mysql-主从同步和半同步复制
环境说明:
主库IP:192.168.1.3
从库IP:192.168.1.5
一、配置/etc/my.cnf 文件
1、主:要配置启用二进制文件和server_id
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql_slow_query.log
long_query_time=1
server-id=1
log_bin=log_bin
2、从:只需要配置server_id即可, 要求必须与其他主/从节点的不一致
server-id=2
二、检查/配置/var/lib/mysql/auto.cnf
文件
分别查看主库及从库的/var/lib/mysql/auto.cnf
文件,要求主、从节点的 uuid 必须不能一致,若一样则需修改从节点的uuid即可
三、创建用户
在主上创建一个用户允许别的机器到你这里主从复制(replication slave)的权限
在mysql界面上创建一个用户允许哪台ip机器访问本机上的主服务的二进制文件
mysql> grant replication slave on *.* to 'slave_user'@'192.168.1.5' identified by '123456';
四、配置log_bin日志文件和Position位置
主:我们要知道主服务上当前的二进制日志文件的名字和它现在所在的位置。
mysql> show master status;
+-------------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+--------------+------------------+-------------------+
| mysql-master-bin.000002 | 1608 | | | |
+-------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
从:从服务,要配置连接到主服务器的相关配置(hostname,user,password,port)和日志文件的名字和它现在所在的点的位置(MASTER_LOG_FILE,MASTER_LOG_POS)。
mysql> change master to master_host='192.168.1.3', master_user='slave_user', master_password='123456', master_port=3306, MASTER_LOG_FILE='mysql-master-bin.000002',MASTER_LOG_POS=1608;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
从:启动为从库服务
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
从:查看sql线程和io线程是否为yes来判断它们的主从是否成功搭建起来
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.3
Master_User: backup
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-master-bin.000003
Read_Master_Log_Pos: 2904
Relay_Log_File: mysql-slave-relay-bin.000002
Relay_Log_Pos: 994
Relay_Master_Log_File: mysql-master-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
注:如果上步操作show slave status\G;
的时候io线程(Slave_IO_Runningg)和sql线程(Slave_SQL_Running)的结果不是yes,可能出现的情况为:
1. 密码不对
2. 网络不通
3. MASTER_LOG_POS没有找对(我们在从上面配置主服务的配置的时候,出现了错误,我们没有详细的根据主服务器上的配置来配置的)
4. uuid 出现了错误(/var/lib/mysql/auto.cnf)
如果出现错误的时候,可以继续用 show slave status\G;看Error的报错信息来判断是什么问题导致它出现了错误
Last_Error:
半同步(基于以上主从同步)
一、首先加载插件
主:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
从:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
(删除插件:UNINSTALL PLUGIN 'semisync_slave.so'
)
二、主、从分别查看插件是否加载成功(主从都要)
mysql>show plugins;
安装插件成功:
rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
三、启动半同步复制
主: mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
从: mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
=====================================================
注:可写在配置文件/etc/my.cnf
里,然后重启
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;
=====================================================
四、从库重新启动I/O线程
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;
五、查看半同步是否启动
1、主:
mysql> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+
1 row in set (0.00 sec)
2、从:
mysql> show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.20 sec)
这两个变量常用来监控主从是否运行在半同步复制模式下。
注:当半同步复制发生超时时(由rpl_semi_sync_master_timeout参数控制,单位是毫秒,默认为10000,即10s),会暂时关闭半同步复制,转而使用异步复制。当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为半同步复制。
参考资料:
mysql-主从复制和半同步