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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
简介: 标签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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
存储 缓存 测试技术
ZYNQ-AXI Interconnect IP介绍
ZYNQ-AXI Interconnect IP介绍
2727 0
ZYNQ-AXI Interconnect IP介绍
|
消息中间件 运维 Java
【Log日志】logback.xml动态配置属性值(包括接入的第三方配置)
1如何动态配置Logback的存放路径 我们在开发过程中,会使用到logback.xml 配置来管理日志文件; 比如
|
7月前
|
自然语言处理 搜索推荐 前端开发
大模型联网搜索的短板与突破之路
本文作者详细分析了当前大模型在联网搜索功能中存在的几个主要问题,并提供了具体的案例和解决方案。
1009 8
大模型联网搜索的短板与突破之路
|
9月前
|
分布式计算 DataWorks 搜索推荐
DataWorks 产品评测与最佳实践探索!
DataWorks 是阿里巴巴推出的一站式智能大数据开发治理平台,内置15年实践经验,集成多种大数据与AI服务。本文通过实际使用角度,探讨其优势、潜力及改进建议。评测涵盖用户画像分析、数据治理、功能表现等方面,适合数字化转型企业参考。
192 1
|
8月前
|
机器学习/深度学习 存储 文字识别
阿里国际Ovis2系列模型开源:多模态大语言模型的新突破
阿里国际Ovis2系列模型开源:多模态大语言模型的新突破
334 0
|
Kubernetes Cloud Native Java
从一个服务预热不生效问题谈微服务无损上线
本文基于阿里云技术服务团队和产研团队,在解决易易互联使用 MSE(微服务引擎)产品无损上线功能所遇到问题的过程总结而成。本文将从问题和解决方法谈起,再介绍相关原理,后进一步拓展到对微服务引擎和云原生网关无损上线能力的介绍。
12034 112
|
边缘计算 Kubernetes Linux
KubeSphere平台安装系列之三【Linux多节点部署KubeSphere】(3/3)
KubeSphere平台安装系列之三【Linux多节点部署KubeSphere】(3/3)
307 1
|
运维 架构师 云栖大会
2024云栖大会 | 阿里云网络技术Session主题资料和视频回放归档
2024年9月19日-21日,杭州,一年一度的云栖大会如期而至;阿里云飞天洛神云网络作为阿里云计算的连接底座,是飞天云操作系统的核心组件,致力于为上云企业提供高可靠、高性能、高弹性、智能的连接服务。本次云栖,云网络产品线也带来全系列产品升级,以及创新技术重磅解读,围绕增强确定性、深度可观测、高效自动化和敏捷全球化带来技术、产品和服务升级,以及全新的生态伙伴合作构建。
1164 15
|
监控 物联网 5G
物联网卡的一些主要类型
物联网卡(IoT SIM卡或物联网SIM卡)是专为物联网设备设计的SIM卡,它们允许设备连接到移动网络,进行数据传输和远程控制等操作。根据不同的需求和应用场景,物联网卡可以分为几种不同的类型。以下是物联网卡的一些主要类型及对应的操作简述:
|
消息中间件 存储 SQL
关于Lindorm Ganos
Lindorm 是阿里云推出的云原生超融合多模数据库,集成了宽表、时序、搜索、文件等多种引擎。深度融合的 Lindorm Ganos 时空数据库引擎,能够高效处理海量移动对象的存储、管理和查询需求,弥补了 NoSQL 数据库在时空数据处理上的不足。Ganos 具备原生时空数据类型、多层级索引能力和广适应兼容性,支持标准 SQL 语法,显著提升了计算效率和查询性能。相较传统方案,Ganos 在多种场景下性能提升 3-5 倍,并大幅降低存储计算成本。
428 0