MySQL Master-Master Replication

2024年8月29日 | 13分钟阅读

概念概述

MySQL 提供了多种复制拓扑,其中包括主主复制(Master-Master Replication),也称为双向复制或循环复制。这种设置允许每个服务器都能接受读写请求,从而在两个操作之间创建对称性。当一个服务器更新了某些数据,其他服务器会接管,这就是循环工作的原理。

这种双向的信息流在需要高可用性和故障容错的情况下带来了巨大的好处。它基于构建稳健且容错网络的理论基础,即使其一个组件发生故障,网络也能继续运行。然而,必须妥善处理此类情况,以避免冲突并确保数据完整性。

特性和优势

  • 高可用性: 主主设置意味着即使一个节点发生故障,另一个节点也能轻松接管并持续提供服务,不会中断。这种冗余最大限度地减少了服务器停机的负面影响。
  • 负载均衡: 这种设置可以均衡工作负载,因为两个节点都可以处理读写请求。它还提高了服务交付和可扩展性,因为它有很高的能力来管理增加的并发级别。
  • 地理分布式: 地理上分散的数据库允许主主复制。通过使用多区域节点,组织可以减少延迟。
  • 随时随地读写: 主主配置允许任何节点支持读写操作。在需要从不同地点更新数据的情况下,这种灵活性非常有利。
  • 故障转移和恢复: 这创建了一个故障转移机制,即如果其中一个主服务器发生故障,另一个服务器可以接管并运行操作。这还保证了即使发生硬件问题等情况,系统也能继续运行。

与其他复制方法的比较

在主主复制系统中,数据是双向的,这与主从复制不同,后者是单向的。主从复制涉及数据从控制器节点单向流向代理节点。然而,主主复制允许两个节点上的并发更新。

主主复制更复杂,因为两侧的同时写入会产生需要解决的冲突。数据完整性取决于强大的冲突解决机制。

设置主主复制

先决条件和系统要求

在实施主主复制之前,需要满足一些先决条件和系统要求。请确保所有 MySQL 服务器实例都已正确设置并正常运行。通过检查服务器之间的网络连接来确保数据的通信和同步。此外,必须遵守一些安全措施,因为安全的身份验证凭据对于维护复制操作的真实性也至关重要。

配置 MySQL 服务器

  • 设置 MySQL 主主复制是一个多阶段的过程。此外,在所有服务器上启用 my.cnf 配置文件中应包含的设置,例如复制、服务器 ID、登录以及二进制日志文件的名称。
  • 其次,为两个服务器启用二进制日志记录以跟踪更改。为每个节点分配一个特殊的服务器 ID,并通过复制过程区分它们。为复制用户访问设置适当的权限,并确保防火墙允许两个服务器通信。
  • 使用 SSL/TLS 加密可以使数据传输更安全。将 MySQL 实例设置为在指定的 IP/端口对上运行。

处理初始数据填充

主主复制应以所有节点的数据同步开始。有几种方法可用于初始数据填充

  • 导出和恢复: 要在一个节点上获取数据库的一致快照,请使用 MySQL dump,然后将其恢复到另一个节点。此过程可确保数据一致性,但会在导出和导入期间导致停机。
  • 复制种子: 通过手动从第二个服务器的相同数据中为其中一个服务器播种来启动复制过程。但是,与导出和恢复相比,它可能适用于大型数据集并减少停机时间。
  • Percona Xtrabackup: 这可以通过使用 Percona Xtrabackup 等工具创建数据库的热备份来完成,从而允许在此过程中进行读写操作。与导出和恢复相比,最初传输的数据停机时间最少,延迟也最低。

配置和参数

为复制配置 my.cnf

My.cnf 是 MySQL 的主配置文件,在涉及复制时,应进行特定的修改,以便过程顺利进行。这基本上是一个复制设置文件,它定义了各种 MySQL 实例行为的大多数方面。

