一、高可用概述
软件可用性是指软件系统在给定的时间间隔内处在可工作状态的时间比例。高可用(HA)用于描述软件系统的可用性程度,对于转账、支付等金融服务通常要求做到99.99%以上
二、接入层高可用
1. Keepalived
Keepalived的是一个轻量级的高可用解决方案,它基于虚拟路由冗余协议实现服务或网络的高可用。它专门用来监控集群系统中各个服务节点的状态。如果某个服务节点出现故障,Keepalived在探测到后会自动将该节点从集群系统中剔除,在故障节点恢复正常后,Keepalived还可以自动将该节点重新加入集群。
健康检查和故障转移是Keepalived的两大核心功能。当检测到主负载均衡器发生故障时,由备负载均衡器承载对应的业务,从而保障可用性。
Keepalived可以保证主备模式的可用性,但是不能保证集群模式下的可用性
2. ECMP
ECMP即等价多路径路由。支持多种路径选择策略,如IP哈希、IP取模、平衡轮询、带权轮询等
在用户和接入层之间引入交换机,交换机通过ECMP等价路由将请求分发给LVS集群,实现负载均衡。同时,上联交换机与LVS集群间运行OSPF协议,当某台LVS宕机后,交换机会自动发现并将这台机器的路由动态剔除,这样ECMP就不会再给这台机器分发流量,从而保障高可用。
三、业务层高可用
1. 无状态服务
- 业务逻辑作为无状态的部分,支持平滑的水平扩展,在进行流量分发时,可以根据负载均衡策略将流量分发到非特定的服务器实例。由于服务实例之间完全对等,当任意一台或多台服务器宕机时,可以将请求转发给集群的任意一台可用的机器处理
- 数据部分作为有状态的部分,根据数据类型分别存储到外部中间件和数据库中,如分布式缓存、分布式消息队列、关系型数据库等。基于中间件和数据库本身的冗余备份、故障转移机制保障高可用
2. 集群部署
解决单点问题、如同城双活
3. 依赖处理
- 少依赖:减少应用之间、业务链路之间的依赖。防止服务雪崩
- 弱依赖:服务A依赖于服务B,服务B不可用时,服务A仍然可用,只是在A返回的结果中,与服务B相关的信息是缺失的或经过特殊处理的
- 异步化:对于链路上弱依赖而业务上强依赖的服务,可以采用异步化实现弱依赖,同时采用可靠的处理机制保障服务最终执行成功
重试机制、幂等设计、服务降级、服务限流、监控预警
四、数据层高可用
1. 副本机制
通过冗余备份,在多个节点上复制相同的数据,每个节点即副本。
副本角色:
- 主副本(Master):处理读写请求,将写请求同步到从副本
- 从副本(Slave):处理读请求。从副本和主副本间的数据同步通常存在延迟,无法保证强一致性。
2. 数据复制模式
- 同步复制模式:写请求被Master节点处理的同时,还需保证写操作在Slave节点上执行才返回给客户端。
- 异步复制模式:Slave节点异步从Master节点获取更新的数据。
- 半同步复制模式:写请求被Master节点处理的同时,只需保证相应写操作在某个Slave节点上执行成功即可返回
- 组复制:基于分布式一致性算法实现分布式环境下数据的最终一致性,同时提供高可用、高扩展的MySQL集群服务。