数据库设计 - 主主一致性

本文探讨了在双主或多主数据库架构下,高并发场景中可能出现的主主不一致问题,即由于主键冲突导致的数据同步失败。文章详细解释了主主不一致的原因,并提出了三种解决方案:调整数据库自增主键的初始值和增长步长、采用分布式自增主键生成算法如雪花算法,以及实施影子主不服务策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、What

在双主或者多主的情况下,主与主之间需要同步,在高并发的情况下,可能会出现同步失败的现象。那么此时就出现了主与主之间不一致的问题。

二、Why

那么为什么会出现主主不一致呢,也就是说为什么主与主之间会同步失败呢?通常是主主同步时主键冲突引起的,比如说主库使用的是自增id,如果同时来了两个请求分别到数据库主A和数据库主B,那么两者都各自增了1,比如是4,那么主A会同步主A的id为4的记录给主B,主B页会同步主B的id为4的记录给主A,产生了主键冲突,导致数据丢失。

三、How

方案一:数据库的自增主键不同初始值,相同增长步长
在这里插入图片描述

为了避免主主不一致,核心就是避免主键冲突,数据库层面有一个简单的做法:不同初始值,相同增长步长。

图中就是一个简单的例子,左边初始为1,步长为2,那么刚好就都是奇数主键,右边初始为2,步长为2,那么刚好都是偶数主键,两库同步之后就是全量数据,不会有主键冲突。

但是这样子会给运维造成负担,毕竟数据库配置不一样就需要额外的管理成本。

方案二:上游层面处理
一种更加推荐的做法就是由第三方来保证一个全局自增的主键,所有生产者都要从这里获取主键。一个著名的分布式自增主键生成算法 – 雪花算法。

方案三:影子主不服务
其实就是高可用里说的keealived+VIP的方式,让一个主变为影子主,它只在对外提供服务的主库挂了的时候接替它上任,这就不会发生不一致的情况,但是资源使用率只有50%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值