mysql5.5半同步主从复制

来源:互联网 发布:xz1 compact 知乎 编辑:程序博客网 时间:2024/06/10 01:29

安装环境:centos5.7 32位 虚拟机2台分别安装了mysql5.5.16
主库ip:192.168.1.100
从库ip:192.168.1.101
mysql安装目录:/usr/local/mysql

1.mysql配置主从复制
主库编辑my.cnf:
[mysqld]
log-bin=NEW_NAME
server-id=1     #配一个唯一的ID编号,1至32。
#设置要进行或不要进行主从复制的数据库名,同时也要在 Slave 上设定。
binlog-do-db=数据库名1
binlog-do-db=数据库名2
binlog-ignore-db=数据库名1
binlog-ignore-db=数据库名2

mysql> grant replication slave on *.* to slaveuser@192.168.1.101 identified by '123456' ;
mysql> flush privileges;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000008 |      337 |              |                  |
+------------------+----------+--------------+------------------+
记录下二进制日志文件名和位置

从库编辑my.cnf,把server-id改成不和主机相同的数字。
如果只想同步指定的数据库,可以添加  replicate-do-db = yourdatabase,
同步几个就复制几个,把数据库名改了就好。
[mysqld]
server-id=2     #唯一
#设置要进行或不要进行主从复制的数据库名,同时也要在 Master 上设定。
replicate-do-db=数据库名1
replicate-do-db=数据库名2
replicate-ignore-db=数据库名1
replicate-ignore-db=数据库名2

mysql> change master to master_host='192.168.1.100',master_user='slaveuser',master_password='123456', master_log_file='mysql-bin.000008',master_log_pos=337;
mysql> start slave;
mysql> show slave status\G;
如果出现:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上两项都为Yes,那说明没问题了。如果指定了个别的数据库,还可以看到
注:如果出现Slave_SQL_Running:connecting的现象,首先在从库命令行下输入:
#mysql -uslaveuser -h 192.168.1.100 -p123456
看是否能登入mysql,如果是拒绝等提示,那要查看主机上的第从库授权操作是否用户的权限等设置正确。

如果开始的环境不是主从架构,跑了一段时间已经有了数据,这时候要先在主机上加锁:flush tables with read lock;
打包主机的数据目录: #tar zcf  /tmpdatabak.tgz /opt/data,拷贝这个压缩包到从机,解压后,做主从的配置。
然后解锁:unlock tables;

2. Semi-sync Repication的历史
Semi-sync最早是由Google实现的一个补丁,代码主要由Mark Callaghan,Wei Li等人贡献.
Google原本是将需求提给Hekki的,但是后来等不及就自己实现了......
(现在Mark Callaghan已跳到Facebook,除了Google,他曾经还在Informix、Oracle工作过)

在5.5之后由MySQL Replication Team按照Plugin的方式将代码移植过来,
并将Semi-sync独立成MySQL的一个插件,
主要代码移植者是Zhenxing He(参考)

3.安装,配置Semi-sync Replication
/usr/local/mysql/lib/plugin目录下有semisync_master.so,semisync_slave.so两个文件
主库安装:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

然后会出现以下4个系统参数:
mysql> show variables like '%rpl_semi%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | OFF   |
| rpl_semi_sync_master_timeout       | 1000  |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+
编辑my.cnf主库添加如下配置:
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000

重启主库
mysql> show variables like '%rpl_semi%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | ON    |
| rpl_semi_sync_master_timeout       | 1000  |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+
rpl_semi_sync_master_enabled :
启动master 支持半同步复制。
rpl_semi_sync_master_timeout :
主库等待半同步复制信息返回的超时间隔,默认10秒
rpl_semi_sync_master_trace_level :
监控等级:
1 = general level (for example, time function failures)
16 = detail level (more verbose information)
32 = net wait level (more information about network waits)
64 = function level (information about function entry and exit)

rpl_semi_sync_master_wait_no_slave :
是否允许master 每个事物提交后都要等待slave 的receipt信号。
默认为on ,每一个事务都会等待,如果slave当掉后,当slave追赶上master的日志时可以自动的切换为半同步方式,
如果为off,则slave追赶上后,也不会彩玉半同步的方式复制了,需要手工发动。

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 |
+--------------------------------------------+-------------+
    * Rpl_semi_sync_master_clients 0            ##表示有多少slave设置了半同步模式。
    * Rpl_semi_sync_master_net_avg_wait_time 0  ##master等待slave回复的平均等待时间, 单位毫秒.
    * Rpl_semi_sync_master_net_wait_time 0      ##master总的等待时间
    * Rpl_semi_sync_master_net_waits 0          ##master等待slave回复的的总的等待次数
    * Rpl_semi_sync_master_no_times 0           ##master关闭半同步复制的次数
    * Rpl_semi_sync_master_no_tx 0              ##master 没有收到slave的回复而提交的次数,(应该可以理解为master 等待超时的次数)
    * Rpl_semi_sync_master_status OFF           ##表示当前是异步模式还是半同步模式。
    * Rpl_semi_sync_master_timefunc_failures 0  ##The number of times the master failed when calling time functions such as gettimeofday()
    * Rpl_semi_sync_master_tx_avg_wait_time 0   ## master 花在每个事务上的平均等待时间
    * Rpl_semi_sync_master_tx_wait_time 0       ##master 总的等待时间
    * Rpl_semi_sync_master_tx_waits 0           ##master 总的等待次数
    * Rpl_semi_sync_master_wait_pos_backtraverse 0 ## 是后来的先到了,而先来的还没有到的次数
    * Rpl_semi_sync_master_wait_sessions 0         ##当前有多少个session 因为slave 的回复而造成等待
    * Rpl_semi_sync_master_yes_tx 0 ##master 成功接收到slave的回复的次数

从库安装:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
然后会出现下列2个参数:
mysql> show variables like '%rpl_semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | OFF   |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
编辑my.cnf从库添加如下配置:
rpl_semi_sync_slave_enabled=1
重启从库
mysql> show variables like '%rpl_semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
rpl_semi_sync_slave_enabled :
启动slave 支持半同步复制。
rpl_semi_sync_slave_trace_level :
监控等级,同 上面的rpl_semi_sync_master_trace_leve。


mysql> show global status like '%Rpl%';
+----------------------------+-------------+
| Variable_name              | Value       |
+----------------------------+-------------+
| Rpl_semi_sync_slave_status | ON          |
| Rpl_status                 | AUTH_MASTER |
+----------------------------+-------------+
Rpl_semi_sync_slave_status ON ##表示当前处于异步模式还是半同步模式

说明:
主备在启动后,且slave线程开始dump主库的日志后,Semi-sync Replication就会开启,
上面的配置(rpl_semi_sync_master_timeout=1000)表示主库在某次事务中,如果等待时间超过1000毫秒,
那么则降级为普通模式,不再等待备库。如果主库再次探测到,备库恢复了,则会自动再次回到Semi-sync状态。

原创粉丝点击