Настройка репликации Mysql типа “master-master”
#1. Конфигурация сред
Мы имеем 2 ноды
10.4.1.81 – mysql-1-81
10.4.1.82 – mysql-1-82
Операционная системы Debian 8 Jessie x64
#2. Установка mysql 5.5.
Устанавливаем сам Mysql
sudo su
aptitude install mysql-server -y
Редактируем конфиг для возможности подключения с сети:
nano /etc/mysql/my.cnf
Закоментим строку:
bind-address = 127.0.0.1
Найдем строки в конфиге и приведем к виду: server-id = 1 – на 1 сервере, на 2-ом server-id = 2, в остальном одинаково.
[…]
[mysqld]
Unique Server ID
server-id = 1
Do not replicate the following databases
binlog-ignore-db = mysql
replicate-ignore-db = mysql
Auto increment offset
auto-increment-increment = 2
Do not replicate sql queries for the local server ID
replicate-same-server-id = 0
Beginne automatisch inkrementelle Werte mit 1
auto-increment-offset = 1
Delete binlog data after 10 days
expire_logs_days = 10
Max binlog size
max_binlog_size = 500M
Binlog file path
log_bin = /var/log/mysql/mysql-bin.log
[…]
Рестартим mysql
#3.Перейдем к настройке репликации.
Сервер № 1 Подключаемся к Mysql.
mysql -u root -p
create user ‘replicator’@’%’ identified by ‘password’;
create database example_DB;
grant replication slave on . to ‘replicator’@’%’;
FLUSH PRIVILEGES;
show master status;
Запишем себе
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000010 | 1034 | | mysql |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
quit
Не забываем поменять password на свой пароль.
Сервер № 2 Подключаемся к Mysql.
mysql -u root -p
create user ‘replicator’@’%’ identified by ‘password’;
create database example_DB;
grant replication slave on . to ‘replicator’@’%’;
FLUSH PRIVILEGES;
show master status;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000011 | 514 | | mysql |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
slave stop;
CHANGE MASTER TO MASTER_HOST = ‘10.4.1.81’, MASTER_USER = ‘replicator’, MASTER_PASSWORD = ‘password’, MASTER_LOG_FILE = ‘mysql-bin.000010’, MASTER_LOG_POS = 1034;
slave start;
quit
Не забываем поменять password на свой пароль.
Сервер № 1 Подключаемся к Mysql.
mysql -u root -p
slave stop;
CHANGE MASTER TO MASTER_HOST = ‘10.4.1.82’, MASTER_USER = ‘replicator’, MASTER_PASSWORD = ‘password’, MASTER_LOG_FILE = ‘mysql-bin.000011’, MASTER_LOG_POS = 514;
slave start;
Проверим статус репликации
show slave status\G
Получим
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.4.1.82
Master_User: replicator
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000012
Read_Master_Log_Pos: 107
Relay_Log_File: mysqld-relay-bin.000003
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000012
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 107
Relay_Log_Space: 556
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 2
1 row in set (0.00 sec)
На другом сервере будет похожий вывод.
На этом репликация законцена.
#4.Замечания.
****Мы предполагаем что репликация настраивается на “чистые сервера” без баз данных. В противном случае перед настройко необходимо остановить первый серврер, слить с него бузу в дамп и импортировать на 2-й сервер. Важно: не разблокирывайте базу данных пока репликация не настроена. Ниже представлены несколько команд, которые помогут вам скопировать все данные с сервера на новый сервер, если на вашем сервере были данные.**
FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;
Дампим данные в all_databases.sql.mysqldump –defaults-file=/etc/mysql/debian.cnf -cCeQ –hex-blob –quote-names –routines –events –triggers –all-databases -r all_databases.sql
Теперь импортируем полученные данные на 2-й серврер
mysql –defaults-file=/etc/mysql/debian.cnf < all_databases.sql
Если что-то пошло нетак смотрим логи /var/log/syslog.
#Переходим к настройке балансировки и mysql-proxy.
На серверах mysql-proxy1 и mysql-proxy2 устанавливаем необходимые компоненты (здесь и далее, все команды выполняются от имени суперпользователя).
sudo su
apt-get install mysql-proxynano /etc/default/mysql-proxy
ENABLED=”true”
OPTIONS=”–proxy-lua-script=/usr/share/mysql-proxy/rw-splitting.lua –proxy-address=10.4.1.81:3306 –proxy-backend-addresses=10.4.1.81:3306,10.4.1.82:3306″
$ sudo chmod 0660 /etc/mysql/mysql-proxy.cnf
启动mysql-proxy
$ sudo /etc/init.d/mysql-proxy start
* Starting MySQL Proxy daemon… [ OK ]
测试3307端口
$ mysql -hlocalhost -P3307 -uroot -p
mysql-proxy 软件包所含文件如下:
$ dpkg -L mysql-proxy
/.
/etc
/etc/default
/etc/default/mysql-proxy
/etc/init.d
/etc/init.d/mysql-proxy
/usr
/usr/share
/usr/share/mysql-proxy
/usr/share/mysql-proxy/active-queries.lua
/usr/share/mysql-proxy/active-transactions.lua
/usr/share/mysql-proxy/admin-sql.lua
/usr/share/mysql-proxy/admin.lua
/usr/share/mysql-proxy/analyze-query.lua
/usr/share/mysql-proxy/auditing.lua
/usr/share/mysql-proxy/commit-obfuscator.lua
/usr/share/mysql-proxy/histogram.lua
/usr/share/mysql-proxy/load-multi.lua
/usr/share/mysql-proxy/ro-balance.lua
/usr/share/mysql-proxy/ro-pooling.lua
/usr/share/mysql-proxy/rw-splitting.lua
/usr/share/mysql-proxy/xtab.lua
/usr/share/doc
/usr/share/doc/mysql-proxy
/usr/share/doc/mysql-proxy/README.TESTS.gz
/usr/share/doc/mysql-proxy/README
/usr/share/doc/mysql-proxy/copyright
/usr/share/doc/mysql-proxy/changelog.Debian.gz
/usr/lib
/usr/lib/libmysql-chassis-glibext.so.0.0.0
/usr/lib/libmysql-chassis-timing.so.0.0.0
/usr/lib/libmysql-chassis.so.0.0.0
/usr/lib/libmysql-proxy.so.0.0.0
/usr/lib/mysql-proxy
/usr/lib/mysql-proxy/lua
/usr/lib/mysql-proxy/lua/proxy
/usr/lib/mysql-proxy/lua/proxy/auto-config.lua
/usr/lib/mysql-proxy/lua/proxy/balance.lua
/usr/lib/mysql-proxy/lua/proxy/commands.lua
/usr/lib/mysql-proxy/lua/proxy/parser.lua
/usr/lib/mysql-proxy/lua/proxy/tokenizer.lua
/usr/lib/mysql-proxy/lua/proxy/test.lua
/usr/lib/mysql-proxy/lua/admin.lua
/usr/lib/mysql-proxy/lua/lfs.so
/usr/lib/mysql-proxy/lua/glib2.so
/usr/lib/mysql-proxy/lua/chassis.so
/usr/lib/mysql-proxy/lua/mysql.so
/usr/lib/mysql-proxy/lua/lpeg.so
/usr/lib/mysql-proxy/lua/posix.so
/usr/lib/mysql-proxy/plugins
/usr/lib/mysql-proxy/plugins/libadmin.so
/usr/lib/mysql-proxy/plugins/libproxy.so
/usr/lib/mysql-proxy/plugins/libreplicant.so
/usr/lib/mysql-proxy/plugins/libdebug.so
/usr/lib/pkgconfig
/usr/lib/pkgconfig/mysql-proxy.pc
/usr/lib/pkgconfig/mysql-chassis.pc
/usr/bin
/usr/bin/mysql-binlog-dump
/usr/bin/mysql-myisam-dump
/usr/bin/mysql-proxy
/usr/include
/usr/include/network-mysqld.h
/usr/include/network-mysqld-lua.h
/usr/include/network-mysqld-proto.h
/usr/include/network-mysqld-binlog.h
/usr/include/network-mysqld-packet.h
/usr/include/network-mysqld-masterinfo.h
/usr/include/network-conn-pool.h
/usr/include/network-conn-pool-lua.h
/usr/include/network-queue.h
/usr/include/network-socket.h
/usr/include/network-socket-lua.h
/usr/include/network-address.h
/usr/include/network-address-lua.h
/usr/include/sys-pedantic.h
/usr/include/chassis-plugin.h
/usr/include/chassis-log.h
/usr/include/chassis-keyfile.h
/usr/include/chassis-mainloop.h
/usr/include/chassis-path.h
/usr/include/chassis-filemode.h
/usr/include/chassis-limits.h
/usr/include/chassis-event-thread.h
/usr/include/chassis-gtimeval.h
/usr/include/glib-ext.h
/usr/include/glib-ext-ref.h
/usr/include/string-len.h
/usr/include/lua-load-factory.h
/usr/include/lua-scope.h
/usr/include/lua-env.h
/usr/include/network-injection.h
/usr/include/network-injection-lua.h
/usr/include/chassis-shutdown-hooks.h
/usr/include/chassis-exports.h
/usr/include/network-exports.h
/usr/include/network-backend.h
/usr/include/network-backend-lua.h
/usr/include/disable-dtrace.h
/usr/include/lua-registry-keys.h
/usr/include/chassis-stats.h
/usr/include/chassis-timings.h
/usr/include/chassis-frontend.h
/usr/include/chassis-options.h
/usr/include/chassis-win32-service.h
/usr/include/chassis-unix-daemon.h
/usr/include/my_rdtsc.h
/usr/lib/libmysql-chassis-glibext.so.0
/usr/lib/libmysql-chassis-glibext.so
/usr/lib/libmysql-proxy.so
/usr/lib/libmysql-chassis-timing.so.0
/usr/lib/libmysql-chassis-timing.so
/usr/lib/libmysql-proxy.so.0
/usr/lib/libmysql-chassis.so.0
/usr/lib/libmysql-chassis.so