要开始正式设计了,前边的只是写假设。首先我们把项目分成四个大的模块,(网络编程模块,集群模块,数据库系统存储模块,持久化模块)
结构图如下:
现在我们就各个模块再做整体的设计:
集群模块:
集群功能没有考虑太多的东西。
设计目标:
1.能够增删节点。
2.有数据复制迁移功能。
3.负载均衡,能够使数据基本均匀的散列到多个节点上。
4.有简单容错处理。
策略:
整体采用一致性哈希环的方式,给每个结点随机一个标记值token ,当其中一个服务器接受到一条数据后,对这个数据进行哈希运算,然后散列到每个结点负责的一个区域中去,这里有一个链接主要讲述的就是Chord 数据库系统的存储方式。
现在我们接着说,我们该如何做,首先数据到达各个控结点,结点使用哈希算法,计算出一个主键ID,然后在路由表中查找哪台服务器的键值区域包含这个键,就将这个数据转发或存储到本机的数据库内。当查找的时候重复这个过程,集群功能其实很复杂,这里只提供原理我们暂时的能力还不足以驾驭一个大型的集群系统,真的不骗你。
具体数据处理流程我们在这里梳理下:
1.首先,其中一个服务器接受到了数据。
2.服务器接受到数据后,进行哈希运算,得出这个主键的哈希值。
3.比较每一台服务器维护的路由表,将这个数据发送到合适它自己的一个服务器中取。
4.当需要获取或者查询一条数据的时候,就基本是重复上边的过程,查找到数据。
关于负载均衡和主控结点的简单:
关于负载均衡我想说以下
1.我认为负载均衡并不是一次负载到位的,只有多级结构层层都注意到这个问题,均作出或多或少的负载均衡,我们的整个系统才能均衡的运行,保持良好的状态。
2.中间的是一个开启主控功能的服务器,它可以仅仅开启主控功能,可以不负载任何数据库业务,关于主控功能就是接受其他所有服务器的心跳包,然后根据计分系统衡量整个存储系统整体评估系统的负载,接着进行动态的调控,数据迁移或者进行一系列操作。
3.关于计分系统是一个根据心跳包也可能是租约协议,根据信息的权重得出一个分数,根据分数来衡量状态。
集群系统及子系统设计
各系统具体功能:
负载均衡子系统:
增删节点功能,数据迁移功能,扩容功能。
心跳包,租约:
负责接收各个心跳包,发放租约等等。
状态积分系统:
根据接收的心跳包信息来评估各个服务器的状态。
运行趋势计算子系统:
根据状态积分系统,根据一定的算法,得出整个系统的稳定性,可用性,一致性,并发程度等等,这个系统其实是一个通用的模块。