Skip to content

TDSQL 主从部署

部署前准备

硬件要求

节点类型CPU内存存储网络
主节点8核16线程32GB1TB SSD万兆网卡
从节点8核16线程32GB1TB SSD万兆网卡

软件要求

软件版本要求
操作系统CentOS 7.6-7.9 或 Ubuntu Server 18.04 LTS
Python3.6 或更高版本
TDSQL5.7 或更高版本

网络规划

  • 主从节点之间建议使用专用网络
  • 确保主从节点之间网络延迟小于10ms
  • 开放必要端口:3306(数据库端口)、33060(监控端口)

系统配置

  1. 关闭防火墙

    bash
    # CentOS/RHEL
    systemctl stop firewalld
    systemctl disable firewalld
    
    # Ubuntu/Debian
    ufw disable
  2. 禁用SELinux

    bash
    # 临时禁用
    setenforce 0
    
    # 永久禁用
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
  3. 优化内核参数

    bash
    cat > /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
  4. 调整文件描述符限制

    bash
    cat > /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;

记录输出中的 FilePositionExecuted_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_RunningSlave_SQL_Running 均为 YesSeconds_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

配置监控告警

在监控平台上配置主从相关告警规则:

  1. 主从延迟告警

    • 告警条件:Seconds_Behind_Master > 300
    • 告警级别:警告
  2. 复制异常告警

    • 告警条件:Slave_IO_Running 或 Slave_SQL_Running 为 No
    • 告警级别:严重
  3. 主节点故障告警

    • 告警条件:主节点不可用
    • 告警级别:严重

故障切换配置

手动故障切换

  1. 检查从节点状态

    sql
    SHOW SLAVE STATUS\G;
  2. 提升从节点为主节点

    sql
    STOP SLAVE;
    RESET SLAVE ALL;
    SET GLOBAL read_only = OFF;
    SET GLOBAL super_read_only = OFF;
  3. 更新应用连接地址

    • 修改应用配置中的数据库连接地址为新主节点地址
    • 重启应用或刷新连接池
  4. 配置其他从节点指向新主节点

    sql
    STOP 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)

  1. 安装MHA

    bash
    # 在MHA管理节点上安装
    sudo yum install -y mha4mysql-manager mha4mysql-node
    
    # 在所有TDSQL节点上安装
    sudo yum install -y mha4mysql-node
  2. 创建MHA配置文件

    bash
    cat > /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
  3. 测试MHA配置

    bash
    masterha_check_ssh --conf=/etc/mha/tdsql_mha.conf
    masterha_check_repl --conf=/etc/mha/tdsql_mha.conf
  4. 启动MHA Manager

    bash
    nohup 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 &
  5. 监控MHA状态

    bash
    masterha_check_status --conf=/etc/mha/tdsql_mha.conf

主从维护操作

主从延迟处理

延迟原因分析

  1. 网络问题:检查网络带宽和延迟
  2. 从节点负载过高:检查CPU、内存、IO使用率
  3. 大事务:优化SQL,拆分大事务
  4. 索引缺失:为查询添加适当索引
  5. 二进制日志过大:调整expire_logs_days参数

延迟解决方法

  1. 优化从节点配置

    sql
    SET GLOBAL slave_parallel_workers = 8;
    SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';
  2. 增加从节点资源:升级硬件或添加更多从节点

  3. 使用级联复制:主节点→中间节点→从节点

  4. 配置半同步或异步复制:根据业务需求调整复制模式

主节点切换

计划内切换

  1. 在主节点上执行

    sql
    FLUSH TABLES WITH READ LOCK;
    SHOW MASTER STATUS;
  2. 等待从节点同步完成

    sql
    SHOW SLAVE STATUS\G;

    确保 Seconds_Behind_Master 为 0

  3. 在主节点上执行

    sql
    UNLOCK TABLES;
  4. 执行手动故障切换步骤

从节点添加与删除

添加新从节点

  1. 使用备份恢复数据

    bash
    # 在主节点上创建备份
    mysqldump -u root -p --all-databases --single-transaction --routines --triggers --events > full_backup.sql
    
    # 在新从节点上恢复备份
    mysql -u root -p < full_backup.sql
  2. 配置主从复制:参考前面的从节点配置步骤

删除从节点

  1. 在从节点上停止复制

    sql
    STOP SLAVE;
    RESET SLAVE ALL;
  2. 关闭从节点

    bash
    sudo $TDSQL_HOME/bin/tdsqladmin -S /home/tdsql/tdsql.sock shutdown
  3. 从监控和MHA配置中移除

    • 更新监控配置,移除该节点
    • 更新MHA配置,移除该节点

