ab复制
MySQL 的 AB 复制(主从复制)是一种常见的数据同步机制,用于在主服务器(A)和从服务器(B)之间复制数据,以实现高可用性和负载均衡。以下是部署 MySQL AB 复制的详细步骤:
1. 环境准备
- 两台服务器:主服务器(A)和从服务器(B)。
- 已安装并运行 MySQL 数据库。
- 确保两台服务器可以通过网络相互通信。
2. 主服务器配置(A)
修改 MySQL 配置文件
编辑主服务器的 MySQL 配置文件(一般位于 /etc/my.cnf 或 /etc/mysql/my.cnf),添加以下内容:
[mysqld]
server-id=1                 # 唯一ID,主从服务器必须不同
log-bin=mysql-bin           # 开启二进制日志
binlog-do-db=your_database  # 需要复制的数据库
binlog-ignore-db=mysql      # 不需要复制的数据库(可选)重启 MySQL 服务
sudo systemctl restart mysqld创建复制用户
登录 MySQL,创建一个用户用于复制:
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;获取主服务器的二进制日志信息
SHOW MASTER STATUS;File(二进制日志文件名)
- Position(二进制日志位置)
3. 从服务器配置(B)
修改 MySQL 配置文件
编辑从服务器的 MySQL 配置文件,添加以下内容:
[mysqld]
server-id=2                 # 唯一ID,与主服务器不同
relay-log=relay-log         # 开启中继日志(可选)
read-only=1                 # 设置只读(可选,确保从库不会被意外写入)重启 MySQL 服务
sudo systemctl restart mysqld配置复制
登录从服务器的 MySQL,执行以下命令:
CHANGE MASTER TO
  MASTER_HOST='主服务器IP地址',
  MASTER_USER='replica_user',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='主服务器的File',
  MASTER_LOG_POS=主服务器的Position;启动复制
START SLAVE;检查复制状态
SHOW SLAVE STATUS\G;Yes:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
4. 测试主从复制
- 在主服务器上向 your_database插入数据。
- 在从服务器上查询 your_database,确保数据同步成功。
注意事项
- 数据一致性:在设置从库前,确保从库和主库数据一致,可通过备份恢复。
- 防火墙设置:确保 3306 端口开放,允许从库访问主库。
- 高可用性:为避免单点故障,可以结合 MHA、Keepalived 或其他工具实现故障自动切换。
配置多个从服务器
在 MySQL AB 复制中,添加多个从服务器非常简单。从库之间没有直接关系,都是独立连接到主服务器的,主服务器会向所有从服务器同步二进制日志。以下是配置两台从服务器的步骤:
1. 环境说明
- 主服务器 (A):负责处理写操作和提供二进制日志。
- 从服务器 (B 和 C):负责从主服务器同步数据。
假设:
- 主服务器 IP:192.168.1.100
- 从服务器 B IP:192.168.1.101
- 从服务器 C IP:192.168.1.102
- 复制用户:replica_user,密码:password
2. 主服务器配置
主服务器的配置与单从库时相同,无需额外调整:
1. 确保主服务器的 server-id 唯一。
2. 开启二进制日志:
   
[mysqld]
server-id=1
log-bin=mysql-bin如果之前已完成主从复制,只需要确保主库已正常运行。
3. 从服务器 B 和 C 配置
3.1 修改配置文件
在每个从服务器(B 和 C)的 MySQL 配置文件(/etc/my.cnf 或 /etc/mysql/my.cnf)中,设置各自的 server-id 和必要的参数:
从服务器 B 配置:
[mysqld]
server-id=2                 # 从库 B 的唯一 ID
relay-log=relay-log         # 中继日志文件
read-only=1                 # 设置只读(可选)从服务器 C 配置:
[mysqld]
server-id=3                 # 从库 C 的唯一 ID
relay-log=relay-log         # 中继日志文件
read-only=1                 # 设置只读(可选)3.2 重启 MySQL 服务
重启每个从服务器的 MySQL 服务以加载新配置:
sudo systemctl restart mysqld3.3 设置从库同步
在每个从服务器(B 和 C)中登录 MySQL,并配置同步:
- 
通过主服务器的备份初始化从库 如果从库未初始化数据,需通过主库备份恢复数据一致性: 
- 
在主库执行备份: mysqldump -u root -p --all-databases --master-data > backup.sql
- 
将 backup.sql拷贝到从库,导入数据:mysql -u root -p < backup.sql
- 
设置复制参数 登录从库 B 和从库 C,分别执行以下命令: CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='replica_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', -- 主库日志文件名 MASTER_LOG_POS=12345; -- 主库日志位置
以上 MASTER_LOG_FILE 和 MASTER_LOG_POS 可通过在主库运行 SHOW MASTER STATUS; 获取。
- 
启动复制 在从库 B 和从库 C 上分别执行: START SLAVE;
- 
检查复制状态 在从库 B 和从库 C 上分别执行: SHOW SLAVE STATUS\G;
确认以下两项均为 Yes:
   - Slave_IO_Running: Yes
   - Slave_SQL_Running: Yes
