当前位置:首页 » Mysql技术教程

MySQL半同步复制

2016-01-03 15:24 本站整理 浏览(8)

l 安装配置:

l 机器分布

IP作用用途
192.168.15.3master主库
192.168.15.4Slave1备库
192.168.15.5Slave2备库
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)

没有问题