Skip to content

TDSQL 多可用区部署

多可用区部署架构

典型架构

双可用区架构

  • 配置:主节点部署在可用区A,从节点部署在可用区B
  • 特点:部署简单,成本较低,提供基本的跨可用区容灾能力
  • 适用场景:对容灾要求一般的业务

三可用区架构

  • 配置:主节点部署在可用区A,从节点1部署在可用区B,从节点2部署在可用区C
  • 特点:提供更高的可用性和容灾能力,支持多维度故障切换
  • 适用场景:对容灾要求较高的核心业务

多主架构

  • 配置:多个主节点分布在不同可用区,同时处理写请求
  • 特点:提供最高的可用性和扩展性,支持跨可用区负载均衡
  • 适用场景:对可用性和性能要求极高的超大规模业务

组件分布

组件可用区A可用区B可用区C
主节点1个--
从节点-1个1个
监控节点1个1个1个
管理节点1个1个-
负载均衡1个1个1个

部署前准备

硬件要求

节点类型CPU内存存储网络
主节点16核32线程64GB2TB SSD万兆网卡
从节点16核32线程64GB2TB SSD万兆网卡
监控节点8核16线程32GB500GB SSD万兆网卡
管理节点8核16线程32GB500GB SSD万兆网卡

软件要求

软件版本要求
操作系统CentOS 7.6-7.9 或 Ubuntu Server 18.04 LTS
Python3.6 或更高版本
TDSQL5.7 或更高版本
负载均衡Nginx 1.16 或 F5
监控系统Prometheus + Grafana 或 TDSQL 监控平台

网络规划

  1. 可用区间网络

    • 采用专线连接,确保低延迟和高带宽
    • 网络延迟要求:< 5ms
    • 带宽要求:≥ 10Gbps
  2. IP地址规划

    • 每个可用区使用独立的子网段
    • 主从节点使用私有IP通信
    • 对外服务使用公网IP或负载均衡IP
  3. 端口规划

    • 数据库端口:3306
    • 监控端口:33060
    • 管理端口:8080
    • 负载均衡端口:3306(对外)

系统配置

  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. 环境准备

配置hosts文件

bash
cat >> /etc/hosts << EOF
# 可用区A
10.0.0.10 tdsql-master-az1
10.0.0.11 tdsql-monitor-az1
10.0.0.12 tdsql-manager-az1

# 可用区B
10.0.1.10 tdsql-slave1-az2
10.0.1.11 tdsql-monitor-az2
10.0.1.12 tdsql-manager-az2

# 可用区C
10.0.2.10 tdsql-slave2-az3
10.0.2.11 tdsql-monitor-az3
EOF

配置SSH免密登录

bash
# 在所有节点上执行
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa

# 复制公钥到所有节点
for host in tdsql-master-az1 tdsql-slave1-az2 tdsql-slave2-az3 tdsql-monitor-az1 tdsql-monitor-az2 tdsql-monitor-az3 tdsql-manager-az1 tdsql-manager-az2;
do
  ssh-copy-id -i ~/.ssh/id_rsa.pub $host;
done

2. 安装TDSQL

在所有节点上安装TDSQL,参考《TDSQL 单节点部署》文档的安装步骤。

3. 配置主节点(可用区A)

修改主节点配置文件

bash
cat > /home/tdsql/conf/tdsql.conf << EOF
[mysqld]
# 基础配置
server_id = 1001
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
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 10000

# 连接配置
max_connections = 4000

# 存储引擎配置
default_storage_engine = InnoDB
innodb_buffer_pool_size = 48G
innodb_log_file_size = 4G
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT

# TDSQL特有配置
tdsql_mode = master
az_name = az1
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;

4. 配置从节点(可用区B和C)

修改从节点1(可用区B)配置文件

bash
cat > /home/tdsql/conf/tdsql.conf << EOF
[mysqld]
# 基础配置
server_id = 2001
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
rpl_semi_sync_slave_enabled = 1

# 从节点配置
read_only = 1
super_read_only = 1
slave_parallel_workers = 16
slave_parallel_type = 'LOGICAL_CLOCK'

# 连接配置
max_connections = 4000

# 存储引擎配置
default_storage_engine = InnoDB
innodb_buffer_pool_size = 48G
innodb_log_file_size = 4G
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT

# TDSQL特有配置
tdsql_mode = slave
az_name = az2
EOF

修改从节点2(可用区C)配置文件

bash
cat > /home/tdsql/conf/tdsql.conf << EOF
[mysqld]
# 基础配置
server_id = 3001
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
rpl_semi_sync_slave_enabled = 1

