(二) MdbCluster分布式内存数据库——分布式架构1
 
  分布式架构是MdbCluster的核心关键,业界有很多相关的实现,却很少有文章详细的解释每个架构实现背后的细节和这么做的原因。在MdbCluster整个研发和测试的过程中,我们不断的遇到各种各样的问题,分析问题的原因,修改相应的设计和实现,再回归测试。很多在设计的时候一些颇为得意的trick,却造成测试时整个系统运行的灾难。无数次的推到重来警醒我们——在没有详细的测试数据支撑的情况下,不要在设计阶段以增加系统复杂度为代价来进行某些想象的优化。虽然我们一直知道这是一条真理,但总有忍不住、自作聪明的时候。现实总能一次次地将我们拉回原地——Keep it simple,stupid! 本文试图总结这一年来我们交的经验税,来详细阐述那些看似简单架构设计背后的复杂细节。
 
  接我们上一章单节点的架构图,两个节点的架构图如下:

  MdbClient与每个节点的MdbAgent建立连接,但只与Master节点进行业务通讯。这个架构本身很简单,几乎可以从1-N无限复制,是一个完全的分布式架构,无单点故障。下面我们通过假设读者的问题,来一步步的介绍整个架构。
  1. 数据是根据什么策略来进行分片的?
  2. 整个业务的交互流程是怎么样的?
  3. 当某个节点状态和数量发生变化时,其它节点如何感知?
  4. 扩容和缩容时,分片是如何调整的? 
  5. 业务消息是如何校验、错误消息如何重定向、超时消息如何处理?
 
  一、 数据是根据什么策略来进行分片的?
  关于MdbCluster的Sharding策略,我们直接采用了Redis的策略。Redis Cluster 采用虚拟哈希槽分区,所有的键根据哈希函数映射到 0 ~ 16383 整数槽内,计算公式:slot = CRC16(key) & 16383。每一个节点负责维护一部分槽以及槽所映射的键值数据。
 
  
  从我们项目实际使用过程,来说说这个分片规则的好处。
  1. 通过 keys -> slot -> node的映射关系,解决了从表的partitionid到Mdbcluster分片nodeid的对应关系。
  2. 为什么不是keys->node直接映射?在扩容和缩容的过程中,这种解耦将带来迁移的便利。利用上图举个简单例子,如果要将节点从5个扩到10个的时候,上述分片策略,只要将node1的slot(1638-3276)挪到node6。node2的slot(4914-6553)挪到node7。依此类推……只要进行5次节点间的数据迁移。但如果是直接映射,分片策略从keys%5->node 转为 keys%10->node,就会面临node1->(node2, 3, 4, 5, 6, 7, 8, 9,10)都要挪数据的场景,总共需要迁移的次数为9*5=45。反之,缩容也一样。
  3. 为什么slot的数量是16384? 2的14次方。网上有很多说法,但我们的经验是:在扩缩容做数据迁移的时候,需要对这个slot的数据进行加锁。如果slot数量太少,锁定的数据量太大,从而造成迁移过程中业务请求失败太多。如果slot数量太多,迁移的批次过多,每次迁移的数据条数太少,造成迁移性能受影响。所以这个数字的大小其实是跟业务每张表的数据量有直接关系的。
 
  二、整个业务的交互流程是怎么样的?
  

  有两点需要特别说明,第一是App的驱动到MdbClient是同步请求,有超时管理。这样做的好处是简化业务逻辑。其它的环节均为异步消息,为了最大化的提高性能。第二是MdbClient到MdbAgent之间具备消息重定向的能力。这样做的好处是,在扩缩容的时候,可以减少App侧返回错误消息的数量。

  

