纪录一下最近对分布式的感悟

 

分布式存储,主要由2部分组成,1、网络对数据切分。 2、存储。  

对 于网络对数据切分需要解决哪些问题?解决数据部署在多台服务器上(一台服务器存储不了,或者计算能力不够或网络流量有限等), 因此3个硬性需求,你要的数据在哪台服务器上如何切片, 某台服务器挂了怎么办, 业务扩大需要添加机器怎么办。 对于某台服务器挂了自然是添加备份(涉及到数据同步),和机器管理(如何在主备之间切换)。对于添加机器需要解决数据同步问题。

 

对于非k-v形式(以mysql)为例子

mysql 数据一般不会被切分在不同服务器上(也就是说每个服务器上的数据都是完整的)“分库分表是例外”。插入更新等修改数据的操作都是直接操作主库, 然后将这些对应操作写成log。或者涉及到修改的数据。  同步发送到备库。 查询等操作随即的从一台服务器上进行。因此添加服务器上只能加速查询的速度。所以引入了分库分表,但是分库分表的想法其实就是一种k-v思想。主备的切换 应该是dns解析(或者用近似的方法,就是设计2个管理节点,由管理节点不停检查主库是否挂了,如果挂了把他剔除资源列表。下次”dns解析“结果自然定 位到备库了。

 

对于k-v

因为他可以将数据切分到不同服务器上, 数据是在哪台服务器上,往往对k mod 服务器数目 (memcache 引入了一致性hash, 目的是减少服务器数目变化时对k % 影响) 。 还有一种思路是引入管理节点,可以通过查询或者管理节点生成的资源配置表等,知道数据在哪台服务器上(比如tair).  

对于每台服务器上数据备份,基本同上面非k-v。对于新添加的机器,他是先对现有数据序列化发给新添加的同步机器(redis)。

 

对于存储

主要是解决索引。

对于k-v

数 据是按map<k, v>组织, 如果数据存储不了,可能要序列化将数据v存储硬盘(在硬盘建立一个类似阉割版的文件系统),(memcache 是用链表纪录最后修改排序,内存不足时将老数据挤出去, 所以因为这点memcache 只能当cache),因此内存只需记住在文件系统种的位置,以及他占有多少个page(页)。文件系统管理,用了位索引(放在内存种),纪录哪些页已经被 使用。 

 

对于mysql 等, 他查询(任意的列进行条件)决定了不能进行key-val 组织数据(除非对所有列做key, 貌似列式数据库就是这么做的),只能类似2查搜索树进化版--极小堆或者红黑树,  因为数据在文件,为了减少io(查询的深度), 采用的是b+树。MyISAM引擎,其叶子节点是数据在硬盘的位置。 对于innodb, 主键索引其叶子节点就是数据, 非主键索引叶子节点保存的是对应主键索引值,因此往往需要查询2次索引。 

    

 

题外话:

上述涉及网络为了性能,采用非阻塞+多路复用+状态机模式。状态机模式要么用状态位(不同状态调用不同的函数),要么函数指针转移。  (原因是什么时候切换函数,依赖数据的到来, 数据可能需要多路复用)要轮训k次, 而k未知。

此外很多时候,解决超时链接,一般就是用极小堆或者红黑树纪录。 这样查询只要0(1),   插入和删除只要0(logn)  (libevent) 。

 

 

posted on 2013-09-10 10:59  andy071001  阅读(183)  评论(0编辑  收藏  举报