multi-master - 多主 - 多写 - 如何在多写中避免数据复制打环(死循环)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 标签PostgreSQL , 打环背景双写或者多写,除了需要考虑数据冲突的问题,另一个要考虑的就是打环的问题。为什么会打环呢?DB A <-> DB B 1、Ainsert into tbl values (1,'test'); 产生redo 同步到B 2、B接收到同步内容 insert into tbl values (1,'test'); 产生redo 同步到A 3、。

标签

PostgreSQL , 打环


背景

双写或者多写,除了需要考虑数据冲突的问题,另一个要考虑的就是打环的问题。

为什么会打环呢?

DB A <-> DB B  

1、A

insert into tbl values (1,'test');  
  
产生redo  
  
同步到B  

2、B

接收到同步内容  
  
insert into tbl values (1,'test');  
  
产生redo  
  
同步到A  

3、。。。 。。。

循环往复。

如何解决多写复制打环呢?

《使用PostgreSQL逻辑订阅实现multi-master》

以上是在数据库源端使用标记来解决,记录数据是从哪个节点产生的,目标端回放时过滤掉打环的数据。

如果你的复制是使用中间层做的,也可以使用类似方法解决。

思路

把一个事务理解为一个数据包。

数据包有身份信息,例如是A库产生的还是B库产生的,我们只要能让REDO中携带这个事务是谁产生的这笔身份信息,并且在写到目标端后依旧能保留这份信息,就可以用来避免多写打环。

实现介绍

pic

假设使用中间服务来进行PG的多主同步,源数据解析采用解析源库REDO的方式。例如pglogical

https://github.com/2ndQuadrant/pglogical

中间服务需要完成几件事情:

1、解析上游节点的REDO,按事务处理

2、检查一个事务中是否有签名信息(怎么检测,取决于第三步怎么加签名)。

如果事务中有签名信息,这个事务的内容不传播给下游(即不在下游回放)。

如果事务中没有签名信息,继续下一步(加签名信息)。

3、在事务中加签名信息(事务的源库签名)。

签名内容是什么?

即这个事务的源头是哪个库(可以用数据库的systemid来表示,或者其他可以唯一标识一个库的ID(例如host+port+dbname))。

怎么加签名?

1、方法1,PG提供了custom wal record的接口,可以在目标库回放这个事务时,在事务结束前,把custom wal record(值为事务的源库签名)加到这个事务中。

具体请参考文档

https://www.postgresql.org/docs/11/generic-wal.html

2、方法2,在事务结束前,在目标库通过写数据产生REDO实现,值为(事务的源库签名)。

例如,

create table 签名表 (id serial8 primary key, info text);  
insert into 签名表 (info) values ('事务的源库签名') returning id;   
delete from 签名表 where id=?;   

或者

create table 签名表 (id serial8 primary key, info text);  
update 签名表 set info='事务的源库签名' where id=?;  -- id = 已注册的源库ID   

方法2比较耗费性能,但是更加通用。

参考

《使用PostgreSQL逻辑订阅实现multi-master》

https://github.com/2ndQuadrant/pglogical

https://github.com/postgrespro/postgres_cluster

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
存储 运维 负载均衡
Redis Cluster集群原理+三主三从交叉复制实战+故障切换
Redis Cluster集群原理+三主三从交叉复制实战+故障切换
1210 0
Redis Cluster集群原理+三主三从交叉复制实战+故障切换
|
弹性计算 网络协议 容灾
PostgreSQL 时间点恢复(PITR)在异步流复制主从模式下,如何避免主备切换后PITR恢复(备库、容灾节点、只读节点)走错时间线(timeline , history , partial , restore_command , recovery.conf)
标签 PostgreSQL , 恢复 , 时间点恢复 , PITR , restore_command , recovery.conf , partial , history , 任意时间点恢复 , timeline , 时间线 背景 政治正确非常重要,对于数据库来说亦如此,一个基于流复制的HA架构的集群,如果还有一堆只读节点,当HA集群发生了主备切换后,这些只读节点能否与新的主节点保持
1656 0
|
5月前
|
SQL 关系型数据库 MySQL
如何判断mysql主从是否同步
如何判断mysql主从是否同步
|
11月前
|
监控 关系型数据库 MySQL
如何避免主从不同步
如何避免主从不同步
73 0
|
11月前
|
关系型数据库 MySQL 数据库
多主复制下处理写冲突(4)-多主复制拓扑
复制的拓扑结构描述了写请求从一个节点传播到另一个节点的通信路径。若有两个主节点,如图-7,只有一个合理拓扑结构:M1必须把他所有的写同步到M2,反之亦然。当有两个以上M,各种不同拓扑都可能的。如图-8说明了一些例子。
88 0
多主复制下处理写冲突(4)-多主复制拓扑
|
11月前
|
CDN
多主复制下处理写冲突(1)-同步与异步冲突检测及避免冲突
多主复制的最大问题:可能发生写冲突,这是必须要解决的。
86 0
|
11月前
|
存储 移动开发 运维
无主复制系统(3)-Quorum一致性的局限性
若有n个副本,且配置w和r,使得w + r > n w + r> nw+r>n,期望可以读到一个最新值。因为成功写入的节点集合和读取的节点集合必有重合,这样读取的节点中至少有一个具有最新值,如图-11。
96 0
|
11月前
|
算法 开发工具 git
多主复制下处理写冲突(3)-收敛至一致的状态及自定义冲突解决逻辑
主从复制模型的数据更新符合顺序性原则:若同一字段有多个更新,则最后一个写操作决定该字段的终值。
83 0
|
关系型数据库 MySQL 数据库
MySQL的延迟复制、半同步复制,主主复制,异步复制有什么区别?底层原理是什么?
MySQL的延迟复制、半同步复制,主主复制,异步复制有什么区别?底层原理是什么?
252 0
|
机器学习/深度学习 算法 关系型数据库
MySQL组复制构建在Paxos分布式算法基础上实现的
MySQL组复制构建在Paxos分布式算法基础上实现的
318 0