需要学习的技术很多,要自学新知识也不是一件容易的事,选择一个自己比较感兴趣的会是一个比较好的开端,于是,打算学一学分布式系统。

  带着问题,有目的的学习,先了解整体架构,在深入感兴趣的细节,这是我的计划。

  首先得有问题,如果每日重复相同的工作,也不主动去学习,很难发现新的问题。不怕自己无知,就怕不知道自己无知,只有不断的学习,才会发现更多未知的知识领域!

带着问题出发

  分布式要解决什么问题呢?解决持久化数据太大,单个节点的硬盘无法存储的问题;解决运算量太大,单个节点的内存、CPU无法处理的问题。解决这些问题,有两种思路:scale up,scale out。前者就是提升单个节点的能力,更大的磁盘,更快的CPU,定制的软硬件,然而这意味着更高的价格,而且再怎么scaleup 也是有上限的。后者就是把存储、计算任务分担到普通的机器上,通过动态增加节点来应对数据量的增长,但缺点是多个节点的管理、任务的调度比较麻烦,这也是分布式系统研究和解决的问题。只有当数据量达到单机无法存储、处理的情况下才考虑分布式,不然都是自找麻烦。

  状态的维护比计算要难很多,所谓状态就是需要持久化的数据。因此主要考虑分布式存储,况且即使是分布式计算,为了节省带宽需要尽量保证data locality,也是需要分布式存储。
 
  现在有一堆数据,可能是结构化或者半结构化,需要将数据分片(segment、fragment、shard),形成一个个的数据子集,存储到一组物理节点上,物理节点之间通过网络通信。那么需要考虑两个问题:
  第一:数据如何划分; 
  第二:数据的可靠性、可用性问题

数据分片

  数据分片是指将数据子集尽可能均衡的划分到各个物理节点上。那么会有哪些挑战呢?

  (1)如果某个物理节点宕机,如何将该物理节点负责的数据尽快的转移到其他物理节点;

  (2)如果新增了物理节点,怎么从其他节点迁移数据到新节点;

  (3)对于可修改的数据(即不是只能追加的数据),比如数据库数据,如果某节点数据量变大,怎么将部分数据迁移到其他负载较小的节点,及达到动态均衡的效果。

  (4)元数据的管理问题:当数据分布在各个节点,那么当用户使用的时候需要知道具体的数据在哪一个节点上。因此,系统需要维护数据的元数据:即每一个数据所在的位置、状态等信息。当用户需要具体的数据时,先查询元数据,然后再去具体的节点上查询。当数据在节点之间迁移的时候,也需要更新元数据。元数据的管理节点这里称之为meta server。元数据的管理也带来了新的挑战:
    (4.1)如何抽取数据的特征(特征是分片的依据,也是用户查询数据时的key),或者支持用户自定义数据特征;

    (4.2)如何保证meta server的高性能和高可用,是单点还是复制集

  (5)分片的粒度,即数据子集的大小,也是数据迁移的基本单位。粒度过粗,不利于数据均衡;粒度过细,管理、迁移成本又会比较大。

