gluster的volume是由一系列的translator组成的,translator就像输入输出流的堆栈式结构一样,由一个translator调用另一个translator,每个translator在运行时作为shared-object,根据不同的文件操作调用不同的函数.
每个translator一般需要定义xlator_fops、xlator_cbks、init、fini、volume_options这几个结构体.结构体里是不同的函数指针
比较重要的是xlator_fops这个结构体,在这里,一般要定义规定好的文件操作,文件操作在xlator.h中都有严格的明确定义
比如
fop_readv_t readv;
fop_writev_t writev;
应该就是对文件内容写入和读出的操作
translator都是采用异步调用和callback的方式,上一个translator异步调用下一个translator的相应的函数,下一个translator完成后调用上一个translator的callback函数.调用和callback主要利用了两个宏,STACK_WIND和STACK_UNWIND
gluster的translator中,一般都能很容易找到文件操作和相应的回调函数,因为命名都很有规律
拿一个简单的rot 13的translator举例说明下
rot-13.c文件中定义了两个文件操作
struct xlator_fops fops = {
.readv = rot13_readv,
.writev = rot13_writev
};
即文件读取和文件写入操作
在上面可以找到
int32_t
rot13_writev_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
struct iatt *prebuf,
struct iatt *postbuf, dict_t *xdata)
{
STACK_UNWIND_STRICT (writev, frame, op_ret, op_errno, prebuf, postbuf,
xdata);
return 0;
}
int32_t
rot13_writev (call_frame_t *frame,
xlator_t *this,
fd_t *fd,
struct iovec *vector,
int32_t count,
off_t offset, uint32_t flags,
struct iobref *iobref, dict_t *xdata)
{
rot_13_private_t *priv = (rot_13_private_t *)this->private;
if (priv->encrypt_write)
rot13_iovec (vector, count);
STACK_WIND (frame,
rot13_writev_cbk,
FIRST_CHILD (this),
FIRST_CHILD (this)->fops->writev,
fd, vector, count, offset, flags,
iobref, xdata);
return 0;
}
rot13_writev是文件内容写入的函数指针,rot13_writev_cbk则是对应的callback
看到在rot13_writev函数中,调用宏STACK_WIND的时候,需要制定callback,当下一个translator同样的文件操作完成以后,callback就能被调用.在rot13_writev_cbk中,调用了STACK_UNWIND_STRICT这个宏来调用上层translator的callback.
在gluster源码中的xlators\cluster中的三个translator应该是我们研究的重点,尤其对于分布式文件系统来说,最重要的就是afr,即automatic file replication,自动文件复制.
通过阅读afr的源码可以看出,gluster的副本机制没有采用主从模型,而是所有节点都是主节点.在一次文件写入时,要调用afr的所有subvolume,而且要等待所有subvolume的回调.
推荐几篇好文章
http://hekafs.org/index.php/2011/11/translator-101-class-1-setting-the-stage/
http://hekafs.org/index.php/2011/11/translator-101-lesson-2-init-fini-and-private-context/
http://hekafs.org/index.php/2011/11/translator-101-lesson-3-this-time-for-real/
http://hekafs.org/index.php/2011/11/translator-101-lesson-4-debugging-a-translator/
让你更加深入了解gluster代码结构,还能自己构造translator,用GDB运行时debug gluster
分享到:
相关推荐
方便下载的Gluster3.6.2源码包
分布式,gluster,高性能,高扩展,文件系统
在centos下对Gluster的分布式文件系统的安装详细过程
openshift-gluster 部署 GlusterFS 容器 确定 OpenShift SDN 中将运行 GlusterFS 的机器。 在那台机器上运行这个命令 docker run --privileged -d jsafrane/kubernetes-gluster 获取运行容器的 IP 地址 docker ps...
gluster 3.2.0 非常好的资源,非常好用
centos7下离线yum安装gluster6、gluster7的rpm包,内有说明文档。亲测可用。
Red Hat Gluster Storage 3.2 Administration Guide Red Hat Gluster Storage Administration Guide describes the configuration and management of Red Hat Gluster Storage for On-Premise
gluster_exporter 普罗米修斯的胶合板出口商安装go get github.com/ofesseler/gluster_exporter./gluster_exportergluster_exporter用法选项默认描述-h,--help -- 显示用法。 --web.listen-address :9189 侦听HTTP...
Glusterfs(分布式文件系统) Hadoop到结合
分布式存储gluster集群的体系结构,超级经典
gluster 运维手册(482页英文原版文档)
Red Hat Gluster Storage is a software-only, scale-out storage solution that provides flexible and agile unstructured data storage for the enterprise. Red Hat Gluster Storage provides new ...
Gluster_File_System-3.2.5-Administration_Guide-en-US.pdf
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
Gluster运行状况报告工具 使用此工具来分析Gluster节点的正确性或运行状况。 注意:该项目的目标不是提高Gluster的“监视”功能,而是确保在发生问题时不要错过对重要内容的分析。 如果某人没有任何其他监视设置,...
ansible-gluster 用于部署 Gluster 的 Ansible 模块和示例剧本本文档目前涵盖 examples/ex_auto_vars-full 目录中的示例。 其他目录中的示例有效,但是是获取当前基于 varfile 的版本的垫脚石。先决条件: 所有...
python-gluster-3.7.1-17.atomic.1.el7.x86_64.rpm
gluster 7 linux
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
gluster常见的坑