(四) MdbCluster分布式内存数据库——业务消息处理
 
 
  离上次更新文章已有快5个月,我还是有点懒。但我们系统的研发并没有因此停下来。下面先简单介绍下MdbCluster最近的一些进展。
  1. 提供了java语言的jdbc驱动。做这个目的是想将业务侧的现有自动化测试案例跑起来,以此扩大系统的测试场景。
  2. 提供SQL命令行界面,解决日常分片数据查询操作问题。对于分片数据库,如果操作数据要到每一片去执行操作语句显然是不合适的。
  3. 多业务接入。最早MdbCluster只接入一个业务系统,随着测试的深入我们接入了更多的业务系统。并在此基础上优化了在线扩缩容的能力。
 
  下面我们继续讨论第二节中提到的最后一个问题:业务消息是如何校验、错误消息如何重定向、超时消息如何处理?
  我们先回顾下业务消息的大概处理流程:在MdbClient、MdbAgent、MdbRWNode都会保存一份完整的SlotList列表,以标明每个数据分片对应的节点。当业务消息从App通过dbc驱动发给MdbClient后,MdbClient会根据partitionid来计算数据的所属分片。并根据计算结果将消息转发给不同分片节点的 MdbAgent,其会对收到数据进行第一次较验。如果有错,会将消息返回,并带上正确的分片信息。MdbClient收到分片错误回复后,会进行消息重定向。如果没错,消息会传给本节点的MdbRWNode进行执行,如果是Insert操作,MdbRWNode则会再次较检数据是否正确。

  1. 业务消息如何校验,为什么需要校验?
  上面提到了消息的校验过程。MdbClient进行的第一次较验是为了找到正确的分片信息。MdbAgent进行第二次较验是为了保证收到的数据都是归属本分片的。在插入操作时,MdbRWNode进行第三次较验,双重较验保证本分片的新增数据不会出错。
  之所以设计这个看上去冗余的较验流程,主要是考虑在线扩缩容的场景下,MdbClient、MdbAgent、MdbRWNode三者的SlotList列表并非一直是一致的。当出现前两者(MdbClient和MdbAgent)不一致场景时,MdbAgent的较验保证分片节点入口数据的准确。而MdbRWNode除了接收MdbAgent的消息,还会收到其它进程的消息请求,因此需要增加校验保证不会往某个分片插入非本分片的数据(否则可能出现脏数据,这点是不可接受的)。
 
  2. 错误消息如何重定向?
  当进行扩缩容的数据迁移时,MdbAgent会最先收到某个slot的更新信息。MdbClient则最后才能收到。在MdbClient收到slot更新前,其所发出的关于这个slot的消息,都属于错误消息。考虑最大程度减少扩缩容时对正常业务的影响,MdbAgent在返回错误时,会带上正确分片的信息。MdbClient收到重定向消息时,会进行消息重定向,以继续正常流程。
  
  3. 超时消息如何处理?
  首先要讨论一下超时消息是如何产生的。当进行扩缩容操作,对某个slot进行数据迁移时,MdbAgent会对这个slot的数据进行锁定(可读不可写)。当数据迁移完毕后,才会放开。关于一个slot的锁定时间长短和库的大小成线性关系。假设库大小在163W条时,每个slot的锁定期大概为0.5秒(可以优化)。MdbClient在收到锁定期数据返回时,当然可以进行重试。但MdbAgent和MdbClient之间可能出现循环的消息风暴。并且App和MdbClient之间会有最大值为一个锁定期的消息队列堵塞(可能有300-500条堵塞消息)。对于一个实时系统来说这是不可接受的。由于在线消息刚好碰到某个slot锁定的概率(1/16384)较低,即当TPS压力为16384时每秒会遇到一条。因此,对于锁定消息,MdbClient会直接返回给App,由App进行相关处理。
 
  4. 多分片消息处理
  当一个查询为全表扫描或者涉及多个分片的数据操作时,MdbClient会分解这些操作,并将这些操作分别发向对应的分片节点。假设对一个有5个分片节点的库进行一次全表查询。MdbClient会给5个分片分别发送一条查询信息,在分别收到5条返回结果时,MdbClient会转发这5条消息给App的dbc驱动。由App的dbc驱动进行数据的汇总。最终,App会收到完整的数据。两个问题:
  a) 分片信息对App是隔离的,App的dbc驱动是如何知道要等待多少条返回信息? 诀窍在于,MdbClient在拆分消息时,会将拆分条数放在请求消息里面。消息返回时,拆分条数也会跟着带回。dbc驱动根据这个条数就知道需要等待的消息数。
  b) 为什么是dbc驱动等待,而不是MdbClient等待?由于dbc驱动的操作是同步的,MdbClient是异步的。所以放在dbc驱动进行消息等待并不会影响系统的效率。
 
  下一章我们会讨论一下在线扩缩容的架构设计,以及迁移数据的状态控制。

