Chinaunix首页 | 论坛 | 博客
  • 博客访问: 610990
  • 博文数量: 244
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-27 09:53
个人简介

记录学习,记录成长

文章分类

全部博文(244)

我的朋友

分类: LINUX

2015-12-11 20:55:03

一.半同步复制原理
MySQL5.5 除了支持内置的异步复制机制,还提供了接口支持半同步复制的机制。

1.异步复制的缺点:
mysql复制默认是异步复制,Master将事件写入binlog,但并不知道Slave是否或何时已经接收且已处理。在异步复制的机制的情况下,如果Master宕机,事务在Master上已提交,但很可能这些事务没有传到任何的Slave上。假设有Master->Salve故障转移的机制,此时Slave也可能会丢失事务。

2.半同步复制的概念:
2.1当Slave主机连接到Master时,能够查看其是否处于半同步复制的机制。

2.2当Master上开启半同步复制的功能时,至少应该有一个Slave开启其功能。此时,一个线程在Master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的Slave已收到此事务的所有事件,或等待超时。

2.3当一个事务的事件都已写入其relay-log中且已刷新到磁盘上,Slave才会告知已收到。

2.4如果等待超时,也就是Master没被告知已收到,此时Master会自动转换为异步复制的机制。当至少一个半同步的Slave赶上了,Master与其Slave自动转换为半同步复制的机制。

2.5半同步复制的功能要在Master和Slave上都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。


3.同步,异步,半同步复制的比较:
3.1同步复制:
Master提交事务,直到事务在所有的Slave都已提交,此时才会返回客户端,事务执行完毕。缺点:完成一个事务可能会有很大的延迟。

3.2异步复制:
当Slave准备好才会向Master请求binlog。缺点:不能保证一些事件都能够被所有的Slave所接收。

3.3半同步复制:
半同步复制工作的机制处于同步和异步之间,Master的事务提交阻塞,只要一个Slave已收到该事务的事件且已记录,它不会等待所有的Slave都告知已收到,且它只是接收,并不用等其完全执行且提交。

4.半同步复制的控制变量,状态监控变量:
4.1控制变量
rpl_semi_sync_master_enabled是控制Master是否开启半同步,开启或不开启,将其设置为ON或OFF(1或0)

rpl_semi_sync_master_timeout是控制Master等待多长时间被告知Slave已收到,也就是所谓的超时时间

rpl_semi_sync_slave_enabled是控制Slave是否开启半同步,开启或不开启,将其设置为ON或OFF(1或0)

4.2常用的状态监控变量:
Rpl_semi_sync_master_clients:查看有多少个开启半同步复制的插件的Slave

Rpl_semi_sync_master_status:查看在Master上半同步复制是否正在运行,其值为ON时,说明Master已启用半同步且已被告知有Slave收到;其值为OFF时,说明Master没启用半同步或是没被告知,由于timeout等原因。

Rpl_semi_sync_master_no_tx:查看有多少事务没有用半同步复制的机制进行复制。

Rpl_semi_sync_master_yes_tx:查看有多少事务是通过半同步复制机制成功复制。

Rpl_semi_sync_slave_status:查看Slave上半同步复制是否正常运行,其值为ON时,说明Slave正通过半同步复制且Slave I/O正在运行;为OFF时,反之。

二.半同步复制配置

配置环境:
mysql主服务器:192.168.85.144
mysql从服务器:192.168.85.145
mysql版本:5.5.46

在MySQL上安装插件需要数据库支持动态载入。检查是否支持:
mysql> show global variables like 'have_dynamic_loading';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+

半同步复制是基于复制的环境。也就是说配置半同步复制前,已有复制的环境。

要实现mysql的半同步复制需要安装相关插件,插件的位置和名称为:
[root@node2 plugin]# pwd
/usr/local/mysql/lib/plugin

[root@node2 plugin]# ll | grep semisync
-rwxr-xr-x 1 root mysql 150472 Sep 18 23:42 semisync_master.so #主服务器安装的插件
-rwxr-xr-x 1 root mysql  81921 Sep 18 23:42 semisync_slave.so #从服务器安装的插件

1.主服务器的命令行下安装插件,格式为:INSTALL PLUGIN plugin_name SONAME 'shared_library_name'

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';

mysql> show global variables like 'rpl_semi%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | OFF   |
| rpl_semi_sync_master_timeout       | 10000 |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+
其中:
rpl_semi_sync_master_enabled表示主服务器的半同步复制功能的状态;
rpl_semi_sync_master_timeout表示半同步复制超时时间,单位毫秒;
rpl_semi_sync_master_trace_level表示追踪级别;
rpl_semi_sync_master_wait_no_slave表示如果没有slave是否等待;

2.从服务器的命令行下安装插件:
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

mysql> show global variables like 'rpl_semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | OFF   |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+

3.启用半同步复制功能(先主后从)
3.1主服务器:
mysql> set global rpl_semi_sync_master_enabled=1;