4. 测试多从库复制
- 
在主库(A)执行写操作: USE test_db; INSERT INTO test_table (name, value) VALUES ('test', 123);
- 
在从库 B 和从库 C 查询数据,确保同步成功: USE test_db; SELECT * FROM test_table;
5. 注意事项
- 从库的 server-id 唯一:每个从库必须有唯一的 server-id。
- 负载均衡:
- 读操作可以分发到多个从库,避免某一从库过载。
- 使用中间件(如 ProxySQL 或 Mycat)管理多个从库。
- 数据一致性:主从复制存在延迟,重要读操作可强制从主库读取。
- 从库只读模式:开启 read_only参数,防止误写从库。
- 半同步复制(可选):提高数据一致性,可在主从之间启用半同步复制。
半同步复制
主从之间启用 半同步复制 是一种增强 MySQL 数据一致性的方法,用于减少主从复制中的数据丢失风险。
什么是半同步复制?
在默认的 MySQL 主从复制中,采用的是异步复制模式:
- 主库执行事务提交后,会立即向客户端返回“提交成功”。
- 主库随后将二进制日志 (binlog) 发送给从库,但主库并不等待从库确认是否收到或应用这些日志。
这种方式虽然效率高,但有潜在风险: 1. 数据丢失:如果主库崩溃,部分已经提交的事务可能尚未传输到从库,导致数据丢失。 2. 数据不一致:主从库之间可能短暂处于不同步状态。
半同步复制 是为了解决这些问题的一种改进: - 主库在提交事务时,不仅写入本地的二进制日志,还需等待至少一个从库确认接收到该日志。 - 只有当至少一个从库确认接收后,主库才会向客户端返回“提交成功”。 - 如果从库未及时响应,主库会切回异步复制模式以保证性能。
半同步复制的优缺点
优点:
- 数据一致性:主从复制的事务日志在提交时已传输到从库,减少了主库崩溃时的数据丢失。
- 高可靠性:适合对数据一致性要求较高的业务场景,如金融、电商等关键系统。
缺点:
- 性能影响:主库需要等待从库确认,会增加事务延迟。
- 依赖网络质量:如果主从之间网络不稳定,可能导致事务处理速度显著下降。
半同步复制的工作流程
- 客户端提交事务:
- 主库将事务日志写入二进制日志 (binlog)。
- 发送日志给从库:
- 主库将 binlog推送到从库。
- 等待从库确认:
- 至少一个从库接收到 binlog并写入中继日志后,向主库发送确认 (ACK)。
- 主库返回提交成功:
- 主库收到确认后,向客户端返回“提交成功”。
- 如果超时未收到确认,主库切换回异步模式。
如何启用半同步复制
以下是配置主从库启用半同步复制的步骤:
1. 检查并安装插件
在主库和从库上确保已安装 rpl_semi_sync_master 和 rpl_semi_sync_slave 插件:
在主库上:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';在从库上:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';2. 配置主库
在主库的 MySQL 配置文件(/etc/my.cnf)中添加以下内容:
[mysqld]
plugin-load-add=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000   # 设置超时时间 (毫秒)重启 MySQL 服务:
sudo systemctl restart mysqld在主库启用半同步复制:
SET GLOBAL rpl_semi_sync_master_enabled = 1;3. 配置从库
在从库的 MySQL 配置文件中添加以下内容:
[mysqld]
plugin-load-add=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1重启从库 MySQL 服务:
sudo systemctl restart mysqld在从库启用半同步复制:
SET GLOBAL rpl_semi_sync_slave_enabled = 1;4. 验证配置
在主库执行以下命令,查看是否启用了半同步复制:
SHOW VARIABLES LIKE 'rpl_semi%';检查是否有以下变量启用:
- rpl_semi_sync_master_enabled:是否启用了主库的半同步。
- rpl_semi_sync_master_status:当前是否使用半同步复制。
适用场景
- 对数据一致性要求高的系统:
- 金融交易、库存管理、在线支付等场景。
- 对性能要求相对次要的环境:
- 如果系统性能要求高,可能需要权衡事务延迟问题。
注意事项
- 从库数量建议:即使启用半同步复制,建议配置多个从库,提高可靠性。
- 网络质量要求:主从之间网络需要稳定,否则可能频繁回退到异步模式。
- 适当调整超时时间:通过参数 rpl_semi_sync_master_timeout设置主库等待从库确认的超时时间。