高可用是通过某种协议或技术,协调服务端为客户端提供持续性服务。

归纳为三种方式:

  1. 客户端对服务端服务进行健康管理,自动容错
  2. 服务端通过容错或网关协议提供统一的服务地址
  3. 服务端通过高可用模块通知客户端更新服务地址。

从客户端调用服务端维度来考虑,高可用就是 客户端调用服务端持续可用,两种方法,一种在客户端来做,一种在服务端来做:

  1. 客户端调用多个服务端地址,客户端通过自动容错服务端,保证高可用。
  2. 客户端调用一个服务端地址,服务端通过容错协议提供高可用地址,保证高可用。
  3. 客户端调用一个服务端地址,服务端通过高可用模块检测故障,通知客户端更新服务地址,保证高可用。

一次完整的服务请求过程包括以下组件:

  1. DNS
  2. LB
  3. Webapp
  4. Service
  5. DB

应用整体高可用需要每层每个组件高可用。

我们依次分析各层各个组件的高可用情况。

客户端

客户端为边缘节点,是最终使用者。

  • 客户端配置主备DNS地址,主DNS故障时,请求被DNS
  • 客户端调用一个负载均衡地址,负载均衡保证该地址高可用

外部与下游服务

  • 主备DNS
  • 高可用LB

DNS

DNS通过提供主备DNS,提供域名解析服务的高可用,同时辅以本地DNS缓存。

  • 对外提供主备DNS地址
  • 主DNS故障时,备DNS提供服务。
  • 通过 区域传输技术

 

传统LB

这里指内网负载均衡

传统LB一般采用 Keepalived+反向代理 方案, 通过Keepalived基于 VRRP协议

  • 对外提供VIP
  • Keepalived负载负载均衡高可用
  • Keepalived通过配置优先级选择主Keepalived实例
  • 主实例故障时,选择优先级高的备实例为主实例
  • 主实例周期性的向备实例发送VRRP通告报文
  • 备实例三个周期间隔没有收到通告报文,备实例发起VRRP通告报文,根据优先级,选择优先级高的作为主实例。
  • Keepalived对反向代理进行健康管理,保证反向代理可用性
  • 反向代理对后端实例进行健康检测,保证后端服务可用性

 

腾讯CLB

腾讯CLB集群由多台LD组成,通过OSPF协议保证集群高可用性。

  • 若一台LD发生故障,OSPF协议可以保证10秒以内把LD服务器从集群中剔除。
  • 跨集群通过上层轮询来保证可用性。

 

阿里SLB

阿里SLB,通过BGP协议实现跨可用区容灾,通过云解析DNS等产品实现跨地域容灾。

以同一个地域双可用区为例,即同城双机房:

  • 每个机房部署各两个节点
  • 两个机房共用负载均衡配置信息,通过配置大小段路由控制流量指向。
  • 当一个机房故障时,通过BGP协议自动秒级收敛路由,外部访问的流量会被转发给另外一个机房的SLB。

 

Webapp

Webapp负责业务页面层,挂载到LB后边。

  • 对外提供多个实例地址
  • 实例通常为无状态可横向扩展
  • 单个故障不影响服务,负载均衡会对其进行健康检测,自动剔除与恢复

外部与下游服务

  • 服务注册与发现
  • 多实例Service

服务注册与发现作为关键组件,需要提供高可用注册与发现服务
不同的服务注册与发现的高可用大同小异,使用到的关键组件均做到高可用。
除了部署多实例,上游服务一般会缓存服务发现的结果,即使服务注册与发现系统出现短暂的故障,也对业务影响较小。

Service

Service负责业务层,提供专项服务。

  • 对外提供多个实例地址
  • 实例通常为无状态可横向扩展
  • 单个故障不影响服务,客户端与服务注册与发现组件会对service进行健康管理,保证Service服务整体可用

外部与下游服务

  • Service
  • DB
  • 缓存
  • 消息中间件

Service间调用与webapp调用service相同

传统DB

数据库用于保存服务数据,是业务的核心。

以MySQL为例,采用MySQL+Keepalived方案提供高可用

  • 对外提供VIP
  • 默认主实例提供读写,主实例故障Keepalived漂移VIP到备实例,备实例提供读写服务
  • 主备通过半同步保证数据一致性,网络波动时降级为异步复制,存在数据不一致的情况

主备切换,可能因为网络问题出现数据丢失的问题。
网络出现分区,存在脑裂的情况,脑裂导致数据库多主,业务数据出现错乱,需要尽量避免这种情况
建议当出现主实例停止服务,网络分区等故障时,备实例提供只读服务,避免因多主导致业务数据错乱,较难恢复的情况。
数据强一致性问题,可以考虑采用基于分布式一致性协议的新数据库系统

腾讯云 云数据库 MySQL

腾讯云数据库MySQL内网使用IP端口访问,外网使用域名端口访问。

资料较少,可能与实际情况不符,仅供参考。

内网访问路径为:SLB,MySQL

外网访问路径为:DNS,SLB,MySQL

Proxy访问路径为:Proxy MySQL

  • DNS通过主备提供高可用
  • SLB通过OSPF内部网关协议,提供高可用
  • MySQL主实例故障后,自动检测,自动故障迁移到备实例,DNS、SLB地址不变
  • Proxy
  • 采用集群架构部署,多节点保证故障平滑转移。
  • 可以通过跨可用区部署的方式来提升数据库代理的可用性。

阿里云 云数据库 RDS

数据库访问路径为:DNS,SLB,Proxy,RDS

  • 对外提供唯一DNS地址访问,应用应关闭相关DNS缓存
  • 高可用模块检测到主数据库实例故障时,切换到备数据库实例服务,DNS地址不变

资料较少,可能与实际情况不符,仅做参考。
把RDS当成一个应用来看,每一层都需要保证高可用
DNS通过主备提供高可用
SLB通过网关协议BGP提供高可用
独享代理是高可用架构,拥有2个节点,并且出现故障时会自动切换到备节点。
RDS通过高可用模块检测故障,通知上层更新后端地址,实现RDS高可用(有状态应用上层挂载一个后端地址,与普通无状态应用不同,无状态应用上层直接挂载多个后端地址)

总结

总结以上高可用方案,发现以下特点

  1. 多实例
  2. 客户端连接多个地址,服务端提供多个连接地址。
  3. 客户端对服务端进行健康管理,自动容错
  4. 应用客户端操作系统对DNS服务进行健康管理
  5. Keepalived对反向代理服务进行健康管理
  6. 反向代理对Webapp服务进行健康管理
  7. Webapp对Service服务进行健康管理
  8. Service对DB服务进行健康管理(Service使用mysql connector连接多个TiDB Server启用故障转移)
  9. 同时可以结合中间服务(服务注册与发现),提高服务容错效率(服务发现通知客户端隔离某个服务)。
  10. 客户端连接一个地址,服务端通过某种协议与技术,提供一个地址,保证其高可用。
  11. Keepalived通过VRRP协议,保证VIP高可用
  12. 腾讯CLB通过OSPF协议,保证VIP高可用
  13. 阿里SLB通过BGP协议,保证VIP高可用
  14. 阿里RDS通过HA模块,通知上层更新连接地址,保证服务高可用(类似于服务注册与发现)