配置半同步类型
5.6 after_commit
5.7 AFTER_SYNC
SET rpl_semi_sync_master_wait_point= AFTER_SYNC;
半同步复制因为多了复制过程中的确认信息的通信时间(ack TCP/IP),复制效率要比异步复制低,但是数据安全性较高
在5.7的AFTER_SYNC的半同步的复制效率,要比after_commit在主库高并发的情况下,要高。
MySQL半同步复制的搭建
1、首先搭建一个异步复制,在异步复制的基础上,配置半同步复制
2、安装半同步的插件
主库
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
从库
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
show plugins;
查看是否安装成功
3、半同步需要在主从同时开启
主库
SET GLOBAL rpl_semi_sync_master_enabled = 1;
从库
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
以上的启动方式是在命令行操作,也可写在配置文件中。
4、重启从库的IO线程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
查看是否开启半同步复制
mysql> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+
mysql> show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
报错日志打印信息
ote] Semi-sync replication initialized for transactions.
2018-04-21T16:01:13.035777+08:00 24 [Note] Semi-sync replication enabled on the master.
2018-04-21T16:01:13.036331+08:00 0 [Note] Starting ack receiver thread
2018-04-21T16:01:53.339548+08:00 25 [Note] While initializing dump thread for slave with UUID <93b3d580-4525-11e8-ae57-000c29a5e804>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(3).
2018-04-21T16:01:53.339929+08:00 25 [Note] Start binlog_dump to master_thread_id(25) slave_server(31133306), pos(mysql-bin.000001, 286723)
2018-04-21T16:01:53.340220+08:00 25 [Note] Start semi-sync binlog_dump to slave (server_id: 31133306), pos(mysql-bin.000001, 286723)
2018-04-21T16:01:53.340934+08:00 3 [Note] Stop asynchronous binlog_dump to slave (server_id: 31133306)
~
85 [Note] Semi-sync replication initialized for transactions.
2018-07-12T00:09:20.604237+08:00 85 [Note] Semi-sync replication enabled on the master.
2018-07-12T00:09:20.604516+08:00 0 [Note] Starting ack receiver thread
2018-07-12T00:10:21.576332+08:00 86 [Note] While initializing dump thread for slave with UUID <c5f0173e-6e4f-11e8-bd8a-00163e04eeaf>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(62).
2018-07-12T00:10:21.576429+08:00 86 [Note] Start binlog_dump to master_thread_id(86) slave_server(108463307), pos(mysql-bin.000002, 52637)
2018-07-12T00:10:21.576457+08:00 86 [Note] Start semi-sync binlog_dump to slave (server_id: 108463307), pos(mysql-bin.000002, 52637)
2018-07-12T00:10:21.576507+08:00 62 [Note] Stop asynchronous binlog_dump to slave (server_id: 108463307)
配置文件的配置实例5.7
plugin_dir=/usr/local/mysql/lib/plugin
plugin_load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000
rpl_semi_sync_master_wait_point = AFTER_SYNC
rpl_semi_sync_master_wait_for_slave_count = 1
就是如果没有该插件就忽略这个参数
loose_rpl_semi_sync_master_timeout = 5000
如果半同步复制返回ack的信息,超过5000ms,那么半同步复制会自动的降级为异步复制
rpl_semi_sync_master_wait_for_slave_count = 1
半同步复制中,如果有多个从库,需要等待几个从库返回确认信息。
---------------------------------------------------------------------------
GTID的概述:
1、全局事务标识:global transaction identifieds。
2、GTID事物是全局唯一性的,且一个事务对应一个GTID。
3、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
4、GTID用来代替classic的复制方法,不在使用binlog+pos开启复制。而是使用master_auto_postion=1的方式自动匹配GTID断点进行复制。
5、MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。6、在传统的slave端,binlog是不用开启的,但是在GTID中,slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。
GTID是一个编号
UUID:事务编号
uuid存放文件
[root@master mysql3306]# cat auto.cnf
[auto]
server-uuid=872a46c0-4525-11e8-b2bc-000c292221ec
uuid是一个在时间和空间上都不相同的串码
可以唯一标志一个mysql实例
如何修改
1.可以手改
2.可以删除auto.cnf 删掉之后,重启数据库,可以自动生新的auto.cnf文件
如何开启GTID
MySQL 5.6只能是重启数据库开启GTID
MySQL 5.7可以在线开启GTID
1、从库
stop slave ;
reset slave all;
vim etc/my3307.cnf
[mysqld]
start slave;
show slave status\G;
2、参数配置:
gtid_mode=on
log_slave_updates=1
enforce_gtid_consistency=1
主从同时配置三个参数‘’
show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | ON |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
3、搭建GTID
不需要指定主库的binlog的文件和位置
change master to master_host='39.108.108.46',master_port=3306,master_user='cjr',master_password='cjr',master_auto_position=1;
线上搭建GTID
mysqldump在线搭建
1、在备份的时候指定--master-data=2(来保存binlog的文件号和位置的命令)。
2、使用mysqldump的命令在dump文件里可以看到下面两个信息:
SET@@GLOBAL.GTID_PURGED='7800a22c-95ae-11e4-983d-080027de205a:1-8';
恢复数据前需要先通过reset master清空gtid_executed变量
scp tmp/all.sql 192.168.168.102:/tmp
3、将备份还原到slave后,使用change master to命令挂载master端。
change master to master_host='192.168.3.10',master_port=3306,master_user='rep',master_password='rep',master_auto_position=1;
注意:在mysql5.6.9以后的命令才支持这个功能。
从库reset master 命令的作用:
清空从库的gitd的应用信息
之后在清空gtid信息之后,才能指定从gtid的特定位置的开始同步
1、Xtrabackup_binlog_info文件中,包含global.gtid_purged='XXXXXX:XXXX'的信息。
2、然后到slave去手工的 SET GLOBAL.GTID_PURGED='XXXXXX:XXXX'。
3、恢复备份,开启change master to 命令。
GTID的限制
1. 不支持非事务引擎(从库报错,stopslave; start slave; 忽略)
2. 不支持create table … select 语句复制(主库直接报错)
3. 不允许在一个SQL同时更新一个事务引擎和非事务引擎的表
4. 在一个复制组中,必须要求统一开启CTID或是关闭GTID
5. 开启GTID需要重启(5.7中不需要)
6. 开启GTID后,就不在使用原来的传统的复制方式
7. 对于create temporary table 和drop temporary table语句不支持
8. 不支持sql_slave_skip_counter