# 从节点配置
read_only = 1
super_read_only = 1
slave_parallel_workers = 16
slave_parallel_type = 'LOGICAL_CLOCK'

# 连接配置
max_connections = 4000

# 存储引擎配置
default_storage_engine = InnoDB
innodb_buffer_pool_size = 48G
innodb_log_file_size = 4G
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT

# TDSQL特有配置
tdsql_mode = slave
az_name = az3
EOF

重启从节点

bash
# 在从节点1上执行
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 &

# 在从节点2上执行
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 &

5. 配置主从复制

在从节点1(可用区B)上执行

sql
CHANGE MASTER TO
  MASTER_HOST = 'tdsql-master-az1',
  MASTER_PORT = 3306,
  MASTER_USER = 'repl',
  MASTER_PASSWORD = 'repl_password',
  MASTER_AUTO_POSITION = 1;

START SLAVE;

在从节点2(可用区C)上执行

sql
CHANGE MASTER TO
  MASTER_HOST = 'tdsql-master-az1',
  MASTER_PORT = 3306,
  MASTER_USER = 'repl',
  MASTER_PASSWORD = 'repl_password',
  MASTER_AUTO_POSITION = 1;

START SLAVE;

检查主从复制状态

sql
# 在主节点上执行
SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync_master_clients';

# 在从节点上执行
SHOW SLAVE STATUS\G;

确保:

  • 主节点上 Rpl_semi_sync_master_clients 为 2
  • 从节点上 Slave_IO_RunningSlave_SQL_Running 均为 Yes
  • 从节点上 Seconds_Behind_Master 为 0

6. 配置负载均衡

安装并配置Nginx

bash
# 在所有可用区的负载均衡节点上执行
sudo yum install -y nginx

cat > /etc/nginx/nginx.conf << EOF
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

stream {
    upstream tdsql_cluster {
        server tdsql-master-az1:3306 weight=1 max_fails=3 fail_timeout=30s;
        server tdsql-slave1-az2:3306 weight=1 max_fails=3 fail_timeout=30s backup;
        server tdsql-slave2-az3:3306 weight=1 max_fails=3 fail_timeout=30s backup;
    }

    server {
        listen 3306;
        proxy_pass tdsql_cluster;
        proxy_connect_timeout 10s;
        proxy_timeout 30s;
        proxy_buffer_size 4k;
    }
}
EOF

# 启动Nginx
sudo systemctl start nginx
sudo systemctl enable nginx

配置DNS

将数据库服务域名解析到所有可用区的负载均衡IP,实现智能DNS解析和故障切换。

7. 配置监控系统

安装Prometheus

bash
# 在监控节点上执行
download_url=https://github.com/prometheus/prometheus/releases/download/v2.30.0/prometheus-2.30.0.linux-amd64.tar.gz
sudo wget $download_url -O /tmp/prometheus.tar.gz
sudo tar -zxvf /tmp/prometheus.tar.gz -C /opt
sudo mv /opt/prometheus-2.30.0.linux-amd64 /opt/prometheus

# 配置Prometheus
cat > /opt/prometheus/prometheus.yml << EOF
global:
  scrape_interval:     15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'tdsql'
    static_configs:
      - targets: ['tdsql-master-az1:9104', 'tdsql-slave1-az2:9104', 'tdsql-slave2-az3:9104']
  - job_name: 'node'
    static_configs:
      - targets: ['tdsql-master-az1:9100', 'tdsql-slave1-az2:9100', 'tdsql-slave2-az3:9100', 'tdsql-monitor-az1:9100', 'tdsql-monitor-az2:9100', 'tdsql-monitor-az3:9100', 'tdsql-manager-az1:9100', 'tdsql-manager-az2:9100']
EOF

# 启动Prometheus
sudo nohup /opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml --storage.tsdb.path=/opt/prometheus/data --web.listen-address=:9090 > /var/log/prometheus.log 2>&1 &

安装Grafana

bash
# 在监控节点上执行
sudo yum install -y https://dl.grafana.com/oss/release/grafana-8.2.0-1.x86_64.rpm
sudo systemctl start grafana-server
sudo systemctl enable grafana-server

配置监控面板

  1. 登录Grafana(默认端口3000,用户名/密码:admin/admin)
  2. 添加Prometheus数据源
  3. 导入TDSQL监控面板模板
  4. 配置告警规则,包括:
    • 主从延迟告警
    • 复制状态告警
    • 节点不可用告警
    • 可用区故障告警

故障切换测试

1. 单节点故障测试

模拟主节点故障

bash
# 在主节点上执行
sudo $TDSQL_HOME/bin/tdsqladmin -S /home/tdsql/tdsql.sock shutdown

