C++自制Redis数据库(三)设计开始敲定各模块架构-简单集群设计
2016-02-07 16:19
721 查看
要开始正式设计了,前边的只是写假设。首先我们把项目分成四个大的模块,(网络编程模块,集群模块,数据库系统存储模块,持久化模块)
结构图如下:
现在我们就各个模块再做整体的设计:
集群模块:
集群功能没有考虑太多的东西。
设计目标:
1.能够增删节点。
2.有数据复制迁移功能。
3.负载均衡,能够使数据基本均匀的散列到多个节点上。
4.有简单容错处理。
策略:
整体采用一致性哈希环的方式,给每个结点随机一个标记值token ,当其中一个服务器接受到一条数据后,对这个数据进行哈希运算,然后散列到每个结点负责的一个区域中去,这里有一个链接主要讲述的就是Chord 数据库系统的存储方式。
Chord 数据库
现在我们接着说,我们该如何做,首先数据到达各个控结点,结点使用哈希算法,计算出一个主键ID,然后在路由表中查找哪台服务器的键值区域包含这个键,就将这个数据转发或存储到本机的数据库内。当查找的时候重复这个过程,集群功能其实很复杂,这里只提供原理我们暂时的能力还不足以驾驭一个大型的集群系统,真的不骗你。
2.服务器接受到数据后,进行哈希运算,得出这个主键的哈希值。
3.比较每一台服务器维护的路由表,将这个数据发送到合适它自己的一个服务器中取。
4.当需要获取或者查询一条数据的时候,就基本是重复上边的过程,查找到数据。
1.我认为负载均衡并不是一次负载到位的,只有多级结构层层都注意到这个问题,均作出或多或少的负载均衡,我们的整个系统才能均衡的运行,保持良好的状态。
2.中间的是一个开启主控功能的服务器,它可以仅仅开启主控功能,可以不负载任何数据库业务,关于主控功能就是接受其他所有服务器的心跳包,然后根据计分系统衡量整个存储系统整体评估系统的负载,接着进行动态的调控,数据迁移或者进行一系列操作。
3.关于计分系统是一个根据心跳包也可能是租约协议,根据信息的权重得出一个分数,根据分数来衡量状态。
增删节点功能,数据迁移功能,扩容功能。
心跳包,租约:
负责接收各个心跳包,发放租约等等。
状态积分系统:
根据接收的心跳包信息来评估各个服务器的状态。
运行趋势计算子系统:
根据状态积分系统,根据一定的算法,得出整个系统的稳定性,可用性,一致性,并发程度等等,这个系统其实是一个通用的模块。
结构图如下:
现在我们就各个模块再做整体的设计:
集群模块:
集群功能没有考虑太多的东西。
设计目标:
1.能够增删节点。
2.有数据复制迁移功能。
3.负载均衡,能够使数据基本均匀的散列到多个节点上。
4.有简单容错处理。
策略:
整体采用一致性哈希环的方式,给每个结点随机一个标记值token ,当其中一个服务器接受到一条数据后,对这个数据进行哈希运算,然后散列到每个结点负责的一个区域中去,这里有一个链接主要讲述的就是Chord 数据库系统的存储方式。
Chord 数据库
现在我们接着说,我们该如何做,首先数据到达各个控结点,结点使用哈希算法,计算出一个主键ID,然后在路由表中查找哪台服务器的键值区域包含这个键,就将这个数据转发或存储到本机的数据库内。当查找的时候重复这个过程,集群功能其实很复杂,这里只提供原理我们暂时的能力还不足以驾驭一个大型的集群系统,真的不骗你。
具体数据处理流程我们在这里梳理下:
1.首先,其中一个服务器接受到了数据。2.服务器接受到数据后,进行哈希运算,得出这个主键的哈希值。
3.比较每一台服务器维护的路由表,将这个数据发送到合适它自己的一个服务器中取。
4.当需要获取或者查询一条数据的时候,就基本是重复上边的过程,查找到数据。
关于负载均衡和主控结点的简单:
关于负载均衡我想说以下1.我认为负载均衡并不是一次负载到位的,只有多级结构层层都注意到这个问题,均作出或多或少的负载均衡,我们的整个系统才能均衡的运行,保持良好的状态。
2.中间的是一个开启主控功能的服务器,它可以仅仅开启主控功能,可以不负载任何数据库业务,关于主控功能就是接受其他所有服务器的心跳包,然后根据计分系统衡量整个存储系统整体评估系统的负载,接着进行动态的调控,数据迁移或者进行一系列操作。
3.关于计分系统是一个根据心跳包也可能是租约协议,根据信息的权重得出一个分数,根据分数来衡量状态。
集群系统及子系统设计
各系统具体功能:
负载均衡子系统:增删节点功能,数据迁移功能,扩容功能。
心跳包,租约:
负责接收各个心跳包,发放租约等等。
状态积分系统:
根据接收的心跳包信息来评估各个服务器的状态。
运行趋势计算子系统:
根据状态积分系统,根据一定的算法,得出整个系统的稳定性,可用性,一致性,并发程度等等,这个系统其实是一个通用的模块。
这暂时不提供具体的函数与数据结构,采用自顶向下的设计,后续会给出具体设计,现阶段是敲定使用何种架构。
查看原文: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/相关文章推荐
- NoSQL之Redis(二)---Java操作Redis存储自定义类型数据
- Redis学习笔记
- Redis 10 个快速提示
- redis设置为系统服务并开机启动(附脚本文件)
- CentOS环境下Redis安装
- REDIS源码中一些值得学习的技术细节02
- c++自制Redis数据库(三)初步基础框架设计
- C++自制Redis数据库(二)部分设计前置问题
- redis 集群安装配置
- redis使用(四):C 同步接口
- Redis设计与实现
- 亲密接触Redis-第一天
- Java开发-Redis客户端Jedis
- Redis高可用方案之Sentinel
- redis 初步学习
- redis缓存的一些技巧
- Redis数据库高级实用特性:持久化机制
- mac下安装使用redis
- windows下部署redis
- Windows下安装并设置Redis