(五) MdbCluster分布式内存数据库——数据迁移架构及节点扩缩容状态图
(五) MdbCluster分布式内存数据库——数据迁移架构及节点扩缩容状态图
上一篇:(四) MdbCluster分布式内存数据库——业务消息处理
本节主要讨论在系统扩容期间的数据迁移架构及节点的状态图。我们将通过介绍这两部分,慢慢展开复杂的扩缩容流程。
下图从左到右,我们增加了ClusterManager进程及容器。ClusterManager进程的作用在于接到前台界面发来的扩缩容指令后,根据指令生成新的slotlist分布图,及其对应的迁移计划。所谓迁移计划: { slot: 1003, from: 1, to: 3 } 表示将编号为1003的slot数据,从节点1迁移到节点3。并将迁移计划发给节点3的MdbRedux。MdbRedux根据迁移计划分别控制节点1和节点3的MdbAgent的状态,以控制迁移过程中slot:1003 数据的可读不可写。并且MdbRedux给本节点的DataMigration发送数据迁移命令,执行slot:1003 数据从1迁移到3的步骤。最后,MdbRedux还要负责更新所有节点的slotlist数据。MdbAgent则给所有的client推送更新。

问题:1、为什么DataMigration没有通过MdbAgent,而直接通过MdbRWNode操作数据。主要是为了性能考虑。迁移过程中涉及批量的数据操作,直接通过MdbRWNode进行可以更快的完成。并且避免挤占MdbAgent的正常业务消息通道,影响迁移过程中的正常业务消息。另外,我们减弱了迁移过程中批量数据操作的部分校验工作。也是为了更快的完成迁移,避免影响在线业务。
2、为什么MdbRedux和DataMigration没有部署在单独容器,而是每个数据节点都有。关于这点主要考虑并行迁移。执行计划可能包括from:1, to:3; from:2 ,to:4; 这时,ClusterManager就可以同时给节点3,4分别发送迁移计划。两部分迁移可以并行进行。
在MdbCluster的开发过程中,我们发现数据节点的状态管理是至关重要的。不同状态下,数据节点对于外部请求的响应会有不同。一个完整的状态图可以保证系统节点在不同状态下的正确运行。下面就是一对主备节点的扩缩容情况下的状态图。