检查故障切换

  1. 监控系统应立即发出告警
  2. 从节点应自动提升为主节点
  3. 其他从节点应自动指向新主节点
  4. 应用应通过负载均衡自动连接到新主节点
  5. 业务中断时间应小于30秒

恢复主节点

bash
# 在原主节点上执行
sudo $TDSQL_HOME/bin/tdsql_safe --defaults-file=$TDSQL_HOME/conf/tdsql.conf --user=tdsql &

# 配置为从节点
mysql -u root -p -e "STOP SLAVE; RESET SLAVE ALL; CHANGE MASTER TO MASTER_HOST='tdsql-slave1-az2', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='repl_password', MASTER_AUTO_POSITION=1; START SLAVE;"

2. 可用区故障测试

模拟可用区A故障

bash
# 在可用区A的所有节点上执行
sudo shutdown -h now

检查故障切换

  1. 监控系统应立即发出可用区故障告警
  2. 可用区B的从节点应自动提升为主节点
  3. 可用区C的从节点应自动指向新主节点
  4. 负载均衡应自动将流量切换到可用区B和C
  5. 业务中断时间应小于60秒

恢复可用区A

  1. 启动可用区A的所有节点
  2. 配置可用区A的节点为从节点
  3. 恢复负载均衡配置
  4. 验证数据同步正常

多可用区部署最佳实践

架构设计

  1. 选择合适的可用区数量

    • 一般建议3个可用区,提供最高的可用性
    • 最少2个可用区,提供基本的跨可用区容灾能力
  2. 合理分配节点资源

    • 主节点和从节点配置相同,便于故障切换
    • 监控和管理节点跨可用区部署,确保监控不中断
    • 负载均衡节点每个可用区至少部署1个
  3. 选择合适的复制模式

    • 核心业务建议使用强同步复制
    • 非核心业务可以使用半同步或异步复制
    • 根据业务对一致性和性能的要求选择合适的复制模式

配置优化

  1. 优化网络配置

    • 确保可用区间网络延迟小于5ms
    • 配置足够的网络带宽,满足数据同步需求
    • 启用网络压缩,减少数据传输量
  2. 优化复制配置

    • 启用GTID,简化主从管理和故障切换
    • 配置适当的复制并行度,提高从节点同步速度
    • 启用半同步或强同步复制,确保数据一致性
  3. 优化存储配置

    • 使用高性能SSD存储,提高IO性能
    • 配置适当的RAID级别,提高存储可靠性
    • 启用存储加密,确保数据安全

监控与告警

  1. 监控关键指标

    • 可用区间网络延迟和带宽
    • 主从复制延迟
    • 节点CPU、内存、IO使用率
    • 数据库连接数和查询性能
    • 可用区整体状态
  2. 设置合理的告警阈值

    • 网络延迟:> 10ms 警告,> 50ms 严重
    • 主从延迟:> 300s 警告,> 600s 严重
    • 节点不可用:立即告警
    • 可用区故障:立即告警
  3. 定期测试故障切换

    • 每季度进行一次单节点故障切换测试
    • 每半年进行一次可用区故障切换测试
    • 每次测试后进行总结和优化

安全建议

  1. 网络安全

    • 配置防火墙,限制只有授权IP可以访问数据库
    • 启用SSL加密,保护数据传输安全
    • 配置VPC和子网隔离,提高网络安全性
  2. 数据安全

    • 启用数据加密,保护静态数据安全
    • 配置定期备份,确保数据可恢复
    • 启用审计日志,记录所有数据库操作
  3. 访问控制

    • 遵循最小权限原则,限制用户权限
    • 使用强密码,定期更换密码
    • 启用多因素认证,提高登录安全性

常见问题(FAQ)

Q1: 多可用区部署的成本如何?

A1: 多可用区部署的成本主要包括:

  1. 硬件成本:需要更多的服务器节点
  2. 网络成本:可用区间专线连接成本
  3. 人力成本:部署和维护复杂度增加
  4. 软件成本:监控和管理软件成本

但多可用区部署可以显著提高系统可用性,减少业务中断损失,从长远来看是值得的。

Q2: 多可用区部署的延迟如何?

A2: 多可用区部署的延迟主要取决于:

  1. 可用区间距离:距离越远,延迟越高
  2. 网络带宽:带宽不足会导致延迟增加
  3. 复制模式:强同步复制延迟最高,异步复制延迟最低
  4. 负载情况:高负载会导致延迟增加

一般建议选择距离较近的可用区,确保延迟小于5ms。

Q3: 如何选择合适的复制模式?

