MySQL主从集群的实现示例

 更新时间:2026年01月28日 09:36:42   作者:山高自有客行路  
本文主要介绍了MySQL主从集群的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、MySQL主从复制的工作原理

1. 基本概念

  • 主节点(Master):处理所有写操作(如INSERT、UPDATE、DELETE),并将这些操作记录到二进制日志(Binary Log)中。
  • 从节点(Slave):连接到主节点,读取并应用主节点的二进制日志,从而同步数据。

2. 工作流程

  1. 事务记录:当主节点上发生写操作时,MySQL会将这些操作记录在二进制日志中。
  2. 日志传输:从节点通过IO线程连接到主节点,请求获取新的二进制日志条目,并将其存储在从节点的中继日志(Relay Log)中。
  3. 日志应用:从节点上的SQL线程读取中继日志中的条目,并执行相应的SQL语句,更新本地数据库。

二、环境准备

假设我们有以下三台服务器:

  • 主节点(Master): 192.168.1.101
  • 从节点1(Slave 1): 192.168.1.102
  • 从节点2(Slave 2): 192.168.1.103

确保各节点之间可以互相通信,并开放必要的端口(如3306)。

三、安装与配置

1. 安装MySQL

在所有节点上安装MySQL:

sudo apt update
sudo apt install mysql-server

2. 配置主节点(Master)

编辑配置文件

编辑主节点的/etc/mysql/mysql.conf.d/mysqld.cnf文件,在末尾添加以下内容:

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=testdb  # 只同步指定数据库,如需同步所有数据库可删除此行
expire_logs_days=7   # 自动清理过期的日志文件
max_binlog_size=100M # 单个日志文件的最大大小
relay-log=mysql-relay-bin
log-slave-updates=1  # 如果需要级联复制,则启用此选项
sync_binlog=1        # 确保每次提交都同步到磁盘
innodb_flush_log_at_trx_commit=1 # 确保每次提交都刷新日志到磁盘
  • server-id: 每个节点必须有一个唯一的ID。
  • log-bin: 启用二进制日志,这是主从复制的基础。
  • binlog-do-db: 只记录特定数据库的操作日志,如果需要同步所有数据库,可以省略此行。
  • expire_logs_days: 设置日志文件的自动清理天数。
  • max_binlog_size: 设置单个日志文件的最大大小。
  • relay-log: 指定中继日志文件名。
  • log-slave-updates: 如果从节点也需要作为其他从节点的主节点,启用此选项。
  • sync_binlog: 确保每次提交都同步到磁盘,提高数据一致性。
  • innodb_flush_log_at_trx_commit: 确保每次提交都刷新日志到磁盘,提高数据一致性。

重启MySQL服务

sudo systemctl restart mysql

创建用于复制的用户

登录到MySQL并创建用于复制的用户:

mysql -u root -p

CREATE USER 'replicator'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;

锁定数据库并获取二进制日志位置

锁定数据库以防止数据修改,并获取当前二进制日志位置:

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

记下FilePosition的值,稍后需要在从节点上使用。

3. 配置从节点(Slave)

编辑配置文件

在每个从节点上编辑/etc/mysql/mysql.conf.d/mysqld.cnf文件,在末尾添加以下内容:

[mysqld]
server-id=2  # 对于第二个从节点,使用不同的ID,如3
relay-log=mysql-relay-bin
log-slave-updates=1
read-only=1
skip-slave-start=1  # 禁止启动时自动启动复制
slave_parallel_workers=4  # 并行复制线程数
slave_parallel_type=LOGICAL_CLOCK  # 并行复制类型
gtid_mode=ON  # 启用GTID
enforce_gtid_consistency=ON  # 强制GTID一致性
  • server-id: 每个节点必须有一个唯一的ID。
  • relay-log: 指定中继日志文件名。
  • log-slave-updates: 如果从节点也需要作为其他从节点的主节点,启用此选项。
  • read-only: 设置从节点为只读模式,防止意外写入。
  • skip-slave-start: 禁止启动时自动启动复制,便于手动控制。
  • slave_parallel_workers: 设置并行复制线程数。
  • slave_parallel_type: 设置并行复制类型。
  • gtid_mode: 启用GTID。
  • enforce_gtid_consistency: 强制GTID一致性。

