MySQL双主机双Master方案测试

必须避免系统中任何一处出现单点故障。

如果主MySQL所在的物理机器出现硬件故障,就是一个单点故障,虽然可以迅速的用一台从属机(Slave)升级为主机(Master). 但是也会比较慢。 最好的方法还是用双Master方案避免出现单点故障。

此试验预计花费时间 2天。

需要解决下面二个问题

1.实现二台主数据库的循环同步,即A库有变化,B库同步;同理B库有变化,A库同步;

2.当A库发生故障后,及时报警,同时B库替换为A库为主库,与所有slave服务器通讯正常;

准备工作

写道

一般来说,master机与slave机的mysql版本尽量一致,或者master比slave高.但我们这里是双master,即互为主从,所以mysql的版本要保持一致;

打算用我自己的机器与192.168.0.8的机器来做测试;

A:192.168.0.219(本机)
B:192.168.0.8

查看一下版本
A:$ mysql -V
mysql Ver 14.14 Distrib 5.1.62, for debian-linux-gnu (i486) using readline 6.1

B:$ mysql -V
mysql Ver 14.14 Distrib 5.5.13, for FreeBSD8.1 (amd64) using 5.2

升级mysql

将本机的mysql升级到5.5版本

创建同步帐号

Python代码  

  1. 因为服务器A及服务器B互为主从,所以要分别为其建立同步帐号,都授予REPLIATION SLAVE权限.

  2. A:

  3. mysql>grant replication slave on *.* to 'replicate'@'192.168.0.8' identified by '123456';

  4. mysql>flush privileges;

  5. B:

  6. mysql>grant replication slave on *.* to 'replicate'@'192.168.0.219' identified by '123456';

  7. mysql>flush privileges;

  8. 如果不行直接进phpmyadmin去创建也一样;

  9. 测试一下.

  10. A:

  11. mysql -h192.168.0.8 -ureplicate -p123456  能进入mysql> OK!!

  12. B:

  13. mysql -h192.168.0.219 -ureplicate -p123456  能进入mysql> OK!!

修改配置文件my.cnf

Xml代码  

  1. A:

  2. [mysqld]

  3. server-id        = 1

  4. log-bin          = mysql-bin

  5. binlog-do-db     = test-xf

  6. binlog-ignore-db = mysql

  7. #主-主需要多添加的部分

  8. replicate-do-db = test-xf  

  9. replicate-ignore-db = mysql,information_schema

  10. log-slave-updates  #如果一个master挂掉,另一个马上接管

  11. #下面3句,服务器频繁的刷新日志,这个保证了在其中一台挂掉的话,日志刷新到另外一台,从而保证了数据的同步.

  12. sync-binlog = 1

  13. auto_increment_offset = 1

  14. auto_increment_increment = 2

  15. 重启mysql服务: sudo /etc/init.d/mysql restart

  16. 查看master状态

  17. mysql> show master status\G;

  18. *************************** 1. row ***************************

  19. File: mysql-bin.000006

  20. Position: 977

  21. Binlog_Do_DB: test-xf

  22. Binlog_Ignore_DB: mysql

  23. 1 row in set (0.00 sec)

  24. ERROR:

  25. No query specified

  26. B:

  27. [mysqld]

  28. server-id        = 2

  29. log-bin          = mysql-bin

  30. binlog-do-db     = test-xf

  31. binlog-ignore-db = mysql

  32. #主-主需要多添加的部分

  33. replicate-do-db = test-xf

  34. replicate-ignore-db = mysql,information_schema

  35. log-slave-updates  #如果一个master挂掉,另一个马上接管

  36. #下面3句,服务器频繁的刷新日志,这个保证了在其中一台挂掉的话,日志刷新到另外一台,从而保证了数据的同步.

  37. sync-binlog = 1

  38. auto_increment_offset = 2

  39. auto_increment_increment = 2

  40. 重启mysql服务: sudo /usr/local/etc/rc.d/mysql-server restart

  41. 查看master状态:

  42. mysql> show master status\G;

  43. *************************** 1. row ***************************

  44. File: mysql-bin.000005

  45. Position: 348

  46. Binlog_Do_DB: test-xf

  47. Binlog_Ignore_DB: mysql

  48. 1 row in set (0.00 sec)

  49. ERROR:

  50. No query specified

指定同步位置

