如何在gluster的源码中添加自己的xlator

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在gluster的源码中添加自己的xlator相关的知识,希望对你有一定的参考价值。

参考技术A   glusterfs中主线为xlator,几乎每一个大的功能点,或者性能,都可以以xlator形式参与进glusterfs中,那么xlator的开发就必不可少,所以,这里介绍一下简单的向glusterfs中增加xlator的方法,首先创建一个卷testvol
  [root@CM addxlator]# mkdir /opt/test
  [root@CM addxlator]# gluster volume create testvol 192.168.0.194:/opt/test force
  volume create: testvol: success: please start the volume to access data
  [root@CM addxlator]# gluster volume info all
  
  Volume Name: testvol
  Type: Distribute
  Volume ID: f0ef2a09-09c0-4a84-aeb6-3f2e0aebf4c2
  Status: Created
  Number of Bricks: 1
  Transport-type: tcp
  Bricks:
  Brick1: 192.168.0.194:/opt/test
  [root@CM addxlator]#
  [root@CM addxlator]# gluster volume start testvol force
  volume start: testvol: success
  [root@CM addxlator]#

  创建成功后,可以查看volume file中的内容
  cat /var/lib/glusterd/vols/testvol/testvol-fuse.vol
  volume testvol-client-0
  type protocol/client
  option transport-type tcp
  option remote-subvolume /opt/test
  option remote-host 192.168.0.194
  end-volume

  volume testvol-dht
  type cluster/distribute
  subvolumes testvol-client-0
  end-volume

  volume testvol-write-behind
  type performance/write-behind
  subvolumes testvol-dht
  end-volume

  volume testvol-read-ahead
  type performance/read-ahead
  subvolumes testvol-write-behind
  end-volume

  volume testvol-io-cache
  type performance/io-cache
  subvolumes testvol-read-ahead
  end-volume

  volume testvol-quick-read
  type performance/quick-read
  subvolumes testvol-io-cache
  end-volume

  volume testvol-open-behind
  type performance/open-behind
  subvolumes testvol-quick-read
  end-volume

  volume testvol-md-cache
  type performance/md-cache
  subvolumes testvol-open-behind
  end-volume

  volume testvol
  type debug/io-stats
  option count-fop-hits off
  option latency-measurement off
  subvolumes testvol-md-cache
  end-volume

  这个配置为默认的配置,接下来需要将自己的xlator增加入该配置中,根据之前所提到过的xlator_dyload的过程,需要修改这个volume file,来增加xlator,修改配置如下:
  volume testvol-client-0
  type protocol/client
  option transport-type tcp
  option remote-subvolume /opt/test
  option remote-host 192.168.0.194
  end-volume

  volume testvol-dht
  type cluster/distribute
  subvolumes testvol-client-0
  end-volume

  volume testvol-write-behind
  type performance/write-behind
  subvolumes testvol-dht
  end-volume

  volume testvol-read-ahead
  type performance/read-ahead
  subvolumes testvol-write-behind
  end-volume

  volume testvol-io-cache
  type performance/io-cache
  subvolumes testvol-read-ahead
  end-volume

  volume testvol-quick-read
  type performance/quick-read
  subvolumes testvol-io-cache
  end-volume

  volume testvol-open-behind
  type performance/open-behind
  subvolumes testvol-quick-read
  end-volume

  volume testvol-md-cache
  type performance/md-cache
  subvolumes testvol-open-behind
  end-volume volume testvol-test
  type debug/test
  subvolumes testvol-md-cache
  end-volume volume testvol
  type debug/io-stats
  option count-fop-hits off
  option latency-measurement off
  subvolumes testvol-test
  end-volume

  可以看到,配置中多了个testvol-test这么一层,接下来将glusterfs挂载至挂载点查看输出log
  [root@CM addxlator]#
  [root@CM addxlator]# mount -t glusterfs 192.168.0.194:testvol /media
  [root@CM addxlator]#
  查看gluster挂载到的挂载点对应的log输出信息
  cat /usr/local/var/log/glusterfs/media.log
  [2013-06-10 11:00:29.899440] I [glusterfsd.c:1878:main] 0-/usr/local/sbin/glusterfs: Started running /usr/local/sbin/glusterfs version 3git (/usr/local/sbin/glusterfs --volfile-id=testvol --volfile-server=192.168.0.194 /media)
  [2013-06-10 11:00:29.903627] I [socket.c:3515:socket_init] 0-glusterfs: SSL support is NOT enabled
  [2013-06-10 11:00:29.903823] I [socket.c:3530:socket_init] 0-glusterfs: using system polling thread
  [2013-06-10 11:00:29.909423] E [test.c:54:init] 0-testvol-test: test translator loaded
  [2013-06-10 11:00:29.909718] I [dht-shared.c:311:dht_init_regex] 0-testvol-dht: using regex rsync-hash-regex = ^\.(.+)\.[^.]+$
  [2013-06-10 11:00:29.911047] I [socket.c:3515:socket_init] 0-testvol-client-0: SSL support is NOT enabled
  [2013-06-10 11:00:29.911173] I [socket.c:3530:socket_init] 0-testvol-client-0: using system polling thread
  [2013-06-10 11:00:29.911218] I [client.c:2236:notify] 0-testvol-client-0: parent translators are ready, attempting connect on transport
  Final graph:
  经过查看log,可以看到test模块中的打印输出, in test translator lookup
  接下来查看描述一下外挂xlator的方式
  首先现在glusterfs的源代码,编译以后,在本地也就存在了glusterfs的开发环境,为了开发调试方便,可暂不将xlator存于glusterfs工程中,这时可以编写一个Makefile
  首先建立一个目录
  mkdir addxlator_sample
  cd addxlator_sample
  Makefile中内容可如下:
  #Add translator into glusterfs volume file
  #Author Steven Liu
  #E-mail lingjiujianke@gmail.com
  #Blog: http://blog.fs-linux.org

  TARGET = test.so
  OBJECTS = test.o

  GLUSTERFS_SRC = /opt/glusterfs
  GLUSTERFS_LIB = /usr/local/lib
  HOST_OS = HF_LINUX_HOST_OS

  CFLAGS = -fPIC -Wall -O0 -g \
  -DHAVE_CONFIG_H -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D$(HOST_OS) \
  -I$(GLUSTERFS_SRC) -I$(GLUSTERFS_SRC)/libglusterfs/src \
  -I$(GLUSTERFS_SRC)/contrib/uuid

  LDFLAGS = -shared -nostartfiles -L$(GLUSTERFS_LIB) -lglusterfs -lpthread

  $(TARGET): $(OBJECTS)
  $(CC) $(OBJECTS) $(LDFLAGS) -o $(TARGET)

  clean:
  rm -rf $(TARGET) $(OBJECTS)
  Makefile编写完成之后,需要OBJECTS,这时需要编写test.c来保证编译通过,当然,test这个xlator也需要在这里生成
  #ifndef _CONFIG_H
  #define _CONFIG_H
  #include "config.h"
  #include "xlator.h"
  #endif

  #include <fnmatch.h>
  #include <errno.h>
  #include "glusterfs.h"
  #include "xlator.h"
  #include <stdarg.h>
  #include "defaults.h"
  #include "logging.h"

  int test_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
  int32_t op_ret, int32_t op_errno,
  inode_t *inode, struct iatt *buf,
  dict_t *xdata, struct iatt *postparent)
  
  STACK_UNWIND_STRICT (lookup, frame, op_ret, op_errno, inode, buf, xdata,
  postparent);
  return 0;
  

  static int test_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)
  
  gf_log(this->name, GF_LOG_ERROR, "in test translator lookup");
  STACK_WIND (frame, test_lookup_cbk,
  FIRST_CHILD(this), FIRST_CHILD(this)->fops->lookup,
  loc, xdata);
  return 0;
  

  static int test_stat (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)
  
  gf_log(this->name, GF_LOG_ERROR, "in test translator stat");
  return 0;
  

  int
  reconfigure (xlator_t *this, dict_t *options)
  
  return 0;
  

  int
  init (xlator_t *this)
  
  struct ios_conf *conf = NULL;
  int ret = -1;

  gf_log (this->name, GF_LOG_ERROR, "test translator loaded");
  if (!this)
  return -1;

  if (!this->children)
  gf_log (this->name, GF_LOG_ERROR,
  "test translator requires atleast one subvolume");
  return -1;
  

  if (!this->parents)
  gf_log (this->name, GF_LOG_ERROR, "dangling volume. check volfile ");
  

  conf = this->private;

  this->private = conf;
  ret = 0;
  return ret;
  

  void
  fini (xlator_t *this)
  
  struct ios_conf *conf = NULL;

  if (!this)
  return;

  conf = this->private;

  if (!conf)
  return;
  this->private = NULL;

  GF_FREE(conf);
  gf_log (this->name, GF_LOG_ERROR, "test translator unloaded");
  return;
  

  int
  notify (xlator_t *this, int32_t event, void *data, ...)
  
  default_notify (this, event, data);
  return 0;
  

  struct xlator_fops fops =
  .stat = test_stat,
  .lookup = test_lookup,
  ;

  struct xlator_cbks cbks =
  ;

  struct volume_options options[] =
  ;
  目前仅用于测试的xlator而已,所以自己定义了lookup与stat,还有lookup_cbk,其他的并未定义,全部走default,这个原理在之前已经提到过。
  然后执行make既可生成对应的xlator文件
  Makefile test.c test.o test.so
  将test.so复制至/usr/local/lib/glusterfs/3git/xlator/debug中
  然后执行glusterfs的客户端,mount至挂载节点,如果成功,可以查看log,整个过程成功矣~~!
