草庐IT

MySQL集群:双主模式

零点冰. 2023-06-05 原文

目录

1、双主模式

1.1、高可用架构

1.2、MMM架构(基于双主模式)

1.2.1、MMM故障处理机制

1.2.2、MMM监控机制

1.3、MHA架构(基于主从模式)

1.3.1、MHA故障处理机制

1.3.2、MHA优点

1.4、主备切换

1.4.1、主备延迟问题

1.4.2、可靠性优先

1.4.3、可用性优先

2、双主模式实战 

2.1、修改master1的my.ini配置文件

2.2、​​​​​​​在主库master1配置slave访问master1的用户的ip权限

2.3、修改master2的my.ini配置文件

​​​​​​​2.4、在主库master2配置slave访问master2的用户的ip权限

​​​​​​​2.5、在主库master1配置master2的关联关系

2.6、在主库master2配置master1的关联关系


1、双主模式

两台服务器互为主从,任何一台服务器数据变更,都会通过复制应用到另外一方的数据库中。

可解决因主库故障导致的服务不可用情况。

可分为双主单写(推荐)和双主双写模式,双主双写模式会存在如下问题:

  • ID冲突

        在A主库写入,当A数据未同步到B主库时,对B主库写入,如果采用自动递增容易发生ID主键的冲突。可以采用MySQL自身的自动增长步长来解决,例如A的主键为1,3,5,7...B的主键为2,4,6,8... ,但是对数据库运维、扩展都不友好。

  • 更新丢失

        同一条记录在两个主库中进行更新,会发生前面覆盖后面的更新丢失。

1.1、高可用架构

        一个Master提供线上服务,另一个Master作为备胎供高可用切换,Master下游挂载Slave承担读请求。

        通过引入高可用组件(MMM、Keepalived),实现主库故障的自动切换。

 1.2、MMM架构(基于双主模式)

        MMM(Master-Master Replication Manager for MySQL)是一套用来管理和监控双主复制,支持双主故障切换的第三方软件。同一时间只允许一个节点进行写入操作。

1.2.1、MMM故障处理机制

MMM 包含writer和reader两类角色,分别对应写节点和读节点。

  1. 当 writer节点出现故障,程序会自动移除该节点上的VIP(虚拟IP)
  2. 写操作切换到 Master2,并将Master2设置为writer
  3. 将所有Slave节点会指向Master2

除了管理双主节点,MMM 也会管理 Slave 节点,在出现宕机、复制延迟或复制错误,MMM 会移除该节点的 VIP,直到节点恢复正常。

1.2.2、MMM监控机制

MMM 包含monitor和agent两类程序,功能如下:

  • monitor:监控集群内数据库的状态,在出现异常时发布切换命令,一般和数据库分开部署。
  • agent:运行在每个 MySQL 服务器上的代理进程,monitor 命令的执行者,完成监控的探针工作和具体服务设置,例如设置 VIP(虚拟IP)、指向新同步节点

1.3、MHA架构(基于主从模式)

        MHA(Master High Availability)是一套比较成熟的 MySQL 高可用方案,也是一款优秀的故障切换和主从提升的高可用软件。

        在MySQL故障切换过程中,MHA能做到30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。MHA还支持在线快速将Master切换到其他主机,通常只需0.5-2秒。

        目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器

MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)

  • MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。负责检测master是否宕机、控制故障转移、检查MySQL复制状况等。
  • MHA Node运行在每台MySQL服务器上,不管是Master角色,还是Slave角色,都称为Node,是被监控管理的对象节点,负责保存和复制master的二进制日志、识别差异的中继日志事件并将其差异的事件应用于其他的slave、清除中继日志。

MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master,整个故障转移过程对应用程序完全透明。

1.3.1、MHA故障处理机制

  1. 把宕机masterbinlog保存下来
  2. 根据binlog位置点找到最新的slave
  3. 用最新slaverelay log修复其它slave
  4. 将保存下来的binlog在最新的slave上恢复
  5. 将最新的slave提升为master
  6. 将其它slave重新指向新提升的master,并开启主从复制

1.3.2、MHA优点

  • 自动故障转移快
  • 主库崩溃不存在数据一致性问题
  • 性能优秀,支持半同步复制和异步复制
  • 一个Manager监控节点可以监控多个集群

1.4、主备切换

        将主库变为从库,将从库变为主库。分为可靠性优先和可用性优先,主备切换时存在延迟问题。

1.4.1、主备延迟问题

主备同步流程分为如下三个步骤:

  1. 主库 A 执行完成一个事务,写入 binlog,我们把这个时刻记为 T1;
  2. 主库A将binlog传给备库B,我们把备库B接收完 binlog 的时刻记为 T2;
  3. 备库 B 执行完成这个binlog复制,我们把这个时刻记为 T3。

主备延迟,就是同一个事务,在备库执行完成的时间和主库执行完成的时间之间的差值,也就是 T3-T1

在备库上执行show slave status命令,它可以返回结果信息,seconds_behind_master表示当前备库延迟了多少秒。

