首页 > 代码库 > mysql 主主复制

mysql 主主复制

项目中客户需要高可用,数据库是高可用的关键一部分。研究了很多mysql的高可用,用的比较多的就是mysql cluster 和mysql 主从主主复制。

mysql cluster过于复杂,有5个节点,当然最少要部署在两台机器上,所有重点研究了一下主主复制。

1、配置文件 my.cnf

A节点

log-bin=mysql-bin
server-id       = 1
binlog-do-db=test                 主库 需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
binlog-ignore-db=mysql      主库不需要复制的数据库苦命,如果复制多个数据库,重复设置这个选项即可
replicate-do-db=test             从库需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
replicate-ignore-db=mysql 从库不需要复制的数据库苦命,如果复制多个数据库,重复设置这个选项即可
log-slave-updates
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1

B节点:

log-bin=mysql-bin
server-id       = 2
binlog-do-db=test
binlog-ignore-db=mysql
replicate-do-db=test
replicate-ignore-db=mysql
log-slave-updates
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=2

配置改完要要从起mysql才能进行下一步的操作。


AB节点各建一个对方访问的账号:

GRANT REPLICATION SLAVE ON *.* to ‘repl‘@‘192.168.10.131‘ identified by ‘password’;

操作之前最好没有业务发生,如果有的话可以用主数据库锁表的方式操作
 flush tables with read lock;

AB节点查看show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 261 | | |
记录下 FILE 及 Position 的值,在后面进行从服务器操作的时候需要用到。

AB节点执行最后两个参数都是对方的。

change master to master_host=‘192.168.21.10‘,master_user=‘repl‘,master_password=‘111111‘,master_log_file=‘mysqlmaster-bin.000001‘,master_log_pos=594;

ab节点启动 start slave;

AB节点检查:

show slave status\G
Slave_IO_State: Waiting for master to send event
Master_Host: 1xx.3.4x.2xx
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000120    //主库BinaryLog名
Read_Master_Log_Pos: 974015581           //主库BinaryLog偏移量,只要有数据更新就会增长。
Relay_Log_File: mysqld-relay-bin.000020    //从库中继日志名
Relay_Log_Pos: 320839203                  //从库中继日志偏移量
Relay_Master_Log_File: mysql-bin.000120    //对当前主库BinaryLog做中继
Slave_IO_Running: Yes       //接收更新状态
Slave_SQL_Running: Yes       //执行状态
Replicate_Do_DB: nq        //复制的库
Replicate_Ignore_DB:           //排除
Replicate_Do_Table:           //复制单表
Replicate_Ignore_Table:           //排除表
Replicate_Wild_Do_Table:           //跨库复制表
Replicate_Wild_Ignore_Table:
Last_Errno: 0         //上一个执行错误码
Last_Error:           //错误详细信息
Skip_Counter: 0         //可以跳过Last_Errno
Exec_Master_Log_Pos: 974015581 //执行到的偏移量
Relay_Log_Space: 320839203 //中继偏移量
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
1 row in set (0.00 sec)

其中Slave_IO_Running 与 Slave_SQL_Running 的值都必须为YES,才表明状态正常。如果有错误,优先查看错误日志进行解决。

取消主数据库锁定
mysql> UNLOCK TABLES;

剩下的就是验证了。

我做过测试当一台机器关掉mysql服务后,在另一台机器操作,后面重启后依然可以同步过去,只是不知道缓存会保留多长时间。


mysql 主主复制