Skip to content

TDSQL 跨地域部署

跨地域部署架构

典型架构

主备架构

  • 配置:主集群部署在地域A,备集群部署在地域B
  • 特点:部署简单,成本较低,主地域处理所有业务请求
  • 适用场景:对容灾要求高,但对跨地域性能要求不高的场景

双活架构

  • 配置:两个集群分别部署在地域A和地域B,同时处理业务请求
  • 特点:提供更高的可用性和性能,支持负载均衡
  • 适用场景:对可用性和性能要求都很高的场景

多活架构

  • 配置:多个集群分布在不同地域,同时处理业务请求
  • 特点:提供最高的可用性和扩展性,支持全球负载均衡
  • 适用场景:全球化业务,需要在多个地区提供服务的场景

数据同步模式

异步复制

  • 特点:主地域写入数据后立即返回,异步同步到其他地域
  • 优势:性能最好,对主地域影响最小
  • 劣势:可能存在数据丢失,数据一致性级别较低
  • 适用场景:对性能要求高,对数据一致性要求相对较低的场景

半同步复制

  • 特点:主地域写入数据后,等待至少一个备地域确认接收后返回
  • 优势:数据安全性较高,性能适中
  • 劣势:主地域性能会受到备地域网络延迟的影响
  • 适用场景:对数据一致性有一定要求,对性能要求也较高的场景

强同步复制

  • 特点:主地域写入数据后,等待所有备地域确认接收并应用后返回
  • 优势:数据零丢失,一致性级别最高
  • 劣势:主地域性能会受到最慢备地域的影响
  • 适用场景:对数据一致性要求极高,对性能要求相对较低的场景

部署前准备

硬件要求

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

软件要求

软件版本要求
操作系统CentOS 7.6-7.9 或 Ubuntu Server 18.04 LTS
Python3.6 或更高版本
TDSQL5.7 或更高版本
负载均衡F5 或云厂商负载均衡
监控系统Prometheus + Grafana 或 TDSQL 监控平台
数据同步工具TDSQL 内置同步工具或第三方工具

网络规划

  1. 跨地域网络

    • 采用专线或VPN连接,确保网络稳定性和安全性
    • 网络延迟要求:< 100ms(根据业务需求调整)
    • 带宽要求:≥ 10Gbps
    • 启用网络压缩,减少数据传输量
  2. IP地址规划

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

    • 数据库端口:3306
    • 监控端口:33060
    • 管理端口:8080
    • 数据同步端口:33061
    • 负载均衡端口: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-bj
10.0.0.11 tdsql-slave1-bj
10.0.0.12 tdsql-monitor-bj
10.0.0.13 tdsql-manager-bj

# 地域B(上海)
172.16.0.10 tdsql-master-sh
172.16.0.11 tdsql-slave1-sh
172.16.0.12 tdsql-monitor-sh
172.16.0.13 tdsql-manager-sh

# 地域C(广州)
192.168.0.10 tdsql-master-gz
192.168.0.11 tdsql-slave1-gz
192.168.0.12 tdsql-monitor-gz
192.168.0.13 tdsql-manager-gz
EOF

配置跨地域网络

在云厂商控制台或物理设备上配置跨地域专线或VPN连接,确保地域间网络通畅。

2. 安装TDSQL

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

3. 配置主集群(地域A)

修改主节点配置文件

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

# 连接配置
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
region_name = beijing
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)

修改备集群主节点配置文件

bash
# 地域B(上海)
cat > /home/tdsql/conf/tdsql.conf << EOF
[mysqld]
# 基础配置
server_id = 20001
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
region_name = shanghai
EOF

重启备集群主节点

bash
# 在地域B主节点上执行
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 &

# 在地域C主节点上执行类似操作

5. 配置跨地域复制

在地域B主节点上执行

sql
CHANGE MASTER TO
  MASTER_HOST = 'tdsql-master-bj',
  MASTER_PORT = 3306,
  MASTER_USER = 'repl',
  MASTER_PASSWORD = 'repl_password',
  MASTER_AUTO_POSITION = 1,
  MASTER_CONNECT_RETRY = 10,
  MASTER_HEARTBEAT_PERIOD = 30;

START SLAVE;

在地域C主节点上执行

sql
CHANGE MASTER TO
  MASTER_HOST = 'tdsql-master-bj',
  MASTER_PORT = 3306,
  MASTER_USER = 'repl',
  MASTER_PASSWORD = 'repl_password',
  MASTER_AUTO_POSITION = 1,
  MASTER_CONNECT_RETRY = 10,
  MASTER_HEARTBEAT_PERIOD = 30;