如上图所示:
1. 一对主备节点以OFFLINE的状态启动,启动完成后为ONLINE的状态,此时并为加入集群。
2. 主节点经过MIGRATING状态,进行扩容操作,变为ACTIVE状态,加入集群,正式作为主节点承接业务消息。备节点则为STANDBY状态,加入集群,从主节点实时同步数据。
3. 当主节点出现故障后,备节点立刻转为ACTIVE状态,承接业务消息。
4. 故障节点转为RECOVERED状态开始恢复过程。恢复过程包括重建数据库,从主节点同步数据。恢复完成后,节点转为STANDBY状态,做为备节点加入集群,从主节点实时同步数据。
5. 在进行缩容操作时,主节点转为MIGRATING状态,进行数据迁移。备节点从主节点实时同步数据。
6. 迁移完成后,主备节点均转为ONLINE状态。脱离集群。
7. 容器退出后,主备节点为OFFLINE状态,以备下次启动。
8. 在集群中的业务节点初次启动时,则从中间状态进入。
(五) MdbCluster分布式内存数据库——数据迁移架构及节点扩缩容状态图的更多相关文章
- (二) MdbCluster分布式内存数据库——分布式架构1
(二) MdbCluster分布式内存数据库--分布式架构1 分布式架构是MdbCluster的核心关键,业界有很多相关的实现,却很少有文章详细的解释每个架构实现背后的细节和这么做的原因.在Mdb ...
- (一) MdbCluster分布式内存数据库——基础架构介绍
(一) MdbCluster分布式内存数据库--基础架构介绍 这个项目是怎么开始的我已经有些记不清楚了,大概是原来的内存数据库很不好用,一次次地让我们踩坑,我又自以为是地觉得可以做一个更好的出来. ...
- (三) MdbCluster分布式内存数据库——节点状态变化及分片调整
(三) MdbCluster分布式内存数据库--节点状态变化及分片调整 上一篇: (二) MdbCluster分布式内存数据库--分布式架构 昨天我们在测试节点动态扩缩容时,发现了一个小bug ...
- Netty 如何高效接收网络数据?一文聊透 ByteBuffer 动态自适应扩缩容机制
本系列Netty源码解析文章基于 4.1.56.Final版本,公众号:bin的技术小屋 前文回顾 在前边的系列文章中,我们从内核如何收发网络数据开始以一个C10K的问题作为主线详细从内核角度阐述了网 ...
- 伪分布式hbase数据迁移汇总
https://www.jianshu.com/p/990bb550be3b hbase0.94.11(hadoop为1.1.2,此电脑ip为172.19.32.128)向hbase1.1.2 (ha ...
- 数据迁移的应用场景与解决方案Hamal
本文来自网易云社区 作者:马进 跑男热播,作为兄弟团忠实粉丝,笔者也是一到周五就如打鸡血乐不思蜀. 看着银幕中一众演员搞怪搞笑的浮夸演技,也时常感慨,这样一部看似简单真情流露的真人秀,必然饱含了许许多 ...
- Redis源码阅读(五)集群-故障迁移(上)
Redis源码阅读(五)集群-故障迁移(上) 故障迁移是集群非常重要的功能:直白的说就是在集群中部分节点失效时,能将失效节点负责的键值对迁移到其他节点上,从而保证整个集群系统在部分节点失效后没有丢失数 ...
- Elasticsearch:单节点数据迁移
Elasticsearch数据迁移:windows单节点迁移到windows 将源数据中的ES安装目录下的data/nodes目录整体拷贝到目标ES的对应目录下 迁移前请备份:迁移后需要重启ES: E ...
- 王家林的81门一站式云计算分布式大数据&移动互联网解决方案课程第14门课程:Android软硬整合设计与框架揭秘: HAL&Framework &Native Service &App&HTML5架构设计与实战开发
掌握Android从底层开发到框架整合技术到上层App开发及HTML5的全部技术: 一次彻底的Android架构.思想和实战技术的洗礼: 彻底掌握Andorid HAL.Android Runtime ...
- 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案
作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段.简单地说,Sharding就是将原来单一 ...
随机推荐
- 因果推断-Caual Inference
两种形式 Reduced Form:Let data speak itself,主要采用regression等方法 Structure Approach:Data only can never rev ...
- 云原生时代崛起的编程语言Go基础实战
@ 目录 概述 定义 使用场景 Go 安全 使用须知 搜索工具 Go基础命令 标准库 基础语法 Effective Go 概览 命名规范 注释 变量 常量(const) 控制结构 数据类型 迭代(ra ...
- shell自动化脚本,启动、停止应用程序
#!/usr/bin/env bash # 常量初始化 set_runtime_vars(){ # 日期时间 Now_Date=`date +"%Y-%m-%d %H:%M:%S" ...
- #Powerbi 利用视觉对象着色地图,制作数据地图
日常工作中,有时我们会遇到需要地图来展示我们的数据场景,利用POWERBI,我们可以快速的制作自己的业务地图. Powerbi自带了三大地图,今天我们用到的是形状地图. 步骤讲解: 第一步:下载对应的 ...
- 2020-10-24:go中channel的recv流程是什么?
福哥答案2020-10-24: ***[评论](https://user.qzone.qq.com/3182319461/blog/1603496305)
- 2021-10-09:杨辉三角。给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。力扣118。
2021-10-09:杨辉三角.给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行.在「杨辉三角」中,每个数是它左上方和右上方的数的和.力扣118. 福大大 答案2021-10 ...
- 基于go语言的声明式流式ETL,高性能和弹性流处理器
简要介绍Benthos,并给出若干示例,指导如何安装和运行. Benthos Benthos 是一个开源的.高性能和弹性的数据流处理器,能够以各种代理模式连接各种源和汇,可以帮助用户在不同的消息流之间 ...
- django时区问题的解决
django时区问题的解决 更新时间:2021年05月18日 09:37:58 作者:Silent丿丶黑羽 我们都知道时区,标准时区是UTC时区,django默认使用的就是UTC时区,我 ...
- operation not supported on selected printer
operation not supported on selected printer 版本原因 解决办法, 每次打印前先选择一次打印机属性,弹窗点确认还是取消都行,最后返回再点打印即可
- 利用简单的IO操作实现M3U8文件之间的合并
先上代码: 1 @SneakyThrows //合并操作,最终文件不包含结束标识,方便多次合并 2 private static void mergeM3U8File(String source, S ...