MySQL репликация · 4 min read · Oct 08, 2025

Идеальный балансировщик нагрузки и высокодоступный веб-кластер с 2 серверами, работающими под Xen на Ubuntu 8.04 Hardy Heron - Страница 4

10. Репликация MySQL (web1, web2)

10.1 Установка MySQL 5.0

apt-get install mysql-server-5.0 mysql-client-5.0

Чтобы убедиться, что репликация может работать, мы должны сделать так, чтобы MySQL слушал на всех интерфейсах, поэтому мы закомментируем строку bind-address = 127.0.0.1 в /etc/mysql/my.cnf:

vi /etc/mysql/my.cnf

[...]
# Вместо skip-networking по умолчанию теперь слушает только на
# localhost, что более совместимо и не менее безопасно.
#bind-address           = 127.0.0.1
[...]

Перезапустите MySQL:

/etc/init.d/mysql restart

На web1

Теперь мы создаем пользователя репликации slave2_user, который может быть использован web2.example.com для доступа к базе данных MySQL:

mysql -u root -p

В оболочке MySQL выполните следующие команды:

GRANT REPLICATION SLAVE ON . TO ‘slave2_user’@’%’ IDENTIFIED BY ‘slave2_password’;
FLUSH PRIVILEGES;
quit;

На web2

Теперь мы повторяем последние два шага на web2.example.com:

mysql -u root -p

GRANT REPLICATION SLAVE ON . TO ‘slave1_user’@’%’ IDENTIFIED BY ‘slave1_password’;
FLUSH PRIVILEGES;
quit;

На web1 И web2

Теперь мы создадим базу данных, которая будет использоваться позже для почтового сервера:

mysqladmin -u root -p create mail

Затем мы переходим в оболочку MySQL:

mysql -u root -p

В оболочке MySQL мы создаем пользователя mail_admin с паролем mail_admin_password (замените его на свой собственный пароль), который имеет привилегии SELECT, INSERT, UPDATE, DELETE на базе данных mail. Этот пользователь будет использоваться Postfix и Courier для подключения к базе данных mail:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail. TO ‘mail_admin’@’localhost’ IDENTIFIED BY ‘mail_admin_password’;
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.
TO ‘mail_admin’@’localhost.localdomain’ IDENTIFIED BY ‘mail_admin_password’;
FLUSH PRIVILEGES;
quit;

10.2 Настройка репликации

Теперь мы настраиваем репликацию master-master в /etc/mysql/my.cnf. Ключевые параметры конфигурации для репликации master-master - это auto_increment_increment и auto_increment_offset:

  • auto_increment_increment контролирует увеличение между последовательными значениями AUTO_INCREMENT.
  • auto_increment_offset определяет начальную точку для значений столбца AUTO_INCREMENT.

Предположим, у нас есть N узлов MySQL (N=2 в этом примере), тогда auto_increment_increment имеет значение N на всех узлах, и каждый узел должен иметь разное значение для auto_increment_offset (1, 2, …, N).

Теперь давайте настроим наши два узла MySQL:

На web1

vi /etc/mysql/my.cnf

добавьте следующие строки сразу под “[mysqld]”:

server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
# используйте 192.168.1.105, если вы не установили кроссовый кабель на eth1
master-host = 192.168.0.105
master-user = slave1_user
master-password = slave1_password
master-connect-retry = 60
replicate-do-db = mail
log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db = mail
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

и измените строку “max_binlog_size”:

[...]
max_binlog_size         = 500M
[...]

/etc/init.d/mysql restart

На web2

vi /etc/mysql/my.cnf

server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2
# используйте 192.168.1.104, если вы не установили кроссовый кабель на eth1
master-host = 192.168.0.104
master-user = slave2_user
master-password = slave2_password
master-connect-retry = 60
replicate-do-db = mail
log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db = mail
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

и измените строку “max_binlog_size”:

[...]
max_binlog_size         = 500M
[...]

/etc/init.d/mysql restart

На web1 И web2

Теперь мы начнем репликацию:

mysql -u root -p

В оболочке MySQL выполните следующие команды:

reset master;
stop slave;
reset slave;

Теперь выполните следующее:

На web1

CHANGE MASTER TO MASTER_HOST=’192.168.0.105’, MASTER_USER=’slave1_user’, MASTER_PASSWORD=’slave1_password’, MASTER_LOG_FILE=’mysql-bin.000001’, MASTER_LOG_POS=98;

start slave;
quit;

На web2

CHANGE MASTER TO MASTER_HOST=’192.168.0.104’, MASTER_USER=’slave2_user’, MASTER_PASSWORD=’slave2_password’, MASTER_LOG_FILE=’mysql-bin.000001’, MASTER_LOG_POS=98;

start slave;
quit;

Теперь репликация должна работать.

10.3 Тестирование репликации

На web1 И web2

mysql -u root -p

В оболочке MySQL выполните следующие команды:

show slave status \G;

В выводе есть 3 важных строки, которые должны выглядеть так:

[...]
Slave_IO_State: Waiting for master to send event
[...]
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: mail
[...]

Теперь вы можете выйти из mysql:

quit;

На web1

Мы вставим некоторые данные на web1.example.com для тестирования, которые будут использоваться в следующей главе для почты:

mysql -u root -p

В оболочке MySQL выполните следующие команды:

use mail;

Мы создадим следующие таблицы:

CREATE TABLE domains (
domain varchar(50) NOT NULL,
transport varchar(128) NOT NULL default ‘smtp:[192.168.1.104]’,
PRIMARY KEY (domain) )
TYPE=MyISAM;

CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;

CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT ‘10485760’,
PRIMARY KEY (email)
) TYPE=MyISAM;

CREATE TABLE transport (
domain varchar(128) NOT NULL default ‘’,
transport varchar(128) NOT NULL default ‘’,
UNIQUE KEY domain (domain)
) TYPE=MyISAM;

quit;

Эти только что созданные таблицы также должны появиться в базе данных mail на web2, благодаря репликации.

На web2

Теперь мы проверим это:

mysql -u root -p

В оболочке MySQL выполните следующие команды:

use mail;
show tables;

Вывод должен быть:

+----------------+
| Tables_in_mail |
+----------------+
| domains         |
| forwardings    |
| transport        |
| users              |
+----------------+
4 rows in set (0.00 sec)

quit;

Если вы видите, что репликация работает.

10.4 Создание пользователя для ldirectord

Теперь мы создадим пользователя, который будет подключаться к базе данных в файле ldirectord.php.

На web1 И web2

mysql -u root -p

В оболочке MySQL выполните следующие команды:

GRANT USAGE ON . TO ‘ldirectord’@’localhost’ IDENTIFIED BY ‘LDIRECTORD_PASSWORD’;
quit;

Теперь, когда вы перейдете с браузером по адресам:

http://192.168.1.104/ldirectord.php

и

http://192.168.1.105/ldirectord.php

Вы должны увидеть:

Подключено к MySQL отображается на экране.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.