MySQL主从、双主、半同步及SSL复制
一、引言
在企业级数据库应用中,数据的高可用性和一致性至关重要。MySQL提供了多种复制架构来满足不同的业务需求,包括主从复制、双主复制、半同步复制以及基于SSL的安全复制。本文将详细介绍这些复制方式的原理、配置方法和应用场景。
二、MySQL主从复制
2.1 原理
主从复制是MySQL中最基本的复制方式,它基于二进制日志(binlog)实现。主库将数据变更记录到binlog中,从库通过IO线程读取主库的binlog并写入自己的中继日志(relay log),然后SQL线程从中继日志中读取事件并在从库上重放,从而实现数据同步。
2.2 配置步骤
2.2.1 主库配置
- 修改主库配置文件(my.cnf或my.ini):
[mysqld] server-id=1 log-bin=mysql-bin binlog-format=ROW
- 重启主库服务
- 创建用于复制的用户:
CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
- 查看主库状态,记录File和Position值:
SHOW MASTER STATUS;
2.2.2 从库配置
- 修改从库配置文件:
[mysqld] server-id=2 relay-log=mysql-relay-bin read-only=1
- 重启从库服务
- 配置从库连接主库:
CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
- 启动从库复制:
START SLAVE;
- 检查从库状态:
SHOW SLAVE STATUS\G
2.3 应用场景
- 读写分离:主库负责写操作,从库负责读操作,提高系统性能
- 数据备份:从库可以作为数据备份,避免在主库上进行备份操作影响业务
- 故障转移:当主库发生故障时,可以将从库提升为主库,保证业务的连续性
三、MySQL双主复制
3.1 原理
双主复制是在主从复制的基础上发展而来的,它允许两个MySQL服务器互为主从,即每个服务器既可以作为主库向另一个服务器发送数据变更,也可以作为从库接收另一个服务器的数据变更。双主复制通常用于需要双向数据同步的场景。
3.2 配置步骤
3.2.1 服务器A配置
- 修改服务器A配置文件:
[mysqld] server-id=1 log-bin=mysql-bin binlog-format=ROW auto-increment-increment=2 auto-increment-offset=1
- 重启服务器A服务
- 创建用于复制的用户:
CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
- 查看服务器A状态,记录File和Position值:
SHOW MASTER STATUS;
3.2.2 服务器B配置
- 修改服务器B配置文件:
[mysqld] server-id=2 log-bin=mysql-bin binlog-format=ROW auto-increment-increment=2 auto-increment-offset=2
- 重启服务器B服务
- 创建用于复制的用户:
CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
- 查看服务器B状态,记录File和Position值:
SHOW MASTER STATUS;
3.2.3 配置双向复制
- 在服务器A上配置连接服务器B:
CHANGE MASTER TO MASTER_HOST='server_b_ip', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
- 在服务器B上配置连接服务器A:
CHANGE MASTER TO MASTER_HOST='server_a_ip', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
- 分别启动两台服务器的复制:
START SLAVE;
- 检查两台服务器的复制状态:
SHOW SLAVE STATUS\G
3.3 注意事项
- 自增主键冲突:由于两个服务器都可以插入数据,可能会导致自增主键冲突。通过设置auto-increment-increment和auto-increment-offset参数可以避免这种情况
- 循环复制:双主复制可能会出现循环复制的问题,即服务器A的数据变更同步到服务器B,然后服务器B的数据变更又同步回服务器A。可以通过设置 replicate-do-db 或 replicate-ignore-db 参数来解决
- 数据一致性:由于网络延迟等原因,可能会导致两台服务器的数据不一致。需要定期进行数据校验和修复
四、MySQL半同步复制
4.1 原理
半同步复制是在主从复制的基础上增加了确认机制。当主库提交事务时,它会等待至少一个从库接收到并写入中继日志后才返回成功响应给客户端。这样可以确保在主库发生故障时,至少有一个从库拥有完整的事务数据,提高了数据的安全性。
4.2 配置步骤
4.2.1 安装半同步插件
- 在主库和从库上分别安装半同步插件:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
4.2.2 主库配置
- 修改主库配置文件:
[mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10000
- 重启主库服务
- 检查半同步状态:
SHOW VARIABLES LIKE 'rpl_semi_sync_master_enabled'; SHOW STATUS LIKE 'Rpl_semi_sync_master_status';
4.2.3 从库配置
- 修改从库配置文件:
[mysqld] rpl_semi_sync_slave_enabled=1
- 重启从库服务
- 检查半同步状态:
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled'; SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
4.3 优缺点
4.3.1 优点
- 提高数据安全性:确保在主库故障时至少有一个从库拥有完整数据
- 性能较好:相比全同步复制,半同步复制的性能开销较小
4.3.2 缺点
- 性能影响:由于需要等待从库确认,会增加事务提交的延迟
- 复杂性增加:配置和维护相对复杂
五、MySQL SSL复制
5.1 原理
SSL复制是通过SSL加密通道来传输复制数据的,它可以保证数据在网络传输过程中的安全性,防止数据被窃听或篡改。在配置SSL复制之前,需要先在主库和从库上配置SSL证书和密钥。
5.2 配置步骤
5.2.1 生成SSL证书和密钥
- 在主库上生成CA证书、服务器证书和私钥:
openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 365 -key ca-key.pem -out ca-cert.pem openssl req -newkey rsa:2048 -days 365 -nodes -keyout server-key.pem -out server-req.pem openssl rsa -in server-key.pem -out server-key.pem openssl x509 -req -in server-req.pem -days 365 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
5.2.2 主库配置
- 将生成的证书和密钥文件复制到主库的MySQL数据目录
- 修改主库配置文件:
[mysqld] ssl-ca=/var/lib/mysql/ca-cert.pem ssl-cert=/var/lib/mysql/server-cert.pem ssl-key=/var/lib/mysql/server-key.pem
- 重启主库服务
- 验证SSL配置:
SHOW VARIABLES LIKE '%ssl%';
5.2.3 从库配置
- 将主库的CA证书复制到从库
- 修改从库配置文件:
[mysqld] ssl-ca=/var/lib/mysql/ca-cert.pem
- 重启从库服务
- 配置从库使用SSL连接主库:
CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_SSL=1, MASTER_SSL_CA='/var/lib/mysql/ca-cert.pem';
- 启动从库复制并检查状态:
START SLAVE; SHOW SLAVE STATUS\G
5.3 优势
- 数据安全:加密传输防止数据泄露和篡改
- 合规性:满足某些行业对数据传输安全性的合规要求
六、总结
MySQL的主从、双主、半同步及SSL复制各有其特点和适用场景。主从复制适用于读写分离和数据备份;双主复制适用于双向数据同步;半同步复制提高了数据的安全性;SSL复制保证了数据传输的安全性。在实际应用中,可以根据业务需求选择合适的复制方式,或者结合多种方式来实现更复杂的高可用和分布式架构。