server_id 引发的 MySQL 级联复制同步异常
MySQL 级联复制的坑,我帮你们踩了。
作者:蒋士峰,爱可生 DBA 团队成员,熟悉 MySQL,Oracle 等数据库。每天的积累,时间久了,会带来不一样的收货。
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文约 1200 字,预计阅读需要 3 分钟。
业务场景
在日常运维的某个系统下,由于之前数据库主机所用硬盘是传统机械硬盘,容量小,传输速度低,并且数据库服务器整体性能不高。随着业务访问量的增加,现有数据库服务器无法满足需求,所以需要搭建一套高性能的数据库服务器,并且所用硬盘是 SSD。
由于原先数据库采用的是主从复制架构,所以新搭建的数据库也要采用主从架构。跟旧数据库集群组成一套级联复制的 MySQL 数据库集群(旧集群的主库作为主,新集群的主库为旧集群主库的从,新集群从库还继续为新集群主库的从),先进行数据同步一段时间,再找时间点进行业务割接。
由此从 旧集群主库--->新集群主库--->新集群从库 之前形成了一条类似于链条式的同步关系,具体关系图如下:
问题的发现
搭建完成新集群,做级联复制的时候,没有发现任何错误,数据同步也是正常的。大概过了 15 天进行数据比对的时候,发现了一个重要问题:新集群的主库可以正常同步旧集群主库的新增数据,但是新集群的从库无法同步新集群主库的新增数据。
如图所示:
问题分析
-
由于从新集群的主库到新集群从库无法正常同步,所以我们先分析了新集群主库的 binlog 日志是否开启,还有
log_slave_update
是否也开启了,只有开启了,才能产生 binlog 做主从同步。发现都是开启的,所以只能从其他方面去看。 -
除此之外,我们还专门在旧集群主库上进行了创建库,插入数据操作,观察 positon 位置点的变化信息。
创建库,插入数据之前:
创建库,插入数据之后:
重要问题:发现插入数据的时候,旧集群主库和新集群主库的 binlog 位置点都发生了变化,只有新集群的从库的 binlog 位置点一直没变,这明显是不正常的。
-
前面也确认了 binlog 相关参数都是开启的。所以此时,我们只有把三台数据库的配置文件
my.cnf
拿出来对比一下了,检查一下是不是配置文件的相关参数出了问题。经过对比确认参数,发现了一个主要的问题:旧集群的主库的
server_id
为 1,新集群的主库的server_id
为 2,新集群的从库的server_id
为 1。这意味着什么?旧集群主库的
server_id
与新集群从库的server_id
重复了。但是问题又来了,当时做主从的时候完全没有报错啊。那么,级联复制中,是不是也要保证所有的server_id
不同呢?
- 带着这个疑问,我们专门在本地环境搭建了一套类似于生产环境的级联复制,并且随意改动
server_id
,然后插入数据,观察一下数据同步情况。验证了一条重要信息:级联复制中,所有参与构建集群的 MySQL 数据库server_id
不能相同,一旦相同,数据同步就会出现故障。
产生这一问题的根源
在项目中,数据集群众多,手动安装工作量较大,所以本次安装数据库也是采用自动化安装的,分配 server_id
的时候,也是 1 或者 2 随机分配。所以才导致了本次新集群从库 server_id
跟旧集群冲突了。
整改步骤
数据已经同步了 15 天了,但是我们的 binlog 只保存了 14 天,所以现在只有先修改一下 server_id
,保证该级联复制中所有数据库的 server_id
都是不同的;然后再备份一下旧集群主库,恢复到新集群,重做级联复制。
带来的启示
- 使用级联复制,一定要保证所有参与数据库的
server_id
不同。 - 要确 binlog 日志以及相关参数是开启的。
- 由于级联复制存在各种小问题,所以日常生产中尽量少用级联复制。
更多技术文章,请访问:https://opensource.actionsky.com/
关于 SQLE
SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。
SQLE 获取
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
周鸿祎:“开源不如闭源”的言论是胡说八道
360 公司创始人周鸿祎日前应邀在哈佛大学第二十七届哈佛中国论坛发表演讲称,发展专业大模型可能是中国的一个巨大机会,所有企业都值得让专业大模型重塑一遍。 并谈到了开源大模型的发展。他认为,虽然现在开源模型的能力达不到 GPT 4。但是专注在一个方向上,用企业内部的专有数据加上专有工具进行能力的加强之后,它就有可能在专业能力上超过 GPT 4。 “我是一直相信开源的力量,至于说网上有些胡说八道,你们也别被他们忽悠了,说开源不如闭源好。一句话,今天没有开源就没有 Linux,没有 Linux 就没有互联网,连说实话的公司自己都是借助了开源力量才成长到今天。开源社区聚集的工程师和科学家的数量是闭源的数百倍。所以今年开源只做了一年就已经超过了 GPT-3.5 的能力,所以我觉得未来一两年内,我认为开源的力量很有可能会达到或者超过闭源的水平。” 针对此前李彦宏所说的百度大模型已经超过了 GPT4 这一言论,周鸿祎则表示,李彦宏指的是在写古诗的能力方面。“前两天百度的李彦宏说他们超过了 GPT 4,然后王小川就不相信,他就出来怼李彦宏。其实你仔细听听李总说的有道理,他前面是说在写古诗方面。” 他还...
- 下一篇
Spring开发:动态代理的艺术与实践
本文分享自华为云社区《Spring高手之路17——动态代理的艺术与实践》,作者: 砖业洋__。 1. 背景 动态代理是一种强大的设计模式,它允许开发者在运行时创建代理对象,用于拦截对真实对象的方法调用。这种技术在实现面向切面编程(AOP)、事务管理、权限控制等功能时特别有用,因为它可以在不修改原有代码结构的前提下,为程序动态地注入额外的逻辑。 2. JDK动态代理 2.1 定义和演示 JDK动态代理是Java语言提供的一种基于接口的代理机制,允许开发者在运行时动态地创建代理对象,而无需为每个类编写具体的代理实现。 这种机制主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口实现。下面是JDK动态代理的核心要点和如何使用它们的概述。 使用步骤 定义接口:首先定义一个或多个接口,代理对象将实现这些接口。 实现接口:创建一个类,它实现上述接口,提供具体的实现逻辑。 创建InvocationHandler实现:定义一个InvocationHandler的实现,这个实现中的invoke方法可以包含自定义逻辑。 创建代...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2配置默认Tomcat设置,开启更多高级功能