系统设计

Netty 实战之如何设计一个大文件存储系统

2018-02-24  本文已影响1001人  逅弈

逅弈 转载请注明原创出处,谢谢!

我们知道随着系统的发展,以往单机的存储系统已经无法满足日益增长的文件存储需求了。急需一种可以存储大量文件、低成本、高扩展、高可用的分布式存储系统。Google的GFS就是这样的一种分布式文件系统。Google File System、Map Reduce、Big Table是Google的三大论文,他们是奠定Google伟大帝国的重要基石。今天我们主要来了解下分布式文件系统,与GFS类似的还有:HDFS、Ceph 、GridFS 、TFS等等。这些文件系统各有各的优点,适用的场景也各不相同,他们的特点不是本文要讨论的重点。今天我要来说的是,怎样设计一个简单的大文件存储系统。

分布式、集群部署

首先分布式系统,我想大家都不陌生。说到分布式,肯定要说下集群
分布式是将不同的业务分布在不同的地方,简单来说就是一个业务分拆多个子业务,部署在不同的服务器上。
集群是将同一个业务,部署在多个服务器上。
为了保证系统的高可用性,肯定要通过集群部署;为了保证系统的可扩展性,则要通过分布式部署。

分块存储

为了保证一个大文件能快速的存储,可以将文件分块,通过多线程进行并发的存储。读取的时候,也可以通过多线程并发的读取文件块,快速的下载。

基于以上两点的分析,初步可以得出一个系统的架构:

[ node ] <--sync--> [ node ] <--sync--> [ node ]

其中每一个node都是集群中的一个节点,主要有以下职责:

[ node ]  ---store---> disk
[ node ]  <--restore-- disk

节点之间通过p2p通讯的方式进行数据的同步,保证数据的一致性。这里同步的是文件的元数据metaData。文件的实际数据不需要在每一个node中保存,为了容灾,一般对数据在不同磁盘、不同机架、不同机房保存3个副本。
除此之外,该系统还需要有以下特点:

有了node之后,就有了一个集群,对外一个集群肯定是一个单独的系统,是一个整体。因此,还需要有一个单独的节点来管理所有的node。所以,在系统中增加一个proxy节点。该节点对外充当整个系统的入口,对内则管理所有的node,并给node下发store和restore的指令。调整后的系统架构如下:

    +--------------[ proxy ]---------------+
    |                  |                   |
    v                  v                   v
[ node ] <--sync--> [ node ] <--sync--> [ node ]

proxy和node之间通过zk进行连接。

系统启动的流程如下:

存储文件的流程如下:

下载文件的流程如下:

至此一个简单的大文件分布式存储系统设计完成了,还有许多其他需要考虑的,如:

以上是我的一点思考,肯定有不到位的地方,欢迎大家批评指正,如果您有更好的方法或建议,欢迎分享。

更多原创好文,请关注「逅弈逐码」
上一篇下一篇

猜你喜欢

热点阅读