Xml代码  

  1. A:

  2. mysql> change master to

  3. -> master_host = '192.168.0.8',

  4. -> master_user = 'replicate',

  5. -> master_password = '123456',

  6. -> master_log_file = 'mysql-bin.000005',

  7. -> master_log_pos = 348;

  8. Query OK, 0 rows affected (0.44 sec)

  9. B:

  10. mysql> change master to

  11. -> master_host = '192.168.0.219',

  12. -> master_user = 'replicate',

  13. -> master_password = '123456',

  14. -> master_log_file = 'mysql-bin.000006',

  15. -> master_log_pos = 977;

  16. Query OK, 0 rows affected (0.05 sec)

重启A,B服务器上的从服务线程

Xml代码  

  1. A:

  2. mysql> start slave;

  3. Query OK, 0 rows affected (0.03 sec)

  4. mysql> show slave status\G;

  5. *************************** 1. row ***************************

  6. Slave_IO_State: Waiting for master to send event

  7. Master_Host: 192.168.0.8

  8. Master_User: replicate

  9. Master_Port: 3306

  10. Connect_Retry: 60

  11. Master_Log_File: mysql-bin.000005

  12. Read_Master_Log_Pos: 348

  13. Relay_Log_File: xiaofei-desktop-relay-bin.000002

  14. Relay_Log_Pos: 253

  15. Relay_Master_Log_File: mysql-bin.000005

  16. Slave_IO_Running: Yes

  17. Slave_SQL_Running: Yes

  18. Replicate_Do_DB: test-xf

  19. Replicate_Ignore_DB: mysql,information_schema

  20. Replicate_Do_Table:

  21. Replicate_Ignore_Table:

  22. Replicate_Wild_Do_Table:

  23. Replicate_Wild_Ignore_Table:

  24. Last_Errno: 0

  25. Last_Error:

  26. Skip_Counter: 0

  27. Exec_Master_Log_Pos: 107

  28. Relay_Log_Space: 419

  29. Until_Condition: None

  30. Until_Log_File:

  31. Until_Log_Pos: 0

  32. Master_SSL_Allowed: No

  33. Master_SSL_CA_File:

  34. Master_SSL_CA_Path:

  35. Master_SSL_Cert:

  36. Master_SSL_Cipher:

  37. Master_SSL_Key:

  38. Seconds_Behind_Master: 0

  39. Master_SSL_Verify_Server_Cert: No

  40. Last_IO_Errno: 0

  41. Last_IO_Error:

  42. Last_SQL_Errno: 0

  43. Last_SQL_Error:

  44. Replicate_Ignore_Server_Ids:

  45. Master_Server_Id: 2

  46. 1 row in set (0.01 sec)

  47. ERROR:

  48. No query specified

  49. B:

  50. mysql> start slave;

  51. Query OK, 0 rows affected (0.02 sec)

  52. mysql> show slave status\G;

  53. *************************** 1. row ***************************

  54. Slave_IO_State: Waiting for master to send event

  55. Master_Host: 192.168.0.219

  56. Master_User: replicate

  57. Master_Port: 3306

  58. Connect_Retry: 60

  59. Master_Log_File: mysql-bin.000006

  60. Read_Master_Log_Pos: 977

  61. Relay_Log_File: queen-relay-bin.000002

  62. Relay_Log_Pos: 253

  63. Relay_Master_Log_File: mysql-bin.000006

  64. Slave_IO_Running: Yes

  65. Slave_SQL_Running: Yes

  66. Replicate_Do_DB: test-xf

  67. Replicate_Ignore_DB: mysql,information_schema

  68. Replicate_Do_Table:

  69. Replicate_Ignore_Table:

  70. Replicate_Wild_Do_Table:

  71. Replicate_Wild_Ignore_Table:

  72. Last_Errno: 0

  73. Last_Error:

  74. Skip_Counter: 0

  75. Exec_Master_Log_Pos: 107

  76. Relay_Log_Space: 409

  77. Until_Condition: None

  78. Until_Log_File:

  79. Until_Log_Pos: 0

  80. Master_SSL_Allowed: No

  81. Master_SSL_CA_File:

  82. Master_SSL_CA_Path:

  83. Master_SSL_Cert:

  84. Master_SSL_Cipher:

  85. Master_SSL_Key:

  86. Seconds_Behind_Master: 0

  87. Master_SSL_Verify_Server_Cert: No

  88. Last_IO_Errno: 0

  89. Last_IO_Error:

  90. Last_SQL_Errno: 0

  91. Last_SQL_Error:

  92. Replicate_Ignore_Server_Ids:

  93. Master_Server_Id: 1

  94. 1 row in set (0.00 sec)

  95. ERROR:

  96. No query specified

  97. 二台服务器的:

  98. Slave_IO_Running: Yes

  99. Slave_SQL_Running: Yes

  100. 均为Yes表示启动成功;

