写入主服务器的文件会自动复制到从服务器。在本演示中,.txt和b.txt被写入/tmp/localhost_12001/filestore,并被复制到其他文件夹。
另一个从主机localhost_12003停止从localhost_12001复制,并开始从新的主主机localhost_12002复制。
在这个快速演示的结束状态中,LOCALHOST_12002是主设备,LOCALHOST_12003是从设备。手动在/tmp/localhost_12002/filestore下创建文件,并查看显示在/tmp/localhost_12003/filestore中的文件。
有许多应用需要存储来存储大量相对较小的数据文件。示例包括用于存储小视频、图像、邮件附件等的媒体存储。这些对象中的每一个通常都是千字节,通常不大于几兆字节。这些用例的另一个显著特点是通常只添加或删除文件,很少更新。当有更新时,它们没有任何并发要求。
与通用分布式文件系统必须满足的要求相比,这些要求要简单得多;这些要求将包括对文件的并发访问、读取和更新的随机访问、POSIX遵从性等。为了满足这些需求,一般的DFS也相当复杂,构建和维护成本很高。
分布式文件系统的另一种实现包括HDFS,它的灵感来自Google的GFS。这是使用最广泛的分布式文件系统之一,它构成了Hadoop的主要数据存储平台。HDFS的主要目标是处理非常大的数据集,并通过将文件拆分成固定大小的块来跨商用服务器群集分发文件。HDFS不是特别适合存储大量相对较小的文件。
正如我们已经指出的,可以为需求更简单的应用程序类构建一个非常简单的系统。
不更新已创建的文件(或者删除旧文件并创建新文件是可行的)
我们称此系统为分区文件存储(PFS),以区别于其他分布式文件系统。该系统需要提供以下功能:
可扩展性:应根据存储要求将文件分布在大量商用服务器上。
容错:每个文件都应该在多个服务器上复制,这样单个服务器故障就不会降低可用性。
Apache Helix是一个通用的集群管理框架,可以非常轻松地提供可伸缩性、容错和弹性特性。Rsync可以很容易地用作服务器之间的复制通道,以便在多个服务器上复制每个文件。
为了实现冗余,我们需要额外的副本,称为从副本。从属设备可以选择性地提供读取服务。
在主服务器上的每一次写入都将导致创建/删除一个或多个文件。为了保持时间线一致性,从设备需要以相同的顺序应用改变以促进这一点,主设备将每个事务记录在文件中,并且每个事务与64位ID相关联,其中32LSB表示序列号,MSB表示世代号。序列号在每个事务上递增,并且当选举新的主设备时,世代递增。
从设备需要复制才能跟上主服务器上的更改。每次从服务器应用更改时,它都会对上次应用的事务处理ID设置检查点。在重新启动期间,这允许从服务器从上一个检查点ID提取更改。与主服务器类似,从服务器将每个事务处理记录到事务处理日志中,但它不会生成新的事务处理ID,而是使用由主服务器生成的相同ID。
当主机发生故障时,会将新的从机提升为主机。如果以前的主节点是可访问的,则新的主节点将在接管主节点之前刷新与以前的主节点相比的所有更改。新主机将记录当前一代的结束事务ID,然后以从1开始的顺序开始新一代。之后,主机将开始接受写入。
这个应用程序演示了一个使用rsync作为复制机制的文件存储。可以设想一个类似的系统,在该系统中,不使用rsync,而是可以实现一个自定义解决方案来通知从设备更改,还可以提供一个API来拉取更改文件。
文件服务器:该组件支持文件上传和下载,并将文件写入file_store_dir。这不包括在此应用程序中。其想法是,大多数应用程序都有不同的实现此组件的方式,并且有一些相关的业务逻辑。如果需要,想出这样一个组件并不难。
文件存储监视器:此组件监视本地文件系统上的file_store_dir目录是否有任何更改,并将更改通知注册的侦听器。
更改日志生成器:它注册为文件存储监视器的侦听器,并在每次通知时将更改记录到change_log_dir下的一个文件中。
集群状态观察器:从站观察集群状态,能够知道谁是当前的主站。
Replicator:这有两个子组件:更改日志的定期rsync:这是定期将主服务器的change_log_dir重新同步到其本地目录的后台进程。
Change Log Watcher:它监视change_log_dir中的更改,并将更改通知注册的监听器。
随需应变rsync调用器:它注册为更改日志观察器的侦听器,并且在每次更改时调用rsync仅同步更改的文件
节点之间的协调由Helix完成。Helix执行分区管理,并根据复制因子将分区分配给多个节点。它选举一个节点为主节点,并指定其他节点为从节点。它以状态转换(离线到从、从到主)的形式向每个节点提供通知。它还会在群集状态发生更改时提供通知。这允许从主机停止从当前主机复制,而从新主机开始复制。
在这个应用程序中,我们只有一个分区,但是很容易将其扩展为支持多个分区。通过对文件存储进行分区,用户可以添加新节点,并且Helix将自动在节点之间重新分配分区。综上所述,Helix提供分区管理、容错和促进自动集群扩展。