GlusterFS插件

自uWSGI 1.9.15起可用

官方modifier1: 27

‘glusterfs’插件允许你使用自GlusterFS 3.4起可用的glusterfs api,直接提供存储在glusterfs文件系统中的文件

这个方法 (与通过fuse或者nfs提供相比) 在性能和易于部署方面有许多优势。

第1步:安装glusterfs

我们从官方渠道构建glusterfs,在3个节点上(192.168.173.1, 192.168.173.2, 192.168.173.3),把它安装在/opt/glusterfs。

  1. ./configure --prefix=/opt/glusterfs
  2. make
  3. make install

现在,这样启动配置/控制守护进程:

  1. /opt/glusterfs/sbin/glusterd

从现在起,我们可以配置我们的集群

第2步:第一个集群

运行控制客户端来访问glusterfs shell:

  1. /opt/glusterfs/sbin/gluster

第一步是“发现”其他节点:

  1. # do not run on node1 !!!
  2. peer probe 192.168.173.1
  3. # do not run on node2 !!!
  4. peer probe 192.168.173.2
  5. # do not run on node3 !!!
  6. peer probe 192.168.173.3

记住,你无需对运行着glusterfs控制台的机器的相同的地址运行”peer probe”。你必须在集群的每个节点上重复这个过程。

现在,我们可以创建一个副本卷 (每个节点上都必须存在/exports/brick001目录):

  1. volume create unbit001 replica 3 192.168.173.1:/exports/brick001 192.168.173.2:/exports/brick001 192.168.173.3:/exports/brick001

并启动它:

  1. volume start unbit001

现在,你应该可以挂载你的glusterfs文件系统,并开始在其中写文件了 (你可以使用nfs或者fuse)

第3步:uWSGI

一个名为’glusterfs’的构建配置文件已经可以用了,所以你可以简单这样做:

  1. PKG_CONFIG_PATH=/opt/glusterfs/lib/pkgconfig/ UWSGI_PROFILE=glusterfs make

这个配置文件目前禁用了’matheval’支持,因为glusterfs库使用带相同函数前缀的bison/yacc (引发命名冲突)。

现在,你可以启动你的HTTP服务来快速提供glusterfs文件 (记住,不涉及任何nfs或者fuse):

  1. [uwsgi]
  2. ; bind on port 9090
  3. http-socket = :9090
  4. ; set the default modifier1 to the glusterfs one
  5. http-socket-modifier1 = 27
  6. ; mount our glusterfs filesystem
  7. glusterfs-mount = mountpoint=/,volume=unbit001,server=192.168.173.1:0
  8. ; spawn 30 threads
  9. threads = 30

高可用性

主要的GlusterFS卖点是高可用性。使用前面的设置,我们引入了一个带控制守护进程的SPOF。

‘server’选项允许你指定多个控制守护进程 (尝试它们直到有一个响应)

  1. [uwsgi]
  2. ; bind on port 9090
  3. http-socket = :9090
  4. ; set the default modifier1 to the glusterfs one
  5. http-socket-modifier1 = 27
  6. ; mount our glusterfs filesystem
  7. glusterfs-mount = mountpoint=/,volume=unbit001,server=192.168.173.1:0;192.168.173.2:0;192.168.173.3:0
  8. ; spawn 30 threads
  9. threads = 30

‘0’端口是glusterfs惯例,它意味着“默认端口” (一般是24007)。你可以指定任何你需要/想要的端口。

多个挂载点

如果你的web服务器 (像nginx或者uWSGI http路由器) 能够设置协议变量 (像SCRIPT_NAME或者UWSGI_APPID),那么你可以在同一个实例中挂载多个glusterfs文件系统:

  1. [uwsgi]
  2. ; bind on port 9090
  3. http-socket = :9090
  4. ; set the default modifier1 to the glusterfs one
  5. http-socket-modifier1 = 27
  6. ; mount our glusterfs filesystem
  7. glusterfs-mount = mountpoint=/,volume=unbit001,server=192.168.173.1:0;192.168.173.2:0;192.168.173.3:0
  8. glusterfs-mount = mountpoint=/foo,volume=unbit002,server=192.168.173.1:0;192.168.173.2:0;192.168.173.3:0
  9. glusterfs-mount = mountpoint=/bar,volume=unbit003,server=192.168.173.1:0;192.168.173.2:0;192.168.173.3:0
  10. ; spawn 30 threads
  11. threads = 30

多进程 VS 多线程

目前,混合两者将会提供最佳性能和可用性。

异步支持还在进行中

内部路由

uWSGI内部路由 让你可以重写请求来改变请求文件。目前,glusterfs插件只使用PATH_INFO,因此,你可以通过’setpathinfo’指令来改变它

也支持缓存。看看教程 (链接在主页上) ,获得一些很酷的点子吧

使用capabilities (在Linux上)

如果你的集群要求客户端绑定到特权端口 (<1024) ,而你不想要改动它 (而显然,你不想要作为root运行uWSGI),那么你或许想要给予你的uWSGI实例NET_BIND_SERVICE capability。只需确保你有一个启用了capabilities的uWSGI,然后添加

  1. ... --cap net_bind_service ...

到所有你想要连接到glusterfs的实例

注意:

该插件自动启用了mime type引擎。

无目录索引支持