创业公司如何构建一个分布式文件存储系统

有时候初创企业需要快速搭建一个文件存储平台,满足企业内项目的图片、视频、文本等文件的存储;并且即使在读写文件的时候,磁盘坏了、服务器宕机了、交换机坏了、机柜掉电了甚至机房挂了,用户还能正常访问。你同时可能希望公司业务快速增长后,访问量猛增的时候能够尽量少的或者不开发代码,通过扩容硬件就能解决问题。为了解决这些问题,我们设计了自己的存储系统WFS。
最基本的分布式文件存储系统需要满足以下几个原则:
1、伸缩性
伸缩性是指系统可以根据需求和成本调整自身处理能力的一种能力。伸缩性常常意味着系统可以改变自己的处理能力以满足更多用户访问、处理更多数据而不会对用户体验造成任何影响,伸缩性不仅需要伸(即扩容),有时候还需要缩(即缩容)

2、可用性
无论是非预期的服务异常还是正常的服务程序维护,都要保证7X24小时内,服务的可用性。一般都是使用SLA(Service Level Agrement)测量系统的高可用性,就是大家经常看到的几个9,比如某知名网站做到4个9以上的可用性,是啥概念呢,就是故障发生到恢复的时间,也就是服务不可用的时间一天内不超过8.66秒,一年内不超过52.56分钟。

衡量一个系统架构设计是否满足高可用的目标,就是假设系统中任何一台或者多台服务器宕机时,以及出现各种不可预期的问题时候,系统整体是否依然可用。

3、避免过度设计
避免过度设计, 早期先构建一个比较合理的抽象架构,满足基本的业务需求,然后迭代的增加新的功能需求;不是一开始就设计好全部功能以应对自己认为可能会出现的功能。好的设计方法一定是可以在后期逐渐添加新功能特性,而不是一开始就开发一个超级大的系统。

有哪些关键的技术点和难点要注意呢?
网络、磁盘、服务器任何一个环节出问题的时候,应该不影响系统的正常使用。
网络断了有备用网络可用切换。
磁盘坏了有备用磁盘可用,换了新磁盘后数据可用自动恢复。
服务器宕机后有备用服务器可以使用,服务器恢复正常后,服务器上的数据可以自动同步。


系统架构:

创业公司如何构建一个分布式文件存储系统_第1张图片


Client:
主要是提供了访问文件的API接口,例如:上传文件、下载文件、删除文件、判断文件是否存在等功能;使用TCP传输,私有协议。

NameServer: 
主要是起到调度作用,管理所有的DataServer服务,客户端访问哪个DataServer,是由NameServer决定的;NameServer服务记录了所有的Group和DataServer服务器的状态,磁盘使用率等信息;每个NameServer之间是完全对等的。

Storage Cluster:
存储集群,有多个Group组成;理论上Storage Cluster里的Group是可以无限扩容的,当一个Group存储满的时候可以再扩容一个Group,只需要购置硬件,不需要新开发程序。

Group:
 逻辑卷。有多个DataServer组成。

DataServer:
数据存储集群,主要是提供数据存储的服务;接收上传文件和下载文件的请求,并把接收的文件存储在GlusterFS集群上,元信息存储在DC集群上。

IdServer: 
提供生成唯一文件ID的服务。

DC集群:
存储文件的元信息数据,由缓存和数据库组成。

GlusterFS集群:
存储真正的文件数据。底层存储文件使用GlusterFS 管理所有的文件。

描述:
该文件存储系统借鉴了FastDFS一些架构思想,但是与FastDFS又有很大的不同。

文件存储系统是主要由N+1个NameServer节点和多个DataServer节点组成;NameServer通过心跳对DataServer的状态进行监测,DataServer会通过心跳,把本身的状态同步给NameServer,包括存活时长、磁盘状态、服务器状态等;每个DataServer都要主动连接每个NameServer,实时上报自己状态,每个NameServer的信息是对等的,每个NameServer都可以提供服务,所以某个NameServer挂掉后Client可继续访问其他NameServer;同理如果一台DataServer挂掉后,NameServer会监测到,把他剔除出去;每个DataServer对应一个GlusterFs的挂载点,一个挂载点对应一个GlusterFS的一个卷。

写文件流程:

创业公司如何构建一个分布式文件存储系统_第2张图片


如图所示,客户端首先向NameServer发起写请求,NameServer需要根据Group,以及每个Group上的DataServer的容量、负载、状态等情况来选择一个可写的DataServer;接着,客户端向选择的DataServer写数据,DataServer首先会去IdServer获取一个文件ID,然后把数据写到GlusterFS里,GlusterFS 负责存储文件数据,并同步到备份磁盘;文件数据写成功后,DataServer负责把文件Meta信息写入DC;这些操作完成后给客户端返回操作结果。如果中间发生任何错误,客户端可以尝试从第一步开始重试。DataServer支持流式写数据。

每个写操作过程中NameServer会记录Group信息,标示文件存储到哪个Group上;DataServer上会记录文件ID,并把文件ID返回给客户端,客户端根据文件ID访问文件。

读文件流程:

创业公司如何构建一个分布式文件存储系统_第3张图片

客户端读取文件的时候,首先访问NameServer,NameServer查找出文件所在的Group,然后在Group里选取出一个DataServer;客户端得到可以读取文件的DataServer信息,连接DataServer根据文件ID读取文件数据。


伸缩性:
这里的伸缩可以支持两种伸缩,
一种是可以Group内进行伸缩,即支持扩容DataServer服务器,达到承载更多业务能力。
另一种是可以对Group进行伸缩,即支持扩容一个Group,达到承载更多业务的能力。

可用性:
NameServer和DataServer都是有多台服务器组成,保证其中一台服务器宕机不影响系统的正常使用。


讨论:
1、数据的去重问题?
可以对文件进行MD5或者SHA1等做Hash算法,计算其指纹,文件写入前可以先去去重系统查询是否存在指纹,如果存在基本可以认为是重复文件了。

2、GlusterFS本身支持集群了,为什么还要构造 NameServer和DataServer
1)降低GlusterFS集群太大造成的风险。
2)DataServer可以支持丰富请求,比如支持图片处理,支持HTTP,热数据缓存,都可以在这一层处理。

3、集群是否可以增加缓存?
1)每台DataServer增加SSD盘。
2)搭建一套缓存服务。



你可能感兴趣的:(分布式存储)