重启MySQL服务

sudo systemctl restart mysql

设置主节点信息

登录到MySQL并设置主节点信息:

mysql -u root -p

CHANGE MASTER TO
MASTER_HOST='192.168.1.101',
MASTER_USER='replicator',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000001',  -- 使用之前记录的File值
MASTER_LOG_POS=154,                  -- 使用之前记录的Position值
MASTER_AUTO_POSITION=1;              -- 如果使用GTID,则启用此选项

START SLAVE;

SHOW SLAVE STATUS\G;

检查输出中的Slave_IO_RunningSlave_SQL_Running字段是否为Yes,以确认从节点已成功连接到主节点。

对于第二个从节点,重复上述步骤,并确保使用不同的server-id

解锁主节点

在主节点上解锁数据库,允许数据修改:

UNLOCK TABLES;

四、测试与验证

1. 测试主从复制功能

在主节点上进行一些操作,例如创建数据库和表,并插入数据:

mysql -u root -p

CREATE DATABASE testdb;
USE testdb;
CREATE TABLE example (id INT NOT NULL PRIMARY KEY, data VARCHAR(100));
INSERT INTO example VALUES (1, 'test');

然后在从节点上查询该表的数据,确认数据已正确同步:

mysql -u root -p

USE testdb;
SELECT * FROM example;

如果能看到插入的数据,则说明主从复制已经正常工作。

五、进一步优化与管理

1. 监控与维护

为了确保集群的稳定性和性能,建议定期监控MySQL的状态和日志文件。可以使用以下命令查看从节点的状态:

SHOW SLAVE STATUS\G;

重点关注以下字段:

  • Slave_IO_Running: IO线程是否运行。
  • Slave_SQL_Running: SQL线程是否运行。
  • Last_Error: 上次错误信息。
  • Seconds_Behind_Master: 从节点落后主节点的时间。

也可以通过配置监控工具如Prometheus + Grafana来实时监控MySQL集群的状态。

2. 故障转移与高可用性

为了提高系统的高可用性,可以考虑以下措施:

  • 自动故障转移:使用中间件如MHA(MySQL High Availability)或Orchestrator来实现自动故障转移。
  • 负载均衡:使用负载均衡器(如HAProxy)来分发读请求到多个从节点,减轻主节点的压力。

3. 数据一致性检查

定期检查主从节点之间的数据一致性,可以使用工具如Percona Toolkit中的pt-table-checksumpt-table-sync来检测和修复不一致的数据。

六、高级配置与优化

1. 半同步复制(Semi-Synchronous Replication)

半同步复制可以在一定程度上保证数据一致性。配置步骤如下:

在主节点上启用半同步插件:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;

在从节点上启用半同步插件:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
START SLAVE;

2. 并行复制(Parallel Replication)

MySQL 5.7及以上版本支持并行复制,可以显著提高从节点的复制速度。配置步骤如下:

在从节点的配置文件中添加以下配置:

slave_parallel_workers=4  # 设置并行线程数
slave_parallel_type=LOGICAL_CLOCK  # 设置并行类型

3. GTID(Global Transaction Identifier)

GTID可以简化主从切换和故障恢复。配置步骤如下:

在主节点和从节点的配置文件中添加以下配置:

gtid_mode=ON
enforce_gtid_consistency=ON

然后在从节点上使用GTID进行复制配置:

CHANGE MASTER TO
MASTER_HOST='192.168.1.101',
MASTER_USER='replicator',
MASTER_PASSWORD='your_password',
MASTER_AUTO_POSITION=1;

七、常见问题及解决方案

1. 从节点无法连接主节点

  • 检查防火墙:确保防火墙允许3306端口。
    sudo ufw allow 3306/tcp
  • 检查权限:确认主节点的replicator用户权限正确。
  • 网络连通性:使用pingtelnet等工具检查网络连通性。
    ping 192.168.1.101
    telnet 192.168.1.101 3306

2. 数据不一致

  • 使用Percona Toolkit:使用pt-table-checksumpt-table-sync工具进行数据一致性检查和修复。
    pt-table-checksum --host=192.168.1.101 --user=root --password=your_password
    pt-table-sync --execute h=192.168.1.101,u=root,p=your_password h=192.168.1.102
  • 配置一致性:确认主节点和从节点的配置一致,特别是字符集和排序规则。

