MySQL半同步复制

l  安装配置:

l  机器分布

IP

作用

用途

192.168.15.3

master

主库

192.168.15.4

Slave1

备库

192.168.15.5

Slave2

备库

l  基本的MySQL主从配置

MySQL复制过程分成三步:

master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events;

slave将master的binary log events拷贝到它的中继日志(relay log);

slave重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的

Master配置

1)分配复制权限

主库和从库均需要执行

mysql> grant replication client,replication slave on *.* to 'replck1'@'192.168.15.%' identified by "replck1#!123";

mysql> flush privileges;

2)将master中的数据dump到slave1 slave2中

/opt/app/mysql/bin/mysqldump -uroot -p''  --opt --default-character-set=utf8 

--triggers -R --master-data=2 --hex-blob --single-transaction --no-autocommit --all-databases > all.sql

在每台机上安装

[root@MASTER_03 ~]# yum -y install openssh-clients

导入

[root@SLAVE_04 ~]# /opt/app/mysql/bin/mysql < /tmp/all.sql

[root@SLAVE_05 data]# /opt/app/mysql/bin/mysql < /tmp/all.sql

导入后,进入master 清除日志

mysql> reset master;

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000001 |      120 |              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

在slave1 slave2中进行指定

mysql> change master to

    -> master_host='192.168.15.3',

    -> master_user='replck1',

    -> master_password='replck1#!123',

    -> master_port=3306,

    -> master_log_file='mysql-bin.000001',

    -> master_log_pos=120;

Query OK, 0 rows affected, 2 warnings (0.04 sec)

mysql> start slave;

在master中创建一个iot2库,发现已经同步

开启半同步

1,在Master上装插件:
install plugin rpl_semi_sync_master soname 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled=ON;
在my.cnf配置文件里,加入 rpl_semi_sync_master_enabled = 1

2,在Slave上装插件:
install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; 
SET GLOBAL rpl_semi_sync_slave_enabled =ON;
在my.cnf配置文件里,加入rpl_semi_sync_slave_enabled = 1

参数:
当所有的Slave崩溃,或则断开,甚至是只有Master没有Slave(不可能)。从而Slave接受不到Master的事务,导致M得不到S返回的确认信息。M会一直等待。这里有2个参数可以设置:
Master上:
rpl_semi_sync_master_enabled:表示在 master 上已经开启半同步复制模式。
rpl_semi_sync_master_timeout :为了防止半同步复制在没有收到S发出的确认发生堵塞,该可以设置一个计时器,用来设置超时,超过这个时间值没有收到信息,则切换到异步复制,执行操作。(默认为10000毫秒,等于10秒,这个参数动态可调,表示主库在某次事务中,如果等待时间超过10秒,那么则降级为异步复制模式,不再等待SLAVE从库。如果主库再次探测到,SLAVE从库恢复了,则会自动再次回到半同步复制模式。)
rpl_semi_sync_master_wait_no_slave :当一个事务被提交,但是Master没有Slave连接,这时M不可能收到任何确认信息,但M会在时间限制范围内继续等待。如果没有Slave链接,会切换到异步复制。(是否允许master每个事务提交后都要等待slave的接收确认信号。默认为on,每一个事务都会等待。如果为off,则slave追赶上后,也不会开启半同步复制模式,需要手工开启。)
Slave上:
rpl_recovery_rank:当 slave 从库宕机后,假如 Relay-Log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log,并且重新从 MASTER 上获取日志,这样保证 relay-log 的完整。默认情况下该功能是关闭的, relay_log_recovery 的值设置为 1 时,将可在 slave从库上开启该功能。

在master中

mysql> show variables like 'rpl%';
+------------------------------------+----------+
| Variable_name | Value |
+------------------------------------+----------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_stop_slave_timeout | 31536000 |
+------------------------------------+----------+
5 rows in set (0.00 sec)

在slave 中

mysql> show variables like 'rpl%';
+---------------------------------+----------+
| Variable_name | Value |
+---------------------------------+----------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
| rpl_stop_slave_timeout | 31536000 |
+---------------------------------+----------+
3 rows in set (0.01 sec)

状态:
如何知道是半同步复制?

Rpl_semi_sync_master_clients:说明支持和注册半同步复制的已链接Slave数。
Rpl_semi_sync_master_status:ON是活动状态(半同步),OFF是非活动状态(异步),要么是他没有启用或则已恢复到异步复制状态。用于指示主服务器使用的是异步复
制模式,还是半同步复制模式。
Rpl_semi_sync_master_yes_tx:成功提交数量。
Rpl_semi_sync_master_no_tx :不成功提交数量。
Rpl_semi_sync_slave_status :Slave上的半同步复制状态,ON表示已经被启用,OFF表示非活动状态。

复制正常的测试

mysql> insert into test1 values(5,'d5');
Query OK, 1 row affected (0.00 sec)

mysql> show global status like 'rpl_semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 7022 |
| Rpl_semi_sync_master_net_wait_time | 21066 |
| Rpl_semi_sync_master_net_waits | 3 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 4 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 3146 |
| Rpl_semi_sync_master_tx_wait_time | 6293 |
| Rpl_semi_sync_master_tx_waits | 2 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 2 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

停掉slave1然后在master插入

mysql> insert into test1 values(6,'d6');
Query OK, 1 row affected (10.01 sec)

此时的状态

mysql> show global status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF |
+-----------------------------+-------+
1 row in set (0.00 sec)

重新开启slave 查看master

mysql> show global status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+
1 row in set (0.00 sec)

插入


mysql> insert into test1 values(7,'d7');
Query OK, 1 row affected (0.06 sec)

 没有问题

原文地址:https://www.cnblogs.com/olinux/p/5096485.html