mysql5.5半同步主从复制
2013-02-28 10:19
267 查看
安装环境: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状态。
主库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状态。
相关文章推荐
- mysql主从复制及半同步
- MySQL5.6主从复制(mysql数据同步配置)
- 运维工程师必备之MySQL数据的主从复制、半同步复制和主主复制详解
- 基于semisync实现MySQL的主从半同步复制
- 快速笔记02-MySQL主从复制原理半同步操作步骤及原理
- mysql 主从复制同步时出错解决方法
- MySQL架构优化实战系列2:主从复制同步与查询性能调优
- mysql并行复制降低主从同步延时的思路与启示
- MySql5.5半同步复制(Semi-sync repication)
- mysql并行复制降低主从同步延时的思路与启示
- Mysql 的主从复制,最多支持多少个数据库同步
- Mysql主从(主从不同步解决办法,常见问题及解决办法,在线对mysql做主从复制)
- mysql主从复制实现数据库同步
- [置顶] MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!
- MySQL主从复制原理、半同步操作步骤及原理
- mysql主从复制中的半同步复制
- MySQL主从双向同步复制
- mysql主从复制(单向同步)
- mysql服务器复制的主从架构半同步的实现
- MySQL数据的主从复制、半同步复制和主主复制详解