腾讯云免认证账号:腾讯云同城双活与异地多活(MySQL+Redis)架构搭建指南
在互联网高并发、大流量的背景下,系统的稳定性就是企业的生命线。很多技术团队在项目初期,服务器和数据库都堆在腾讯云的同一个可用区(机房)。平时风平浪静,可一旦遇到机房断电、光缆被挖断或者大面积网络故障,整个业务就会瞬间陷入瘫痪。
为了实现“高可用”,架构师们通常会祭出两级大招:同城双活(Multi-AZ) 和 异地多活(Multi-Region)。
很多人一听到“多活”就觉得高不可攀,认为那是大厂才能玩的底层黑科技。其实,利用腾讯云成熟的云产品(如 TDSQL、CDB、TcaplusDB 以及 DTS 数据传输服务),中小团队也能在几天内搭建起一套高可用的多活架构。
今天这篇教程直接切入核心,不扯空洞的理论,带你用大白话拆解同城双活与异地多活的架构逻辑,并手把手教你如何配置 MySQL + Redis 的双活落地。
核心复习:同城双活 vs 异地多活,有何不同?
在动手之前,必须搞清楚这两套方案的边界,否则选错了型,不仅烧钱,还解决不了问题。
1. 同城双活(同城多可用区)
- 怎么建: 把应用和数据库分别部署在同一个城市(比如上海)的两个不同机房(比如上海可用区二、上海可用区三)。
- 网络延迟: 极低(通常 < 2ms),因为两个机房之间拉的是专线纤。
- 数据同步: 强一致性。MySQL 和 Redis 可以做到几乎零延迟的同步。
- 防范风险: 完美防御单机房断电、单机房火灾等物理故障。
2. 异地多活(跨地域多活)
- 怎么建: 在两个相隔很远的城市(比如北京和广州)分别建一套完整的系统。
- 网络延迟: 较高(北京到广州光速传输也有约 30ms 的物理延迟)。
- 数据同步: 最终一致性。因为延迟的存在,绝对做不到实时强同步,只能异步复制。
- 防范风险: 防御城市级灾难(如地震、主干网断裂)。
大白话建议: 95% 的企业,做到同城双活就已经足够应对绝大多数宕机灾难了。只有当你的DAU过千万,或者对合规性有极端要求时,才需要考虑异地多活。
第一阶段:同城双活(MySQL+Redis)实战搭建
同城双活的核心思想是:应用层双活(流量随便切),数据层一主一备(自动秒级切换)。
1. 基础设施:划定 Vpc 与子网
你在腾讯云买服务器时,必须把它们安顿在不同的可用区。
- 在上海地域创建一个 VPC。
- 创建两个子网:子网 A 属于 上海可用区二,子网 B 属于 上海可用区三。
2. 应用层(CLB + CVM)配置
- 买两台轻量服务器或 CVM,一台扔在子网 A,一台扔在子网 B。
- 购买一个腾讯云 负载均衡(CLB),并在后端服务器列表里,同时把这两台服务器挂载上去,权重设为 50:50。
- 这样,无论哪个机房挂了,CLB 都能在一秒内把流量全部导向另一个机房存活的应用。
3. 数据层:MySQL(CDB 高可用版)配置
不要自己去服务器上装集群,直接买腾讯云的 云数据库 CDB(高可用版)。
- 购买选型: 在购买页面,选择 跨可用区部署。
- 节点分配: 主节点选 上海可用区二,备节点选 上海可用区三。
- 底层原理: 腾讯云底层会利用强同步机制(Semi-Sync),确保主备数据绝对一致。一旦可用区二停电,CDB 会在 30 秒内自动把可用区三的备节点升级为主节点,应用的数据库连接地址(VIP)保持不变,无需人工修改代码。
4. 缓存层:Redis(本地双活)
Redis 通常用来做高速缓存。在同城双活下,建议使用腾讯云的 Redis 尊享版(跨可用区高可用),其主备架构与 MySQL 类似:可用区二读写,可用区三异步同步。因为同城延迟极低,缓存穿透的概率微乎其微。
第二阶段:异地多活(MySQL+Redis)实战搭建
异地多活的难度呈指数级上升。因为北京和广州之间的延迟有 30ms,如果北京的应用跨地域去读广州的数据库,网络开销会让你的系统卡得像 PPT。
异地多活的铁律:单元化部署,各读各的,数据异步混算。
1. 核心大招:流量染色与单元化(GSLB)
假设你按用户 ID 划分:ID 为奇数的去北京机房,ID 为偶数的去广州机房。
- 利用腾讯云的 全局负载均衡(GSLB) 或者控制 DNS 解析,当北京用户请求时,直接解析到北京机房的 CLB。
- 绝对禁止跨地域调用: 北京的应用只能读写北京本地的 MySQL 和 Redis,广州的应用只能读写广州本地。
2. 数据层:MySQL 异地双活(利用 DTS 双向同步)
北京有一套 MySQL,广州有一套 MySQL,两边都在同时写入数据,如何保持同步?
- 进入腾讯云控制台,搜索 数据传输服务 DTS。
- 新建一个 双向数据同步 任务。
- 源数据库选北京的 CDB,目标数据库选广州的 CDB。
- 配置冲突解决策略:重点! 必须选择“错开主键”或者“时间戳优先”。比如北京生成的 ID 都是奇数,广州生成的 ID 都是偶数,防止两边同时往数据库插数据时发生主键冲突。
🚨 异地多活的“隐形大坑”——数据回环:如果北京的数据同步给广州,广州误以为是本地新产生的,又同步回北京,系统就会死循环。腾讯云的 DTS 后台自带“防回环”机制,它会给同步的数据打上特殊标签,确保数据只复制一次。
3. 缓存层:Redis 异地多活
Redis 里的数据通常有过期时间,且变化极快。在异地多活场景下,普通的 Redis 复制根本无法承受。
- 官方神器: 腾讯云提供了 Redis 全球多活(Global Replication) 产品。
- 配置方法: 你可以在北京和广州各买一个 Redis 实例,在控制台将它们绑定为一个“全球多活组”。
- 业务逻辑: 两边的 Redis 都可以本地读取。对于需要共享的缓存(如用户登录的 Token 状态),北京写入后,腾讯云底层会通过专线,在几十毫秒内异步推送到广州。虽然有短暂的时间差,但完全能满足业务需求。
第三阶段:容灾演练与切流(关键时刻不抓瞎)
架构搭好了,怎么验证它真的能救命?你需要进行定期演练。
场景一:同城双活单机房挂掉(如可用区二故障)
- 自动部分: 腾讯云 CLB 会自动剔除可用区二的异常 CVM。MySQL 会自动触发主备切换,可用区三的备库接管读写。
- 人工确认: 运维登录控制台,检查业务日志,确认无脏数据,演练结束。
场景二:异地多活城市级挂掉(如北京机房整体失联)
这时候需要人工介入路由切流:
- 登录腾讯云 DNS 解析/流量调度控制台。
- 把原本分流到北京的 50% 奇数用户流量,一键硬切换改指向广州机房的 CLB。
- 广州的应用此时开始同时承载 100% 的用户请求。由于 DTS 一直在后台同步,广州的 MySQL 里已经拥有了北京机房死掉前 99.9% 的数据。
- 代价接受: 切换过程中,可能会有极少数在最后几毫秒内注册的北京用户提示“登录失败”或“数据滞后”,这在异地多活的“最终一致性”理论中是完全被允许的。
总结与高可用四句口诀
高可用架构不是一劳永逸的银弹,而是一场向物理定律(光速与网络延迟)妥协的艺术。总结起来就四句话:
- 同城双活最划算: 跨可用区买服务,代码一行不用改,防灾搞定九成半。
- 异地多活先分区: 业务必须单元化,北京人看北京库,跨城读写是灾难。
- 主键冲突要避开: 异地双写用 DTS,奇偶主键错开排,防止数据成乱麻。
- 定期演练才心安: 别等真正出了事,才翻文档看切流,平时多练兵,战时显神威。