START SLAVE;

检查跨地域复制状态

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

# 在地域B和C主节点上执行
SHOW SLAVE STATUS\G;

确保:

  • 地域A主节点上 Rpl_semi_sync_master_clients 为 2
  • 地域B和C主节点上 Slave_IO_RunningSlave_SQL_Running 均为 Yes

6. 配置负载均衡

配置全局负载均衡

使用云厂商提供的全局负载均衡(Global Load Balancer)或第三方负载均衡设备,将业务请求分发到不同地域的TDSQL集群。

配置DNS

将数据库服务域名解析到全局负载均衡IP,实现智能DNS解析和故障切换。

7. 配置监控系统

部署集中监控

在一个地域部署集中监控系统,监控所有地域的TDSQL集群:

bash
# 安装Prometheus
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-bj'
    static_configs:
      - targets: ['tdsql-master-bj:9104', 'tdsql-slave1-bj:9104']
  
  - job_name: 'tdsql-sh'
    static_configs:
      - targets: ['tdsql-master-sh:9104', 'tdsql-slave1-sh:9104']
  
  - job_name: 'tdsql-gz'
    static_configs:
      - targets: ['tdsql-master-gz:9104', 'tdsql-slave1-gz:9104']
  
  - job_name: 'node-bj'
    static_configs:
      - targets: ['tdsql-master-bj:9100', 'tdsql-slave1-bj:9100', 'tdsql-monitor-bj:9100', 'tdsql-manager-bj:9100']
  
  - job_name: 'node-sh'
    static_configs:
      - targets: ['tdsql-master-sh:9100', 'tdsql-slave1-sh:9100', 'tdsql-monitor-sh:9100', 'tdsql-manager-sh:9100']
  
  - job_name: 'node-gz'
    static_configs:
      - targets: ['tdsql-master-gz:9100', 'tdsql-slave1-gz:9100', 'tdsql-monitor-gz:9100', 'tdsql-manager-gz: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 &

配置监控告警

在监控平台上配置跨地域相关告警规则:

  1. 跨地域复制延迟告警

    • 告警条件:Seconds_Behind_Master > 3600
    • 告警级别:严重
  2. 地域不可用告警

    • 告警条件:地域内所有节点不可用
    • 告警级别:严重
  3. 跨地域网络告警

    • 告警条件:跨地域网络延迟 > 500ms
    • 告警级别:警告

灾难恢复测试

1. 地域级故障测试

模拟地域A故障

bash
# 在地域A的所有节点上执行
sudo shutdown -h now

手动故障切换

  1. 提升地域B集群为主集群

    sql
    # 在地域B主节点上执行
    STOP SLAVE;
    RESET SLAVE ALL;
    SET GLOBAL read_only = OFF;
    SET GLOBAL super_read_only = OFF;
    
    # 在地域B从节点上执行
    STOP SLAVE;
    RESET SLAVE ALL;
    CHANGE MASTER TO
      MASTER_HOST = 'tdsql-master-sh',
      MASTER_PORT = 3306,
      MASTER_USER = 'repl',
      MASTER_PASSWORD = 'repl_password',
      MASTER_AUTO_POSITION = 1;
    START SLAVE;
  2. 配置地域C集群指向地域B

    sql
    # 在地域C主节点上执行
    STOP SLAVE;
    RESET SLAVE ALL;
    CHANGE MASTER TO
      MASTER_HOST = 'tdsql-master-sh',
      MASTER_PORT = 3306,
      MASTER_USER = 'repl',
      MASTER_PASSWORD = 'repl_password',
      MASTER_AUTO_POSITION = 1;
    START SLAVE;
  3. 更新负载均衡配置

    在负载均衡控制台或设备上,将流量切换到地域B和地域C的集群。

  4. 验证业务恢复

    检查应用是否能够正常连接到新的主集群,业务是否恢复正常。

自动故障切换

配置TDSQL的自动故障切换功能,或使用第三方工具(如MHA、Orchestrator)实现自动故障切换。

2. 恢复地域A集群

  1. 启动地域A的所有节点

  2. 配置地域A集群为备集群

    sql
    # 在地域A主节点上执行
    CHANGE MASTER TO
      MASTER_HOST = 'tdsql-master-sh',
      MASTER_PORT = 3306,
      MASTER_USER = 'repl',
      MASTER_PASSWORD = 'repl_password',
      MASTER_AUTO_POSITION = 1;
    START SLAVE;
  3. 恢复负载均衡配置

    在负载均衡控制台或设备上,将流量恢复到所有地域的集群。

跨地域部署最佳实践

架构设计

  1. 选择合适的地域数量

    • 一般建议3个地域,提供最高的容灾能力
    • 最少2个地域,提供基本的跨地域容灾能力
    • 考虑业务覆盖范围和用户分布选择地域
  2. 合理分配集群角色

    • 主集群:选择业务核心区域,处理主要业务请求
    • 备集群:选择距离主集群适中的区域,平衡容灾效果和成本
    • 多活集群:根据业务需求和用户分布,选择合适的地域
  3. 选择合适的数据同步模式

    • 主备架构:建议使用半同步复制
    • 双活或多活架构:建议使用异步复制
    • 根据业务对一致性和性能的要求选择合适的复制模式

配置优化

  1. 优化网络配置

    • 使用专线或高质量VPN,确保跨地域网络稳定
    • 启用网络压缩,减少数据传输量
    • 配置合理的网络超时时间,避免因网络波动导致业务中断
  2. 优化复制配置

    • 启用GTID,简化跨地域复制管理
    • 配置适当的复制并行度,提高跨地域复制速度
    • 调整复制心跳间隔,及时发现复制异常
    • 配置合理的复制超时时间,平衡数据一致性和性能
  3. 优化存储配置

    • 使用高性能SSD存储,提高IO性能
    • 配置适当的RAID级别,提高存储可靠性
    • 启用存储加密,确保数据安全
    • 配置合理的存储容量,满足业务增长需求

监控与告警

  1. 监控关键指标

    • 跨地域网络延迟和带宽
    • 跨地域复制延迟
    • 各地域节点CPU、内存、IO使用率
    • 各地域数据库连接数和查询性能
    • 各地域业务流量分布
  2. 设置合理的告警阈值

    • 跨地域复制延迟:> 3600秒(严重)
    • 跨地域网络延迟:> 500ms(警告)
    • 地域不可用:立即告警(严重)
    • 节点不可用:立即告警(严重)
  3. 建立完善的监控体系

    • 部署集中监控系统,统一监控所有地域的集群
    • 配置多级告警机制,确保告警及时送达
    • 建立告警响应流程,明确各角色职责

灾难恢复

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

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

    • 每年至少进行一次完整的灾难恢复演练
    • 测试不同级别的灾难场景
    • 演练后进行总结和优化
    • 记录演练过程和结果,持续改进
  3. 配置自动化恢复机制

    • 启用TDSQL的自动故障切换功能
    • 或使用第三方工具实现自动灾难恢复
    • 配置自动监控和告警,及时发现灾难
    • 建立自动化的业务恢复流程

安全建议

  1. 网络安全

    • 使用专线或IPsec VPN,确保跨地域数据传输安全
    • 配置防火墙,限制只有授权IP可以访问数据库
    • 启用SSL加密,保护数据传输安全
    • 定期审计网络访问日志,发现异常访问
  2. 数据安全

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

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

常见问题(FAQ)

Q1: 跨地域部署的成本如何?

A1: 跨地域部署的成本主要包括:

  1. 硬件成本:需要更多的服务器节点
  2. 网络成本:跨地域专线或VPN连接成本
  3. 人力成本:部署和维护复杂度增加
  4. 软件成本:监控和管理软件成本
  5. 云资源成本:如果使用云服务,跨地域数据同步和流量费用

但跨地域部署可以提供最高级别的容灾能力,减少业务中断损失,从长远来看是值得的。

Q2: 跨地域部署的延迟如何?

A2: 跨地域部署的延迟主要取决于:

  1. 地域间距离:距离越远,延迟越高
  2. 网络质量:专线质量越好,延迟越低
  3. 数据同步模式:强同步复制延迟最高,异步复制延迟最低
  4. 负载情况:高负载会导致延迟增加

一般来说,同城跨地域延迟在10ms以内,同国跨地域延迟在50-200ms之间,跨国跨地域延迟在200ms以上。

Q3: 如何选择合适的数据同步模式?

A3: 选择数据同步模式应考虑以下因素:

  1. 业务对一致性的要求

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

    • 高并发业务:建议使用异步复制
    • 低并发业务:建议使用半同步复制
  3. 地域间网络条件

    • 网络延迟低、带宽充足:建议使用半同步复制
    • 网络延迟高、带宽有限:建议使用异步复制

Q4: 跨地域部署如何实现业务多活?

A4: 实现业务多活可以采用以下方式:

  1. 应用层多活

    • 在应用层实现数据分片和路由
    • 不同地域处理不同分片的数据
    • 实现跨地域数据同步
  2. 数据库层多活

    • 使用TDSQL的多活功能
    • 或使用第三方中间件(如MyCAT、ProxySQL)实现多活
    • 配置数据冲突检测和解决机制
  3. 全局负载均衡

    • 使用全局负载均衡将用户请求分发到最近的地域
    • 实现用户就近访问,提高用户体验
    • 支持地域级故障切换

Q5: 如何处理跨地域部署中的数据一致性问题?

A5: 可以采取以下措施:

  1. 使用合适的复制模式:根据业务需求选择异步、半同步或强同步复制
  2. 启用GTID:确保每个事务有唯一标识,便于数据恢复和冲突解决
  3. 配置合理的复制超时时间:避免因网络问题导致写操作长时间阻塞
  4. 定期验证数据一致性:使用工具检查跨地域数据是否一致
  5. 配置数据冲突解决机制:对于双活或多活架构,配置自动或手动的数据冲突解决机制

Q6: 跨地域部署的扩容如何操作?

A6: 扩容操作包括:

  1. 在现有地域添加节点

    • 按照单地域扩容方式添加节点
    • 配置跨地域复制,加入跨地域集群
  2. 添加新地域

    • 在新地域部署TDSQL集群
    • 配置跨地域复制,将新地域集群加入跨地域集群
    • 更新负载均衡配置,将新地域纳入流量分发范围
  3. 跨地域迁移

    • 在新地域部署TDSQL集群
    • 配置跨地域复制,实现数据同步
    • 逐步将业务流量迁移到新地域
    • 完成跨地域迁移后,调整跨地域复制关系

Q7: 如何监控跨地域部署的状态?

A7: 可以监控以下指标:

  1. 跨地域网络状态:延迟、带宽、丢包率
  2. 跨地域复制状态:复制延迟、复制线程状态、复制错误
  3. 各地域节点状态:CPU、内存、IO使用率
  4. 各地域数据库状态:连接数、查询性能、错误率
  5. 各地域业务状态:流量分布、响应时间、成功率

建议使用集中监控系统(如Prometheus + Grafana),实现跨地域统一监控和告警。

Q8: 跨地域部署的备份策略如何制定?

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

  1. 备份位置

    • 每个地域至少保留一份备份
    • 跨地域备份,防止地域级故障
    • 考虑异地备份,防止重大灾难
  2. 备份频率

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

    • 定期验证备份的可用性
    • 每季度进行一次跨地域恢复测试
    • 确保备份可以在1小时内恢复
  4. 备份保留

    • 本地备份:保留7天
    • 跨地域备份:保留30天
    • 异地备份:保留180天

Q9: 跨地域部署与多可用区部署有什么区别?

A9: 主要区别包括:

  1. 部署范围

    • 多可用区部署:同一地域内的不同可用区
    • 跨地域部署:不同地域,可能相距数百或数千公里
  2. 网络延迟

    • 多可用区部署:延迟一般小于5ms
    • 跨地域部署:延迟一般在50ms以上
  3. 容灾能力

    • 多可用区部署:可以应对可用区级故障
    • 跨地域部署:可以应对地域级甚至区域级故障
  4. 成本

    • 多可用区部署:成本相对较低
    • 跨地域部署:成本相对较高
  5. 复杂度

    • 多可用区部署:相对简单
    • 跨地域部署:相对复杂,需要考虑更多因素

Q10: 如何选择跨地域部署的地域?

A10: 选择地域应考虑以下因素:

  1. 业务覆盖范围:选择靠近用户的地域,提高用户体验
  2. 法规要求:某些业务可能需要数据存储在特定地域
  3. 网络条件:选择网络延迟低、带宽充足的地域
  4. 成本因素:不同地域的硬件和网络成本可能不同
  5. 云厂商支持:如果使用云服务,选择云厂商支持较好的地域
  6. 灾备需求:选择距离主地域适中的地域,平衡容灾效果和成本

一般建议选择距离主地域300-1000公里的地域作为备地域,既可以提供有效的容灾能力,又可以控制跨地域网络延迟。