(四) MdbCluster分布式内存数据库——业务消息处理的更多相关文章

  1. (一) MdbCluster分布式内存数据库——基础架构介绍

    (一) MdbCluster分布式内存数据库--基础架构介绍   这个项目是怎么开始的我已经有些记不清楚了,大概是原来的内存数据库很不好用,一次次地让我们踩坑,我又自以为是地觉得可以做一个更好的出来. ...

  2. (二) MdbCluster分布式内存数据库——分布式架构1

    (二) MdbCluster分布式内存数据库--分布式架构1   分布式架构是MdbCluster的核心关键,业界有很多相关的实现,却很少有文章详细的解释每个架构实现背后的细节和这么做的原因.在Mdb ...

  3. (三) MdbCluster分布式内存数据库——节点状态变化及分片调整

    (三) MdbCluster分布式内存数据库--节点状态变化及分片调整   上一篇: (二) MdbCluster分布式内存数据库--分布式架构   昨天我们在测试节点动态扩缩容时,发现了一个小bug ...

  4. (四):C++分布式框架——状态中心模块

    (四):C++分布式框架--状态中心模块 上篇:(三):C++分布式实时应用框架--系统管理模块 技术交流合作QQ群:436466587 欢迎讨论交流 版权声明:本文版权及所用技术归属smartguy ...

  5. [.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境

    [.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境 本篇导读: 前面介绍了两款代码管理工具 ...

  6. MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  7. 17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列

    原文:https://mp.weixin.qq.com/s/lpsQ3dEZHma9H0V_mcxuTw 一.资料文档 二.开发语言 三.支持的协议 四.消息存储 五.消息事务 六.负载均衡 七.集群 ...

  8. 综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列

    来源:http://t.cn/RVDWcfe 一.资料文档 Kafka:中.有kafka作者自己写的书,网上资料也有一些.rabbitmq:多.有一些不错的书,网上资料多.zeromq:少.没有专门写 ...

  9. hadoop基础----hadoop理论(四)-----hadoop分布式并行计算模型MapReduce具体解释

    我们在前一章已经学习了HDFS: hadoop基础----hadoop理论(三)-----hadoop分布式文件系统HDFS详细解释 我们已经知道Hadoop=HDFS(文件系统,数据存储技术相关)+ ...

  10. MeayunDB-高性能分布式内存数据库

    MeayunDB(www.meayun.com)是一款分布式的NoSQL列式内存数据库,由C#编写,主要为高性能,高并发,高可伸缩及大数据系统提供技术解决方案.基于MeayunDB,可以简单,快速的构 ...

随机推荐

  1. WPF 屏幕点击的设备类型

    1.鼠标 可以通过Mouse相关的事件参数MouseButtonEventArgs中的数据,e.StylusDecice==null表示没有触摸设备,所以设备为鼠标 2.触笔 or 触摸 根据Styl ...

  2. Spring源码:bean的生命周期(一)

    前言 本节将正式介绍Spring源码细节,将讲解Bean生命周期.请注意,虽然我们不希望过于繁琐地理解Spring源码,但也不要认为Spring源码很简单.在本节中,我们将主要讲解Spring 5.3 ...

  3. (数据科学学习手札152)geopandas 0.13版本更新内容一览

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,昨天晚上geopandas正式 ...

  4. unity运行时调试log控制台

    最近从GameFramework把里头觉得很赞的Debugger调试器单独抽离了出来,方便嵌入任意项目工程进行调试. 查看log信息,允许点击详情并复制到粘贴板,允许锁定log滚动面板 支持开启log ...

  5. 2022-05-20:给定一个正数数组arr,长度为N,依次代表N个任务的难度,给定一个正数k, 你只能从0任务开始,依次处理到N-1号任务结束,就是一定要从左往右处理任务, 只不过,难度差距绝对值不

    2022-05-20:给定一个正数数组arr,长度为N,依次代表N个任务的难度,给定一个正数k, 你只能从0任务开始,依次处理到N-1号任务结束,就是一定要从左往右处理任务, 只不过,难度差距绝对值不 ...

  6. 2022-02-27:k8s安装yapi,yaml如何写?

    2022-02-27:k8s安装yapi,yaml如何写? 答案2022-02-27: yaml如下: apiVersion: apps/v1 kind: Deployment metadata: l ...

  7. Cannot apply DjangoModelPermissionsOrAnonReadOnly on a view that does not set `.queryset` or have a `.get_queryset()` method.

    这个问题是在使用 django REST 做自定义认证的时候出现的 解决方法是 在settings.py 中注释掉这个 REST_FRAMEWORK={ 'DEFAULT_PERMISSION_CLA ...

  8. 一次查找分子级Bug的经历,过程太酸爽了

    "Debugging is like trying to find a needle in a haystack, except the needle is also made of hay ...

  9. Galaxy生物信息分析平台的数据集对象清理

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. Galaxy Project 是在云计算背景下诞生的一个生物信息学可视化分析开源项目.该项目由 ...

  10. Python爬虫————泉州二手房数据爬取和数据可视化

    1.选题的背景 我本次的主题是泉州二手房房价的调查分析. 首先通过爬虫采集链家网上所有二手房的房源数据,并对采集到的数据进行清洗:然后,对清洗后的数据进行可视化分析,探索隐藏在大量数据背后的规律:将这 ...