外观
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线程 | 64GB | 2TB SSD | 万兆网卡 |
| 从节点 | 16核32线程 | 64GB | 2TB 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 或更高版本 |
| 负载均衡 | Nginx 1.16 或 F5 |
| 监控系统 | Prometheus + Grafana 或 TDSQL 监控平台 |
网络规划
可用区间网络
- 采用专线连接,确保低延迟和高带宽
- 网络延迟要求:< 5ms
- 带宽要求:≥ 10Gbps
IP地址规划
- 每个可用区使用独立的子网段
- 主从节点使用私有IP通信
- 对外服务使用公网IP或负载均衡IP
端口规划
- 数据库端口:3306
- 监控端口:33060
- 管理端口:8080
- 负载均衡端口: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-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;
done2. 安装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_Running和Slave_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配置监控面板
- 登录Grafana(默认端口3000,用户名/密码:admin/admin)
- 添加Prometheus数据源
- 导入TDSQL监控面板模板
- 配置告警规则,包括:
- 主从延迟告警
- 复制状态告警
- 节点不可用告警
- 可用区故障告警
故障切换测试
1. 单节点故障测试
模拟主节点故障
bash
# 在主节点上执行
sudo $TDSQL_HOME/bin/tdsqladmin -S /home/tdsql/tdsql.sock shutdown检查故障切换
- 监控系统应立即发出告警
- 从节点应自动提升为主节点
- 其他从节点应自动指向新主节点
- 应用应通过负载均衡自动连接到新主节点
- 业务中断时间应小于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检查故障切换
- 监控系统应立即发出可用区故障告警
- 可用区B的从节点应自动提升为主节点
- 可用区C的从节点应自动指向新主节点
- 负载均衡应自动将流量切换到可用区B和C
- 业务中断时间应小于60秒
恢复可用区A
- 启动可用区A的所有节点
- 配置可用区A的节点为从节点
- 恢复负载均衡配置
- 验证数据同步正常
多可用区部署最佳实践
架构设计
选择合适的可用区数量:
- 一般建议3个可用区,提供最高的可用性
- 最少2个可用区,提供基本的跨可用区容灾能力
合理分配节点资源:
- 主节点和从节点配置相同,便于故障切换
- 监控和管理节点跨可用区部署,确保监控不中断
- 负载均衡节点每个可用区至少部署1个
选择合适的复制模式:
- 核心业务建议使用强同步复制
- 非核心业务可以使用半同步或异步复制
- 根据业务对一致性和性能的要求选择合适的复制模式
配置优化
优化网络配置:
- 确保可用区间网络延迟小于5ms
- 配置足够的网络带宽,满足数据同步需求
- 启用网络压缩,减少数据传输量
优化复制配置:
- 启用GTID,简化主从管理和故障切换
- 配置适当的复制并行度,提高从节点同步速度
- 启用半同步或强同步复制,确保数据一致性
优化存储配置:
- 使用高性能SSD存储,提高IO性能
- 配置适当的RAID级别,提高存储可靠性
- 启用存储加密,确保数据安全
监控与告警
监控关键指标:
- 可用区间网络延迟和带宽
- 主从复制延迟
- 节点CPU、内存、IO使用率
- 数据库连接数和查询性能
- 可用区整体状态
设置合理的告警阈值:
- 网络延迟:> 10ms 警告,> 50ms 严重
- 主从延迟:> 300s 警告,> 600s 严重
- 节点不可用:立即告警
- 可用区故障:立即告警
定期测试故障切换:
- 每季度进行一次单节点故障切换测试
- 每半年进行一次可用区故障切换测试
- 每次测试后进行总结和优化
安全建议
网络安全:
- 配置防火墙,限制只有授权IP可以访问数据库
- 启用SSL加密,保护数据传输安全
- 配置VPC和子网隔离,提高网络安全性
数据安全:
- 启用数据加密,保护静态数据安全
- 配置定期备份,确保数据可恢复
- 启用审计日志,记录所有数据库操作
访问控制:
- 遵循最小权限原则,限制用户权限
- 使用强密码,定期更换密码
- 启用多因素认证,提高登录安全性
常见问题(FAQ)
Q1: 多可用区部署的成本如何?
A1: 多可用区部署的成本主要包括:
- 硬件成本:需要更多的服务器节点
- 网络成本:可用区间专线连接成本
- 人力成本:部署和维护复杂度增加
- 软件成本:监控和管理软件成本
但多可用区部署可以显著提高系统可用性,减少业务中断损失,从长远来看是值得的。
Q2: 多可用区部署的延迟如何?
A2: 多可用区部署的延迟主要取决于:
- 可用区间距离:距离越远,延迟越高
- 网络带宽:带宽不足会导致延迟增加
- 复制模式:强同步复制延迟最高,异步复制延迟最低
- 负载情况:高负载会导致延迟增加
一般建议选择距离较近的可用区,确保延迟小于5ms。
Q3: 如何选择合适的复制模式?
A3: 选择复制模式应考虑以下因素:
业务对一致性的要求:
- 金融核心业务:强同步复制
- 一般核心业务:半同步复制
- 非核心业务:异步复制
业务对性能的要求:
- 高并发业务:异步或半同步复制
- 低并发业务:强同步复制
可用区间网络条件:
- 网络延迟低、带宽充足:强同步复制
- 网络延迟高、带宽有限:异步复制
Q4: 多可用区部署如何实现读写分离?
A4: 可以通过以下方式实现:
负载均衡层读写分离:
- 配置负载均衡,将写请求转发到主节点
- 将读请求均衡转发到所有从节点
中间件读写分离:
- 使用MyCAT、ProxySQL等中间件
- 中间件自动解析SQL,实现读写分离
应用层读写分离:
- 在应用代码中根据SQL类型选择连接
- 写操作连接主节点,读操作连接从节点
Q5: 如何处理多可用区部署中的数据一致性问题?
A5: 可以采取以下措施:
- 使用强同步或半同步复制:确保数据至少复制到一个从节点
- 启用GTID:确保每个事务有唯一标识,便于数据恢复
- 配置适当的超时时间:避免因网络问题导致写操作长时间阻塞
- 定期验证数据一致性:使用工具检查主从数据是否一致
- 配置自动修复机制:发现数据不一致时自动修复
Q6: 多可用区部署的扩容如何操作?
A6: 扩容操作包括:
添加从节点:
- 在现有可用区添加从节点
- 在新可用区添加从节点
- 配置主从复制,加入集群
提升可用区级别:
- 将现有从节点所在可用区提升为独立可用区
- 配置负载均衡和DNS
- 实现多可用区负载均衡
跨可用区迁移:
- 在新可用区部署从节点
- 等待数据同步完成
- 将主节点切换到新可用区
- 完成跨可用区迁移
Q7: 如何监控多可用区部署的状态?
A7: 可以监控以下指标:
- 节点状态:CPU、内存、IO使用率
- 复制状态:主从延迟、复制线程状态
- 网络状态:可用区间延迟、带宽使用率
- 业务状态:连接数、查询性能、错误率
- 可用区状态:可用区整体负载、故障情况
建议使用Prometheus + Grafana构建统一的监控平台,实现可视化监控和告警。
Q8: 多可用区部署的备份策略如何制定?
A8: 备份策略应考虑以下因素:
备份位置:
- 每个可用区至少保留一份备份
- 跨区域备份,防止区域级故障
备份频率:
- 全量备份:每天一次
- 增量备份:每小时一次
- 二进制日志备份:实时备份
备份验证:
- 定期验证备份的可用性
- 每季度进行一次恢复测试
- 确保备份可以在30分钟内恢复
备份保留:
- 本地备份:保留7天
- 跨可用区备份:保留30天
- 跨区域备份:保留90天
Q9: 如何处理多可用区部署中的灾难恢复?
A9: 灾难恢复策略包括:
制定详细的灾难恢复计划:
- 明确灾难级别和响应流程
- 确定恢复时间目标(RTO)和恢复点目标(RPO)
- 明确各角色的职责和操作步骤
定期进行灾难恢复演练:
- 每半年进行一次完整的灾难恢复演练
- 测试不同级别的灾难场景
- 演练后进行总结和优化
配置自动化恢复机制:
- 自动检测灾难发生
- 自动触发故障切换
- 自动恢复业务
建立备用数据中心:
- 在不同区域建立备用数据中心
- 实现跨区域数据同步
- 确保在区域级故障时可以快速切换
Q10: 多可用区部署与传统主从部署有什么区别?
A10: 主要区别包括:
部署范围:
- 传统主从部署:通常在同一机房或数据中心
- 多可用区部署:跨多个地理位置独立的可用区
容灾能力:
- 传统主从部署:只能应对单节点故障
- 多可用区部署:可以应对整个可用区故障
网络要求:
- 传统主从部署:网络延迟低,带宽要求相对较低
- 多可用区部署:对网络延迟和带宽要求较高
复杂度:
- 传统主从部署:部署和维护相对简单
- 多可用区部署:部署和维护复杂度较高
成本:
- 传统主从部署:成本相对较低
- 多可用区部署:成本相对较高
可用性:
- 传统主从部署:可用性一般在99.9%
- 多可用区部署:可用性可以达到99.99%或更高
