作为现代化的互联网企业 ,最怕的是什么 ?是意外!由各种意外导致的数据库问题,磁盘问题、网络问题、人员误操作问题等等,这些问题都可能导致数据不可用或者丢失,造成重大损失。因此,很少会有企业采用「单机」数据库架构,尽管这个架构简单明了,却经不起任何的意外,所以大部分企业都会采用更加安全可靠的「主从高可用」架构。这种架构通常具备一个主库(Master)和一个或多个从库(Slave),所有从库都实时保存了主库最新数据的副本,当主库出现问题无法访问时,保证从库可以迅速接管。但实际上,你的「主从高可用」架构通常是部署在一个机房的多台服务器中,在遭遇火灾、地震、线缆被意外挖断等人为不可控的灾害时,主从高可用架构将形同虚设,你的数据照样会被一锅端。这就是我今天想聊的话题,单一机房内的高可用并不能算真正意义上的高可用,而「跨机房容灾」甚至「异地容灾」才算。
顾名思义,异地容灾就是在「主从高可用」架构的基础上,把服务器分别部署在不同地域的机房中,当中心节点地域的机房发生灾害,其他单元节点所处地域的服务器可以迅速接管业务,确保业务的可用性,但是这又会带来新的问题,单元节点平时只是作为「灾备实例」存在,谁能确保在所有中心节点的流量切换到单元节点后不出任何问题呢?因此,这个方案是存在风险的。
而异地多活则是异地容灾的一种升级方案,单元节点如果仅仅是作为灾备实例,那也太浪费了,不如和中心节点一起,同步处理业务流量,这样一来,不仅可以提高资源利用率,也能保证在任意一个节点失效时,其他节点可以平稳接管流量。要做到这一点,我们就要解决各节点之间的数据一致性问题。上图就是一个异地多活的解决方案,其核心是在所有节点间建立实时的数据同步机制,以确保各个节点的数据一致性。当中心节点发生数据变更时,这些变更会被实时同步到所有单元节点,反之亦然,形成了一个双向同步的复制链路,确保所有节点中的数据保持实时一致。
实现这个过程是非常复杂的,但是通过 NineData 就可以轻松做到。
NineData 是玖章算术公司自主研发的云原生智能数据管理平台,是一个纯国产的软件。它提供的数据复制功能专门用于数据源之间的数据迁移与同步,针对本文的双向数据实时同步的需求,也提供了非常强大的支持。
这里我们以 MySQL 为例,假设有 A、B、C 三个数据源,以数据源 A 为中心节点,分别创建 A 和 B、A 和 C 之间的双向复制任务,实现三个数据源的数据实时同步。
步骤一:录入所有节点的 MySQL 数据库并添加多活标记
1. 登录 NineData 控制台,单击数据源管理>数据源,然后在页面中单击创建数据源,选择需要录入的数据源。
2. 根据页面提示进行配置,然后单击创建数据源完成创建。3. 单击数据源 ID 进入数据源详情页面,单击展开,找到多活标记,配置多活标记名称。该步骤所有参与复制的数据源都需要执行,以防止发生数据循环复制。步骤二:创建数据源 A、B、C 之间的双向复制任务
1. 登录 NineData 控制台,单击数据复制>数据复制,然后单击创建复制。
2. 根据页面提示配置复制任务,源数据源处选择数据源 A,目标数据源处选择数据源 B,然后在复制方式处选择双向复制。3. 配置完成后启动任务,然后再次创建一个新的复制任务,源数据源处依然选择数据源 A,目标数据源处选择数据源 C,然后同样在复制方式处选择双向复制。
4. 根据页面提示完成配置后,在数据复制的任务列表中可以看到多了 2 条双向复制任务,当正反向任务的延迟为 0 的时候,代表数据源 A、B、C 之间的数据是一致的。
本方案作为示例展示了一中心两单元的同步架构,事实上,这个解决方案可以支持无限多个单元节点的实时同步,只需重复添加数据源 A 到数据源 N 即可实现。
至此,你的异地多活架构已经全部配置完成,所有节点都可以提供业务读写,得益于实时的数据同步机制,任何一个节点发生故障时,其他节点均能够无缝接管中心节点的流量,由于所有单元节点本身就在处理业务,因此无需担心单元节点能否胜任,保证了系统的高可用性和持续性。