项目中客户需要高可用,数据库是高可用的关键一部分。研究了很多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服务后,在另一台机器操作,后面重启后依然可以同步过去,只是不知道缓存会保留多长时间。