云数据库 Tair(兼容 Redis)作为高性能的Key-Value数据库,在业务场景中往往承载着大量的重要数据,为保障数据安全性,云数据库 Tair(兼容 Redis)提供了多种灾备方案供您选择。
容灾架构演进
当实例因不可预料的原因(例如设备故障、机房断电等)发生故障,容灾机制可用于保障数据的一致性和业务可用性。
灾备方案 | 灾备级别 | 说明 |
★★★☆☆ | 主备节点部署在同一可用区中的不同机器上,当任一节点发生故障时,由高可用HA(High Availability)系统自动执行故障切换,避免单点故障引起的服务中断。 | |
★★★★☆ | 主备节点分别部署在同一地域下两个不同的可用区,当任一可用区因电力、网络等不可抗因素失去通信时,高可用HA系统将执行故障切换,确保整个实例的持续可用。 | |
★★★★★ | 由多个子实例构成全球多活实例,所有子实例通过同步通道保持实时数据同步,由通道管理器负责子实例的健康状态监测、主备切换等等异常事件的处理,适用于异地灾备、异地多活、应用就近访问、分摊负载等场景。 |
单可用区高可用方案
实例全架构均支持单机房高可用架构。由高可用HA(High Availability)系统监控主备节点的健康状态并自动执行故障切换,避免单点故障引起的服务中断。
部署架构 | 说明 |
标准架构(双副本)实例采用双机主从(Master-Replica)架构,高可用HA模块侦测到主节点故障时,会自动进行主从切换,将Replica提升为Master,而原来的Master恢复连接后会成为新的Replica。 | |
集群架构(多副本)实例中的数据分片用于承载数据,每个数据分片均为多副本(分别部署在不同机器上)高可用架构,主节点发生故障后,系统会自动进行主备切换保证服务高可用。 | |
|
同城容灾方案
云数据库 Tair(兼容 Redis)提供跨双机房的同城容灾架构。如果业务为单一地域部署,且对容灾要求较高,可在创建实例时,选择支持同城容灾的可用区(即多可用区)。操作方法,请参见创建实例。
完成创建后,备机房将创建与主机房相同规格的Replica实例,主备机房的实例数据通过专门的复制通道同步。
当主机房出现电力或网络问题时,Replica实例将升级为Master实例,系统调用Config Server接口为Proxy更新路由信息。同时,云数据库 Tair(兼容 Redis)优化了Redis的同步机制,在同步位点上借鉴MySQL的GTID,实现了全局Opid,查找Opid的操作通过后台线程无锁进行,发送AOF binlog是异步同步的过程(可限流),保障了Redis服务的性能。
跨地域容灾方案
随着业务的快速发展,在业务分布较广时,如果还采用跨地域远距离访问的架构,将导致访问的延迟大,影响用户体验。借助阿里云的Tair全球多活(分布式缓存)功能,可帮助您解决业务因跨地域访问导致延迟大的问题,全球多活功能具有如下优势:
可直接创建或指定需要同步的子实例,无需通过业务自身的冗余设计来实现,极大降低业务设计的复杂度,让您专注于上层业务的开发。
可提供跨域复制(Geo-replication)能力,快速实现数据异地灾备和多活。
该功能可应用于跨地域数据同步场景及多媒体、游戏、电商等行业的全球化业务部署等场景。更多介绍,请参见全球多活。
如何应对故障
故障(例如设备故障、机房断电、自然灾害等)通常可分为主节点故障或可用区级别故障,虽然发生概率较低,但故障可能会导致实例一段时间无法写入、闪断,甚至会造成实例停机或数据丢失(实例的可靠性还与架构息息相关,通常集群架构的可靠性更高)。为了尽可能地降低故障带来的影响,多副本、多可用区实例会在故障时自动执行切换,这会最大限度地缩短停机时间。下文向您介绍不同灾备方案的实例如何应对故障。
应对节点故障
当主节点发生故障时:
若实例为单可用区多副本节点(例如具备主、备节点):系统会在发生节点故障时自动执行故障切换,选取复制延迟最小的备节点成为新的主节点,并更新路由关系。
若实例为多可用区:系统会在发生节点故障时自动执行故障切换,选取另一可用区的备节点成为新的主节点,并更新路由关系。但此时可能产生实例与其他业务跨机房访问的情况。
说明在多可用区集群架构中,当主、备可用区都存在备节点时,主备切换会优先选择主可用区的备节点进行切换,避免业务跨可用区访问。
应对可用区故障
当发生可用区故障(例如断电、火灾等,造成整个机房不可用)时:
若实例为单可用区部署:实例整体不可用,需要等待该可用区恢复,此时,您可以通过历史的备份数据在其他可用区创建新实例。
若实例为多可用区部署:会触发自动切换。
从安全性来说,选择多可用区、并在每个可用区创建多个副本可以尽可能地减少停机时间,但您需要在发生故障的概率、业务数据的重要性、成本之间作出选择。
全球多活的子实例也适用上述原则,但单个子实例故障时不会影响其他子实例的可用性。推荐全球多活的子实例为多可用区部署,避免因单个子实例故障而导致数据写入失败。