My.cnf 中用于复制的关键条目包括

  • 服务器 ID 分配: 对于属于复制设置的每个 MySQL 服务器,都有一个特殊的标识符,称为服务器 ID。这对于区分节点很重要。为了向服务器提供标识符,我在 my.cnf 文件中为 server-id 参数分配了一个数字。
  • 二进制日志配置: 复制非常有意义,二进制日志会记录数据库中发生的所有更改。log-bin 是指定的二进制日志文件名基础的名称,binlog_format 表示日志记录格式(例如,ROW、STATEMENT 或 MIXED)。
  • 复制连接: 配置 bind-address 参数可确保 MySQL 服务器侦听用于复制相关通信的特定 IP 地址。
  • 复制用户凭据: 配置 master-user 和 master-password 等条目,以提供复制用户连接到主服务器所需的凭据。

关键配置参数

MySQL 复制行为受几个重要配置选项的高度影响。

  • relay-log: 它定义了其中继日志的基本名称,以便它可以存储在中继日志中,这在中继日志在复制过程中至关重要。
  • expire_logs_days: 在删除二进制日志文件之前的天数,以防止内存堆积。
  • max_binlog_size: 它确定了最大的二进制日志文件大小。达到此点后,将开始新的二进制日志文件。
  • sync_binlog: 当此参数设置为 1 时,每次写入操作发生时,二进制日志都会刷新到磁盘,从而提高了系统的持久性,但性能会降低。

确保服务器 ID 一致

  • 在配置服务器 ID 时,服务器一致的标识符对于防止复制层次结构中的冲突至关重要。
  • 唯一性: 对于复制配置中的每个 MySQL 服务器,服务器 ID 必须不同。这消除了歧义,确保准确地区分在一个服务器上所做的更改以及其他服务器上的更改。
  • 避免重复 ID: 在服务器重启或重新配置的情况下,必须小心避免无意中重复服务器 ID。服务器 ID 冲突可能导致数据不一致。
  • 监控和审计 ID: 定期监控和审计整个复制环境中的服务器 ID,有助于及时发现和纠正任何差异。

自动增量和主键。

自动增量列的策略

  • 调整增量值:将 INCREMENT 部分设置在合适的间隔,可避免服务器之间的冲突。这减少了生成重复主键值的可能性。
  • 使用奇偶范围:将自动增量范围分配给服务器,例如为某个服务器分配奇数范围,为另一个服务器分配偶数范围,有助于减少冲突的发生。然而,这是使用奇偶数的特征来实现差异化的。

确保主键生成的一致性

  • 同步种子值:通过对两个控制器服务器上的自动增量列的种子值进行对齐来获得一致的开始。同步确保主键没有冲突。
  • 避免并发插入:如果两个主服务器同时进行多个插入操作,自动增量值可能会重叠。可以通过协调插入或以服务器特定的方式插入来避免此类冲突。
  • 定期监控:通过定期检查控制器服务器之间的自动增量值和主键生成,有助于检测任何异常。此监控过程可以使用自动化脚本或其他工具完成。

监控和故障排除

监控复制状态

然而,监督主主复制是否运行良好至关重要。需要考虑的关键方面包括

SHOW STATUS 命令:还可以通过 SHOW STATUS 命令发现复制状态。例如,“Slave_IO_Running”和“Slave_Master_Status”等参数分别显示 IO 和 SQL 线程的状态。

  • Performance Schema 查询:借助 MySQL Performance Schema 进行更详细的监控。诸如“performance_schema.replication_connection_status”之类的查询提供了有关复制连接如何执行的最新信息。
  • 第三方监控工具:使用 MySQL Enterprise Monitor 或 PMM 等外部软件可简化监控过程。这些工具提供用户友好的仪表板、警报和历史数据分析。

识别和解决常见问题

尽管进行了详细的配置,但主主复制有时仍会遇到问题。识别和解决这些常见挑战涉及

  • 网络延迟:网络延迟会影响复制。通过监控网络延迟和优化通信路径来管理此问题。
  • 自动增量值冲突:必须考虑解决自动增量值冲突。这包括增量调整、奇偶范围以及服务器增量。
  • 监控磁盘空间:充足的磁盘空间可防止因存储容量有限而导致的复制失败。始终监控所有主服务器上的磁盘空间。

日志记录和错误处理

