且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Mysql半同步复制(Semi-synchronous Replication)

更新时间:2022-09-22 14:27:47

企业应用中,mysql经常采用主从构架,或者主主架构,这样可以实现mysql服务器的负载均衡,提升mysql服务器的性能.而关键是,可以实现mysql的数据同步复制功能,来为企业数据备份提供一种方便的机制

默认情况下,MySQL5.5 的复制功能是异步的,这意味着当谈到数据一致性时,主服务器及其从服务器是独立的。异步复制可以提供***的性能,因为主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,无需等待验证更新数据是否已经复制到至少一台拓扑从服务器中,就可以***处理其它进入的事务处理请求。虽然快,但这也同时带来了很高的风险,如果在主服务器或从服务器端发生故障,会造成主服务器/从服务器数据的不一致,甚至在恢复时造成数据丢失。

MySQL5.5 引入了一种半同步复制功能,该功能可以确保主服务器和访问链中至少一台从服务器之间的数据一致性和冗余。在这种配置结构中,一台主服务器和其许多从服务器都进行了配置,这样在复制拓扑中,至少有一台从服务器在父主服务器进行事务处理前,必须确认更新已经收到并写入了其中继日志(Relay Log)。当出现超时,源主服务器必须暂时切换到异步复制模式重新复制,直到至少有一台设置为半同步复制模式的从服务器及时收到信息。

Mysql半同步复制(Semi-synchronous Replication)

 

主要注意的地方:

1)mysql复制过程在网络上传输时是明文的,不过支持SSL加密.

2)mysql复制要求主从架构的服务器的server id 不能相同.

3)半同步复制模式必须在主服务器和从服务器端同时启用,否则主服务器默认使用异步复制模式。
 

 

实验环境: debian系统6.2 mysql5.5 + centos配置基本一样。

主:192.168.3.107

从:192.168.3.45  

一配置过程

1主端准备:

 认都是打开 的包括类型 ID 为1  默认每个mysql 都是主。

为从授权:

grant  replication client,replication slave on *.* to hou@192.168.3.45 identified by 'houzi123' ;

  flush privilege;

mysql> flush privileges;

mysql> create database testdb;
mysql> use testdb;
mysql> create table testuser(id int(4),name varchar(20));
mysql> insert into testuser values(1,'test1');
mysql> flush privileges;
mysql> select * from testuser;
+------+-------+
| id | name |
+------+-------+
| 1 | test1 | 
+------+-------+ 1 row in set (0.00 sec)
 

配置文件写:

replicate_ignore_db = mysql  忽略的DB 不然这个

replicate_do_db = testdb  


重启服务 在进去
mysql> show master status  ;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 |      307 | testdb       | mysql            |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

说明配置文件成功了

 3:设置从服务器:

# 从服务器不需要二进制日志,只需要启动中继日志 
除非有自己独立的库需要二进制日志,那么***要关闭,
注释掉log-bin 和 binlog_format 
# 从服务器需要开启中继日志
relay-log=relay-bin  
 
 relay-log-index=relay-bin.index
server-id   = 11 ##ID 2以后随便设置

 replicate-ignore-db = mysql 忽略的DB 不然这个 会一直报错!

#replicate-do-db = testdb 

从端不需要写 写了的话 必须手动建立库。这样你可以有效控制。

重启服务

Mysql半同步复制(Semi-synchronous Replication)

  mysql> change master to  master_host='192.168.3.107',  master_user='hou',master_password='houzi123',master_port=3306;
 mysql>slave start;

 在从上查看库就会同步过来的。
 mysql> SHOW SLAVE STATUS\G

查看状态 都YES 就为成功的。

Mysql半同步复制(Semi-synchronous Replication)

成功后就会生成状态文件,名字默认为 `master.info` and `relay-log.info`。slave关闭后,会保留他们。当下一次slave启动时,就会读取这两个文件来判断从master读取到二进制日志的什么位置了,改变的话需要删除这些文件。

 

 在测试下同步:

主:

mysql>  use testdb;
Database changed
mysql>  insert into testuser values(2,'test2');

从:mysql> select * from testuser;
+------+-------+
| id   | name  |
+------+-------+
|    1 | test1 |
|    2 | test2 |
+------+-------+
2 rows in set (0.00 sec)

#####################################################

5.5 以后的异步还是有点不一样的。

下面开始 半的 因为他是基础异步的基础上,半同步也会带来的问题:网络原因(比如网速很慢)造成同步迟迟不能进行.,在等不到某一个从服务器同步后,自动降级为异步这么来解决。

5.5版的mysql,那么在/usr/local/mysql/lib/plugin/ 保存了相关的插件,而我们需要安装的是semisync_master.so semisync_slave.so

root@houzaicun:/usr/local/mysql/lib/plugin# ls -a semisync_* 
semisync_master.so  semisync_slave.so

启动主服务器的半同步复制功能:
mysql>  INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.03 sec)

set global rpl_semi_sync_master_enabled=1;
set global rpl_semi_sync_master_timeout=1000; (1 秒, 默认为 10 秒)

启动从服务器或多个从服务器的半同步复制功能:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)
set global rpl_semi_sync_slave_enabled=1;
 
在主服务器上的my.cnf里添加如下记录 :
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
 
在丛服务器上的my.cnf里添加如下记录 :

 rpl_semi_sync_slave_enabled=1

因为设置全局参数了不用重启服务的。。

一旦启动半同步复制模式,将会显示出新系统及其状态变量,这些变量可用于检查配置和运行状
态。每个值使用 SHOW VARIABLES 和 SHOW STATUS 显示,包括:
在主服务器中:

Rpl_semi_sync_master_status 用于指示主服务器使用的是异步复制模式,还是半同步复
制模式

Rpl_semi_sync_master_clients:用于显示有多少个从服务器配置成了半同步复制模式

Rpl_semi_sync_master_yes_tx: 显示从服务器确认的成功提交数量

Rpl_semi_sync_master_no_tx:显示从服务器确认的不成功提交数量

Rpl_semi_sync_master_tx_avg_wait_time:事务因开启Semi_sync,平均需要额外等待的时间

Rpl_semi_sync_master_net_avg_wait_time:事务进入等待队列后,到网络平均等待时间

依据上面两个状态值可以知道,Semi-sync的网络消耗有多大,给某个事务带来的额外的消耗有多大.

Mysql半同步复制(Semi-synchronous Replication)

取消插件:  UNINSTALL PLUGIN rpl_semi_sync_master;

未完待续。。。如有问题 回复或者邮箱联系。



本文转自 houzaicunsky 51CTO博客,原文链接:http://blog.51cto.com/hzcsky/820859