MySQL读写分离与高可用方案(CentOS 5.6.44环境)
By 水木神風
at 2025-07-23 • 0人收藏 • 313人看过
MySQL读写分离与高可用方案(CentOS 5.6.44环境)
一、架构设计方案
1. 目标架构
[应用层] │ ├─ [主库] 10.109.10.122 (读写) │ └─ [从库] 10.109.10.125 (只读)
2. 技术选型
数据同步:MySQL原生主从复制
故障转移:手动切换(5.6版本推荐方案)
读写分离:应用层实现(或使用ProxySQL)
二、主库(122)配置
1. 修改my.cnf
[mysqld] server-id = 1 log-bin = mysql-bin binlog-format = ROW sync_binlog = 1 innodb_flush_log_at_trx_commit = 1
2. 创建复制账号
CREATE USER 'repl'@'10.109.10.%' IDENTIFIED BY 'SecurePass123!'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.109.10.%'; FLUSH PRIVILEGES;
3. 锁定数据库并获取位置点
FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; -- 记录File和Position值(例如:mysql-bin.000001, 107)
三、从库(125)配置
1. 安装相同版本MySQL
# 确保版本一致 yum install mysql-server-5.6.44
2. 修改my.cnf
[mysqld] server-id = 2 read-only = 1 relay-log = mysql-relay-bin log-slave-updates = 1
3. 配置主从复制
CHANGE MASTER TO MASTER_HOST='10.109.10.122', MASTER_USER='repl', MASTER_PASSWORD='SecurePass123!', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107; START SLAVE;
4. 验证复制状态
SHOW SLAVE STATUS\G -- 确保 Slave_IO_Running 和 Slave_SQL_Running 都是 Yes
四、读写分离实现方案
方案A:应用层实现(推荐)
# Python示例
db_config = {
'master': {
'host': '10.109.10.122',
'user': 'app_user',
'password': 'AppPassword123!',
'database': 'app_db'
},
'slave': {
'host': '10.109.10.125',
'user': 'app_user',
'password': 'AppPassword123!',
'database': 'app_db'
}
}
def get_db_connection(is_write=False):
return pymysql.connect(**db_config['master'] if is_write else db_config['slave'])方案B:使用中间件(ProxySQL)
-- ProxySQL配置示例 INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (10,'10.109.10.122',3306); INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (20,'10.109.10.125',3306); -- 读写分离规则 INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES (1,1,'^SELECT.*FOR UPDATE',10,1), (2,1,'^SELECT',20,1), (3,1,'^INSERT',10,1), (4,1,'^UPDATE',10,1), (5,1,'^DELETE',10,1);
五、高可用保障措施
1. 主从监控脚本
#!/bin/bash SLAVE_STATUS=$(mysql -h 10.109.10.125 -e "SHOW SLAVE STATUS\G" | grep "Running") if [[ ! $SLAVE_STATUS =~ "Yes" ]]; then echo "主从复制异常!" | mail -s "MySQL复制告警" admin@example.com fi
2. 手动故障切换流程
原主库(122)故障时:
-- 在从库(125)执行: STOP SLAVE; RESET MASTER; SET GLOBAL read_only = 0;
修改应用配置:将所有请求指向125
原主库恢复后:
-- 在原主库(122)执行: CHANGE MASTER TO MASTER_HOST='10.109.10.125', ...; START SLAVE;
3. 数据一致性校验
# 使用pt-table-checksum工具 pt-table-checksum --replicate=test.checksums h=10.109.10.122,u=check_user,p=CheckPass123!
六、注意事项
版本限制:
MySQL 5.6不支持GTID自动故障转移
考虑升级到5.7+以获得更好的高可用特性
备份策略:
# 主库每日全备 mysqldump --single-transaction --master-data=2 -h 122 -u backup_user -p > /backups/full_$(date +%F).sql
性能优化:
# 从库my.cnf追加 innodb_read_only = 1 skip-slave-start = 0
登录后方可回帖