有效的日志记录和错误处理机制有助于主动管理主主复制

  • 错误日志检查:检查 MySQL 错误日志,查找与复制相关的任何警告或错误。通过错误日志,可以识别发生了什么以及哪里出了问题。
  • 全局事务标识符 (GTID):使用 GTID 可确保错误处理,因为事务具有唯一标识。对于错误,GTID 有助于跟踪和纠正不一致。
  • 二进制日志分析:二进制日志分析有助于跟踪修改。例如,MySQLbinlog 等工具可以查看二进制日志内容,从而帮助诊断。

安全注意事项

对于 MySQL 中的主主复制设置至关重要,因为它可防止重要信息暴露或被篡改。关键安全注意事项包括

网络安全

  • 防火墙规则:采用严格的防火墙策略来管理主服务器与其流量的交互。阻止某些 IP 和端口组合。
  • VPN 或 TLS 加密:可以通过 VPN 或 TLS 实现控制器服务器之间数据传输的安全通信。

身份验证和授权

  • 安全密码:为参与复制的任何帐户使用强大且唯一的 MySQL 密码。定期更新密码以尽量减少安全风险。
  • 有限的权限:默认应仅授予复制用户所需的权限。减少不必要的、过于宽松的权限,以减轻未经授权的访问。

加密

  • 静态数据加密:为静态数据(信息可以保存在控制器服务器上的位置)提供加密机制。MySQL 支持的加密类型包括表级别和表空间级别。
  • 二进制日志加密:启用二进制日志加密以保护复制过程。因此,它保护了主服务器数据传输的完整性,从而防止窃听。

监控和审计

  • 审计日志:启用 MySQL 操作的审计以进行跟踪。定期评估审计日志,查找欺诈或未经授权的活动。
  • 警报系统:部署警报机制,通知管理员任何可疑或犯罪活动。快速检测可提高对安全事件的响应能力。

更新和维护

  • 定期更新:确保我的 MySQL 服务器拥有最新的安全补丁和更新。通过应用安全补丁,可以立即解决漏洞并提高系统安全性。
  • 操作系统更新:确保经常更新您的操作系统,因为它们可能存在非 MySQL 软件特有的漏洞。

管理故障转移和冗余

负载均衡

  • 分发流量:使用负载均衡器将读写查询均匀地分发到控制器服务器。这提高了操作速度并具有容错能力。

自动故障转移

  • 监控工具:引入控制器服务器运行状况监控工具,这些工具可以持续评估这些服务器的运行状况。自动化脚本和其他工具也可以在主服务器出现问题时进行故障转移,将流量重定向到另一个更健康的服务器。

虚拟 IP (VIP) 设置

  • 虚拟 IP 地址:考虑使用在控制器服务器之间移动的 VIP。这种方法通过在工作主服务器上重定向流量来帮助平滑故障转移过程。

基于仲裁的决策

  • 仲裁系统:建立共识机制,其中超过一半的节点必须同意集群的状态。这有助于避免脑裂情况,并确保做出可靠的故障转移判断。

仲裁服务器

  • 引入仲裁服务器:对于具有偶数个节点的设置,请包含一个仲裁服务器,尤其是在涉及两个不同组织的设置中。在网络分区的情况下,使用仲裁服务器来建立多数。

高可用性中间件

  • 与中间件集成:利用具有自动故障转移和冗余管理器的可用性高的中间件解决方案。这些工具通常具有其他功能,例如运行状况检查和性能增强。

数据库代理解决方案

  • 实施代理服务器:考虑安装数据库代理服务器,以双向处理故障,从而将流量重定向到健康的服务器。使用代理有助于增强控制和监控措施。

定期测试

  • 模拟故障转移:进行频繁的测试和故障转移模拟,以检查故障转移系统是否正常工作。在它们影响生产过程之前,检测潜在问题并纠正它们。

扩展主主复制

水平扩展

  • 添加读副本:使用读副本将读取分散到多个服务器。水平扩展可以提高读取性能并处理更多的读取请求。

负载均衡

  • 负载均衡器:确保读写查询使用负载均衡器均匀地分布到控制器服务器及其副本。负载均衡的概念可实现资源的有效利用,并避免某些节点的耗尽和最终故障。

