2019独角兽企业重金招聘Python工程师标准>>>

Mysql 主从双向同步复制

MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环。当一个从服务器连接到主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知下一次更新。

为什么使用主从复制?

1、主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。

2、通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。但是不要同时在主从服务器上进行更新,这样可能引起冲突。

3、使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。

MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让主服务器发送二进制日志。主服务器创建一个线程将二进制日志中的内容发送到从服务器。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,从服务器使用此线程读取中继日志并执行日志中包含的更新。SHOW PROCESSLIST语句可以查询在主服务器上和从服务器上发生的关于复制的信息。

默认中继日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是从服务器主机名,nnnnnn是序列号。用连续序列号来创建连续中继日志文件,从000001开始。从服务器跟踪中继日志索引文件来识别目前正使用的中继日志。默认中继日志索引文件名为host_name-relay-bin.index。在默认情况,这些文件在从服务器的数据目录中被创建。中继日志与二进制日志的格式相同,并且可以用mysqlbinlog读取。当SQL线程执行完中继日志中的所有事件后,中继日志将会被自动删除。

从服务器在数据目录中另外创建两个状态文件--master.info和relay-log.info。状态文件保存在硬盘上,从服务器关闭时不会丢失。下次从服务器启动时,读取这些文件以确定它已经从主服务器读取了多少二进制日志,以及处理自己的中继日志的程度。

下面来看一下具体的配置:

一、准备服务器

由于MySQL不同版本之间的(二进制日志)binlog格式可能会不一样,因此最好的搭配组合是Master的MySQL版本和Slave的版本相同或者更低,Master的版本肯定不能高于Slave版本。

本文中,我们假设主服务器(以下简称Master)和从服务器(以下简称Slave)的版本都是5.1.35,操作系统是Centos 6.3。

假设同步Master的主机名为:master(IP:192.168.1.123),Slave主机名为:slave(IP:192.168.1.124),2个MySQL的basedir目录都是/usr/local/mysql,datadir都是:/var/lib/mysql。

二、设置同步服务器

1、设置同步Master

修改 my.cnf 文件,在

# Replication Master Server (default)# binary logging is required for replication

添加如下内容:

#log-bin=/var/log/mysql/updatelog
server-id = 1
auto_increment_increment = 2
auto_increment_offset = 1
binlog-do-db=discuz
binlog-ignore-db=mysql
#log-slave-updates
slave-skip-errors=all

注:

slave-skip-errors 是跳过错误,继续执行复制操作

多主互备和主从复制有一些区别,因为多主中 都可以对服务器有写权限,所以设计到自增长重复问题

出现的问题(多主自增长ID重复)
1:首先我们通过A,B的test表结构
2:掉A,在B上对数据表test(存在自增长ID)执行插入操作,返回插入ID为1
3:后停掉B,在A上对数据表test(存在自增长ID)执行插入操作,返回的插入ID也是1
4:然后 我们同时启动A,B,就会出现主键ID重复

解决方法:
我们只要保证两台服务器上插入的自增长数据不同就可以了
如:A查奇数ID,B插偶数ID,当然如果服务器多的话,你可以定义算法,只要不同就可以了

在这里我们在A,B上加入参数,以实现奇偶插入

A:my.cnf上加入参数

auto_increment_offset = 1
auto_increment_increment = 2

这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了

B:my.cnf上加入参数

auto_increment_offset = 2
auto_increment_increment = 2

这样B的auto_increment字段产生的数值是:2, 4, 6, 8, …等偶数ID了

可以看出,你的auto_increment字段在不同的服务器之间绝对不会重复,所以Master-Master结构就没有任何问题了。当然,你还可以使用3台,4台,或者N台服务器,只要保证auto_increment_increment = N 再设置一下auto_increment_offset为适当的初始值就可以了,那样,我们的MySQL可以同时有几十台主服务器,而不会出现自增长ID重复。

重启MySQL,创建一个MySQL帐号为同步专用

# /usr/local/mysql/bin/mysql -u root -p
mysql> GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO   'root'@'%' IDENTIFIED BY 'root';
mysql> FLUSH PRIVILEGES ;

