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查询数据库连接状态以及连接信息详解

    Mysql查询数据库连接状态以及连接信息详解

    这篇文章主要给大家介绍了关于Mysql查询数据库连接状态以及连接信息的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-04-04
  • MySQL group by和left join并用解决方式

    MySQL group by和left join并用解决方式

    这篇文章主要介绍了MySQL group by和left join并用解决方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • MySQL Semaphore wait has lasted使用详解

    MySQL Semaphore wait has lasted使用详解

    MySQL 5.7.19 Semaphore wait >600秒错误源于InnoDB线程等待信号量超时,常见于死锁、资源竞争或IO瓶颈,排查需检查长事务、高并发写入、磁盘性能及数据页损坏,建议升级至5.7或8.0版本以修复问题
    2025-07-07
  • mysql创建学生表、课程表及学生选课表详细代码

    mysql创建学生表、课程表及学生选课表详细代码

    这篇文章主要给大家介绍了mysql创建学生表、课程表及学生选课表的相关资料,学生、课程以及成绩的增删改查都是建立在连接数据库的基础之上,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • mysql database manual(mysql数据库手册)

    mysql database manual(mysql数据库手册)

    mysql database manual(mysql数据库手册),使用mysql的朋友可以参考下。
    2011-09-09
  • 解决MySQL启动报错:Warning:mysqld.service changed on disk问题

    解决MySQL启动报错:Warning:mysqld.service changed on 

    文章提示MySQL启动时报错,因服务配置文件已更改,需运行`systemctl daemon-reload`重新加载配置,随后重启MySQL服务以解决此问题
    2025-09-09
  • textarea标签(存取数据库mysql)的换行方法

    textarea标签(存取数据库mysql)的换行方法

    textarea标签本身不识别换行功能,回车换行用的是\n换行符,输入时的确有换行的效果,但是html渲染或者保存数据库mysql时就只是一个空格了,这时就需要利用换行符\n和br标签的转换进行处理
    2023-09-09
  • MySQL模糊查找like通配符使用(小白入门篇)

    MySQL模糊查找like通配符使用(小白入门篇)

    这篇文章主要为大家介绍了MySQL模糊查找like通配符使用的小白入门篇学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • MySQL操作数据库实战指南

    MySQL操作数据库实战指南

    这篇文章主要给大家介绍了关于MySQL数据库操作库的相关资料,MySQL数据库是一个关系型数据库管理系统,所采用的SQL语言是用于访问数据库最常用的标准会语言,需要的朋友可以参考下
    2023-07-07
  • windows 64位下MySQL 8.0.15安装教程图文详解

    windows 64位下MySQL 8.0.15安装教程图文详解

    本文通过图文并茂的形式给大家介绍了MySQL 8.0.15安装教程(windows 64位),非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04

最新评论