互联网的发展催生了云计算和大数据的发展,云计算和大数据的本质都是构建低成本,高性能高可用的分布式存储系统,本文简单介绍分布式存储的一些基础知识。
分布式存储通过网络连接的大量的普通服务器,将数据分片分散在集群中的不同节点(服务器或进程)中,对外提供统一的服务。
分布式存储一般需要具有几个特性
可扩展:分布式存储一般可扩展几百甚至几千台服务器,并可容易的增加或减少节点,在节点调整过程中,分布式存储服务可自动实现数据的迁移及负载均衡等操作。
低成本:组成分布式存储服务的服务器可为普通服务器,由于普通服务器故障率通常较高,因此要求存储服务具有较好的容错性。
高性能:分布式存储理论上随着节点数量的增加,对外提供的服务的性能应该成线性增长的趋势。这是分布式存储同非分布式存储的一大区别之一,一般非分布式存储在数据量达到一定规模之后,都会存在单点的读写问题,分布式存储一般通过数据分片解决单点问题。
易用:分布式是存储对外提供统一的接口,用户不需要关心数据的分片查找,副本维护等工作。
分布式存储根据存储类型可分为
分布式文件系统:一般存储非结构的blob对象(文件,图像等),比如淘宝的TFS,AWS的EBS,google的GFS等
分布式键值系统:存储关系简单的半结构数据,只提供基于键值的CRUD操作,不能做关联查询,比如Redis,Tair,MongoDB等
分布式表格系统:用于存储半结构化数据,与键值系统相比,除了提供CRUD操作外,还支持基于某个主键的范围扫描,比如Google的BigTable,AWS的DynamoDB等
分布式关系数据库:存储关系数据,比如Taobao的OceanDB。
存储系统的性能瓶颈在于随机的读写操作。下表列出了各种硬件的存储性能比:
类别消耗时间访问L1Cache0.5ns访问L2Cache7nsMutex加锁/解锁100ns内存访问100ns千兆网络发送1MB数据10ms内存顺序读取1MB数据0.25ms机房内网络来回0.5ms异地机房间网络来回30~100ms
SATA磁盘寻道10ms
从SATA磁盘顺序读取1MB数据20ms
固态SSD盘访问延迟0.1~0.2ms
SATA的顺序读取带宽可以达到100MB以上,由于磁盘的寻道时间大约为10ms,顺序读取1MB数据的时间为:磁盘寻道时间+数据读取时间,即10ms+1MB/100MB/s*1000=20ms。
分布式存储系统一般需要解决几个问题
数据分布
在分布式存储系统中,如何将数据分片到不同的节点是首先要考虑的问题,一般分布式系统常使用的方法是Hash分布。
hash分布
哈希分布就是根据数据的某一个特征计算hash值,并将hash值和集群中的节点做映射。从而将不同hash值的数据分布到不同的节点上。
hash分布的一个问题是一旦数据已经分布到不同的节点中,做扩容比较困难,比如现在数据通过hash值分布到三台机器上,如果要将机器扩展到五台,需要重新将所有的数据重新算一下hash值,然后重新分布。因此一般扩展节点的数量是原数量的一倍,这样只需要移动一半数据。
一致性hash
一致性hash算法从某种程度上解决了扩展过程中移动数据太多的问题,一致行hash算法给每个节点赋予一个hash值,这些节点按顺序构成一个环,数据根据hash值落在环中的某个节点上。当需要扩容时,将新加入节点放入环中,数据迁移只需要迁移新节点相邻的节点上的数据即可。一致性hash容易造成数据偏斜,而且在数据复制过程中,对相邻节点的压力比较大。
一般系统会引入虚拟节点或虚拟槽的解决方式:即解耦数据与节点间的关系,引入虚拟节点,将数据映射到大量的虚拟节点上,然后虚拟节点在在映射到实体节点上,这样在扩容过程中,可以以虚拟节点为单位移动数据,可从不同的实体节点上移动虚拟节点到新节点。很多存系统都采用了这种方案,如redis,Cassandra。
异常
分布式系统中,一台服务器或者一个服务器上的不同进程被成为一个节点,节点间通过网络互联,不论是节点还是网络都是不可靠的。分布式系统需要处理由于节点或网络引起的各种异常。
节点异常包括节点宕机或磁盘不可用(可恢复和不可恢复),分布式系统需要可以自动监控的节点的异常,并做相应处理:对不可恢复异常,如果该节点值主副本节点,则需要重新进行选主,如果该节点是从副本节点,则需要其他节点从主副本(或其他从副本)复制一份分片数据,保证副本数量不变。对可恢复异常,需要恢复节点并重构内存。
网络异常:通过网络进行交互,结果可分为成功,失败,和未知。未知的情况可能有成功也可能是失败,因此需要有重试机制,而且多次调用的结果应该幂等。
复制
由于异常的存在,为了达到高可用的目的,一般数据会有多个副本,多个副本键间的关系有:
主从副本:主从副本只有主提供写,从可以提供读服务(或仅是备份的作用),主从的缺点主的单点写瓶颈,但是由于数据被分片了,如果数据的摸一个分片遇到写瓶颈,可以通过增加集群节点的方式解决,这要求分布式存储的扩容比较容易,一般像redis,mongodb这种系统扩容都不会成为问题,但是像ES,分片数量不能修改,扩容就需要重新倒入数据。
主主副本:同一个副本的不同节点都可以是进行写操作,Cassandara即是用这种方式实现
一致性
因为同一份数据包含多个副本,副本间的一致性是分布性存储系统需要考虑的问题。
一致性分为强一致性,弱一致性和最终一致性。最终一致又可分为:
读写一致性:A写后,A后的读都可获得最新结果。
会话一致性:同一个会话内写后读都可获得最新结果。
单调读:A读取一次结果后,后续读取不会获得之前版本的值。
单调写:A的多次写在多个副本间按照顺序执行。
一般分布式存储系统都既可以支持强一致性又可支持最总一致性。
分布式存储系统大体遵循相同的功能模式,但具体实现又根据自身特点各有不同。在日常系统维护过程中,了解相应的分布式系统存储的实现机制可以快速帮助定位问题并找到正确的解决方案。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』