MySQL集群:双主模式

news2025/8/12 0:18:00

目录

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于 Laravel Redis 多个进程同时取队列问题详解

最近在工作中遇到了一个问题,开启多个进程处理队列会重复读取 Redis 中队列吗?是否因此导致重复执行任务?下面就来通过示例代码详细介绍下。 使用 Supervisor 监听 Laravel 队列任务,其中 Supervisor 的配置如下: 1 2…

.net----泛型

泛型泛型的基本概念集合类System. Collections. ArrayList泛型集合类System. Collection. Generic. List<T>ArrayListList<T>泛型的定义和类型参数类型参数<T>泛型类和泛型接口泛型类泛型接口泛型结构泛型方法泛型委托和泛型事件default关键字及协变和逆变协…

手动引入jar包,解决Dependency ‘XXX‘ not found的两种方式

目录引言一、使用systemPath导入&#xff08;一&#xff09;将jar包复制到指定文件夹&#xff08;二&#xff09;在pom文件中引入jar包**这里有一个超级大的坑&#xff0c;就是systemPath不支持聚合工程的父子传导&#xff01;&#xff01;&#xff01;****不支持pom工程的继承…

Linux零基础从入门到精通,必学的55个指令合集【上篇】

Linux学习笔记 资料下载&#xff1a; 链接: https://pan.baidu.com/s/1UvwkJaEJO7W3sU5qkCgKzA?pwdfe2f提取码: fe2f 本篇文章主要适用0基础的读者&#xff0c;内容会比较通俗易懂&#xff0c;也会有详细的图解教程&#xff0c;以及运行后的返回结果。我本人在系统性的学习…

G1D22-安装burpsuiteAttacKG

–0724 还有几分钟&#xff0c;把burpsuite安装一下 —0804 hh当然&#xff0c;和室友聊天去啦hhh java目录下找不到jdk&#xff0c;环境变量没法配emm&#xff0c;重新装一下。 emm原来这个文件夹是在安装时自己创建的 啊啊啊&#xff0c;我是猪emm javasuite闪退是因为环境变…

别瞎扯,元宇宙就是没有切实发展?

前言 最近两年&#xff0c;技术圈比较火的话题之一就是&#xff1a;元宇宙&#xff0c;而且2021年被看作是元宇宙元年&#xff0c;直到现在元宇宙话题依然不断&#xff0c;因为元宇宙在过去的一年里太火了。不管是在国内还是国外&#xff0c;元宇宙太火了&#xff0c;而且与元宇…

WPF项目实战布局--通用固件下载 C#

每个作品都是产品 C# WPF版效果&#xff1a; C# winForm版效果: 一.布局设计UI 1.主体&#xff1a;grid 2行 2列 00 下载按钮 20% 01进度条 80% &#xff08;同时显示百分比&#xff09; 10 11都是跨列 显示日志 2.细节&#xff1a;百分比与进度条Value绑定。下载按钮…

java EE初阶 — 计算机工作原理

文章目录1.操作系统2.操作系统的定位3.进程3.1 进程的基本了解3.2 操作系统内核是如何管理软件资源的3.3 PCB里描述了进程的哪些特征3.3.1 三个较为简单的特征3.3.2 进程的调度属性4.内存管理1.操作系统 操作系统是一个搞管理的软件。 对上要给软件提供稳定的运行环境。对下要…

Java面向对象之——继承

文章目录前言一、继承机制二、继承的语法三、父类成员访问&#x1f351;1、子类中访问父类的成员变量&#x1f351;2、子类中访问父类的成员方法四、super关键字五、子类构造方法六、super和this七、继承关系下的代码执行顺序八、访问限定修饰符protected九、Java继承方式十、f…

C#界面里Control.ImeMode 属性的使用

C#界面里Control.ImeMode 属性的使用 Control.ImeMode 属性是获取或设置控件的输入法编辑器 (IME) 模式。 输入法是一种特殊的程序,可以通过某种方式进行激活。 输入法程序总是在别的程序上面,因此它的运行是一种特殊的状态,所以需要特别处理。 因为电脑当时为了输入26个字…