mysql> show global variables like 'rpl_semi%';
+------------------------------------+-------+
| 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    |
+------------------------------------+-------+

3.2从服务器:
mysql> set global rpl_semi_sync_slave_enabled=1;

mysql> show global variables like 'rpl_semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+

3.3虽然经过了上述操作,但是依然还未启用半同步复制功能:
mysql> show global status like 'rpl%'; #主服务器上
+--------------------------------------------+-------------+
| Variable_name                              | Value       |
+--------------------------------------------+-------------+
| Rpl_semi_sync_master_clients               | 0           | #值为0即半同步从服务器数位0
| Rpl_semi_sync_master_net_avg_wait_time     | 0           |
| Rpl_semi_sync_master_net_wait_time         | 0           |
| Rpl_semi_sync_master_net_waits             | 0           |
| Rpl_semi_sync_master_no_times              | 0           |
| Rpl_semi_sync_master_no_tx                 | 0           |
| Rpl_semi_sync_master_status                | ON          |
| Rpl_semi_sync_master_timefunc_failures     | 0           |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0           |
| Rpl_semi_sync_master_tx_wait_time          | 0           |
| Rpl_semi_sync_master_tx_waits              | 0           |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0           |
| Rpl_semi_sync_master_wait_sessions         | 0           |
| Rpl_semi_sync_master_yes_tx                | 0           |
| Rpl_status                                 | AUTH_MASTER |
+--------------------------------------------+-------------+

3.4启用半同步复制功能还需要重启从服务器的复制线程
mysql> stop slave IO_THREAD;

mysql> start slave IO_THREAD;

3.5主服务器上查看半同步复制的客户端连接数
mysql> show global status like 'rpl%';
+--------------------------------------------+-------------+
| Variable_name                              | Value       |
+--------------------------------------------+-------------+
| Rpl_semi_sync_master_clients               | 1           |
| Rpl_semi_sync_master_net_avg_wait_time     | 0           |
| Rpl_semi_sync_master_net_wait_time         | 0           |
| Rpl_semi_sync_master_net_waits             | 0           |
| Rpl_semi_sync_master_no_times              | 0           |
| Rpl_semi_sync_master_no_tx                 | 0           |
| Rpl_semi_sync_master_status                | ON          |
| Rpl_semi_sync_master_timefunc_failures     | 0           |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0           |
| Rpl_semi_sync_master_tx_wait_time          | 0           |
| Rpl_semi_sync_master_tx_waits              | 0           |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0           |
| Rpl_semi_sync_master_wait_sessions         | 0           |
| Rpl_semi_sync_master_yes_tx                | 0           |
| Rpl_status                                 | AUTH_MASTER |
+--------------------------------------------+-------------+

4.测试
mysql> show global variables like 'rpl_semi_sync_slave_enabled';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| rpl_semi_sync_slave_enabled | ON    |
+-----------------------------+-------+

mysql> show global variables like 'rpl_semi_sync_master_enabled';
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON    |
+------------------------------+-------+

4.1从服务器开启了复制进程时
mysql> start slave IO_THREAD;

主服务器上创建数据库:
mysql> create database testdb1;
Query OK, 1 row affected (0.03 sec) #耗时0.03s

4.2从服务器上关闭了复制进程时
mysql> stop slave IO_THREAD;

主服务器上创建数据库:
mysql> create database testdb2;
Query OK, 1 row affected (10.02 sec) #耗时10.02s即超时时间

紧接着再创建数据库:
mysql> create database testdb3;
Query OK, 1 row affected (0.01 sec) #因为一旦超时就自动降为异步复制,所以耗时减少了

4.3其他信息
通过半同步复制机制复制成功的事务
mysql> show global status like 'rpl_semi_sync_master_yes_tx';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_yes_tx | 3     |
+-----------------------------+-------+

没有通过半同步复制机制复制的事务
mysql> show global status like 'rpl_semi_sync_master_no_tx';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_master_no_tx | 2     |
+----------------------------+-------+

主服务器上的状态信息:
mysql> show global status  like 'rpl_semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     | #此时连接数为0
| Rpl_semi_sync_master_net_avg_wait_time     | 2964  |
| Rpl_semi_sync_master_net_wait_time         | 11858 |
| Rpl_semi_sync_master_net_waits             | 4     |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 2     |
| Rpl_semi_sync_master_status                | OFF   |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 2612  |
| Rpl_semi_sync_master_tx_wait_time          | 7836  |
| Rpl_semi_sync_master_tx_waits              | 3     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 3     |
+--------------------------------------------+-------+

4.4从服务器上启用复制进程然后查看
mysql> start slave IO_THREAD;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| test               |
| testdb1            |
| testdb2            |
| testdb3            |
+--------------------+
开启从服务器的复制进程后,就会自动向主服务器同步数据;

mysql异步主从复制配置:
http://blog.chinaunix.net/uid-30212356-id-5572660.html

阅读(528) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~