同步延迟主要原因如下:

  • 备库机器性能问题

        机器性能差,甚至一台机器充当多个主库的备库。

  • 分工问题

        备库提供了读操作,或者执行一些后台分析处理的操作,消耗大量的CPU资源。

  • 大事务操作

        大事务耗费的时间比较长,导致主备复制时间长。比如一些大量数据的delete或大表DDL操作都可能会引发大事务

1.4.2、可靠性优先

        主备切换过程一般由专门的HA高可用组件完成,但是切换过程中会存在短时间不可用,因为在切换过程中某一时刻主库A和从库B都处于只读状态。

  1. 判断从库B的Seconds_Behind_Master值,当小于某个值才继续下一步
  2. 把主库A改为只读状态(readonly=true)
  3. 等待从库B的Seconds_Behind_Master值降为 0
  4. 把从库B改为可读写状态(readonly=false)
  5. 把业务请求切换至从库B

1.4.3、可用性优先

        不等主从同步完成, 直接把业务请求切换至从库B ,并且让 从库B可读写 ,这样几乎不存在不可用时间,但可能会数据不一致。

  1. 主库A执行完 INSERT c=4 ,得到 (4,4) ,然后开始执行 主从切换
  2. 主从之间有5S的同步延迟,从库B会先执行 INSERT c=5 ,得到 (4,5)
  3. 从库B执行主库A传过来的binlog日志 INSERT c=4 ,得到 (5,4)
  4. 主库A执行从库B传过来的binlog日志 INSERT c=5 ,得到 (5,5)
  5. 此时主库A和从库B会有 两行 不一致的数据

2、双主模式实战 

​​​​​​​2.1、修改master1的my.ini配置文件

Log_bin=mysql-bin #开启bin log日志功能

Server-id=1 #设置server-id

Sync-binlog=1

Binlog-ignore-db=information_schema #指定需要同步的数据

Binlog-ignore-db=performation_schema

Binlog-ignore-db=sys

Relay_log=mysql-relay-bin #开启relay log配置

Log_slave_updates=1 #在master做了更新操作是否将修改写入binlog

Auto_increment_offset=1 #双主双写时配置,配置主键自增开始值

Auto_increment_increment=2 #双主双写时配置,配置主键自增步长

2.2、​​​​​​​在主库master1配置slave访问master1的用户的ip权限

grant replication slave on *.* to '用户名'@'%' identified by '密码';
grant all privileges on *.* to '用户名'@'%' identified by '密码';

show master status;

 2.3、修改master2的my.ini配置文件

Log_bin=mysql-bin					#开启bin log日志功能
Server-id=3							#设置server-id
Sync-binlog=1
Binlog-ignore-db=information_schema		#指定需要同步的数据
Binlog-ignore-db=performation_schema
Binlog-ignore-db=sys
Relay_log=mysql-relay-bin				#开启relay log配置
Log_slave_updates=1					#在master做了更新操作是否将修改写入binlog
Auto_increment_offset=2				#双主双写时配置,配置主键自增开始值
Auto_increment_increment=2			#双主双写时配置,配置主键自增步长

​​​​​​​2.4、在主库master2配置slave访问master2的用户的ip权限

grant replication slave on *.* to '用户名'@'%' identified by '密码';
grant all privileges on *.* to '用户名'@'%' identified by '密码';

show master status;

 ​​​​​​​2.5、在主库master1配置master2的关联关系

change master to master_host='master2 IP', master_port=3306, master_user='root', master_password='root', master_log_file='master2 bin log文件名',master_log_pos=107

2.6、在主库master2配置master1的关联关系

change master to master_host='master1 IP', master_port=3306, master_user='root', master_password='root', master_log_file='master1 bin log文件名',master_log_pos=107

以上内容为个人学习理解,如有问题,欢迎在评论区指出。

部分内容截取自网络,如有侵权,联系作者删除。

有关MySQL集群:双主模式的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  4. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  5. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  6. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

    了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

  7. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  8. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

  9. Ruby:标准递归模式 - 2

    我经常迷上ruby​​的一件事是递归模式。例如,假设我有一个数组,它可能包含无限深度的数组作为元素。所以,例如:my_array=[1,[2,3,[4,5,[6,7]]]]我想创建一个方法,可以将数组展平为[1,2,3,4,5,6,7]。我知道.flatten可以完成这项工作,但这个问题是作为我经常遇到的递归问题的一个例子-因此我试图找到一个更可重用的解决方案。简而言之-我猜这种事情有一个标准模式,但我想不出任何特别优雅的东西。任何想法表示赞赏 最佳答案 递归是一种方法,它不依赖于语言。您在编写算法时要考虑两种情况:再次调用函数的情

  10. ruby - 在 Ruby 中查找多个正则表达式匹配的模式和位置 - 2

    这应该是一个简单的问题,但我找不到任何相关信息。给定一个Ruby中的正则表达式,对于每个匹配项,我需要检索匹配的模式$1、$2,但我还需要匹配位置。我知道=~运算符为我提供了第一个匹配项的位置,而string.scan(/regex/)为我提供了所有匹配模式。如果可能,我需要在同一步骤中获得两个结果。 最佳答案 MatchDatastring.scan(regex)do$1#Patternatfirstposition$2#Patternatsecondposition$~.offset(1)#Startingandendingpo

随机推荐