(三) MdbCluster分布式内存数据库——节点状态变化及分片调整
 
 
  昨天我们在测试节点动态扩缩容时,发现了一个小bug。开始时我想当然“头疼医头,脚疼医脚”地安排开发在问题发生的地方修掉这个bug。早上刚好要一起开会,顺便讨论起这个bug。我们在白板画出了系统的架构图,从bug的发生点,一个环节一个环节的往上追溯原因。意外的发现bug的源头离bug发生的地方已经过5,6个环节了。如果没有这个会,开发修bug的时候可能会从最下面开始一个环节一个环节向上修,也许一个星期后才会发现最终的问题。
  这里想分享的两点:
  1. 当一个系统变得庞大,已超过一个人维护能力,并且有一组人不断在为这个系统贡献新代码时。一旦发现程序运行不如预期,一定有很多的方式来修复这个bug。但能找到bug的根源,在离bug最近的地方,用最少的代码进行修复,体现了一个程序员对这个系统的驾驭能力。这样做最大也最直接的好处是可以减少修复旧bug时引入新bug,并避免大规模的回归测试。
  2. 调试程序不一定要通过debug工具或者加调试日志的办法。如果有幸这个系统是自己写的,通过bug的现象,回忆自己写过的代码或设计方案,可以更快的分析定位出问题的根本原因。我自己经常用这个办法,并且屡试不爽。之前总流传一个好的程序员和一个差的程序员效率可以差10倍,现实中我也经常看到这种情况,应该这也是其中的原因之一吧。
  我想这就是《人月神话》里面说的: “程序员,就像诗人一样,几乎仅仅工作在单纯的思考中。程序员凭空地运用自己的想象,来建造自己的城堡。”
 
  我们接着讨论上节列出的问题:
 
  三、当某个节点状态和数量发生变化时,其它节点如何感知?
  考虑到节点主备切换、扩缩容时,节点的状态,分区(slot)数据的状态变化很多。我们增加了一个MdbRedux进程,专门用于通知各种状态的变化,以及节点的状态查询。节点内的MdbRedux与集群的每个MdbAgent都有通讯链路,可以保证状态变更通知的广播。可能有人会问,节点间链路是怎么发现和建立的?我们的系统是基于博客前面文章提到的《c++分布式应用框架》开发的。链路是可以自动发现和建立的。

  举个主备切换的例子。当MDB1节点发生异常时,备节点 MDB2的MdbRWNode感知到异常,通知MdbAgent,MdbAgent更新自己的状态,并通知MdbRedux对其它节点的MdbAgent进行状态更新广播。从而达到每个节点的状态一致。最后,MdbAgent会通过serverpush,将状态变更推送给MdbClient。

  

  四、扩容和缩容时,分片是如何调整的?

  扩缩容的时候分为两步,一是根据扩缩容的情况生成执行计划。二是根据生成的执行计划,迁移数据。

  这边举一个最简单的由2个节点扩容为3个节点的场景。生成执行计划的算法的目的也很简单:通过尽量少的迁移来使每个节点承担的数据尽量平均。例子里面的算法从Node1迁移[5461, 8190]到Node3,从Node2迁移[13653,16383]到Node3。从而使3个节点的slot数大概为5461。这个算法避免了从Node1到Node2的数据迁移。

  同理由2个点节扩容为4个节点时,仅发了Node1到Node3和Node2到Node4的迁移。此时还附带了另一个好处,这样的迁移是可以并行执行的。

  可见,随着扩缩容的次数和节点个数不同,每个分片里面的slot会被切得不连续,片段会很多。当然这在系统里面是没有问题的。因为每个slot都是单独管理的。但算法为了维护时候简单一些,每次做扩缩容生成执行计划的时候,都会尽量去考虑合并相临的slot,如果某个slot单独落在某个节点,也会进行调整。以最大程度保证分片数据的清晰简洁。

  关于数据迁移的部分,我们后面单独列章节来讲。

