MySQL MGR集群原理及实践
moboyou 2025-03-28 13:15 24 浏览
一、MGR简介
MGR全称MySQL Group Replication(Mysql组复制),是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案。MGR提供了高可用、高扩展、高可靠的MySQL集群服务。在MGR出现之前,用户常见的MySQL高可用方式,无论怎么变化架构,本质就是Master-Slave架构。MySQL 5.7版本开始支持无损半同步复制(lossless semi-sync replication),从而进一步提示数据复制的强一致性。
MySQL Group Replication(MGR)是MySQL官方在5.7.17版本引进的一个数据库高可用与高扩展的解决方案,以插件形式提供。MGR基于分布式paxos协议,实现组复制,保证数据一致性。内置故障检测和自动选主功能,只要不是集群中的大多数节点都宕机,就可以继续正常工作。提供单主模式与多主模式,多主模式支持多点写入。
二、MGR原理
组复制是一种可用于实现容错系统的技术。复制组是一个通过消息传递相互交互的Server集群。复制组由多个Server成员组成,如下图的Master1、Master2、Master3,所有成员独立完成各自的事务。
当客户端发起一个更新事务时,该事务先在本地执行,执行完成之后就要发起对事务的提交操作。在还没有真正提交之前,需要将产生的复制写集广播出去,复制到其它成员。如果冲突检测成功,组内决定该事务可以提交,其它成员可以应用,否则就回滚。
最终,所有组内成员以相同的顺序接收同一组事务。因此组内成员以相同的顺序应用相同的修改,保证组内数据强一致性。
三、MGR特点
高一致性。基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
高容错性。只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
高扩展性。节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
高灵活性。有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。
四、使用限制
(1) 仅支持innodb引擎
为什么需要使用innodb引擎呢?在MySQL Group Replication中,事务以乐观形式执行,但是在提交时检查冲突,如果存在冲突,则会在某些实例上回滚事务,保持各个实例的数据一致性,那么,这就需要使用到 事务存储引擎,同事Innodb提供一些额外的功能,可以更好的管理和处理冲突,所以建议 业务使用表格使用inndb存储引擎,类似于系统表格mysql.user使用MyISAM引擎的表格,因为极少修改及添加,极少出现冲突情况。
(2)主键
每个需要复制的表格都必须定义一个显式主键,注意跟隐式主键区分(使用Innodb引擎的表格,如果没有指定主键,默认选择第一个非空的唯一索引作为主键,如果没有,则自动创建一个6个字节的rowid隐式主键)。这个主键能在冲突发生时启动极其重要的作用,同时,能够有效提高relay log的执行效率。
(3)隔离级别
官网建议使用READ COMMITTED级别,除非应用程序依赖于REPLEATABLE READ,RC模式下没有GAP LOCK,比较好支持Innodb本身的冲突检测机制何组复制的内部分布式检测机制一起协同工作。不支持SERIALIZABLE隔离级别。
(4)外键
不建议使用级联外键,如果旧库本身有外键,业务上无法去除并且使用的是多主模式,那么,请配置
group_replication_enforce_update_everywhere_check ,强制检查每个组成员的级联检查,避免多主模式下执行级联操作造成的检测不到的冲突。
五、参数规范
因前期创建实例大多采取默认配置 导致开发,测试,生产等环境间数据库参数不同 对程序运行有一定的影响。 以后创建实例将会参数规范化 对已有的实例后续也会慢慢修正 。
下面简单解释下几个改动的参数
- sql_mode 去除了ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE等限制 采取了较为宽松的模式
- lower_case_table_names 统一设置为1 即不区分大小写 有些实例还没更改 大家建表建库的时候不要大写
- character-set-server 统一设置为utf8 不要用latin1字符集
- wait_timeout和interactive_timeout参数控制空闲连接的时长 当连接空闲时间超过此参数则会被断开 以后会统一设置为1800s即30分钟
- transaction_isolation 事务隔离级别 MySQL官方默认是可重复读(repeatable-read)目前单实例及主从架构的mysql采用了此级别,MGR集群将采取读已提交(read-committed)级别。Oracle默认是读已提交 。
六、两地三中心应用
随着互联网业务快速发展,多IDC的业务支撑能力和要求也逐步提升,行业内的“两地三中心”方案较为流行。其中两地是指同城、异地;三中心是指生产中心、同城容灾中心、异地容灾中心。
两地三中心方案中,基于设定的短期目标可以明确同城双活和异地容灾的方案组合。设计重点为同城双活,即在同城的数据中心之间,一般通过高速光纤相连,在网络带宽有保障的前提下,网络延迟一般在可接受范围内,两个机房之间可以认为在同一个局域网内。
在设计上可以和应用层结合起来,有两种部署模式:分为应用层双活和数据库双活,应用层双活和数据库单活。
- MGR集群多活架构
基于MGR的多活特性,数据的写入可以在多个节点之间进行复制,实现数据强一致性需求,并且在节点间通信出现延迟的情况下,会自动实现服务降级。对于此类方案,我们可以采用同机房多写,同城异机房只读的方案。
- 双主模式的多活
两个节点均可以写入数据,可以实现跨机房的数据复制,延迟较低,在业务层需要做隔离,在故障发生时能够快速切换到同机房的Slave节点。此方案对于两个IDC机房的场景中较为实用,但是机房多活的场景不适合。
- 业务交叉的双活方案
此种方案是双活技术的变通实现,即存在两类业务A和B,数据存储在database级别(schema层级),分别在不通的IDC节点完成数据写入,比如业务A在IDC1完成写入,业务B在IDC2完成写入,两个节点之间存在跨机房的复制节点,在出现问题时,能够通过域名的方式切换到指定的IDC节点。此种方案对于业务的依赖性较高,不适合机房多活的场景。
相关推荐
- 产品页不显示价格?用这招让独立站转化率翻倍
-
“客户急得直拍桌子:‘为什么美国用户点进来看不到价格?’”建站设计师小夏盯着屏幕上的报错提示——结构化数据没写对,Google爬虫根本没抓到价格信息。这是一家卖手工珠宝的跨境店,主推定制款,价格因材质...
- FOGProject 1.5.10 开源 可以使用PXE、PartClone和Web GUI
-
FOGProject起点介绍FOG是一个免费的开源克隆/镜像/救援套件/库存管理系统。FOG可以使用PXE、PartClone和WebGUI来对WindowsXP、Vista、Windows7...
- AI+隐私计算:淘宝API的下一站,数据开放与安全的双重革命
-
淘宝API分类全解析:从商品管理到智能营销的接口生态引言在电商行业数字化转型中,淘宝API(ApplicationProgrammingInterface)作为连接平台与开发者的技术桥梁,已成为实...
- PHP MySQLi基础教程 MySQL 创建数据库
-
数据库存有一个或多个表。你需要CREATE权限来创建或删除MySQL数据库。使用MySQLi和PDO创建MySQL数据库CREATEDATABASE语句用于在MySQL中创...
- PHP跑不动?服务器慢成蜗牛,客户投诉不断.
-
最近公司电商系统总卡,用户下单页面半天打不开,客服电话快被打爆。技术主管说PHP性能不行,我们几个新来的程序员被拉来紧急开会。老王翻出一本破旧的《高性能PHP开发》说:"这本书早该读了"...
- PHP+UniApp:低成本打造外卖系统横扫App+小程序+H5全平台
-
在餐饮行业数字化转型中,外卖系统开发常面临两大痛点:高昂的开发成本(需独立开发App、小程序、H5)和多端维护的复杂性。PHP+UniApp的组合通过技术复用与跨平台能力,为中小商家和开发者提供了“降...
- PHP分布式锁超卖方案以及高并发优化
-
在PHP的生态中,是通过多进程的方式去优化程序性能的。在单机架构情况下防止超卖不像JAVA那样可以使用自身的锁机制实现。需要借助第三方程序来实现,如:数据库、Redis等。接下来我们通过一个基于Re...
- PHP实战经验之系统如何支撑高并发
-
高并发系统各不相同。比如每秒百万并发的中间件系统、每日百亿请求的网关系统、瞬时每秒几十万请求的秒杀大促系统。他们在应对高并发的时候,因为系统各自特点的不同,所以应对架构都是不一样的。另外,比如电商平台...
- PHP高并发架构:三招让Redis与MySQL数据强同步(含黑科技方案)
-
技术段位:百万级并发架构师必修实战价值:数据不一致窗口期<50ms|零代码侵入方案|抗亿级流量冲击一、颠覆认知:99%的项目在用错误方案(你中招了吗?)1.经典双删策略的致命缺陷//...
- 基于Python的仓库库存管理系统的设计和实现
-
《基于Python的仓库库存管理系统的设计和实现》该项目采用技术Python的django框架、mysql数据库,项目含有源码、论文、PPT、配套开发软件、软件安装教程、项目发布教程、核心代码介绍视...
- 如何在Redis中处理并发写入php电商网站库存超卖示例
-
经常会遇到需要在项目中处理并发的情况。今天就用redis来处理并发,解决电商项目中的库存超卖常见需求。项目背景电商网站需要处理高并发的购买请求,每个请求都会减少对应商品的库存数量。为了避免库存超卖,我...
- 【新书推荐】6.1 鼠标基础知识(鼠标的基础操作)
-
第六章鼠标Windows程序以其友好的用户交互体验著称。键盘和鼠标都是用户与Windows程序交互的工具。键盘一般被当作用来输入和管理文本数据的设备,鼠标则被看作是用来绘制和处理图形对象的设备。上一...
- FFmpeg学习(1)开篇(ffmpeg 教程)
-
FFmpeg学习(1)开篇FFmpeg学习(2)源码编译,环境配置为什么要学习FFmpeg本人希望打算深入研究音视频领域,音视频领域的内容很多,我自己打算从几方面循序渐进:FFmpeg常用功能实践,...
- 华纳云:服务器监控系统中最常用的性能指标有哪些
-
服务器监控系统通常用于监视服务器的性能和健康状况,以确保其正常运行并及时发现问题。以下是服务器监控系统中最常用的性能指标: 1.CPU使用率:CPU使用率是指服务器上的中央处理器(CPU...
- 实战线上 Linux 服务器深度优化指南
-
1.系统基础配置优化优化目标:建立统一、安全、稳定的系统基础环境,为后续优化奠定基础。1.1规范化主机命名采用"功能-地域-机房-机柜-编号"命名法,这样便于资产管理和定位。#采用...
- 一周热门
- 最近发表
- 标签列表
-
- 外键约束 oracle (36)
- oracle的row number (32)
- 唯一索引 oracle (34)
- oracle in 表变量 (28)
- oracle导出dmp导出 (28)
- oracle两个表 (20)
- oracle 数据库 字符集 (20)
- matlab化简多项式 (20)
- 多线程的创建方式 (29)
- 多线程 python (30)
- java多线程并发处理 (32)
- 宏程序代码一览表 (35)
- c++需要学多久 (25)
- css class选择器用法 (25)
- css样式引入 (30)
- css教程文字移动 (33)
- php简单源码 (36)
- php个人中心源码 (25)
- php小说爬取源码 (23)
- 云电脑app源码 (22)
- html画折线图 (24)
- docker好玩的应用 (28)
- linux有没有pe工具 (34)
- mysql数据库源码 (21)
- php开源万能表单系统源码 (21)