主从同步复制模式
异步复制模式 | 全同步复制 | 半同步复制 |
---|---|---|
Asyncchronous replication | Fully syncchronous replication | Semisyncchronous replication |
主库接受到客户请求后,处理完事务后,立即将结果返给客户端,不去关系从库是否已经接收并处理 | 当主库执行完一次事务,且所有从库都接受并处理之后,才返回给客户端 | 介于两种模式之间,主库执行一次事务后,等待至少一个从库接受并写到relay log中才返回给客户端 |
客户体验度高,访问从库可能没有数据 | 客户体验度差,数据同步好 | 目前大多数企业采用的方法 |
半同步复制模式的配置
准备两台数据库mysql服务器
master(主库) 192.168.4.51 slave(从库) 192.168.4.52
[root@mysql51 ~]#systemctl start mysqld //确保从库和51上的数据相同
[root@mysql51 ~]# mysql -uroot -p123456
mysql>show databases;
+----------------------+
| Database |
+----------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+----------------------+
配置主从关系
mysql> system vim /etc/my.cnf //配置主库51
[mysqld]
log_bin=master51 //设置日志名
server_id=51
mysql> system systemctl restart mysqld
mysql> show master status; //查看启动的日志
mysql> show master logs; //查看当前日志
+-----------------+----------+
| Log_name | File_size|
+-----------------+----------+
| master51.000001 | 446 |
+-----------------+----------+
mysql>grant replication slave on *.* to repluser@"%" identified by "123456";
//授权给repluser用户, 密码为123456(需符合当前密码权限,本机之前改过权限0)
mysql> system vim /etc/my.cnf
[mysqld]
server_id=52
mysql> system systemctl restart mysqld //配置从库,指定主库信息
mysql> change master to
-> master_host="192.168.4.51",
-> master_user="repluser",
-> master_password="123456",
-> master_log_file="master51.000001", //关联主服务器的日志文件
-> master_log_pos=446; //关联主服务器的偏移量
mysql> start slave;
mysql> show slave status\G; //查看从服务器信息
....
Slave_IO_Running: Yes //yes为正常
Slave_SQL_Running: Yes //yes为正常
查看是否可以自动添加模块
mysql> show variables like 'have_dynamic_loading';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES |
+----------------------+-------+
1 row in set (0.01 sec)
主从分别下载对应模块并查看是否启用
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; //主库
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; //从库
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
//查看系统下的表,是否安装成功
+----------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
| rpl_semi_sync_slave | ACTIVE |
+----------------------+---------------+
2 rows in set (0.00 sec)
启用半同步复制,默认是关闭的,并查看对应库
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; //主库执行
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1; //从库执行
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like "rpl_semi_sync_%_enabled"; //查看是否启用
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_slave_enabled | ON |
+------------------------------+-------+
2 rows in set (0.00 sec)
写入配置文件,设置每次启动
[root@master51 ~]# vim /etc/my.cnf //主库
[mysqld]
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
[root@slave52 ~]# vim /etc/my.cnf //从库
[mysqld]
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
高可用架构下,master和slave需同时启动,以便在切换后能继续使用半同步复制
[root@master51 ~]# vim /etc/my.cnf
[mysqld]
plugin-load \
="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1