如果想要在Slave上有权限执行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 语句的话,必须授予全局的 FILE 和 SELECT 权限:

2、设置同步Slave

修改my.cnf文件,添加

server-id = 2
auto_increment_increment = 2
auto_increment_offset = 2
master-host = 192.168.1.123
master-user = root
master-password = root
master-port = 3306
replicate-ignore-db=mysql
replicate-do-db=discuz
#log-slave-updates
slave-skip-errors=all

重启MySQL

3、启动同步

在主服务器master MySQL命令符下:

# /usr/local/mysql/bin/mysql -u root -p
mysql> show master status;  显示(当然这个是我机器的情况,你的不可能跟我一样哈,只是个例子):
+------------------+----------+-------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+-------------------+------------------+
| mysql-bin.000009 | 98 | discuz | mysql |
+------------------+----------+-------------------+------------------+

在从服务器master MySQL命令符下:

# /usr/local/mysql/bin/mysql -u root -p
mysql> slave stop;
mysql> change master to master_host='192.168.1.123', master_user='root', master_password='root', master_log_file='mysql-bin.000009', master_log_pos=98;
mysql> slave start;
mysql> show slave status\G;    Slave_IO_Running: Yes  Slave_SQL_Running: Yes

如果都是yes,那代表已经在同步

往表里面写点数据测试一下看是否同步成功,如果不成功,绝对不是你的RP问题,再检查一下操作步骤!

4、设置双向同步

修改slave服务器的my.cnf,添加

log-bin=/var/log/mysql/updatelog
binlog-do-db=discuz
binlog-ignore-db=mysql

重启MySQL,创建一个MySQL帐号为同步专用

mysql> GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
mysql> GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO   'root'@'%' IDENTIFIED BY 'root';
mysql> FLUSH PRIVILEGES ;

修改master服务器的my.cnf,添加

master-host = 192.168.1.124
master-user = root
master-password = root
master-port = 3306
replicate-ignore-db=mysql
replicate-do-db=discuz

重启MySQL

在主服务器slave MySQL命令符下:

show master status;
+------------------+----------+-------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+-------------------+------------------+
| mysql-bin.000013 | 98 | discuz | mysql |
+------------------+----------+-------------------+------------------+

在服务器A MySQL命令符下:

mysql> slave stop;
mysql> change master to master_host='192.168.1.124', master_user='root', master_password='root', master_log_file='mysql-bin.000013', master_log_pos=98;
mysql> slave start;

其实也就是A->B单向同步的反向操作!双向同步,就这么简单啦!

提示:如果修改了主服务器的配置,记得删除从服务器上的master.info文件。否则从服务器使用的还是老配置,可能会导致错误。

-----------------------------------------------------------------------------------

注意:关于要复制多个数据库时,binlog-do-db和replicate-do-db选项的设置,网上很多人说是用半角逗号分隔,经过测试,这样的说法是错误的,MySQL官方文档也明确指出,如果要备份多个数据库,只要重复设置相应选项就可以了。

比如:

binlog-do-db=a
binlog-do-db=b
replicate-do-db=a
replicate-do-db=b

补:

# 启用从库日志,这样可以进行链式复制

log-slave-updates

# 从库是否只读,0表示可读写,1表示只读

read-only=1

# 只复制某个表

replicate-do-table=tablename

# 只复制某些表(可用匹配符)

replicate-wild-do-table=tablename%

# 只复制某个库

replicate-do-db=dbname

# 只复制某些库

replicte-wild-do-db=dbname%

# 不复制某个表

replicate-ignore-table=tablename

#不复制某些表

replicate-wild-ignore-table=tablename%

#不复制某个库

replicate-ignore-db=dbname

#复制完的sql语句是否立即从中继日志中清除,1表示立即清除

relay-log-purge=1

转载于:https://my.oschina.net/51clocker/blog/388258