(二) MdbCluster分布式内存数据库——分布式架构1的更多相关文章

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

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

  2. 关于RabbitMQ分布式集群架构

    RabbitMQ分布式集群架构和高可用性(HA) (一) 功能和原理 设计集群的目的 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行 通过增加更多的节点来扩展消息通信的吞吐量 1 集群配 ...

  3. 【Kubernetes学习之三】Kubernetes分布式集群架构

    环境 centos 7 一.Kubernetes分布式集群架构1.Kubernetes服务注册和服务发现问题怎么解决的?每个服务分配一个不变的虚拟IP+端口, 系统env环境变量里有每个服务的服务名称 ...

  4. [转]分布式文件系统FastDFS架构剖析

    [转]分布式文件系统FastDFS架构剖析 http://www.programmer.com.cn/4380/ 文/余庆 FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实 ...

  5. hadoop(二)搭建伪分布式集群

    前言 前面只是大概介绍了一下Hadoop,现在就开始搭建集群了.我们下尝试一下搭建一个最简单的集群.之后为什么要这样搭建会慢慢的分享,先要看一下效果吧! 一.Hadoop的三种运行模式(启动模式) 1 ...

  6. JAVA系统架构高并发解决方案 分布式缓存 分布式事务解决方案

    JAVA系统架构高并发解决方案 分布式缓存 分布式事务解决方案

  7. 2020重新出发,NOSQL,MongoDB分布式集群架构

    MongoDB分布式集群架构 看到这里相信你已经掌握了 MongoDB 的大部分基本知识,现在在单机环境下操作 MongoDB 已经不存在问题,但是单机环境只适合学习和开发测试,在实际的生产环境中,M ...

  8. 分布式:分布式事务(CAP、两阶段提交、三阶段提交)

    1 关于分布式系统 1.1 介绍 我们常见的单体结构的集中式系统,一般整个项目就是一个独立的应用,所有的模块都聚合在一起.明显的弊端就是不易扩展.发布冗重.服务治理不好做. 所以我们把整个系统拆分成若 ...

  9. Linux系统zookeeper环境搭建(单机、伪分布式、分布式)

    本人现在对zookeeper的环境搭建做一个总结,一般zookeeper的安装部署可以有三种模式,单机模式.伪分布式和分布式,这三种模式在什么时候应用具体看大家的使用场景,如果你只有一台机器且只是想自 ...

  10. CentOS7 hadoop3.3.1安装(单机分布式、伪分布式、分布式)

    @ 目录 前言 预先设置 修改主机名 关闭防火墙 创建hadoop用户 SSH安装免密登陆 单机免密登陆--linux配置ssh免密登录 linux环境配置Java变量 配置Java环境变量 安装Ha ...

随机推荐

  1. 读书笔记:A Philosophy of Software Design

    今天一位同事在斯坦福的博士生导师John Ousterhout (注,Tcl语言的设计者)来公司做了他的新书<A Philosophy of Software Design>的演讲,介绍了 ...

  2. 6个tips缓解第三方访问风险

    随着开发和交付的压力越来越大,许多企业选择依赖第三方来帮助运营和发展业务.值得重视的是,第三方软件及服务供应商和合作伙伴也是云环境攻击面的重要组成部分.尽管企业无法完全切断与第三方的关联,但可以在向他 ...

  3. 使用SunnyUI的datagridview常用代码(个人常用)

    1.窗体加载时初始化grid private void LayOut() { dgv.Font = new System.Drawing.Font("微软雅黑", 9F); dgv ...

  4. JDK17都出了,学点JDK11新特性

    JDK8 - 转- JDK11 -转- JDK17 JShell(JDK9开始支持) G:\dowload\JDK\JDK11\jdk-11.0.2\bin ===> C:\Windows\Sy ...

  5. 【每日一题】【List与Array互转】【工具类的使用】2021年12月10日-56. 合并区间

    以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] .请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入 ...

  6. JavaScript入门⑤-欲罢不能的对象原型与继承-全网一般图文版

    JavaScript入门系列目录 JavaScript入门①-基础知识筑基 JavaScript入门②-函数(1)基础{浅出} JavaScript入门③-函数(2)原理{深入}执行上下文 JavaS ...

  7. 【Java】从头开始学新的编程语言

    本文自用,Java入门笔记 -每个类都要在自己的单独文件中-我大为震撼 能运行的最小的Java程序要有main函数 public static void main(String[] args) (id ...

  8. 重学c#系列——linq(3) [二十九]

    前言 继续介绍一些复杂的linq. 正文 groupjoin 这个函数: 有department public class Deployment { public string Id { get; s ...

  9. cs231n__2. K-nearest Neighbors

    CS231n 2 K-Nearest Neighbors note ---by Orangestar 1. codes: import numpy as np class NearestNeighbo ...

  10. 时间老去,Ruby不死,Ruby语言基础入门教程之Ruby3全平台开发环境搭建EP00

    如果说电子游戏是第九艺术,那么,编程技术则配得上第十艺术的雅称.艺术发展的普遍规律就是要给与人们对于艺术作品的更高层感受,而Matz的Ruby语言则正是这样一件艺术品. 无论是语法还是理念,都让Rub ...