转载本回答被提问者和网友采纳

Gluster 简介

参考技术A Gluster 是一种可扩展的分布式文件系统,可将来自多个服务器的磁盘存储资源聚合到一个全局命名空间中。

GlusterFS 体系结构将计算,存储和 I/O 资源聚合到一个全局命名空间中。 每台服务器加上存储设备(配置为直连存储,JBOD 或使用存储区域网络)被视为节点。 通过添加其它节点或向每个节点添加额外存储来扩展容量。 通过在更多节点之间部署存储来提高性能。 通过在节点之间复制数据来实现高可用性。

GlusterFS 通过以太网或 Infiniband RDMA 互连将各种存储服务器聚合到一个大型并行网络文件系统中。 GlusterFS 基于可堆叠的用户空间设计。

GlusterFS 有一个客户端和服务器组件。服务器通常部署为 storage bricks,每个服务器运行 glusterfsd 守护程序以将本地文件系统导出为 volume。 glusterfs 客户端进程通过 TCP/IP,InfiniBand 或套接字直接协议连接到具有自定义协议的服务器,使用可堆叠转换器从多个远程服务器创建复合虚拟卷。默认情况下,文件是整体存储的,但也支持跨多个远程卷分割文件。然后,客户端主机可以通过 FUSE 机制使用自己的本机协议,使用内置服务器转换器的 NFS v3 协议或通过 libgfapi 客户端库访问 volume。