mysql主从双向同步复制相关推荐

  1. MySQL 数据库双向同步复制

    MySQL 复制问题的最后一篇,关于双向同步复制架构设计的一些设计要点与制约. 问题和制约 数据库的双主双写并双向同步场景,主要考虑数据完整性.一致性和避免冲突.对于同一个库,同一张表,同一个记录中的 ...

  2. Mysql双向同步复制

    Mysql双向同步复制 http://zhumeng8337797.blog.163.com/blog/static/1007689142011590160330/ 2011-06-09 00:16: ...

  3. Linux MySQL主主复制(Replication)(MySQL数据双向同步)配置

    http://www.centos.bz/2011/07/linux-mysql-replication-two-way-sync/#配置当前从服务器 Linux MySQL主主复制(Replicat ...

  4. MySQL主从数据库同步延迟问题解决

    MySQL主从数据库同步延迟问题 摘要: MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响 ...

  5. Mysql5.7的gtid主从半同步复制和组复制

    (一)gtid主从半同步复制 一.半同步复制原理 mysql默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主库如果cr ...

  6. MySQL数据库半同步复制

    半同步复制,是有一个从节点或者一部分从节点与主节点之间是同步复制的,其他的从节点仍是异步复制 半同步复制是谷歌公司贡献给MySQL的一个插件,默认在MySQL中没有此插件,所以要实现主从的版同步复制需 ...

  7. mysql主从同步默认延迟_减少mysql主从数据同步延迟问题的详解

    基于局域网的master/slave机制在通常情况下已经可以满足'实时'备份的要求了.如果延迟比较大,就先确认以下几个因素: 1. 网络延迟 2. master负载 3. slave负载 一般的做法是 ...

  8. mysql的半同步复制

    mysql的半同步复制: 一.测试环境: 两台redhat linux5.8虚拟机: Master: IP地址:172.16.77.77 MySQL版本:5.5.28 操作系统:RHEL5.8 Sla ...

  9. mysql主从不同步怎么恢复_mysql主从不同步时,怎么恢复

    mysql主从不同步时,怎么恢复 Mysql的主从数据库没有同步 先上Master库: mysql>show processlist;   查看下进程是否Sleep太多.发现很正常. show  ...

最新文章

  1. js进阶 11-22/23 js如何实现选项卡
  2. 《LeetCode力扣练习》第94题 二叉树的中序遍历 Java
  3. 查看文件的MD5/SHA1效验值
  4. 取消chrome下input和textarea的聚焦边框
  5. hadoop 2.9.2 yarn配置公平调度器
  6. Android Studio最全插件整理
  7. 连接 Microsoft Cloud App Security 的数据
  8. 分析:新建短信,当我们接受人RecipientsEditor中输入+86的时候,系统会自己主动在+86后增加空格...
  9. 获取会话名称时错误 5_5种可重复的数据科学工具
  10. 从点击一个链接到浏览器显示页面,这个过程中发生了什么?
  11. SystemFile
  12. easyExcel 处理ExcelDataConvertException异常,获取异常的数据行列值等信息
  13. 智能交通大数据体系实践
  14. 洛谷P1894 [USACO4.2]完美的牛栏The Perfect Stall(二分图最大匹配)
  15. python3 爬取网页表格例子
  16. python 编写正三角形,倒三角和菱形和各种镂空菱形
  17. 渗透测试-流量加密之冰蝎蚁剑
  18. adb常用命令以及使用
  19. java里dialect_iBatis3基于方言(Dialect)的分页
  20. 高斯消元法的MATLAB代码

热门文章

  1. ML大杂烩:**常见机器学习算法公式梳理
  2. linux apu 分辨率,编写xorg.conf 简单三行解决Ubuntu分辩率不可调的问题
  3. Docker(二)容器操作容器
  4. WPF绘制光滑连续贝塞尔曲线
  5. 【转】 SLIC超像素分割详解(一):简介
  6. MVP Community Camp 社区大课堂
  7. Linux用系统命令杀死僵尸进程
  8. 关于textarea的ie9的maxlength不起作用的问题,请参考如下URL解决。
  9. VB.NET 开发ColorPicker例子
  10. Rows Over Window与Range Over Window的区别