分布式系统分布式架构《大规模分布式存储系统》笔记

《分布式存储系统》--总结①

2018-05-03  本文已影响13人  CPinging

        第一次书写这本书籍的读后感,我在这里将我对每一章节的大致概念与提及的方法做一个简单梳理总结,方便日后回顾。希望在未来的研究僧岁月能够对这个方向做更多的研究。


一、分布式中的一些常用的基本概念

1 异常

        在分布式中(其实不只是分布式中,在所有的网络层中都是如此)我们常常将服务器节点看做是不可靠的,同样,网络也是不可靠的。在不可靠中,我们常常会提到一些异常的概念例如服务器宕机、网络异常与磁盘故障。

        (1)服务器异常:服务器异常其实挺好理解的,简单来说就是服务器宕机。而服务器宕机确实很麻烦的一件事情。当服务器重启后你的节点就会失去所有的内存信息。因此我们在设计服务器的时候要考虑如何将数据恢复到宕机前的某个一致状态。

        (2)网络异常:说道网络问题那就与“计算机网络”这一门学科息息相关。引发网络异常的原因有许多,比如消息丢失、消息乱序或者网络数据包错误。而设计相应的容错系统就要要求我们记住“网络永远不可靠”。

        (3)磁盘故障此故障分为“磁盘损坏”与“磁盘数据错误”。对于损坏问题,我们要就要将数据存储到多台服务器。对于出现错误问题,我们要求蚕蛹“校验和机制”来处理问题。

        在这里,我们也需要提及一个概念——“超时”,即在分布式系统中有可能当一个节点向另一个节点发送请求会出现请求超时的情况,所以当出现超时的情况时,我们就可以通过不断读取之前操作。简单来说就是不断重试知道成功

2 一致性

        由于各种异常,所以几乎所有的分布式集群在设计的时候都会讲数据冗余存储多份,每一份称为一个“副本”。所以副本也就成为分布式存储系统容错技术的唯一手段。而对于我们设计者来说,如何保证副本之间的一致性是整个分布式系统的理论核心。

        在一致性这个概念中,我抽象出来了几个比较重要的部分。①强一致性:就是说我在A机器中写入了一个值,那么我B、C机器中后续读取出的值均为更新过的。②最终一致性:即我在A中写入数据后,不能立刻在BC中读到,而是在经过部分时间后可以读到。保证最终的效果。

3 衡量指标

        评价分布式的优良也有其一套指标,不过这个不是特别重要的重点,所以就简单的写一写。

        (1)性能:性能分为“系统吞吐能力”——在某一段时间可以处理的请求总数,用每秒处理的读操作或写操作来评价。“系统响应延迟”——某个请求发出到接收到返回结果所耗费的时间。

        (2)可用性:值系统在面对各种异常时可以提供正常的服务的能力。

        (3)一致性:同上述一致性。

        (4)可扩展性:是指通过扩展集群服务器规模来提高系统存储容量、计算量和性能的能力。

二、分布式系统中的数据分布问题

        分布式存储数据这个问题其实是比较复杂的,首先重要的一点就是他要能保证多台机器的负载时均衡的。并且其要求能够自动识别负载高的节点并将部分数据进行迁移。而在迁移的过程中有会面临许多问题,我们要针对每个点提出不同的解决方案。

1 哈希分布

        大致来说,哈希分布简单可以分为两种:①不区分用户,将所有的数据按照其对应的主建进行散列分布。但是这样却带了了一些问题,例如:一次操作中同一个用户id下的多条记录要去不同的服务器中寻找,这个复杂度可想而知。②将服务器按照0~N-1进行编号,此时就可以按照用户id进行  Hash(id)%N进行排列。但是这样又带了了一些问题,比如:倘若部分id下的用户数量比较庞大,而部分id下的数据量很小,那么我们的机器中就会出现负载不均衡的问题。

        所以这些问题的解决是没有最优解的,只有最适合的没有最好的。除了上述方法之外,我们这里还会介绍一种思路——“一致性哈希算法”。

        这里放上一些专门介绍此算法的博客:一致性哈希算法 - HappyCoder - 博客园

        简单来说就是除了给数据一个哈希值,我们也会给各个节点(机器)一个token值,而这些token形成一个环。然后我们将哈希数据在环上进行排列,然后顺时针找对应数据最近的节点(token),这个节点就需要存储这些数据了。

一致性哈希算法示意图

        这有什么好处呢??用之前普通的哈希方案的话会面临着,倘若我在集群中增加了部分节点,那么我之前存储的数据就要整体迁移了。。是不是就很麻烦。。。。

        所以这里我们就知道使用这个方法就算增加了部分节点,那我们就只需要修改部分数据的存储地点就好,避免了大规模的数据迁移。

一致性哈希算法面对增加节点的示意图

2 顺序分布

        哈希分布破坏了数据的有序性,只支持随机读取操作,不能支持顺序扫描。所以我们可以用顺序分布的方式解决。例如我们可以将用户表中7000个数据划分为1~1000、1001~2000、.....6001~7000。而这些索引信息由meta节点来维护。相当于出来了一个树的结构。

3 负载均衡

        负载均衡是集群中比较重要的部分之一,一般来说集群中需要一个总控节点来负责整体调度,并将数据迁移到工作节点中来。对于工作节点,他们需要使用“心跳包”将节点的负载信息(CPU内存、磁盘、网络资源、读写次数等信息)定期发送给主控节点,由主控节点计算出工作节点的负载以及需要迁移的数据并生产迁移任务放入迁移队列中等待执行。

        在这个过程中存在许多我们要考虑的问题。倘若有一台全新的机器上线,由于新的机器负载最低,所以主控节点就会将大量的信息同事迁移到这台新的机器中去,那么整个系统在新增机器的过程中的服务质量就会大幅下降。所以一般我们会将其调整为30~60分钟。

上一篇下一篇

猜你喜欢

热点阅读