当前位置: 首页 > news >正文

MySQL业务双活的初步设计方案

这是学习笔记的第 2142 篇文章


640?wx_fmt=gif

  在之前设计两地三中心方案时,提到了一个方案,在文章发布后收到了很多朋友的反馈,当然这个事情不是拍脑袋想的,我们最近在落实这件事情。 

  我们先来看下之前的一个简略版设计,这是基于分布式设计方案,可以引入数据组件syncer和writer,实现机房多活的业务需求,syncer和writer为数据的发布者和消费者,基于分布式协议进行处理。

在处理过程中有三类关键技术:

1)数据的处理基于分布式ID,能够唯一定位数据处理操作,并且该操作具备递增趋势。

2)同步组件的稳定性,同步组件可以理解为一种通用服务,需要考虑不同机房间的数据延迟和数据冲突处理机制,保证同步组件服务的稳定,高效。

3)同步组件的高可用,对于同步组件需要根据业务特点做权重处理,考虑不通IDC的业务情况,并重点考虑同步组件的数据冗余设计,保证发生异常时能够及时恢复数据。

此种方案短期内难以实现,但是长期来看,可以支持机房多活,业务价值更高。

640?wx_fmt=png

当然在具体设计的时候,其实有很多现实的问题摆在面前,在经过了几次讨论和各个技术方向的对接讨论后,我设计了如下的方案。

640?wx_fmt=png

我来做下解释,首先对于机房多活来说,我们设定的这个场景是源端和目标端,当然一个实例既可以是目标端也可以同时是源端。 

为了提高业务响应,我们的设定规则是遵循最终一致性,所以在业务场景接入的时候,对于高并发修改同一条数据的情况需要从业务规划层面避免。

从源端写入的数据会通过流转的方式进入目标端,而这个过程中数据的格式为了通用起见是采用了JSON来进行流转。

源端如何得到这些实时的数据变化,我们可以采用虚拟从库(virtual_slave)的组件来进行对接,这里可以参考的有canal,maxwell和mysql-python-replication,我们这里目前先行测试使用的是maxwell.

对于数据的流转,为了提高定制能力,我们需要加入过滤器(stream-filter)来进行过滤,同时在下发解析请求的时候可以通过路由的方式打到不同的队列里面,这里的队列可选方案有Redis,Kafka,RabbitMQ等,因为是双活方案,对标两地三中心,在数据写入队列时出现错误其实是直接会丢失数据的,所以在这一层面,是采用双通道的方式,即写入两个队列,两个队列是物理隔离的,数据在通道内自然有时间的先后。 

而缓存队列只是数据的一个流转节点,不需要保留过长的时间,所以数据下发之后就需要持久化,持久化代表着这个消息是完整唯一的,而多个通道同时写入就需要做去重的基本工作,这个如果采用MySQL方案可以很容易使用insert into duplicate的方式解决,如果为了提高多个通道并发写入的性能,可以采用TiDB的多个结算节点写入,而如果在兼容JSON格式时能够更加友好管理,可以考虑采用MongoDB的方案。 

 数据持久化之后就要开始消费了,我们可以采用类似Kafka的方案进行数据的消费,比如目标端有2个,则应该对已有的消息进行订阅推送,即分裂为两个不同的目标端数据。 

上面的流程中,我们遵循的一个基本设计方式是数据下推不回调,在存储持久化层实现了数据大完整性和唯一性之后,后续的下发流程是相对规整的。 

而如果数据的整个流转完成之后,如何快速应用,这里的设计方式是采用回调,我们可以采用通用接口的方式,来发布多个部署应用(APiInvoker)来进行数据的应用,如果出现错误则可以快速回到订阅入口进行再次稽核重试。

在这个过程中确实引入了很多的组件和可选方案,而整个方案的设计中也借鉴了很多Amdocs TRB的方案设计思想,在此向老东家致敬。 

这个初步方案已经在开始demo开发测试了,来初步验证整个复杂度和可行性,我们拭目以待,如果有好的方案,也欢迎留言交流。 

相关文章:

近期热文:

相关文章:

  • 美女主持直播,被突发意外打断!湾区网友却高喊: 我懂!超甜
  • MySQL周期表管理太繁琐,通过Python自定义工具方法优雅解决
  • 千万不要养大型犬,多么痛的领悟
  • 《吊打面试官》系列-Redis基础
  • 为什么我们的数据科学团队无法产生价值
  • 在繁杂的业务需求中,如何找到API设计的平衡点
  • Greenplum的segment故障自愈小试
  • MySQL表添加了一个字段,竟然导致数据无法写入,反思
  • 通过Maxwell解析MySQL Binlog,打好业务多活的基础
  • 快到买买买的日子了,对于买书我提几点建议
  • 深度解读:我为什么从来不过“双十一”
  • 《黑客与画家》经典语录
  • 一个MySQL服务CPU 100%的优化案例反思
  • MySQL双主模式下是如何避免数据回环冲突的
  • MySQL中的SQL优化建议那么多,该如何有的放矢
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • android 一些 utils
  • AngularJS指令开发(1)——参数详解
  • ES6 学习笔记(一)let,const和解构赋值
  • Facebook AccountKit 接入的坑点
  • If…else
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Mithril.js 入门介绍
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Service Worker
  • Vue全家桶实现一个Web App
  • 排序算法学习笔记
  • 扑朔迷离的属性和特性【彻底弄清】
  • 实现简单的正则表达式引擎
  • 手机端车牌号码键盘的vue组件
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • ​如何在iOS手机上查看应用日志
  • #include<初见C语言之指针(5)>
  • #QT(智能家居界面-界面切换)
  • (待修改)PyG安装步骤
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (原創) 未来三学期想要修的课 (日記)
  • ******IT公司面试题汇总+优秀技术博客汇总
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net Memory Profiler的使用举例
  • .NET 回调、接口回调、 委托
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @Autowired自动装配
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [bzoj 3534][Sdoi2014] 重建
  • [bzoj1912]异象石(set)
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [docker]docker网络-直接路由模式