外观
TDSQL 跨地域部署
跨地域部署架构
典型架构
主备架构
- 配置:主集群部署在地域A,备集群部署在地域B
- 特点:部署简单,成本较低,主地域处理所有业务请求
- 适用场景:对容灾要求高,但对跨地域性能要求不高的场景
双活架构
- 配置:两个集群分别部署在地域A和地域B,同时处理业务请求
- 特点:提供更高的可用性和性能,支持负载均衡
- 适用场景:对可用性和性能要求都很高的场景
多活架构
- 配置:多个集群分布在不同地域,同时处理业务请求
- 特点:提供最高的可用性和扩展性,支持全球负载均衡
- 适用场景:全球化业务,需要在多个地区提供服务的场景
数据同步模式
异步复制
- 特点:主地域写入数据后立即返回,异步同步到其他地域
- 优势:性能最好,对主地域影响最小
- 劣势:可能存在数据丢失,数据一致性级别较低
- 适用场景:对性能要求高,对数据一致性要求相对较低的场景
半同步复制
- 特点:主地域写入数据后,等待至少一个备地域确认接收后返回
- 优势:数据安全性较高,性能适中
- 劣势:主地域性能会受到备地域网络延迟的影响
- 适用场景:对数据一致性有一定要求,对性能要求也较高的场景
强同步复制
- 特点:主地域写入数据后,等待所有备地域确认接收并应用后返回
- 优势:数据零丢失,一致性级别最高
- 劣势:主地域性能会受到最慢备地域的影响
- 适用场景:对数据一致性要求极高,对性能要求相对较低的场景
部署前准备
硬件要求
| 节点类型 | CPU | 内存 | 存储 | 网络 |
|---|---|---|---|---|
| 主节点 | 16核32线程 | 64GB | 2TB SSD | 万兆网卡 |
| 从节点 | 16核32线程 | 64GB | 2TB SSD | 万兆网卡 |
| 监控节点 | 8核16线程 | 32GB | 500GB SSD | 万兆网卡 |
| 管理节点 | 8核16线程 | 32GB | 500GB SSD | 万兆网卡 |
| 网关节点 | 8核16线程 | 32GB | 500GB SSD | 万兆网卡 |
软件要求
| 软件 | 版本要求 |
|---|---|
| 操作系统 | CentOS 7.6-7.9 或 Ubuntu Server 18.04 LTS |
| Python | 3.6 或更高版本 |
| TDSQL | 5.7 或更高版本 |
| 负载均衡 | F5 或云厂商负载均衡 |
| 监控系统 | Prometheus + Grafana 或 TDSQL 监控平台 |
| 数据同步工具 | TDSQL 内置同步工具或第三方工具 |
网络规划
跨地域网络
- 采用专线或VPN连接,确保网络稳定性和安全性
- 网络延迟要求:< 100ms(根据业务需求调整)
- 带宽要求:≥ 10Gbps
- 启用网络压缩,减少数据传输量
IP地址规划
- 每个地域使用独立的子网段
- 主从节点使用私有IP通信
- 对外服务使用公网IP或负载均衡IP
- 跨地域通信使用专线或VPN IP
端口规划
- 数据库端口:3306
- 监控端口:33060
- 管理端口:8080
- 数据同步端口:33061
- 负载均衡端口:3306(对外)
系统配置
关闭防火墙
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. 环境准备
配置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_Running和Slave_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 &配置监控告警
在监控平台上配置跨地域相关告警规则:
跨地域复制延迟告警
- 告警条件:Seconds_Behind_Master > 3600
- 告警级别:严重
地域不可用告警
- 告警条件:地域内所有节点不可用
- 告警级别:严重
跨地域网络告警
- 告警条件:跨地域网络延迟 > 500ms
- 告警级别:警告
灾难恢复测试
1. 地域级故障测试
模拟地域A故障
bash
# 在地域A的所有节点上执行
sudo shutdown -h now手动故障切换
提升地域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;配置地域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;更新负载均衡配置
在负载均衡控制台或设备上,将流量切换到地域B和地域C的集群。
验证业务恢复
检查应用是否能够正常连接到新的主集群,业务是否恢复正常。
自动故障切换
配置TDSQL的自动故障切换功能,或使用第三方工具(如MHA、Orchestrator)实现自动故障切换。
2. 恢复地域A集群
启动地域A的所有节点
配置地域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个地域,提供最高的容灾能力
- 最少2个地域,提供基本的跨地域容灾能力
- 考虑业务覆盖范围和用户分布选择地域
合理分配集群角色:
- 主集群:选择业务核心区域,处理主要业务请求
- 备集群:选择距离主集群适中的区域,平衡容灾效果和成本
- 多活集群:根据业务需求和用户分布,选择合适的地域
选择合适的数据同步模式:
- 主备架构:建议使用半同步复制
- 双活或多活架构:建议使用异步复制
- 根据业务对一致性和性能的要求选择合适的复制模式
配置优化
优化网络配置:
- 使用专线或高质量VPN,确保跨地域网络稳定
- 启用网络压缩,减少数据传输量
- 配置合理的网络超时时间,避免因网络波动导致业务中断
优化复制配置:
- 启用GTID,简化跨地域复制管理
- 配置适当的复制并行度,提高跨地域复制速度
- 调整复制心跳间隔,及时发现复制异常
- 配置合理的复制超时时间,平衡数据一致性和性能
优化存储配置:
- 使用高性能SSD存储,提高IO性能
- 配置适当的RAID级别,提高存储可靠性
- 启用存储加密,确保数据安全
- 配置合理的存储容量,满足业务增长需求
监控与告警
监控关键指标:
- 跨地域网络延迟和带宽
- 跨地域复制延迟
- 各地域节点CPU、内存、IO使用率
- 各地域数据库连接数和查询性能
- 各地域业务流量分布
设置合理的告警阈值:
- 跨地域复制延迟:> 3600秒(严重)
- 跨地域网络延迟:> 500ms(警告)
- 地域不可用:立即告警(严重)
- 节点不可用:立即告警(严重)
建立完善的监控体系:
- 部署集中监控系统,统一监控所有地域的集群
- 配置多级告警机制,确保告警及时送达
- 建立告警响应流程,明确各角色职责
灾难恢复
制定详细的灾难恢复计划:
- 明确灾难级别和响应流程
- 确定恢复时间目标(RTO)和恢复点目标(RPO)
- 明确各角色的职责和操作步骤
- 定期更新灾难恢复计划
定期进行灾难恢复演练:
- 每年至少进行一次完整的灾难恢复演练
- 测试不同级别的灾难场景
- 演练后进行总结和优化
- 记录演练过程和结果,持续改进
配置自动化恢复机制:
- 启用TDSQL的自动故障切换功能
- 或使用第三方工具实现自动灾难恢复
- 配置自动监控和告警,及时发现灾难
- 建立自动化的业务恢复流程
安全建议
网络安全:
- 使用专线或IPsec VPN,确保跨地域数据传输安全
- 配置防火墙,限制只有授权IP可以访问数据库
- 启用SSL加密,保护数据传输安全
- 定期审计网络访问日志,发现异常访问
数据安全:
- 启用数据加密,保护静态数据安全
- 配置定期备份,确保数据可恢复
- 启用审计日志,记录所有数据库操作
- 定期进行数据安全审计,发现安全隐患
访问控制:
- 遵循最小权限原则,限制用户权限
- 使用强密码,定期更换密码
- 启用多因素认证,提高登录安全性
- 定期审计用户权限,撤销不必要的权限
常见问题(FAQ)
Q1: 跨地域部署的成本如何?
A1: 跨地域部署的成本主要包括:
- 硬件成本:需要更多的服务器节点
- 网络成本:跨地域专线或VPN连接成本
- 人力成本:部署和维护复杂度增加
- 软件成本:监控和管理软件成本
- 云资源成本:如果使用云服务,跨地域数据同步和流量费用
但跨地域部署可以提供最高级别的容灾能力,减少业务中断损失,从长远来看是值得的。
Q2: 跨地域部署的延迟如何?
A2: 跨地域部署的延迟主要取决于:
- 地域间距离:距离越远,延迟越高
- 网络质量:专线质量越好,延迟越低
- 数据同步模式:强同步复制延迟最高,异步复制延迟最低
- 负载情况:高负载会导致延迟增加
一般来说,同城跨地域延迟在10ms以内,同国跨地域延迟在50-200ms之间,跨国跨地域延迟在200ms以上。
Q3: 如何选择合适的数据同步模式?
A3: 选择数据同步模式应考虑以下因素:
业务对一致性的要求:
- 金融核心业务:建议使用半同步复制
- 一般业务:建议使用异步复制
业务对性能的要求:
- 高并发业务:建议使用异步复制
- 低并发业务:建议使用半同步复制
地域间网络条件:
- 网络延迟低、带宽充足:建议使用半同步复制
- 网络延迟高、带宽有限:建议使用异步复制
Q4: 跨地域部署如何实现业务多活?
A4: 实现业务多活可以采用以下方式:
应用层多活:
- 在应用层实现数据分片和路由
- 不同地域处理不同分片的数据
- 实现跨地域数据同步
数据库层多活:
- 使用TDSQL的多活功能
- 或使用第三方中间件(如MyCAT、ProxySQL)实现多活
- 配置数据冲突检测和解决机制
全局负载均衡:
- 使用全局负载均衡将用户请求分发到最近的地域
- 实现用户就近访问,提高用户体验
- 支持地域级故障切换
Q5: 如何处理跨地域部署中的数据一致性问题?
A5: 可以采取以下措施:
- 使用合适的复制模式:根据业务需求选择异步、半同步或强同步复制
- 启用GTID:确保每个事务有唯一标识,便于数据恢复和冲突解决
- 配置合理的复制超时时间:避免因网络问题导致写操作长时间阻塞
- 定期验证数据一致性:使用工具检查跨地域数据是否一致
- 配置数据冲突解决机制:对于双活或多活架构,配置自动或手动的数据冲突解决机制
Q6: 跨地域部署的扩容如何操作?
A6: 扩容操作包括:
在现有地域添加节点:
- 按照单地域扩容方式添加节点
- 配置跨地域复制,加入跨地域集群
添加新地域:
- 在新地域部署TDSQL集群
- 配置跨地域复制,将新地域集群加入跨地域集群
- 更新负载均衡配置,将新地域纳入流量分发范围
跨地域迁移:
- 在新地域部署TDSQL集群
- 配置跨地域复制,实现数据同步
- 逐步将业务流量迁移到新地域
- 完成跨地域迁移后,调整跨地域复制关系
Q7: 如何监控跨地域部署的状态?
A7: 可以监控以下指标:
- 跨地域网络状态:延迟、带宽、丢包率
- 跨地域复制状态:复制延迟、复制线程状态、复制错误
- 各地域节点状态:CPU、内存、IO使用率
- 各地域数据库状态:连接数、查询性能、错误率
- 各地域业务状态:流量分布、响应时间、成功率
建议使用集中监控系统(如Prometheus + Grafana),实现跨地域统一监控和告警。
Q8: 跨地域部署的备份策略如何制定?
A8: 备份策略应考虑以下因素:
备份位置:
- 每个地域至少保留一份备份
- 跨地域备份,防止地域级故障
- 考虑异地备份,防止重大灾难
备份频率:
- 全量备份:每天一次
- 增量备份:每小时一次
- 二进制日志备份:实时备份
备份验证:
- 定期验证备份的可用性
- 每季度进行一次跨地域恢复测试
- 确保备份可以在1小时内恢复
备份保留:
- 本地备份:保留7天
- 跨地域备份:保留30天
- 异地备份:保留180天
Q9: 跨地域部署与多可用区部署有什么区别?
A9: 主要区别包括:
部署范围:
- 多可用区部署:同一地域内的不同可用区
- 跨地域部署:不同地域,可能相距数百或数千公里
网络延迟:
- 多可用区部署:延迟一般小于5ms
- 跨地域部署:延迟一般在50ms以上
容灾能力:
- 多可用区部署:可以应对可用区级故障
- 跨地域部署:可以应对地域级甚至区域级故障
成本:
- 多可用区部署:成本相对较低
- 跨地域部署:成本相对较高
复杂度:
- 多可用区部署:相对简单
- 跨地域部署:相对复杂,需要考虑更多因素
Q10: 如何选择跨地域部署的地域?
A10: 选择地域应考虑以下因素:
- 业务覆盖范围:选择靠近用户的地域,提高用户体验
- 法规要求:某些业务可能需要数据存储在特定地域
- 网络条件:选择网络延迟低、带宽充足的地域
- 成本因素:不同地域的硬件和网络成本可能不同
- 云厂商支持:如果使用云服务,选择云厂商支持较好的地域
- 灾备需求:选择距离主地域适中的地域,平衡容灾效果和成本
一般建议选择距离主地域300-1000公里的地域作为备地域,既可以提供有效的容灾能力,又可以控制跨地域网络延迟。
