单体数据库
异地容灾
异地容灾是异地多活的低配版,它往往是这样的架构。
整个方案涉及同城和异地两个机房,都部署了同样的应用服务器和数据库,其中应用服务器都处于运行状态可以处理请求,也就是应用多活。只有同城机房的数据库处于运行状态,异地机房数据库并不启动,不过会通过底层存储设备向异地机房同步数据。然后,所有应用都链接到同城机房的数据库。
异地读写分离
在异地读写分离模式下,异地数据库和主机房数据库同时对外提供服务,但服务类型限制为只读服务,但只读服务的数据一致性是不保证的。
双向同步
双向同步模式下,同城和异地的数据库同时提供服务,并且是读写服务均开放。但有一个重要的约束,就是两地读写的对象必须是不同的数据,区分方式可以是不同的表或者表内的不同记录,这个约束是为了保证两地数据操作不会冲突。因为不需要处理跨区域的事务冲突,所以两地数据库之间就可以采用异步同步的方式。
两个单元之间又相互备份数据,有了这些数据可以容灾,也可以开放只读服务。当然,这个只读服务同样是不保证数据一致性的。
分布式数据库
机房级容灾(两地三中心五副本)
这种模式下,每个分片都有 5 个副本,在同城的双机房各部署两个副本,异地机房部署一个副本。
保留了“异地容灾”模式下的数据同步功能,但因为同样要保证低延迟,所以也做不到 RPO(Recovery Point Objective, 恢复点目标)为零。
由于 Raft 或 Paxos 都是多数派协议,那么任何写操作时,同城的四个副本就能够超过半数完成提交,这样就不会因为与异地机房通讯时间长而推高数据库的操作延迟。
两地三中心虽然可以容灾,但对于异地机房来说 RPO 不为零,在更加苛刻的场景下,仍然受到挑战。这也就催生了三地五副本模式,来实现 RPO 为零的城市级容灾。
城市级容灾(三地五副本)
三地五副本模式是两地三中心模式的升级版。两个同城机房变成两个相邻城市的机房,这样总共是在三个城市部署。
全球化部署
全球化部署的前提是多时间源、多点授时,这样不同分片的主副本就可以分散在多个机房。那么数据库服务可以尽量靠近用户,而应用系统也可以访问本地的分片主副本,整体效果达到等同于单元化部署的效果。
如果从恶意攻击的角度看,基于 Raft 协议的多中心部署反而会带来数据库的脆弱性,因为机房间的通讯链路将成为致命的弱点。所以,应在一定条件下允许对 Raft 协议做降级处理,保证少数副本也可以对外提供服务。
真正的异地多活必须是异地机房提供全服务,这样才能在本质上提升系统可用性,比定期演练更加可靠。
此文章为6月Day23学习笔记,内容来源于极客时间《分布式数据库30讲》