开始测试数据

写道

A:

先在A建立一个test-xf的数据库,我们发现B已经同步好了test-xf库;

建tb_mobile表:
mysql> use test-xf;
Database changed
mysql> set names 'utf8';
Query OK, 0 rows affected (0.00 sec)

mysql> create table tb_mobile(mobile VARCHAR(20) comment'手机号码',time timestamp DEFAULT now() comment'时间');
Query OK, 0 rows affected (0.17 sec)

建完之后我们发现B中的test-xf也已经存在了;

接下来去B服务器进行测试;

在B服务器插入数据;
mysql> insert into tb_mobile(mobile) values('12254123876');
Query OK, 1 row affected (0.05 sec)

mysql> select * from tb_mobile;
+-------------+---------------------+
| mobile | time |
+-------------+---------------------+
| 12254123876 | 2012-06-01 14:40:15 |
+-------------+---------------------+
1 row in set (0.03 sec)

去A服务器中查看也成功了.

***我又在B服务器建了一个新库叫test-007,A服务器却没有同步,原因就是我们在my.cnf的时候设置的同步操作数据库仅有test-xf

配置参数解释

写道

server-id
ID值唯一的标识了复制群集中的主从服务器,因此它们必须各不相同。master_id必须为1到232–1之间的一个正整数值,slave_id值必须为2到232–1之间的一个正整数值。

log-bin
表示打开binlog,打开该选项才可以通过I/O写到Slave的relay-log,也是可以进行replication的前提;

binlog-do-db
表示需要记录进制日志的数据库。如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项

binlog-ignore-db
表示不需要记录二进制日志的数据库。如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项

replicate-do-db
表示需要同步的数据库,如果有多个数据库可用逗号分隔,或者使用多个replicate-do-db选项

replicate-ignore-db=mysql
表示不需要同步的数据库,如果有多个数据库可用逗号分隔,或者使用多个replicate-ignore-db=mysql选项

log-slave-updates
配置从库上的更新操作是否写入二进制文件,如果这台从库,还要做其他从库的主库,那么就需要打这个参数,以便从库的从库能够进行日志同步

slave-skip-errors
在复制过程,由于各种原因导致binlog中的sql出错,默认情况下,从库会停止复制,要用户介入。可以设置Slave-skip-errors来定义错误号,如果复制过程中遇到的错误号是定义的错误号,便可以跳过。如果从库是用来做备份,设置这个参数会存在数据不一致,不要使用。如果是分担主库的查询压力,可以考虑。

sync-binlog=1 or N
sync-binlog的默认值是0,这种模式下,MySQL不会同步到磁盘中去。这样的话,MySQL依赖操作系统来刷新二进制日志binary log,就像操作系统刷其他文件的机制一样。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能binlog中最后的语句丢失了。要想防止这种情况,你可以使用sync-binlog全局变量,使binlog在每N次binlog写入后与硬盘同步。当sync_binlog变量设置为1是最安全的,因为在crash崩溃的情况下,你的二进制日志binary log只有可能丢失最多一个语句或者一个事务。但是,这也是最慢的一种方式(除非磁盘有使用带蓄电池后备电源的缓存cache,使得同步到磁盘的操作非常快)。
即使sync-binlog设置为1,出现崩溃时,也有可能表内容和binlog内容之间存在不一致性。如果使用InnoDB表,MySQL服务器处理COMMIT语句,它将整个事务写入binlog并将事务提交到InnoDB中。如果在两次操作之间出现崩溃,重启时,事务被InnoDB回滚,但仍然存在binlog中。可以用–innodb-safe-binlog选项来增加InnoDB表内容和binlog之间的一致性。(注释:在MySQL 5.1中不需要–innodb-safe-binlog;由于引入了XA事务支持,该选项作废了),该选项可以提供更大程度的安全,使每个事务的 binlog(sync_binlog =1)和(默认情况为真)InnoDB日志与硬盘同步,该选项的效果是崩溃后重启时,在滚回事务后,MySQL服务器从binlog剪切回滚的 InnoDB事务。这样可以确保binlog反馈InnoDB表的确切数据等,并使从服务器保持与主服务器保持同步(不接收回滚的语句)。

