Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL主从集群

MySQL主从集群的实现示例

作者:山高自有客行路

本文主要介绍了MySQL主从集群的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

1. 基本概念

2. 工作流程

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

二、环境准备

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

确保各节点之间可以互相通信,并开放必要的端口(如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 # 确保每次提交都刷新日志到磁盘

重启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一致性

重启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;

重点关注以下字段:

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

2. 故障转移与高可用性

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

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. 从节点无法连接主节点

2. 数据不一致

3. 复制延迟

八、详细配置示例

主节点配置示例 (/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主从集群内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文