第 46 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京),签到题5题

文章目录A.Oops, Its Yesterday Twice MoreM.Windblume FestivalC.Klee in Solitary ConfinementH.CrystalflyD.Paimon Sorting补题链接&#xff1a;https://codeforces.com/gym/103470 A.Oops, It’s Yesterday Twice More Oops, It’s Yesterday Twice More Input file: st…

2020-RKT

2020-RKT&#xff1a;Relation-Aware Self-Attention for Knowledge Tracing 有代码&#xff1a;https://github.com/shalini1194/RKT 摘要 学生在解决练习的过程中获得技能&#xff0c;每一次这样的互动都对学生解决未来练习的能力有明显的影响。 这种影响表现为:1)互动中涉…

Transformer13~目标检测算法汇总

都到了13了 ~~ 还是基于这个的么办法 自从VIT横空出世以来&#xff0c;Transformer在CV界掀起了一场革新&#xff0c;各个上下游任务都得到了长足的进步&#xff0c;然后盘点一下基于Transformer的端到端目标检测算法&#xff01; 原始Tranformer检测器 DETR&#xff08;ECCV…

神经网络架构

神经网络架构 首先我们来看一张图&#xff0c;左边的是生物上的神经网络&#xff0c;右边的是数学版的神经网络 下面我们介绍在深度学习中神经网络的基本架构 整体架构包括层次结构&#xff0c;神经元&#xff0c;全连接&#xff0c;非线性四个部分 我们将针对这四个部分来进…

章节4 Linux操作系统基础知识

4.1-Linux系统结构 Linux系统结构 内核Shell文件系统应用程序 Linux操作系统内核 管理进程管理内存管理驱动管理文件和网络 … Linux Shell 接收用户的命令&#xff0c;经过转换&#xff0c;交给内核去执行 cat —> open() read() 简化操作安全 Linux Shell工具&am…

【docker学习记录】docker安装mysql、redis

目录 docker安装mysql docker安装redis docker安装mysql 1.下载镜像文件 $ sudo docker pull mysql:8.0.31 下载完成后查看一下镜像&#xff1a;sudo docker images 2.创建实例并启动 //mysql版本5 sudo docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var…

uniapp的安装与基础

解释 由dcloud 公司开发的 多端融合框架 1次开发 多端运行 竞品&#xff1a;apiCloud &#xff0c;appCan &#xff0c;Codova 技术架构 Vue语法小程序的api Hybrid混合开发端 App端 - HTML - nvue&#xff08;原生view&#xff09; - native.js(js原生沟通的桥梁) - weex …

目前是大专学历如何快速提升到本科学历?学历提升有哪几种形式呢?

目前是大专学历如何快速提升到本科学历&#xff1f;学历提升有哪几种形式呢&#xff1f; 如今想要晋升和加薪&#xff0c;很多除了工作能力分级&#xff0c;另一个是文凭&#xff0c;许多企业和机构基本上是基于文凭来决定基本工资&#xff0c;所以想得到更好的待遇&#xff0c…

深度强化学习+金融投资的应用入门

原创文章第114篇&#xff0c;专注“个人成长与财富自由、世界运作的逻辑&#xff0c; AI量化投资”。 今天的核心工作是把强化学习环境整合进我们的AI量化平台中。 网上很多代码都把数据获取和预处理&#xff0c;都整合到强化学习的环境里&#xff0c;对于总体量化平台而言&am…

python搭建沙箱环境

python搭建沙箱环境 文章目录python搭建沙箱环境一&#xff0c;下载virtualenv模块1.1 在线状态的下载1.2 离线状态的下载二&#xff0c;创建沙箱环境&#xff08;虚拟环境&#xff09;三&#xff0c;激活以及退出沙箱环境一&#xff0c;下载virtualenv模块 1.1 在线状态的下载…