`
youyu4
  • 浏览: 428906 次
社区版块
存档分类
最新评论

互联网一致性架构设计 -- DB双主一致性

 
阅读更多

互联网一致性架构设计 -- DB双主一致性

 

 

       MySQL数据库集群常使用一主多从,主从同步,读写分离的方式来扩充数据库的读性能,保证读库的高可用,但此时写库仍然是单点。

 

       解决方法

 

       在一个MySQL数据库集群中可以设置两个主库,并设置双向同步,以冗余写库的方式来保证写库的高可用。

 

 

 

 

需求分析

 

       数据冗余会引发数据的一致性问题,因为数据的同步有一个时间差,并发的写入可能导致数据同步失败,引起数据丢失,假设主库使用了auto increment来作为自增主键:

 

  1. 两个MySQL-master设置双向同步可以用来保证主库的高可用
  2. 数据库中现存的记录主键是1,2,3
  3. 主库1插入了一条记录,主键为4,并向主库2同步数据
  4. 数据同步成功之前,主库2也插入了一条记录,由于数据还没有同步成功,插入记录生成的主键也为4,并向主库1也同步数据
  5. 主库1和主库2都插入了主键为4的记录,双主同步失败,数据不一致

         

 

 

 

 

解决方法

 

  • 相同步长免冲突:设置不同初始值,增长步长一样。
  • 上游生成ID避冲突:通过ID生成器生成数据库ID。
  • 消除双写不治本:一个主库支持服务,另一个做备份,shadow-master
  • 内网DNS探测

 

 

 

 

相同步长免冲突

 

  • 设置不同的初始值
  • 设置相同的增长步长

         
 

     如上图所示:

 

  1. 两个MySQL-master设置双向同步可以用来保证主库的高可用
  2. 库1的自增初始值是1,库2的自增初始值是2,增长步长都为2
  3. 库1中插入数据主键为1/3/5/7,库2中插入数据主键为2/4/6/8,不冲突
  4. 数据双向同步后,两个主库会包含全部数据


       
 

    如上图所示

 

    两个主库最终都将包含1/2/3/4/5/6/7/8所有数据,即使有一个主库挂了,另一个主库也能够保证写库的高可用。

 

 

 

 

上游生成ID避冲突

 

       完全可以由业务上游,使用统一的ID生成器,来保证ID的生成不冲突:


       

 

    如上图所示

 

       调用方插入数据时,带入全局唯一ID,而不依赖于数据库的auto increment,也能解决这个问题。至于如何生成全局唯一,趋势递增的ID,参见文章《分布式ID生成算法》。

 

 

 

 

 

消除双写不治本

 

       使用auto increment两个主库并发写可能导致数据不一致,只使用一个主库提供服务,另一个主库作为shadow-master,只用来保证高可用。


       
 

    如上图所示:

 

  1. 两个MySQL-master设置双向同步可以用来保证主库的高可用
  2. 只有主库1对外提供写入服务
  3. 两个主库设置相同的虚IP,在主库1挂掉或者网络异常的时候,虚IP自动漂移,shadow master顶上,保证主库的高可用

 

    缺陷

 

       这个切换由于虚IP没有变化,所以切换过程对调用方是透明的,但在极限的情况下,也可能引发数据的不一致。


        

 

    如上图所示:

 

  1. 两个MySQL-master设置双向同步可以用来保证主库的高可用,并设置了相同的虚IP
  2. 网络抖动前,主库1对上游提供写入服务,插入了一条记录,主键为4,并向shadow master主库2同步数据
  3. 突然主库1网络异常,keepalived检测出异常后,实施虚IP漂移,主库2开始提供服务
  4. 在主键4的数据同步成功之前,主库2插入了一条记录,也生成了主键为4的记录,结果导致数据不一致

 

 

 

 

内网DNS探测

 

       虚IP漂移,双主同步延时导致的数据不一致,本质上,需要在双主同步完数据之后,再实施虚IP偏移,使用内网DNS探测,可以实现shadow master延时高可用:

 

  1. 使用内网域名连接数据库,例如:db.58daojia.org
  2. 主库1和主库2设置双主同步,不使用相同虚IP,而是分别使用ip1和ip2
  3. 一开始db.58daojia.org指向ip1
  4. 用一个小脚本轮询探测ip1主库的连通性
  5. 当ip1主库发生异常时,小脚本delay一个x秒的延时,等待主库2同步完数据之后,再将db.58daojia.org解析到ip2
  6. 程序以内网域名进行重连,即可自动连接到ip2主库,并保证了数据的一致性

 

 

 

 

总结

 

       主库高可用,主库一致性,一些小技巧:

 

  1. 双主同步是一种常见的保证写库高可用的方式
  2. 设置相同步长,不同初始值,可以避免auto increment生成冲突主键
  3. 不依赖数据库,业务调用方自己生成全局唯一ID是一个好方法
  4. shadow master保证写库高可用,只有一个写库提供服务,并不能完全保证一致性
  5. 内网DNS探测,可以实现在主库1出现问题后,延时一个时间,再进行主库切换,以保证数据一致性
  • 大小: 14.1 KB
  • 大小: 13.5 KB
  • 大小: 15.6 KB
  • 大小: 9.7 KB
  • 大小: 11.1 KB
  • 大小: 18.9 KB
分享到:
评论

相关推荐

    DB主从一致性架构优化4种方法

    DB主从一致性架构优化4种方法,DB主从一致性架构优化4种方法

    分布式事务实践 解决数据一致性

    除此以外还介绍了一些分布式事务相关的技术,如幂等性、全局一致性ID、分布式对象等。... 6-1 分布式事务介绍 6-2 spring分布式事务实现_使用JTA 6-3 spring分布式事务实现_不使用JTA 6-4 实例1-DB-DB 6-5 实例1-DB-...

    2018-SACC-数据架构设计

    1. 沈剑_58速运,数据库架构,一致性最佳实践.pdf 2. 封宇_瓜子IM智能客服系统数据架构设计.pdf 3. 汪清平_TenDis在腾讯游戏的演进和实践.pdf 4. 黄贵 - 阿里新一代分布式数据库X-DB技术剖析.pdf

    一致性:ClojureDatomic库,用于将规范等价地交易到您的数据库中-无论是架构,数据还是其他形式

    从更一般的意义上讲,一致性允许您声明(以规范的形式)关于数据库状态的期望,并在无需重复处理架构,所需数据等的情况下等幂地实施这些期望。 相依性 一致性在clojars上可用,并且可以通过在:dependencies添加...

    阿里P8架构师谈:高并发架构解决方案总结

    高并发是指在同一个时间点,有很多用户同时访问URL地址,比如...这里主要讲述的是在并发请求下的数据逻辑处理的接口,如何保证数据的一致性和完整性,这里的并发可能是大量用户发起的,也可能攻击者通过并发工具发起的

    新版Android开发教程.rar

    � A ndroid 在设计初期就考虑了与现其有业务的融合,改变以往从计算机为主改成从手机使用为导向。新 生应用如:G oogle 地图及其衍生应用、 GMail 、 GTalk 等。 � GPS 卫星导航功能,手机照相, MP3 ,蓝芽等均...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    双主架构 主从同步 读写分离 性能优化架构能力 代码级别 关联代码优化 cache对其 分支预测 copy on write 内联优化 系统优化 cache 延迟计算 数据预读 异步 轮询与通知 内存池 模块化 工程架构...

    Java高并发高性能分布式框架从无到有微服务架构设计.doc

    Java高并发高性能分布式框架从无到有微服务架构设计 Java高并发高性能分布式框架从无到有微服务架构设计 微服务架构模式(Microservice Architect Pattern)。近两年在服务的疯狂增长与云计算技术的进步,让微服务...

    He3Proxy是中移(苏州)软件技术有限公司基于PG协议专为He3DB打造的高性能数据库代理项目

    He3Proxy是中移(苏州)软件技术有限公司基于PG协议 专为He3DB 打造的高性能数据库代理项目,采用Go语言开发, He3Proxy为He3DB 提供读写分离、负载均衡、连接池管理、 读一致性等基础能力,让用户像使用单机一样...

    NoSQL数据库笔谈

    最终一致性 变体 BASE 其他 I/O的五分钟法则 不要删除数据 RAM是硬盘,硬盘是磁带 Amdahl定律和Gustafson定律 万兆以太网 3. 手段篇 一致性哈希 亚马逊的现状 算法的选择 Quorum NRW Vector clock Virtual node ...

    He3Proxy是中移(苏州)软件技术有限公司基于PG协议 专为He3DB 打造的高性能数据库代理项目

    He3Proxy是中移(苏州)软件技术有限公司基于PG协议 专为He3DB 打造的高性能数据库代理项目,采用Go语言开发, He3Proxy为He3DB 提供读写分离、负载均衡、连接池管理、 读一致性等基础能力,让用户像使用单机一样...

    Taobao oceanbase代码

     UpdateServer:类似于DBMS中的DB角色,提供跨行跨表事务和很短的查询修改的响应时间以及良好的一致性。  ChunkServer:类似于云计算中的工作机(如GFS的chunk server),具有数据多副本(通常是3)、中等规模数据...

    开涛高可用高并发-亿级流量核心技术

    11.6.2 一致性哈希 226 11.6.3 快速恢复 226 12 连接池线程池详解 227 12.1 数据库连接池 227 12.1.1 DBCP连接池配置 228 12.1.2 DBCP配置建议 233 12.1.3 数据库驱动超时实现 234 12.1.4 连接池使用的一些建议 235 ...

    rel-db-strategies-for-scale:扩展关系数据库的策略

    什么是一致性哈希? 它基本上是一种技术,用于专门基于基于ID或某些唯一代码创建的哈希值在不同服务器之间处理请求。 这几乎是用于负载分配的最简单算法之一,因为它在重定向请求之前不会考虑节点内部的工作量。 您...

    大数据云计算技术系列 NoSQL数据库学习教程(共71页).pdf

    2 最终一致性 2 变体 2 BASE 2 其他 2 I/O的五分钟法则 2 不要删除数据 2 RAM是硬盘,硬盘是磁带 2 Amdahl定律和Gustafson定律 2 万兆以太网 3 手段篇 3 一致性哈希 3 亚马逊的现状 3 算法的选择 3 Quorum NRW 3 ...

    CQRS介绍 CQRS概述

    我个人认为,这种架构很实用,既兼顾了数据的强一致性,又能让代码好维护。 2.CQ两端数据库和上层代码都分离,然后Q的数据由C端同步过来,一般是通过Domain Event进行同步。同步方式有两种,同步或异步,如果需要CQ...

    yugabyte-db:适用于全球,互联网规模的应用程序的高性能分布式SQL数据库

    分布式事务事务设计基于Google Spanner架构。 通过使用Raft共识进行复制以及使用混合逻辑时钟的群集范围内的分布式ACID事务,可以实现高度的写入一致性。 支持快照和可序列化的隔离级别。 默认情况下,读取(查询)...

    存储白皮书(绝对内部资料)

    6.3 时间不同步引起的数据一致性问题 49 6.4 文件共享中的数据一致性问题 50 第7章 数据复制与容灾 51 7.1 灾难恢复/业务连续性 51 7.2 数据备份系统 54 7.2.1 数据备份 54 7.2.2 数据复制 56 7.3 数据一致性 59 7.4...

Global site tag (gtag.js) - Google Analytics