A3: 选择复制模式应考虑以下因素:

  1. 业务对一致性的要求

    • 金融核心业务:强同步复制
    • 一般核心业务:半同步复制
    • 非核心业务:异步复制
  2. 业务对性能的要求

    • 高并发业务:异步或半同步复制
    • 低并发业务:强同步复制
  3. 可用区间网络条件

    • 网络延迟低、带宽充足:强同步复制
    • 网络延迟高、带宽有限:异步复制

Q4: 多可用区部署如何实现读写分离?

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

  1. 负载均衡层读写分离

    • 配置负载均衡,将写请求转发到主节点
    • 将读请求均衡转发到所有从节点
  2. 中间件读写分离

    • 使用MyCAT、ProxySQL等中间件
    • 中间件自动解析SQL,实现读写分离
  3. 应用层读写分离

    • 在应用代码中根据SQL类型选择连接
    • 写操作连接主节点,读操作连接从节点

Q5: 如何处理多可用区部署中的数据一致性问题?

A5: 可以采取以下措施:

  1. 使用强同步或半同步复制:确保数据至少复制到一个从节点
  2. 启用GTID:确保每个事务有唯一标识,便于数据恢复
  3. 配置适当的超时时间:避免因网络问题导致写操作长时间阻塞
  4. 定期验证数据一致性:使用工具检查主从数据是否一致
  5. 配置自动修复机制:发现数据不一致时自动修复

Q6: 多可用区部署的扩容如何操作?

A6: 扩容操作包括:

  1. 添加从节点

    • 在现有可用区添加从节点
    • 在新可用区添加从节点
    • 配置主从复制,加入集群
  2. 提升可用区级别

    • 将现有从节点所在可用区提升为独立可用区
    • 配置负载均衡和DNS
    • 实现多可用区负载均衡
  3. 跨可用区迁移

    • 在新可用区部署从节点
    • 等待数据同步完成
    • 将主节点切换到新可用区
    • 完成跨可用区迁移

Q7: 如何监控多可用区部署的状态?

A7: 可以监控以下指标:

  1. 节点状态:CPU、内存、IO使用率
  2. 复制状态:主从延迟、复制线程状态
  3. 网络状态:可用区间延迟、带宽使用率
  4. 业务状态:连接数、查询性能、错误率
  5. 可用区状态:可用区整体负载、故障情况

建议使用Prometheus + Grafana构建统一的监控平台,实现可视化监控和告警。

Q8: 多可用区部署的备份策略如何制定?

A8: 备份策略应考虑以下因素:

  1. 备份位置

    • 每个可用区至少保留一份备份
    • 跨区域备份,防止区域级故障
  2. 备份频率

    • 全量备份:每天一次
    • 增量备份:每小时一次
    • 二进制日志备份:实时备份
  3. 备份验证

    • 定期验证备份的可用性
    • 每季度进行一次恢复测试
    • 确保备份可以在30分钟内恢复
  4. 备份保留

    • 本地备份:保留7天
    • 跨可用区备份:保留30天
    • 跨区域备份:保留90天

Q9: 如何处理多可用区部署中的灾难恢复?

A9: 灾难恢复策略包括:

  1. 制定详细的灾难恢复计划

    • 明确灾难级别和响应流程
    • 确定恢复时间目标(RTO)和恢复点目标(RPO)
    • 明确各角色的职责和操作步骤
  2. 定期进行灾难恢复演练

    • 每半年进行一次完整的灾难恢复演练
    • 测试不同级别的灾难场景
    • 演练后进行总结和优化
  3. 配置自动化恢复机制

    • 自动检测灾难发生
    • 自动触发故障切换
    • 自动恢复业务
  4. 建立备用数据中心

    • 在不同区域建立备用数据中心
    • 实现跨区域数据同步
    • 确保在区域级故障时可以快速切换

Q10: 多可用区部署与传统主从部署有什么区别?

A10: 主要区别包括:

  1. 部署范围

    • 传统主从部署:通常在同一机房或数据中心
    • 多可用区部署:跨多个地理位置独立的可用区
  2. 容灾能力

    • 传统主从部署:只能应对单节点故障
    • 多可用区部署:可以应对整个可用区故障
  3. 网络要求

    • 传统主从部署:网络延迟低,带宽要求相对较低
    • 多可用区部署:对网络延迟和带宽要求较高
  4. 复杂度

    • 传统主从部署:部署和维护相对简单
    • 多可用区部署:部署和维护复杂度较高
  5. 成本

    • 传统主从部署:成本相对较低
    • 多可用区部署:成本相对较高
  6. 可用性

    • 传统主从部署:可用性一般在99.9%
    • 多可用区部署:可用性可以达到99.99%或更高