数据冗余

  前面提到,分布式系统中的节点都是普通的节点,因此有一定的概率会出现物理故障,比如断电、网络不可用,这些故障导致数据的暂时不可用;另外一些故障更严重,会导致数据的丢失,比如磁盘损坏。即使单个节点的故障是小概率,当集群中的节点数目很多是,故障就成为了一个大概率事件。因此,保证数据的高可用和可靠性是分布式系统必须解决的问题。

  为了避免单点故障,可行的办法就是数据冗余(复制集),即将同一份数据放在不同的物理节点,甚至是不同的数据中心。如果数据是一次写,多次读那很好办,随便从哪个副本读取都行。但对于很多分布式存储系统,比如数据库,数据是持续变化的,有读有写。那么复制集会带来什么样的挑战呢,需要如何权衡呢,假设有三个副本:

  (1)三个副本的地位,大家都是平等的还是有主(primary、master)有次(secondary、slave),如果是平等的,那么每个节点都可以接收写操作;如果不平等,可以一个节点负责所有的写操作,所有节点都提供读操作,

  (2)在平等的情况下,怎么保证写入操作不冲突,保证各个节点的数据是一致的,怎么保证能读取到最新的数据

  (3)不平等的情况下
    (3.1)写节点怎么将变更的数据同步到其他节点,同步还是异步;
    (3.2)非写节点能否提供读数据,如果能够允许,会不会读取到过时的数据。
    (3.3)主节点是怎么产生的,当主节点宕机的时候,怎么选择出新的主节点。是有统一的复制集管理中心(记录谁主谁次,各自的状态),还是复制集自己选举出一个主节点?

  (4)不管复制集内部的节点是平等的,还是有集中式节点的,只要有多个数据副本,就需要考虑数据的一致性可用性问题。按照CAP理论,只能同时满足一致性 可用性 分区容错性之间的二者,不同的分布式系统需要权衡。

 

其他

  分布式系统有自己的术语或者概念。在当前的这个时间点,我对其中的一些有了解,或者使用过;另外一些只是听说过,不甚了解;当然,还有更多的是不知道的,是需要在后续的学习中去发现、去掌握的。
  分片 副本 一致性哈希 幂等 CAP paxos raft NWR lease 两阶段提交协议 三阶段提交协议 拜占庭问题

  目前收集到的学习资料如下:

  刘杰的《分布式系统原理介绍》

  Distributed systems for fun and profit

  CMU课程:http://www.cs.cmu.edu/~dga/15-440/S14/syllabus.html

  MIT课程:http://nil.csail.mit.edu/6.824/2016/schedule.html

  前面两个是基础整体介绍,最后一个是MIT的课程,网上评价很高,也有很多人在学习。

总结:

  对于一门新技术,不要上来就开干,思考新技术解决了什么问题、已有的技术能否替代、适用场景与缺陷。对于自己(程序员),想想为什么要学、是深度还是广度知识、该技术在自己的技能树中的位置。

  对于学习,需要长期目标与短期目标相结合。长期目标很重要,但需要分解成一个个小目标,否则很容易在停顿、重拾之间打转,也很容易分心到其他杂事,也就坚持不下去了。
 

解决持久化数据太大,单个节点的硬盘无法存储的问题;解决运算量太大,单个节点的内存、CPU无法处理的问题的更多相关文章

  1. 解决Vuex刷新页面数据丢失问题 ---- vuex-persistedstate持久化数据

    何为Vuex?用处是什么?为什么刷新丢失? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化 ...

  2. 大数据技术之_08_Hive学习_04_压缩和存储(Hive高级)+ 企业级调优(Hive优化)

    第8章 压缩和存储(Hive高级)8.1 Hadoop源码编译支持Snappy压缩8.1.1 资源准备8.1.2 jar包安装8.1.3 编译源码8.2 Hadoop压缩配置8.2.1 MR支持的压缩 ...

  3. 从零开始入门 K8s | 应用存储和持久化数据卷:存储快照与拓扑调度

    作者 | 至天 阿里巴巴高级研发工程师 一.基本知识 存储快照产生背景 在使用存储时,为了提高数据操作的容错性,我们通常有需要对线上数据进行 snapshot ,以及能快速 restore 的能力.另 ...

  4. 如何解决分布式系统数据事务一致性问题(HBase加Solr)

    如何解决分布式系统数据事务一致性问题 (HBase加Solr) 摘要:对于所有的分布式系统,我想事务一致性问题是极其非常重要的问题,因为它直接影响到系统的可用性.本文以下所述所要解决的问题是:对于入H ...

  5. ActiveMq持久化数据

    A:持久化为文件 这个你装ActiveMQ时默认就是这种,只要你设置消息为持久化就可以了.涉及到的配置和代码有 <persistenceAdapter> <kahaDB direct ...

  6. 011.Kubernetes使用共享存储持久化数据

    本次实验是以前面的实验为基础,使用的是模拟使用kubernetes集群部署一个企业版的wordpress为实例进行研究学习,主要的过程如下: 1.mysql deployment部署, wordpre ...

  7. Oracle数据导入导出imp/exp sp2-0734:未知的命令开头'imp...解决方法

    Oracle数据导入导出imp/exp sp2-0734:未知的命令开头'imp...解决方法   sp2-0734:未知的命令开头'imp 忽略了剩余行默认分类   www.2cto.com  应该 ...

  8. Redis客户端连接以及持久化数据(三)

    0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...

  9. 集群版本升级——rolling upgrade在ES 单节点从 restart 到加入集群,大概要 100s 左右的时间。也就是说,这 100s 内,该节点上的所有分片都是 unassigned 状态

    集群版本升级 Elasticsearch 作为一个新兴项目,版本更新非常快.而且每次版本更新都或多或少带有一些重要的性能优化.稳定性提升等特性.可以说,ES 集群的版本升级,是目前 ES 运维必然要做 ...