主从部署最佳实践

架构设计

  1. 建议使用奇数个从节点:便于选举新主节点
  2. 从节点数量不宜过多:建议3-5个,过多会增加主节点负担
  3. 跨可用区部署:提高容灾能力
  4. 合理选择复制模式:根据业务需求选择异步、半同步或强同步

配置优化

  1. 启用GTID:简化主从管理和故障切换
  2. 配置适当的复制并行度:提高从节点同步速度
  3. 优化二进制日志:使用ROW格式,便于数据恢复
  4. 配置从节点只读:防止误写

监控与告警

  1. 监控关键指标

    • 主从延迟(Seconds_Behind_Master)
    • 复制状态(Slave_IO_Running, Slave_SQL_Running)
    • 二进制日志生成速度
    • 从节点同步速度
  2. 设置合理的告警阈值

    • 主从延迟:300秒(警告),600秒(严重)
    • 复制状态异常:立即告警
  3. 定期测试故障切换:确保故障切换机制正常工作

安全建议

  1. 限制复制用户权限:仅授予REPLICATION SLAVE权限
  2. 使用强密码:为复制用户设置复杂密码
  3. 加密复制流量:使用SSL加密主从之间的数据传输
  4. 定期轮换密码:每3个月更换一次复制用户密码

常见问题(FAQ)

Q1: 主从复制中出现"Duplicate entry"错误怎么办?

A1: 这通常是由于从节点数据与主节点不一致导致的。解决方法:

  1. 检查错误日志,确定冲突的数据
  2. 在从节点上跳过该错误:
    sql
    STOP SLAVE;
    SET GLOBAL sql_slave_skip_counter = 1;
    START SLAVE;
  3. 或重新同步数据:使用主节点备份恢复从节点

Q2: 主从延迟持续增加怎么办?

A2: 可以从以下几个方面排查:

  1. 检查网络带宽和延迟,确保主从之间网络通畅
  2. 检查从节点负载,如CPU、内存、IO使用率
  3. 检查主节点是否有大事务在执行
  4. 优化从节点配置,增加复制并行度
  5. 考虑添加更多从节点分担读压力

Q3: 如何判断主从复制是否健康?

A3: 可以通过以下指标判断:

  1. Slave_IO_RunningSlave_SQL_Running 均为 Yes
  2. Seconds_Behind_Master 为 0 或较小值(通常<10秒)
  3. 主节点和从节点的GTID集合一致
  4. 从节点可以正常执行读操作

Q4: 主节点故障后,如何选择最合适的从节点提升为主节点?

A4: 可以参考以下标准:

  1. 数据最新:选择 Seconds_Behind_Master 最小的节点
  2. 硬件配置最好:选择资源充足的节点
  3. 网络条件最佳:选择网络延迟低的节点
  4. 负载最低:选择当前负载较低的节点
  5. 预设优先级:根据MHA配置的candidate_master参数

Q5: 如何实现读写分离?

A5: 可以通过以下方式实现:

  1. 应用层读写分离:在应用代码中根据SQL类型选择连接主节点或从节点
  2. 中间件读写分离:使用MyCAT、ProxySQL等中间件自动路由
  3. TDSQL内置读写分离:配置TDSQL的读写分离规则

Q6: 主从复制中,从节点可以有多个角色吗?

A6: 是的,从节点可以同时担任多种角色:

  1. 只读从节点:处理读请求
  2. 备份从节点:专门用于备份操作
  3. 延迟从节点:故意设置延迟,用于恢复误操作
  4. 级联从节点:从其他从节点复制数据,减轻主节点负担

Q7: 如何监控主从复制的性能?

A7: 可以监控以下指标:

  1. 主节点

    • Binlog生成速度
    • 主节点发送日志的速率
    • 主节点连接数
  2. 从节点

    • 从节点接收日志的速率
    • 从节点应用日志的速率
    • 从节点复制延迟
    • 从节点IO和SQL线程状态
  3. 网络

    • 主从之间的网络带宽使用率
    • 主从之间的网络延迟

Q8: 主从部署中,如何确保数据安全性?

A8: 可以采取以下措施:

  1. 定期备份数据,包括全量备份和增量备份
  2. 配置适当的复制模式,如半同步或强同步
  3. 启用GTID,便于数据恢复和主从切换
  4. 加密主从之间的数据传输
  5. 定期测试数据恢复流程
  6. 配置监控告警,及时发现异常情况