当前位置: 首页 > 操作系统&&数据库, 数据库 > 正文

C++自制Redis数据库(四)设计各模块架构-简单集群设计

要开始正式设计了,前边的只是写假设。首先我们把项目分成四个大的模块,(网络编程模块,集群模块,数据库系统存储模块,持久化模块)

结构图如下:

模块化设计

 

现在我们就各个模块再做整体的设计:

集群模块:

一致性哈希环 (1)

集群功能没有考虑太多的东西。

设计目标:

1.能够增删节点。

2.有数据复制迁移功能。

3.负载均衡,能够使数据基本均匀的散列到多个节点上。

4.有简单容错处理。

策略:

整体采用一致性哈希环的方式,给每个结点随机一个标记值token ,当其中一个服务器接受到一条数据后,对这个数据进行哈希运算,然后散列到每个结点负责的一个区域中去,这里有一个链接主要讲述的就是Chord 数据库系统的存储方式。

Chord 数据库

现在我们接着说,我们该如何做,首先数据到达各个控结点,结点使用哈希算法,计算出一个主键ID,然后在路由表中查找哪台服务器的键值区域包含这个键,就将这个数据转发或存储到本机的数据库内。当查找的时候重复这个过程,集群功能其实很复杂,这里只提供原理我们暂时的能力还不足以驾驭一个大型的集群系统,真的不骗你。

具体数据处理流程我们在这里梳理下:

1.首先,其中一个服务器接受到了数据。

2.服务器接受到数据后,进行哈希运算,得出这个主键的哈希值。

3.比较每一台服务器维护的路由表,将这个数据发送到合适它自己的一个服务器中取。

4.当需要获取或者查询一条数据的时候,就基本是重复上边的过程,查找到数据。

关于负载均衡和主控结点的简单:

关于负载均衡我想说以下

1.我认为负载均衡并不是一次负载到位的,只有多级结构层层都注意到这个问题,均作出或多或少的负载均衡,我们的整个系统才能均衡的运行,保持良好的状态。

2.中间的是一个开启主控功能的服务器,它可以仅仅开启主控功能,可以不负载任何数据库业务,关于主控功能就是接受其他所有服务器的心跳包,然后根据计分系统衡量整个存储系统整体评估系统的负载,接着进行动态的调控,数据迁移或者进行一系列操作。

3.关于计分系统是一个根据心跳包也可能是租约协议,根据信息的权重得出一个分数,根据分数来衡量状态。

集群系统及子系统设计

集群及子系统 (2)

各系统具体功能:

负载均衡子系统:

增删节点功能,数据迁移功能,扩容功能。

心跳包,租约:

负责接收各个心跳包,发放租约等等。

状态积分系统:

根据接收的心跳包信息来评估各个服务器的状态。

运行趋势计算子系统:

根据状态积分系统,根据一定的算法,得出整个系统的稳定性,可用性,一致性,并发程度等等,这个系统其实是一个通用的模块。

 

这暂时不提供具体的函数与数据结构,采用自顶向下的设计,后续会给出具体设计,现阶段是敲定使用何种架构。

本文固定链接: http://zmrlinux.com/2016/02/07/c%e8%87%aa%e5%88%b6redis%e6%95%b0%e6%8d%ae%e5%ba%93%ef%bc%88%e4%b8%89%ef%bc%89%e8%ae%be%e8%ae%a1%e5%bc%80%e5%a7%8b%e6%95%b2%e5%ae%9a%e5%90%84%e6%a8%a1%e5%9d%97%e6%9e%b6%e6%9e%84-%e7%ae%80%e5%8d%95/ | Kernel & Me

该日志由 root 于2016年02月07日发表在 操作系统&&数据库, 数据库 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: C++自制Redis数据库(四)设计各模块架构-简单集群设计 | Kernel & Me