GlusterFS 的大多数功能都实现为转换器,包括基于文件的镜像和复制,基于文件的条带化,基于文件的负载均衡,卷故障转移,调度和磁盘缓存,存储配额以及具有用户可维护性的卷快照(自 GlusterFS 3.6 版本以来 )。

GlusterFS 服务器有意保持简单:它按原样导出现有目录,将其留给客户端转换器来构建存储。客户端本身是无状态的,不相互通信,并且期望具有彼此一致的转换器配置。 GlusterFS 依赖于弹性散列算法(elastic hashing algorithm),而不是使用集中式或分布式元数据模型。使用 GlusterFS 3.1 及更高版本,可以动态添加,删除或迁移卷,有助于避免配置一致性问题,并允许 GlusterFS 通过避免通常会影响更紧密耦合的分布式文件系统的瓶颈,在商用硬件上扩展到几PB 。

GlusterFS 通过各种复制选项提供数据可靠性和可用性:复制卷和地理复制。复制卷确保每个文件至少存在一个副本,因此如果一个文件出现故障,仍然可以访问数据。地理复制提供了主从模式的复制, volume 会跨不同的地理位置进行复制。这是异步发生的,在发生故障时备份数据非常有用。

https://docs.gluster.org/en/latest/Administrator%20Guide/GlusterFS%20Introduction/
https://en.wikipedia.org/wiki/Gluster

以上是关于如何在gluster的源码中添加自己的xlator的主要内容,如果未能解决你的问题,请参考以下文章

为 GlusterFS 设计新的xlator (编译及调用过程分析)

Gluster 简介

设计新Xlator扩展GlusterFS[转]

如何在android源码中添加自己的jni方法

分布式储存_gluster

Android 添加自己的apk作为Launcher