auto_increment_offset和auto_increment_increment
auto_increment_increment和auto_increment_offset用于主-主服务器(master-to-master)复制,并可以用来控制AUTO_INCREMENT列的操作。两个变量均可以设置为全局或局部变量,并且假定每个值都可以为1到65,535之间的整数值。将其中一个变量设置为0会使该变量为1。
这两个变量影响AUTO_INCREMENT列的方式:auto_increment_increment控制列中的值的增量值,auto_increment_offset确定AUTO_INCREMENT列值的起点。
如果auto_increment_offset的值大于auto_increment_increment的值,则auto_increment_offset的值被忽略。例如:表内已有一些数据,就会用现在已有的最大的自增值做为初始值。

管理运行命令

写道

A.用于控制主服务器的SQL语句
PURGE MASTER LOGS
用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。

RESET MASTER
可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个新的二进制日志文件。

SET SQL_LOG_BIN
如果客户端使用一个有SUPER权限的账户连接,则可以禁用或启用当前连接的二进制日志记录。如果客户端没有此权限,则语句被拒绝,并伴随有错误。

SHOW BINLOG EVENTS
用于在二进制日志中显示事件。如果您不指定’log_name’,则显示第一个二进制日志。

SHOW MASTER LOGS
用于列出服务器中的二进制日志文件。

SHOW MASTER STATUS 
用于提供主服务器二进制日志文件的状态信息。

SHOW SLAVE HOSTS
用于显示当前使用主服务器注册的复制从属服务器的清单。

B、用于控制从服务器的SQL语句
CHANGE MASTER TO
可以更改从属服务器用于与主服务器进行连接和通讯的参数。

LOAD DATA FROM MASTER
用于对主服务器进行快照,并拷贝到从属服务器上。

LOAD TABLE tbl_name FROM MASTER
用于把表的拷贝从主服务器转移到从属服务器。

MASTER_POS_WAIT()
这实际上是一个函数,而不是一个语句。它被用于确认,从属服务器已读取并执行了到达主服务器二进制日志的给定位置。

RESET SLAVE
用于让从属服务器忘记其在主服务器的二进制日志中的复制位置。

SET GLOBAL SQL_SLAVE_SKIP_COUNTER
从主服务器中跳过后面的n个事件。要复原由语句导致的复制中止,这是有用的。

SHOW SLAVE STATUS
用于提供有关从属服务器线程的关键参数的信息。

START SLAVE
用于启动从属服务器线程

STOP SLAVE
用于中止从属服务器线程

主从复制如何提高可靠性

写道

主从单向复制,从服务器只是实时的保存了主服务器的一个副本。当主服务器发生故障时,可以切换到从服务器继续做查询,但不能更新。

如果采用双向复制,即两台mysql服务器即作为主服务器,又作为从服务器。那么两者都可以执行更新操作并能实现负载均衡,当一方出现故障时,另一方不受影响。
但是,除非能保证任何更新操作顺序都是安全的,否则双向复制会导致失败。

为了更好的提高可靠性和可用性,需要当主服务器不可用时,令从服务器成为Master。
原来的主服务器设定为Slave,并从新的Master上同步更新。现在已经有了一个这样开源解决方案[MySQL Master-Master Replication Manager]

带从服务器的MySql主主复制

http://www.litvip.com/2011/06/29/326

http://www.cnblogs.com/czh-liyu/archive/2012/06/01/2530482.html

出自:http://xiaolin0199.iteye.com/blog/2018414

本文转自笔下生辉  51CTO博客,原文链接:http://blog.51cto.com/752030200/1861801,如需转载请自行联系原作者