(三) MdbCluster分布式内存数据库——节点状态变化及分片调整的更多相关文章

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

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

  2. ubuntu12.04+Elasticsearch2.3.3伪分布式配置,集群状态分片调整

    目录 [TOC] 1.什么是Elashticsearch 1.1 Elashticsearch介绍 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.能够快速搜索数 ...

  3. Apache Spark探秘:三种分布式部署方式比较

    转自:链接地址: http://dongxicheng.org/framework-on-yarn/apache-spark-comparing-three-deploying-ways/     目 ...

  4. 基于Redis的三种分布式爬虫策略

    前言: 爬虫是偏IO型的任务,分布式爬虫的实现难度比分布式计算和分布式存储简单得多. 个人以为分布式爬虫需要考虑的点主要有以下几个: 爬虫任务的统一调度 爬虫任务的统一去重 存储问题 速度问题 足够“ ...

  5. 在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练

    在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练 自动驾驶汽车的深度神经网络(DNN)开发是一项艰巨的工作.本文验证了DGX多节点,多GPU,分布式训练在DXC机器 ...

  6. 三分钟分布式CAP理论

    分布式系统架构理论,定义了三种指标,理论说我们最多只能满足两个. ## 分布式系统 首先我们这个理论所说的分布式系统,是指系统内会共享数据,互相有连接有交互,才能完成系统功能的的分布式系统.而这个理论 ...

  7. 业务可视化-让你的流程图"Run"起来(3.分支选择&跨语言分布式运行节点)

    前言 首先,感谢大家对上一篇文章[业务可视化-让你的流程图"Run"起来(2.问题与改进)]的支持. 分享一下近期我对这个项目的一些改进. 1. 增加了分支选择工程,可以根据节点的 ...

  8. Mongodb分布式集群副本集+分片

    目录 简介 1. 副本集 1.1 MongoDB选举的原理 1.2 复制过程 2. 分片技术 2.1 角色 2.2 分片的片键 2.3 片键分类 环境介绍 1.获取软件包 2.创建路由.配置.分片等的 ...

  9. 三:分布式事务一致性协议2pc和3pc

    一:分布式一致性协议--->对于一个分布式系统进行架构设计的过程中,往往会在系统的可用性和数据一致性之间进行反复的权衡,于是就产生了一系列的一致性协议.--->长期探索涌现出一大批经典的一 ...

  10. (三):C++分布式实时应用框架——系统管理模块

    C++分布式实时应用框架--系统管理模块 上篇:(二): 基于ZeroMQ的实时通讯平台 一个分布式实时系统集群动辄上百台机器,集群的规模已经限定这将是一个"封闭"的系统.你不可能 ...

随机推荐

  1. python贪心算法——以“修理牛棚”题目为例

    [USACO1.3]修理牛棚 Barn Repair 题目描述 在一个月黑风高的暴风雨夜,Farmer John 的牛棚的屋顶.门被吹飞了 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个 ...

  2. 外部引入css样式报错Resource interpreted as Stylesheet but transferred with MIME type html/text

    Resource interpreted as Stylesheet but transferred with MIME type html/text 解决方法: 1.将content-type改为t ...

  3. APACHE快速安装流程梳理

    操作参考教程:https://www.cnblogs.com/haw2106/p/9839655.html 快速安装开始: [环境配置1] yum -y install gcc gcc-c++ wge ...

  4. 【离线数仓】Day01-用户行为数据采集:数仓概念、需求及架构、数据生成及采集、linux命令及其他组件常见知识

    一.数据仓库概念 二.项目需求及架构设计 1.需求分析 2.项目框架 3.框架版本选型 服务器选型:云主机 服务器规划 三.数据生成模块 1.数据基本格式 公共字段:所有手机都包含 业务字段:埋点上报 ...

  5. .NET 6 基于IDistributedCache实现Redis与MemoryCache的缓存帮助类

    本文通过IDistributedCache的接口方法,实现Redis与MemoryCache统一帮助类.只需要在配置文件中简单的配置一下,就可以实现Redis与MemoryCache的切换. 目录 I ...

  6. vue设计与实现 第6章 ref 响应原理 笔记

    ref 函数实现代码 const a = ref(1); function ref(value){ const wrapper = {value} Object.defineProperty(wrap ...

  7. gin模板语法

    输出数据: 语句:{{.}} 用法: 在html文件中调用 输出里面的结果 多个目录下定义模板: 语句:{{ define "xxx目录/xxx文件.html"}}        ...

  8. Vue中实现自定义excel下载

    目录 第一种:后端生成excel 第二种:前端合成excel 总结 参考资料 最近在工作中遇到一个需求,就是需要在前端实现一个错误模板Excel的下载功能. 实现下载有两种方式,一种是后端生成一个ex ...

  9. Unix 系统数据文件那些事儿

    前言 Unix like 系统和 windows 的最大区别就是有一套标准的系统信息数据文件,一般存放在 /etc/ 目录下,并且提供了一组近似的接口访问和查询信息,这些基础设施让系统管理看起来井井有 ...

  10. Java用户交互方法——Scanner

    Scanner用户交互 使用Next方法接收 Scanner scanner = new Scanner(System.in); if(scanner.hasNext()){//判断用户有无输入 St ...