Glusterfs:冗余(Replication)源码分析

本文深入分析了Glusterfs的冗余技术,特别是副本(Replication)的实现原理。从文件的创建、读写、创建文件夹到删除文件的操作流程,探讨了如何在多个节点上确保数据的高可用性和一致性。通过源码分析,揭示了Glusterfs在加锁、数据同步等方面的策略,并讨论了潜在的优化方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概述.

冗余技术(redundancy)是分布式存储系统的一个重要技术手段。最简单、最传统的冗余存储技术是副本技术(replication):通过拷贝多个原始数据,并将它们分别存储在不同节点上,从而增加数据可靠性。Gluster文件系统通过多分冗余来保持其系统文件的高可用性。

 

Glusterfs冗余示意图

 

副本技术存在显著缺点是存储开销巨大——为应对部分数据丢失的风险而需要将整个原始文件拷贝存储,为此,为提高存储效率,纠删码(erasure coding)技术被引入到分布式系统中。

因此这方面,有待我们改进,通过差分编码等实现gluster的高可用性。

逻辑卷的创建的时候,可以指定冗余的份数,则以后上传一份文件就会上传到多个存储节点。

2.功能验证

1.冗余卷的配置文件如下:


    2.将文件glusterfs.txt上传到glusterfs存储系统,如下图上传了3份文件。并且确认3份数据内容一样


3.查看afr方式上传的文件的元数据相关信息:

由显示的元数据键可知,afr的三个子卷名均记录在了扩展属性内部;


任意查看一个键的值:


4.手动将文件放入某个brick,在客户端是不可见的:

[root@09:57:22@/mnt/v1]#ls   没有文件

 

而某一个brick下有文件

[root@09:56:12@/mnt/test5]#ls

glusterfs-3.2.5.tar.gz

5.文件

3.冗余设计思想分析

在冗余部分,我们主要结合文件的创建,读写方式来分析冗余是如何实现的。在概要部

分已经提及上传一个文件,会通过在冗余卷的部分,将一个文件上传到多个节点;而在进行文件的读取部分,则只会从一个节点读取一个文件。

 Gluster写文件示意图


Gluster读文件示意图

 

在afr部分,文件的读写操作,文件夹的读写操作,文件的自我修复各个部分代码分开实现。

3.1.写文件

文件的写其实会涉及到2个阶段,首先是创建文件,然后是向文件写IO流。

3.1.1创建文件

文件创建是函数afr_create。当创建操作传递到服务端的实现的POSIX接口时,其

实是通过调用open()函数实现文件创建的:

_fd = open (real_path, _flags, mode);

 

上面代码片段即来自服务端的posix_create方法。

 

如果要创建一个文件,首先当然要从要重父节点获得文件的flag,mode,fd这几个参数,fd为文件的描述符:

local->cont.create.flags = flags;

local->cont.create.mode  = mode;

local->cont.create.fd    = fd_ref (fd);

 

同时获得有效的子卷数目,这儿有效代表了子卷现在能够提供正常服务的卷:

call_count = afr_up_children_count (priv->child_count, local->child_up);

上面参数child_up代码了能正常提供服务的子卷数组,如果是child_down则是不能正常提供服务的数组。

然后就会开始对子卷的循环调用:

for (i = 0; i < priv->child_count; i++) {

     &nbs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值