MySQL双主机双Master方案测试相关推荐

  1. 搭建Mysql双主双从报错The slave I/O thread stops because master and slave have equal MySQL server UUIDs(已解决)

    搭建Mysql双主双从报错The slave I/O thread stops because master and slave have equal MySQL server UUIDs 具体问题 ...

  2. 2022双十一7950x主机配置即简单测试

    2022双十一7950x主机配置即简单测试 主机配置 简单测试(待补充) 个人经验 主机配置 类别 型号 主板 ROG-X670E-E CPU AMD7950X 散热 利民FC140 内存 海力士小绿 ...

  3. Mysql 集群双主双从安装使用详细讲解

    文章目录 下载Mysql 安装单机Mysql 配置Mysql集群 双Master配置 master1配置 master2配置 配置说明 双Slave配置 Slave1配置 Slave2配置 双 Mas ...

  4. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变...

    [Mysql主从复制] 解决的问题 数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了. 负载均 ...

  5. MyCat实现MySQL读写分离(双主双从多库)

    在数据库集群架构中,主数据库负责处理事务性查询(写入操作),而从数据库只负责处理select查询(读操作),这样可以提高数据库整体读写性能.主数据库另外一个功能就是负责将数据变更同步到从数据库中. 读 ...

  6. MySQL 学习 - Replication集群 - 搭建 - 双主双从

    前言 我们这里说的是双主双从集群搭建,当然这个是看你实际业务,说白了一点 两个主节点双向同步,A集群挂掉时,B集群因为双向同步,立即可以开始工作,实现高可用 基本原理 具体流程 主库将变更写入到主库的 ...

  7. MySQL之主从复制(双主双从)

    MySQL一主一从点击跳转 MySQL双主双从原理: master 1 为处理写请求: master 2 和 两个从机(slave1,slave2)负责读请求: 当master 1 宕机时,由mast ...

  8. MySQL主从复制配置过程(双主双从模式)

    环境准备 为了搭建MySQL数据库主从复制(双主双从模式),准备一下四台服务器,并明确了各节点的角色及IP地址. 角色 IP地址 节点名称 Master1 192.168.67.140 CentOS0 ...

  9. 【mysql】mysql的数据库主从2(双主双从)

    在搭建mysql的数据库双主双从之前,我们在四台不同的服务器上搭建mysql数据库,安装的步骤在下面的博客中: linux安装mysql :https://blog.csdn.net/wangyunz ...

  10. MyCat学习:使用MySQL搭建主从复制(双主双从模式)

    首先,上一篇我们建立了一主一丛模式的MySQL读写分离 点击这里 那么接下来,我们搭建双主双从模式的读写分离,并且使用MyCat登录访问 原理:master1,master2,slave1,slave ...

最新文章

  1. 8E1转10M/100M以太网===协转
  2. java spring 上传图片,springboot 上传图片并回显
  3. C++(九)——职工信息管理系统
  4. hdu 5305 回溯+剪枝
  5. 计算机电源风扇维修,电脑电源开关维修和电源风扇加油图解全过程.doc
  6. 【算法】LeetCode算法题-Remove Duplicates from Sorted Array
  7. androidannotations gradle Android Studio
  8. OPenCV的中cvErode和cvDilate腐蚀和膨胀函数
  9. [Machine Learning Algorithm] 决策树与迭代决策树(GBDT)
  10. edem合成运动教程
  11. acdsee 5.0简体中文免费下载【非常流行的看图工具】
  12. macOS Mojave 夜神模拟器打不开解决办法
  13. 2020-11-12
  14. python实现网页爬虫_python实现页面爬虫(selenium,pyppeteer)
  15. 渗透测试、安服等面试资料
  16. 为梦想学习,是最酷的事
  17. OpenSUSE安装配置TeXLive2015.iso、前端软件Kile、Lyx、TeXstudio及TeX的更新管理界面的使用
  18. 亚盛医药全球总部、研发中心正式启用;强生医疗中国“智造”爱惜康新一代抗菌薇乔可吸收缝线上市 | 医药健闻...
  19. 苏嵌学习日志03 07.13
  20. 读完这篇,让你真正理解Redis持久化

热门文章

  1. Python星号表达式
  2. MySQL Sleep进程
  3. JavaScript跨域调用基于JSON的RESTful API
  4. 前台实现ajax 需注意的地方
  5. Xcode6 部署iphone4s出现的问题 No architectures to compile for
  6. 编译器错误信息: CS1010: 常数中有换行符
  7. maven环境、本地仓储配置(下载安装)
  8. ASP.NET 实现文件下载
  9. 机器学习之特征选择方法
  10. 《Unix环境高级编程》学习笔记