分片

  • 数据库分片:通过在多个实例之间进行数据库分片来水平划分数据。通过将数据分布和存储在不同的服务器上,分片有助于减轻服务器因多个请求而承受的压力。

缓存机制

  • 利用缓存:实施缓存技术以减轻数据库服务器的压力。应用程序层缓存或缓存解决方案通过缓存常用数据来提高性能,从而大大提高性能。

高级复制拓扑

  • 多源复制:考虑复杂的复制体系结构,其中包括多主复制,其中特定镜像节点由多个信息源提供。这使得系统更具可扩展性和适应性。

异步复制

  • 利用异步复制:在控制器服务器和镜像之间设置异步复制。由于异步复制写入,主服务器上的操作也可以执行,而无需等待副本确认。

主动监控

  • 实时监控:使用主动监控解决方案来解决性能瓶颈/资源限制。通过采用实时监控,管理员可以检测和解决可能对性能产生负面影响的可扩展性问题。

数据库分区

  • 分区大表:使用数据库分区,尤其是将数据分布在不同分区上的大表。这通过减少争用来提高查询性能。

MySQL 主主复制的升级和维护。

版本兼容性

  • 检查兼容性:在开始升级之前,请确保最新版本的 MySQL 与当前的复制模型兼容。确保您的源/副本服务器在您为目标环境准备的 MySQL 版本下能够顺利运行。

备份程序

  • 执行备份:在升级数据库之前,请完整备份主数据库和副本数据库。在升级过程中遇到意外困难时,采取此预防措施是为了确保数据完整性保持不变。

在暂存环境中进行测试

  • 暂存环境测试:在暂存环境中,针对与实际生产模型相似的设置验证升级系统。在将升级后的版本实施到生产环境之前,查看每个应用程序组件的升级版本,识别和解决任何兼容性问题或冲突。

滚动升级

  • 实施滚动升级:采用周期性升级技术,以尽量减少网络中断。此方法首先更新副本服务器,以便它们可以赶上主服务器,然后继续更新主服务器。这有助于防止整个系统正常运行时间的中断。

MySQL 主主复制的未来趋势和考虑因素

双向复制

  • 增强的双向复制:下一个发展可能旨在改善双向复制功能。这还包括改进冲突解决策略,以及增加数据流管理方案处理双向数据的能力。

自动冲突解决

  • 智能冲突解决:预计将推出更高级的自动化争议解决系统。机器学习算法可能会在未来的版本中包含,以自动检测和解决冲突,而无需人工干预。

与云服务的集成

  • 无缝云集成:随着使用云基础设施的趋势日益增长,MySQL 的未来版本可能会侧重于与领先的云服务提供商的顺畅集成。这可能会带来更好的互操作性、更高的效率以及更轻松的云系统部署。

增强的监控和分析

  • 高级监控工具:主主复制将包含专门为此任务设计的其他集成监控和分析工具。这些工具能够全面了解复制效率、延迟以及潜在的瓶颈所在。

安全增强

  • 高级安全功能:未来的产品版本可能会集成更多安全措施。其中一些措施可能涉及更安全的加密技术、更严格的访问策略以及旨在满足新兴数据保护指南的其他资源。

全球分发

  • 优化全球分发:未来趋势可能围绕改进和 MySQL 主主复制在全球分布式场景中的应用。这将需要确保地理位置相距遥远的服务器位置之间的低延迟复制,以及跨区域操作的一致部署。

微服务架构

  • 微服务兼容性:MySQL 主主复制的演变可能会适应微服务架构的特点。它将具有更好的可扩展性,并能在动态、基于容器的环境中运行。

结论

因此,对于需要可靠数据分发和备份的组织来说,MySQL 主主复制是一个有效的解决方案。未来有前景的趋势包括先进的双向复制、自动化协调和轻松的云实现。开发侧重于安全性、全球分发和新技术兼容性。

感谢 MySQL 社区的存在,使得源到源复制成为可能。社区的参与,加上易于配置的选项和教育材料,确保了该过程的顺利进行。在这个数据管理的世界里,MySQL 主主复制将是一个战略性的选择,它保证了在不断变化的大数据库架构中的可靠性、可扩展性和适用性。


下一主题MySQL Maven