PG数据库如何实现同城异地多活数据同步?

最近在进行系统建设前的设计,系统使用的是pg的数据库。因为业务的实际要求,需要构建同城双活+异地单活  整个三活的模式。系统在三个机房部署,客户随机访问其中任一机房服务。所以需要保障PG数据库在三个地方的数据是一致,且都能提供读写能力。目前有想法是在应用层记录下...显示全部

最近在进行系统建设前的设计,系统使用的是pg的数据库。因为业务的实际要求,需要构建同城双活+异地单活  整个三活的模式。
系统在三个机房部署,客户随机访问其中任一机房服务。所以需要保障PG数据库在三个地方的数据是一致,且都能提供读写能力。
目前有想法是在应用层记录下每次的数据库操作,然后写入消息队列,由其他2地消费消息,重新执行数据库操作。但是这种存在消息消费不及时或者前后顺序不一致的情况,不知道有没有什么好的方案能够实现数据库在同城异地多活的模式。
要求三中心数据和服务都是热的,且提供写入的能力。

收起
参与20

查看其它 2 个回答火龙猫的回答

火龙猫火龙猫  架构师 , 华为技术有限公司

直接基于开源的PG,我估计是不行。

因为你的诉求是多地多活都可以写。而PG本身是主从模式基于redo log同步,备机要回放日志,只能读不能写。

数据库要做到多活,有几个问题要解决。

首先是数据共享,两边PG看到的数据必须是同一份,才能避免数据之间的差异。这个问题只要把数据放在共享存储,基于共享存储做个同城数据双活就解决了。

第二个问题就是数据共享之后,多个数据库实例要能修改访问同一份数据,这个问题其实也有解决办法,就是对同一个库或者一个表,始终只有一个人写就行,这个估计改一些中间件也能做到。

第三个问题,是读写一致性,这个就有点麻烦了,因为必须要保证缓存和视图的一致,也就是集群级MVCC。这个东西估计不动内核不太可能从外围解决。

我们目前倒是针对MySQL有个方案,我发过一篇文章《怎样才是分布式数据库存算分离的正确姿势》里面最后的那个架构是能满足要求的,只可惜这个目前是对MySQL的。

互联网服务 · 2023-02-01
  • 匿名用户
    Why not to try OceanBase Distributed Database for multi-read and write mode?
    2023-02-08

回答者

火龙猫
架构师华为技术有限公司
擅长领域: 数据库服务器分布式系统

火龙猫 最近回答过的问题

回答状态

  • 发布时间:2023-02-01
  • 关注会员:4 人
  • 回答浏览:1919
  • X社区推广