两地三中心架构

image-20251115095329861

  • A是生产中心。A和B是同城双中心。A的数据会实时同步到B同城灾备中心,专线连接速度会很快。
  • B的配置可能和A一样,准备随时接收流量进来。B也可能是双活,接收20%流量。
  • C是灾备中心。配置较低,平常闲置。不会接收生产流量进来。
    两地三中心是一种主备模式,有一个同城灾备中心和一个异地灾备中心,但是这两个中心大部分情况下不会接受不了生产流量,造成资源浪费。

异地多活

异地多活是两地三中心的高级形态,可以实现不同城市建立独立数据中心的高可用架构。异地多活的每个中心均在承载业务流量,并且每个中心之间相互同步数据。
- 异地:指多个地理上的城市,可以是多个。用户流量可以智能分配到多个城市的数据中心。
- 多活:多个中心同时对外提供服务,共同成承担用户流量,没有主备之分。

不需要再做灾备中心,因为每个中心之间数据是相互同步的。
每个机房里面的配置都是一样的,请求可以在一个机房内部完成全链路。不需要跨机房访问数据。
现在分布式数据库的普及,使得异地多活配置起来也更方便了。目前高可用落地,使用异地多活会更加常用。

image-20251115095652754

核心技术

  • 智能DNS/GTM:根据用户位置、各个中心的健康状态,将流量分发到最合适的机房。比如华北用户访问北京机房,联通用户访问联通入口等
  • 多集群管理工具:ArgoCD、Karmada(华为云开源的工具),用于统一管理分布在各个中心的K8s集群,实现全局的服务部署、配置分发等。
  • 多集群监控平台:Thanos、VictoriaMetrics等(prometheus水平扩展难以支持),用于接收来自各个中心的监控数据,实现全局业务监控
  • 分布式数据库:TiDB,CockroachDB(谷歌开源的,可以跨国同步数据),原生支持跨区域部署的数据库,支持多活写入,自动处理冲突等。
  • 单元化/数据分片:每个中心是一个独立的单元,实现业务闭环,防止跨中心数据读取和写入。

智能DNS工作原理

做异地多活最重要的就是智能DNS,让不同地域的用户访问就近流量。

智能DNS,也叫动态DNS、地理DNS、基于策略的DNS、全局流量管理GTM。一种高级域名解析技术,和普通DNS相比,智能DNS不会简单的将一个域名解析到一个固定IP,而是根据访问者的来源信息(比如地理位置、运营商、网络延迟、服务健康状态等)动态返回最合适的IP。

应用场景:
- CDN加速:根据用户位置返回最近的CDN边缘节点
- 比如一个js文件在国外服务器上,直接访问会特别慢。把文件缓存到DNS厂商,他们给一个域名,这个域名就是经过智能DNS的域名,会返回一个离用户最近的有这个js文件的IP地址,加速访问。
- 异地多活:用户访问归属地单元(如北京用户--北京集群)
- 全球化部署:海外用户访问海外服务器,国内用户访问国内机房
- 负载均衡:多个数据中心之间按权重或健康状态分发流量
- 容灾切换:主中心故障自动切换到备用中心(两地三中心策略)
- 运营商择优:机房可能有多个专线入口,比如电信入口、联通入口,根据用户的运营商选择对应的入口。
- 灰度发布:北京用户先用新版本,上海用户用旧版本

image-20251115095829129

公有云智能DNS产品

自建智能DNS成本太高了。一般都用公有云的智能DNS产品。比如:
- 阿里云GTM:
- 地址池管理、多种负载均衡、多种监控探测、故障切换、
- TTL最短1秒(DNS解析缓存有效期。 故障切换/更改IP的时候,用户侧快速更新新IP)、
- CNAME接入(阿里云给你提供一个域名,把你自己的域名CNAME到这个域名上就实现智能DNS转发了)
- 阿里生态
- 腾讯云IGTM
- 功能差不多
- 微信生态
用哪种取决于业务在哪朵云上。都可以的话建议阿里云,因为阿里云先出的GTM产品。

K8s异地多活架构

单集群异地多活架构

image-20251115095952081

  • 有一个主中心A部署了所有系统组件(etcd不推荐跨区域部署,因为对延迟要求非常高,跨区域部署同步数据会有问题)
  • 其他中心是工作节点,kubelet直接注册到主中心的API Server

跨区域/城市通信,可能会由于网络延迟导致跨区访问的各种问题。所以不推荐单集群异地多活架构。

多集群异地多活架构

每个中心安装一个集群,每个集群暴露一个对外访问地址,地址统一接入智能DNS。

image-20251115100112497

公有云实战

地域划分:
多中心区域:
- 华南:广东省、广西壮族自治区、海南省、福建省中南部、台湾、香港特别行政区、澳门特别行政区等
- 华北:北京、天津、河北、山西和内蒙古自治区
- 华东:山东省、江苏省、安徽省、上海市、浙江省、江西省、福建省和台湾省及其钓鱼岛等
- 华西:新疆、内蒙古西部、青海、甘肃、宁夏、陕西、西藏、四川、重庆、云南、贵州

课程演示在腾讯云上:
- 三个区域分别部署三个集群。
- 每个集群通过ingress暴露svc,(服务器不能直接暴露公网端口)。
- 购买CLB。
- 创建监听器,选TCP类型,监听80端口(不选HTTP是因为ingress-controller已经实现了七层分发,要是CLB选了HTTP,每新加域名都得在这里加)
- 后段实例选到ingress-controller节点
- 购买GTM服务。把域名解析到LB的地址。
- 探测任务额度和探测点、地址池数量、 IP 地址数量有关系,生产环境建议购买50 个以上
- 购买一个域名给GTM用
- DNS Pod专业版
- 基于地域的解析需要购买专业版DNS
- 创建GTM实例:GTM实例可以理解为对外发布的一个域名,如果有多个域名发布就购买多个套餐
- 域名:填ingress域名。可以和CNAME域名不同,也可以不是腾讯云的域名
- CNAME域名:GTM接入的域名,后续会把业务域名CNAME到这个域名上
- 实例名称:一般和子域名不同
- TTL:域名对应的IP地址在运营商的DNS系统内的缓存生效时间
- 创建监控器:对地址池中的IP进行健康检查
- 使用TCP探测端口
- 每勾选一个探测节点,就消耗一个探测额度
- 创建地址池:一个地址池就是一组同一位置提供相同服务的IP,一般是不同机房的流量入口
- 云上,地址池写CLB的IP
- 创建华北、华东、华南三个地址池,加一个默认地址池作为其他地域用户的访问规则。
- 权威解析里面,把业务域名创建一条CNAME记录,解析到igtm域名/
- 测试访问,比如华北用户访问业务域名,就被CNAME到igtm域名,返回一个华北机房入口的IP地址
- 测试故障切换
- 关掉华北地域机器,华北地域用户访问会出问题。健康探测有探测时间间隔所以不会马上显示故障状态。
- 监控器探测到故障状态之后,还无法实现华北用户故障切换到兜底机房,因为有DNS解析TTL存在,默认600秒,得等十分钟才能切换过来。