[TOC] # 基本概念 ## 异常 ### 服务器宕机 服务器宕机会导致节点失去所有内存信息,设计存储系统时需要考虑如何通过读取持久化介质中的数据来恢复内存信息。 ### 网络异常 有一种特殊的网络异常称为“网络分区”,即集群的所有节点被划分为多个区域,每个区域内部可以通信,但是区域之间无法通信。 设计容错系统的一个基本原则:总是假设网络将会出现异常并采取相应的处理措施。 ### 磁盘故障 磁盘故障是一种发生概率很高的异常,分布式存储系统需要使用冗余机制,将数据存储到多台服务器,即使其中一台服务器磁盘出现故障,也能从其他服务器上恢复数据。 ## 衡量指标 ### 性能 常见的性能指标有:吞吐能力、响应时间。 其中,吞吐能力指系统在某一段时间可以处理的请求总数,通常为每秒的读操作数或者写操作数;响应时间指从某个请求发出到接收到返回结果消耗的时间。 这两个指标往往是 **矛盾** 的,追求高吞吐的系统,往往很难做到低延迟;同理,追求低延迟也很难做到高吞吐。 ### 可用性 可用性指系统在面对各种异常时可以提供正常服务的能力。可以用系统可用时间占总时间的比值来衡量,例如 4 个 9 位 99.99%。 ### 一致性 分布式系统采用冗余机制保存数据的多份副本,如何保证副本之间的一致性是整个分布式系统的核心问题。 ### 可扩展性 指系统通过扩展集群服务器规模来提高性能的能力.理想的分布式系统需要实现“线性可扩展”,即随着集群规模的增加,系统的整体性能也会线程增加。 # 数据分布 分布式存储系统中的数据分布在多个节点中,常用的数据分布方式有哈希分布和顺序分布。 将数据分布在多台机器时,需要考虑到多台机器的负载均衡。衡量负载的因素很多,如 CPU、内存、磁盘等资源使用情况、读写请求数等。分布式存储系统需要能够自动识别负载高的节点,当某个节点的负载较高,就将它的部分数据迁移到其它节点,实现自动负载均衡。 ## 哈希分布 哈希分布就是将数据计算 hash 值之后,按照 hash 值分配到不同的节点上。例如有 N 个节点,数据的主键为 key,则将该数据分配的节点序号为:hash(key)%N。 传统的哈希分布算法存在一个问题:当节点数量变化时,也就是 N 值改变,那么几乎所有的数据都需要重新分布,将导致大量的数据迁移。 ### 一致性哈希 Distributed Hash Table,DHT:对于哈希空间 0~2n,将该哈希空间看成一个哈希环,将每个节点都配置到哈希环上。每个数据对象通过哈希取模得到哈希值之后,存放到哈希环中顺时针方向第一个大于等于该哈希值的节点上。 ![](index_files/d2d34239-e7c1-482b-b33e-3170c5943556.jpg) 一致性哈希的优点是在加入或者删除节点时只会影响到哈希环中相邻的节点,例如下图中新增节点 X,只需要将数据对象 C 重新存放到节点 X 上即可,而对于节点 A、B、D 都没有影响。 ![](index_files/91ef04e4-923a-4277-99c0-6be4ce81e5ac.jpg) ## 顺序分布 顺序分布将有序的数据划分为多个连续的部分,按一定策略分布到不同节点上。 ## 负载均衡 分布式存储系统中每个集群都有一个总控节点,其它节点为工作节点,由总控节点根据全局负载信息进行整体调度。系统运行过程中需要不断地执行数据迁移工作,将数据从负载较高的工作节点迁移到负载较低的工作节点。 工作节点通过心跳包(Heartbeat,定时发送)将节点负载相关的信息,如 CPU、内存、磁盘、网络等资源使用情况发送给总控节点。 考虑到一个新上线的节点由于其负载较低,如果不加控制,总控节点会将大量数据同时迁移到该节点上,造成该节点一段时间内无法工作。因此负载均衡操作需要平滑进行,新加入的节点需要较长的一段时间来达到比较均衡的状态。 # 复制 ## 主从复制 分布式存储系统采用冗余机制,将一份数据保存多份副本。多个副本通常有一个为主副本,其它为备副本。主副本用来处理写请求,并将写操作日志同步到备副本,备副本通过回放操作日志来保证数据一致性。主副本和备副本都可以处理读请求。当主副本出现故障时,可以将一个备副本选举为主副本。 有两种同步方式:强同步复制和异步复制。强同步复制要求备副本对写操作日志回放成功之后才算完成,而异步复制只需要主副本在本地上的修改完成就算完成。强同步复制一致性好,但是可用性差,异步复制方式相反。 ## CAP 分布式存储系统不可能同时确保一致性(Consistency)、可用性(Availablity)和分区容忍性(Partition),设计中往往需要弱化对某个特性的保证。 - 一致性:读操作总是能读取到之前完成的写操作结果,满足这个条件的系统称为强一致性系统; - 可用性:读写操作在单台机器发生故障的情况下仍然能够正常执行; - 分区容忍性:允许发生网络分区。 # 容错 大规模集群每天都有故障发生,分布式存储系统需要实现自动化容错,才能实现高可用以及减少人工运维成本。 ## 故障检测 通过**租约机制**来对故障进行检测。假设节点 A 为主控节点,节点 A 向节点 B 发送租约,节点 B 在租约规定的期限内才能提供服务。当节点 B 拥有的租约规定的期限块到达时,节点 B 向 A 重新申请租约,否则主动停止服务。 ## 故障恢复 当某个节点故障时,就将它上面的服务迁移到其它节点。 # CDN 架构 CND 通过将网络内容发布到靠近用户的边缘节点,使不同地域的用户在访问相同网页时可以就近获取。这样既可以减轻服务器的负担,也可以提高用户的访问速度。 从下图可以看出,DNS 在对域名解析时不再向用户返回源服务器的 IP 地址,而是返回边缘节点的 IP 地址,所以用户最终访问的是边缘节点。边缘会先从源服务器中获取用户所需的数据,如果请求成功,边缘节点会将页面缓存下来,下次用户访问时可以直接读取。 ![](index_files/dbd60b1f-b700-4da6-a993-62578e892333.jpg) # 参考资料 - 杨传辉. 大规模分布式存储系统: 原理解析与架构实战[M]. 机械工业出版社, 2013.