外观
TDSQL 主从部署
部署前准备
硬件要求
| 节点类型 | CPU | 内存 | 存储 | 网络 |
|---|---|---|---|---|
| 主节点 | 8核16线程 | 32GB | 1TB SSD | 万兆网卡 |
| 从节点 | 8核16线程 | 32GB | 1TB SSD | 万兆网卡 |
软件要求
| 软件 | 版本要求 |
|---|---|
| 操作系统 | CentOS 7.6-7.9 或 Ubuntu Server 18.04 LTS |
| Python | 3.6 或更高版本 |
| TDSQL | 5.7 或更高版本 |
网络规划
- 主从节点之间建议使用专用网络
- 确保主从节点之间网络延迟小于10ms
- 开放必要端口:3306(数据库端口)、33060(监控端口)
系统配置
关闭防火墙
bash# CentOS/RHEL systemctl stop firewalld systemctl disable firewalld # Ubuntu/Debian ufw disable禁用SELinux
bash# 临时禁用 setenforce 0 # 永久禁用 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config优化内核参数
bashcat > /etc/sysctl.d/tdsql.conf << EOF # 网络参数 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.tcp_keepalive_intvl = 15 # 文件系统参数 fs.file-max = 655350 # 内存参数 vm.swappiness = 1 EOF sysctl -p /etc/sysctl.d/tdsql.conf调整文件描述符限制
bashcat > /etc/security/limits.d/tdsql.conf << EOF * soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535 EOF
部署步骤
1. 安装TDSQL
在主从节点上分别安装TDSQL,参考《TDSQL 单节点部署》文档的安装步骤。
2. 配置主节点
修改主节点配置文件
bash
cat > /home/tdsql/conf/tdsql.conf << EOF
[mysqld]
# 基础配置
server_id = 1
port = 3306
basedir = /home/tdsql/installation/tdsql-5.7
datadir = /home/tdsql/data
pid_file = /home/tdsql/tdsql.pid
socket = /home/tdsql/tdsql.sock
# 二进制日志配置
enable_binary_log = 1
binlog_format = ROW
log_bin = /home/tdsql/logs/binlog
binlog_row_image = FULL
expire_logs_days = 7
# 主从复制配置
sync_binlog = 1
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = ON
# 连接配置
max_connections = 2000
# 存储引擎配置
default_storage_engine = InnoDB
innodb_buffer_pool_size = 24G
innodb_log_file_size = 2G
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
# TDSQL特有配置
tdsql_mode = master
EOF重启主节点
bash
sudo $TDSQL_HOME/bin/tdsqladmin -S /home/tdsql/tdsql.sock shutdown
sudo $TDSQL_HOME/bin/tdsql_safe --defaults-file=$TDSQL_HOME/conf/tdsql.conf --user=tdsql &创建复制用户
sql
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;获取主节点状态
sql
SHOW MASTER STATUS;记录输出中的 File 和 Position 或 Executed_Gtid_Set,用于从节点配置。
3. 配置从节点
修改从节点配置文件
bash
cat > /home/tdsql/conf/tdsql.conf << EOF
[mysqld]
# 基础配置
server_id = 2
port = 3306
basedir = /home/tdsql/installation/tdsql-5.7
datadir = /home/tdsql/data
pid_file = /home/tdsql/tdsql.pid
socket = /home/tdsql/tdsql.sock
# 二进制日志配置
enable_binary_log = 1
binlog_format = ROW
log_bin = /home/tdsql/logs/binlog
binlog_row_image = FULL
expire_logs_days = 7
# 主从复制配置
sync_binlog = 1
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = ON
# 从节点配置
read_only = 1
super_read_only = 1
# 连接配置
max_connections = 2000
# 存储引擎配置
default_storage_engine = InnoDB
innodb_buffer_pool_size = 24G
innodb_log_file_size = 2G
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
# TDSQL特有配置
tdsql_mode = slave
EOF重启从节点
bash
sudo $TDSQL_HOME/bin/tdsqladmin -S /home/tdsql/tdsql.sock shutdown
sudo $TDSQL_HOME/bin/tdsql_safe --defaults-file=$TDSQL_HOME/conf/tdsql.conf --user=tdsql &配置主从复制
使用GTID复制
sql
CHANGE MASTER TO
MASTER_HOST = 'master_ip',
MASTER_PORT = 3306,
MASTER_USER = 'repl',
MASTER_PASSWORD = 'repl_password',
MASTER_AUTO_POSITION = 1;使用传统复制
sql
CHANGE MASTER TO
MASTER_HOST = 'master_ip',
MASTER_PORT = 3306,
MASTER_USER = 'repl',
MASTER_PASSWORD = 'repl_password',
MASTER_LOG_FILE = 'binlog.000001',
MASTER_LOG_POS = 154;启动从节点复制
sql
START SLAVE;检查从节点状态
sql
SHOW SLAVE STATUS\G;确保 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes,Seconds_Behind_Master 为 0 或较小值。
主从监控配置
配置监控组件
安装监控代理
bash
# 在主从节点上安装监控代理
sudo yum install -y tdsql-monitor-agent
# 配置监控代理
cat > /etc/tdsql-monitor-agent.conf << EOF
[agent]
server_host = monitor_server_ip
server_port = 8080
node_type = tdsql
node_role = master # 从节点设置为 slave
[tdsql]
host = localhost
port = 3306
user = monitor
password = monitor_password
EOF
# 启动监控代理
sudo systemctl start tdsql-monitor-agent
sudo systemctl enable tdsql-monitor-agent配置监控告警
在监控平台上配置主从相关告警规则:
主从延迟告警
- 告警条件:Seconds_Behind_Master > 300
- 告警级别:警告
复制异常告警
- 告警条件:Slave_IO_Running 或 Slave_SQL_Running 为 No
- 告警级别:严重
主节点故障告警
- 告警条件:主节点不可用
- 告警级别:严重
故障切换配置
手动故障切换
检查从节点状态
sqlSHOW SLAVE STATUS\G;提升从节点为主节点
sqlSTOP SLAVE; RESET SLAVE ALL; SET GLOBAL read_only = OFF; SET GLOBAL super_read_only = OFF;更新应用连接地址
- 修改应用配置中的数据库连接地址为新主节点地址
- 重启应用或刷新连接池
配置其他从节点指向新主节点
sqlSTOP SLAVE; RESET SLAVE ALL; CHANGE MASTER TO MASTER_HOST = 'new_master_ip', MASTER_PORT = 3306, MASTER_USER = 'repl', MASTER_PASSWORD = 'repl_password', MASTER_AUTO_POSITION = 1; START SLAVE;
自动故障切换
配置MHA(Master High Availability)
安装MHA
bash# 在MHA管理节点上安装 sudo yum install -y mha4mysql-manager mha4mysql-node # 在所有TDSQL节点上安装 sudo yum install -y mha4mysql-node创建MHA配置文件
bashcat > /etc/mha/tdsql_mha.conf << EOF [server default] manager_workdir=/var/lib/mha/tdsql manager_log=/var/log/mha/tdsql.log master_binlog_dir=/home/tdsql/logs user=mha_manager password=mha_password ping_interval=1 repl_user=repl repl_password=repl_password ssh_user=root [server1] hostname=master_ip port=3306 candidate_master=1 [server2] hostname=slave1_ip port=3306 candidate_master=1 [server3] hostname=slave2_ip port=3306 candidate_master=1 EOF测试MHA配置
bashmasterha_check_ssh --conf=/etc/mha/tdsql_mha.conf masterha_check_repl --conf=/etc/mha/tdsql_mha.conf启动MHA Manager
bashnohup masterha_manager --conf=/etc/mha/tdsql_mha.conf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/tdsql_manager.log 2>&1 &监控MHA状态
bashmasterha_check_status --conf=/etc/mha/tdsql_mha.conf
主从维护操作
主从延迟处理
延迟原因分析
- 网络问题:检查网络带宽和延迟
- 从节点负载过高:检查CPU、内存、IO使用率
- 大事务:优化SQL,拆分大事务
- 索引缺失:为查询添加适当索引
- 二进制日志过大:调整expire_logs_days参数
延迟解决方法
优化从节点配置:
sqlSET GLOBAL slave_parallel_workers = 8; SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';增加从节点资源:升级硬件或添加更多从节点
使用级联复制:主节点→中间节点→从节点
配置半同步或异步复制:根据业务需求调整复制模式
主节点切换
计划内切换
在主节点上执行:
sqlFLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;等待从节点同步完成:
sqlSHOW SLAVE STATUS\G;确保
Seconds_Behind_Master为 0在主节点上执行:
sqlUNLOCK TABLES;执行手动故障切换步骤
从节点添加与删除
添加新从节点
使用备份恢复数据:
bash# 在主节点上创建备份 mysqldump -u root -p --all-databases --single-transaction --routines --triggers --events > full_backup.sql # 在新从节点上恢复备份 mysql -u root -p < full_backup.sql配置主从复制:参考前面的从节点配置步骤
删除从节点
在从节点上停止复制:
sqlSTOP SLAVE; RESET SLAVE ALL;关闭从节点:
bashsudo $TDSQL_HOME/bin/tdsqladmin -S /home/tdsql/tdsql.sock shutdown从监控和MHA配置中移除:
- 更新监控配置,移除该节点
- 更新MHA配置,移除该节点
主从部署最佳实践
架构设计
- 建议使用奇数个从节点:便于选举新主节点
- 从节点数量不宜过多:建议3-5个,过多会增加主节点负担
- 跨可用区部署:提高容灾能力
- 合理选择复制模式:根据业务需求选择异步、半同步或强同步
配置优化
- 启用GTID:简化主从管理和故障切换
- 配置适当的复制并行度:提高从节点同步速度
- 优化二进制日志:使用ROW格式,便于数据恢复
- 配置从节点只读:防止误写
监控与告警
监控关键指标:
- 主从延迟(Seconds_Behind_Master)
- 复制状态(Slave_IO_Running, Slave_SQL_Running)
- 二进制日志生成速度
- 从节点同步速度
设置合理的告警阈值:
- 主从延迟:300秒(警告),600秒(严重)
- 复制状态异常:立即告警
定期测试故障切换:确保故障切换机制正常工作
安全建议
- 限制复制用户权限:仅授予REPLICATION SLAVE权限
- 使用强密码:为复制用户设置复杂密码
- 加密复制流量:使用SSL加密主从之间的数据传输
- 定期轮换密码:每3个月更换一次复制用户密码
常见问题(FAQ)
Q1: 主从复制中出现"Duplicate entry"错误怎么办?
A1: 这通常是由于从节点数据与主节点不一致导致的。解决方法:
- 检查错误日志,确定冲突的数据
- 在从节点上跳过该错误:sql
STOP SLAVE; SET GLOBAL sql_slave_skip_counter = 1; START SLAVE; - 或重新同步数据:使用主节点备份恢复从节点
Q2: 主从延迟持续增加怎么办?
A2: 可以从以下几个方面排查:
- 检查网络带宽和延迟,确保主从之间网络通畅
- 检查从节点负载,如CPU、内存、IO使用率
- 检查主节点是否有大事务在执行
- 优化从节点配置,增加复制并行度
- 考虑添加更多从节点分担读压力
Q3: 如何判断主从复制是否健康?
A3: 可以通过以下指标判断:
Slave_IO_Running和Slave_SQL_Running均为 YesSeconds_Behind_Master为 0 或较小值(通常<10秒)- 主节点和从节点的GTID集合一致
- 从节点可以正常执行读操作
Q4: 主节点故障后,如何选择最合适的从节点提升为主节点?
A4: 可以参考以下标准:
- 数据最新:选择
Seconds_Behind_Master最小的节点 - 硬件配置最好:选择资源充足的节点
- 网络条件最佳:选择网络延迟低的节点
- 负载最低:选择当前负载较低的节点
- 预设优先级:根据MHA配置的candidate_master参数
Q5: 如何实现读写分离?
A5: 可以通过以下方式实现:
- 应用层读写分离:在应用代码中根据SQL类型选择连接主节点或从节点
- 中间件读写分离:使用MyCAT、ProxySQL等中间件自动路由
- TDSQL内置读写分离:配置TDSQL的读写分离规则
Q6: 主从复制中,从节点可以有多个角色吗?
A6: 是的,从节点可以同时担任多种角色:
- 只读从节点:处理读请求
- 备份从节点:专门用于备份操作
- 延迟从节点:故意设置延迟,用于恢复误操作
- 级联从节点:从其他从节点复制数据,减轻主节点负担
Q7: 如何监控主从复制的性能?
A7: 可以监控以下指标:
主节点:
- Binlog生成速度
- 主节点发送日志的速率
- 主节点连接数
从节点:
- 从节点接收日志的速率
- 从节点应用日志的速率
- 从节点复制延迟
- 从节点IO和SQL线程状态
网络:
- 主从之间的网络带宽使用率
- 主从之间的网络延迟
Q8: 主从部署中,如何确保数据安全性?
A8: 可以采取以下措施:
- 定期备份数据,包括全量备份和增量备份
- 配置适当的复制模式,如半同步或强同步
- 启用GTID,便于数据恢复和主从切换
- 加密主从之间的数据传输
- 定期测试数据恢复流程
- 配置监控告警,及时发现异常情况
