分布式系统
的有关信息介绍如下:看了《大规模分布式存储系统》总觉得要记录点什么才踏实。分布式系统的核心是用廉价的计算机构造集群,同时利用软件的方法解决可靠性问题。分布式中设计的基本问题包括数据分布、复制、一致性、容错等。最后包括分布式协议。数据分布是解决数据如何均匀到分布到多个存储节点;复制是将复制多个副本,其中有一个主副本;一致性解决是多个副本之间的数据一致性问题;容错是用软件的方式实现自动容错功能,当存储节点出现错误的时候能够自动检测出来,并将原有的数据和服务迁移到其他正常工作的节点。
分布式协议包括有两个重点的协议:Paxos选举协议以及两阶段提交协议。Paxos用于多个节点之间达成一致,实现总控节点的选举。两阶段协议用于跨越多个节点操作的原子性,这些操作要么全部操作成功,要么全部失败。
基本概念
(1)异常
在分布式存储系统中,往往将一台服务器或者服务器运行的一个进程称为一个节点,节点与节点之间通过网络互联。然而服务节点是不可靠的,会出现服务器宕机(可能原因内存错误、服务器断电),网络异常(消息丢失、消息乱序或网络包数据数据错误),磁盘故障。
【服务器宕机】服务器宕机内存信息丢失,必须通过磁盘中的操作日志来恢复内存信息,操作日志是好东西。
【磁盘故障】必须从其他节点恢复数据,因为数据一般都会有多份副本。
分布式存储系统中的“三态”:成功、失败和超时。一个RPC(RemoteProcedureCall,远程调用)除了成功和失败以外还有超时。服务器(server)成功处理完客户端(client)的请求,但是由于网络异常或者服务器宕机,客户端没有收到服务器端的回复,此时定义为超时状态。当出现超时状态时,只能通过不断的读取之前操作的状态来验证RPC是否成功,此时就可以将这种操作设置为“幂等”。
(2)一致性
由于异常的存在,分布式系统存储系统设计时往往会将数据冗余存储多份,每一份称为一个副本(replica/copy),这样当一个节点出现问题时,可以从其他节点读到数据。副本是分布式存储系统容错的唯一手段。由于多个副本的存在,如何保证多个副本之间的一致性。可以两种情况考虑一致性问题:一个是客户端的一致性,一个是存储系统的一致性。
客户端的一致性:包括强一致性、弱一致性和最终一致性。客户端的一致性是针对用户能否读到之前用户更新的值。
存储系统的一致性包括副本一致性,更新一致性。
(3)分布式系统评估
性能:系统的吞吐能力和系统的响应时间;
可用性:系统在面对各种异常时可提供正常服务的能力。
一致性:上面第二条
可扩展性:扩展集群服务器来提高存储容量、计算量和性能的能力。
【一致性与可用性】两者是一对矛盾体,可用性强,则一致性就弱。
【评估系统】对于一个分布式系统评估主要找出系统的瓶颈在什么地方。例如,在一个IO限制的系统可以考虑设置缓存机制。
数据分布
分布式系统区别于传统单机系统的地方在于数据可以分部到多个节点,并在多个节点之间实现负载均衡。数据分部方式有两种:一种是哈希分布,一种是顺序分布。
哈希分布根据主键或属性进行hash。但是容易出现“数据倾斜”问题,可以通过一致性hash的方案或者采用元数据服务器管理方案。在一致性hash方案中,需要记录环形中服务器的位置信息。
顺序分布:哈希散列破坏了数据的有序性,只支持随机读取操作,不支持顺序扫描。顺序分布在表格系统中比较常见。一般是通过将大表划分为多个范围,每个范围一个子表,再将这些子表按照一定的策略存储到节点中。顺序存储与B+树数据结构类似。
负载均衡
分布式存储系统中每个集群一般都有一个总控节点,其他节点为工作节点,总控节点负责全局负载信息进行整体调度。系统在工作中需要不断执行迁移任务,将数据从负载较高的节点迁移到负载低的节点。
工作节点通过心跳包将节点的负载相关信息发送给主控节点。主控节点计算工作节点的负载以及需要迁移的数据,生成迁移任务加入迁移队列。
【迁移】迁移的时候注意平滑迁移
复制
数据在系统中存在多个副本,当某个副本出现错误时,分布式存储系统自动将服务切换到其他的副本。副本中有一个主副本(primary),多个备副本(backup),主副本备份到备份副本。
复制协议有强同步复制以及异步复制,区别在于用户的写请求是否需要同步到备份副本才可以返回成功。客户端将写请求发送给主副本,主副本将写请求复制到其他副本,常见的做法是同步操作日志(commitlog)。主副本首先将操作日志同步到备份副本,备副本回放操作日志,完成后通知主副本。接着主副本修改本机,等待所有的操作完成后通知客户端成功。
主备分副本之间的复制一般通过操作日志来实现。操作日志的原理很简单:为了利用好磁盘的顺序读写特性,将客户端的写操作先顺序写入磁盘中,然后应用到内存中。
如果服务器出现故障,只要回来检查操作日志就ok了。
容错
故障检测通过租约(Lease)协议来实现。用心跳包来检测。
【注】总控节点也有备份节点