zoukankan      html  css  js  c++  java
  • 【转】纪录一下最近对分布式的感悟

     

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

    分布式存储,主要由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) 。

  • 相关阅读:
    JAVA多线程之线程的挂起与恢复(suspend方法与resume方法)
    基于Andoird 4.2.2的同步框架源代码学习——同步发起端
    C#MD5为密码加密
    YOUYOU深入学习Ganglia之三(gmetad的软件架构)
    js原生appendChild的bug
    复选框输入Android Studio 如果修改LogCat的颜色,默认全是黑色看着挺不舒服的
    输出目录文件被多个中间文件输出目录相同的工程包含
    数据对象ajax学习篇9
    function设置jsp页面使用js控制文本框只读,并且按下backspace删除按钮后停在原页面
    资源下载南方cass视频教程,包括文档,数据,很全的
  • 原文地址:https://www.cnblogs.com/andy071001/p/3311769.html
Copyright © 2011-2022 走看看