3. 复制延迟

  • 硬件资源:检查从节点的硬件资源(CPU、内存、磁盘I/O)是否充足。
  • 参数调整:调整从节点的innodb_buffer_pool_size和其他相关参数。
    innodb_buffer_pool_size=2G  # 根据实际情况调整大小

八、详细配置示例

主节点配置示例 (/etc/mysql/mysql.conf.d/mysqld.cnf)

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=testdb  # 只同步指定数据库,如需同步所有数据库可删除此行
expire_logs_days=7   # 自动清理过期的日志文件
max_binlog_size=100M # 单个日志文件的最大大小
relay-log=mysql-relay-bin
log-slave-updates=1  # 如果需要级联复制,则启用此选项
sync_binlog=1        # 确保每次提交都同步到磁盘
innodb_flush_log_at_trx_commit=1 # 确保每次提交都刷新日志到磁盘

从节点配置示例 (/etc/mysql/mysql.conf.d/mysqld.cnf)

[mysqld]
server-id=2  # 对于第二个从节点,使用不同的ID,如3
relay-log=mysql-relay-bin
log-slave-updates=1
read-only=1
skip-slave-start=1  # 禁止启动时自动启动复制
slave_parallel_workers=4  # 并行复制线程数
slave_parallel_type=LOGICAL_CLOCK  # 并行复制类型
gtid_mode=ON  # 启用GTID
enforce_gtid_consistency=ON  # 强制GTID一致性

到此这篇关于MySQL主从集群的实现示例的文章就介绍到这了,更多相关MySQL主从集群内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL下200GB大表备份的操作(利用传输表空间解决停服发版表备份问题)

    MySQL下200GB大表备份的操作(利用传输表空间解决停服发版表备份问题)

    这篇文章主要介绍了MySQL下200GB大表备份的操作(利用传输表空间解决停服发版表备份问题),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2025-04-04
  • 一步步教你利用Mysql存储过程造百万级数据

    一步步教你利用Mysql存储过程造百万级数据

    因工作需要维护一张中建表数据内置,所以得造数据所以使用存储过程来造数据,下面这篇文章主要给大家介绍了关于如何一步步利用Mysql存储过程造百万级数据的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • Mysql中关于on,in,as,where的区别

    Mysql中关于on,in,as,where的区别

    这篇文章主要介绍了Mysql中关于on,in,as,where的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • windows 下忘记mysql root密码的更改方法

    windows 下忘记mysql root密码的更改方法

    mysql数据库忘记了root密码是件很痛苦的事,本文介绍如何解决windows环境下mysql服务器忘记root密码的解决方法,需要的朋友可以参考下
    2016-10-10
  • 利用MySQL空间函数实现位置打卡的完整步骤

    利用MySQL空间函数实现位置打卡的完整步骤

    这篇文章主要给大家介绍了关于如何利用MySQL空间函数实现位置打卡的完整步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-08-08
  • mysql中判断记录是否存在方法比较

    mysql中判断记录是否存在方法比较

    把数据写入到数据库的时,常常会碰到先要检测要插入的记录是否存在,然后决定是否要写入。
    2011-07-07
  • 浅析Mysql 中如何导出数据

    浅析Mysql 中如何导出数据

    MySQL中你可以使用SELECT…INTO OUTFILE语句来简单的导出数据到文本文件上,这篇文章给大家介绍了Mysql 中如何导出数据,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • mysql5.7.25使用全文检索功能的实例教程

    mysql5.7.25使用全文检索功能的实例教程

    其实全文检索在MySQL里面很早就支持了,下面这篇文章主要给大家介绍了关于mysql5.7.25使用全文检索功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • MYSQL的索引使用注意小结

    MYSQL的索引使用注意小结

    这篇文章主要介绍了MYSQL的索引使用注意,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • MySQL数据库自动化备份脚本的实践指南

    MySQL数据库自动化备份脚本的实践指南

    数据是企业的核心资产,定期备份数据库是每个运维和开发人员的必修课,本文分享一个生产环境验证过的 MySQL 自动备份脚本,支持多数据库备份、自动压缩、过期清理,并详细解读每一处细节,帮助你快速搭建可靠的备份体系,需要的朋友可以参考下
    2026-04-04

最新评论