随机推荐

  1. 苹果IOS与谷歌 android系统的UI设计原则

    一.苹果为IOS的界面设计提出了六大原则: 1.整体美学 整体美学指的是一个应用的表现和行为与它的功能完美集成,传达连贯的信息. 人们关心一个应用是否提供它承诺的功能,但他们也被应用的外观和行为强烈影 ...

  2. android 高斯模糊实现

    高斯模糊 高斯模糊就是将指定像素变换为其与周边像素加权平均后的值,权重就是高斯分布函数计算出来的值. 一种实现 点击打开链接<-这里是一片关于高斯模糊算法的介绍,我们需要首先根据高斯分布函数计算 ...

  3. jQuery中常用的函数方法总结

    jQuery中为我们提供了很多有用的方法和属性,自己总结的一些常用的函数,方法.个人认为在开发中会比较常用的,仅供大家学习和参考. 事件处理 ready(fn) 代码: $(document).rea ...

  4. 学习Qt,Getting started

    在界面的设计中,现在用的比较多的是Qt和WPF(C#),以前的MFC已出现衰老趋势.本人最近在学习Qt,觉得很有用,遂决定将学习历程记录下来,或许有感于后之来者,不亦乐哉. 一.Hello Qt #i ...

  5. mybati源码之ReuseExecutor

    /** * @author Clinton Begin */ public class ReuseExecutor extends BaseExecutor { private final Map&l ...

  6. unity C#更改系统默认鼠标指针

    最近项目需要替换鼠标的默认图标,实现的效果是初始状态为一种图标,点击鼠标左键要换成另一种图标,按网上通用的方法做了以后,隐藏鼠标指针,在指针的位置画一个图片就可以了,但不知道怎么回事,这种方法画的图标 ...

  7. ubuntu12.04:jdk7:手动安装

    总的原则:将jdk-7u10-linux-x64.tar.gz压缩包解压至/usr/lib/jdk,设置jdk环境变量并将其修改为系统默认的jdk 将jdk-7u5-linux-x64.tar.gz拷 ...

  8. Python_PyMySQL数据库操作

    连接数据库: conn=pymysql.connect(host=,user=',charset='utf8') 建立游标: cur = conn.cursor() 创建一个名字叫 lj 的数据库: ...

  9. Construct Binary Tree from Preorder and Inorder Traversal(根据前序中序构建二叉树)

    根据前序中序构建二叉树. 1 / \ 2 3 / \ / \ 4 5 6 7对于上图的树来说, index: 0 1 2 3 4 5 6 先序遍历为: 6 3 7为了清晰表示,我给节点上了颜色,红色是 ...

  10. oracle 随机数(转载)

    http://blog.sina.com.cn/s/blog_6a01140c0100wimi.html 1.从表中随机取记录 select * from (select * from staff o ...