使用glusterfs来实现文件服务器高可用

由于项目需要,需要对文件服务器实现高可用。之前想过一部份方案是nfs+rsync+inotify+keepalived 这样的方式。但是有很多问题,很多服务器mount之后一旦主的nfs挂掉之后,需要在client服务器上重新进行mount这样的操作。

于是考虑到使用分布式文件系统,这个网上有很多文章来进行比较的。我用这个主要是它的部署方式灵活,没有单点问题,可以mount(通过fuse)

下面就是具体的部署过程,我的操作系统是centos5.6 x86_64

client的IP为:192.168.0.201
server的IP为: 192.168.0.202,192.168.0.203

server端共享的文件夹为 /home/filecluster
client端的文件夹为 /home/filecluster

修改3个机器的hosts文件

192.168.0.201	xen1
192.168.0.202	xen2
192.168.0.203	xen3

首先是需要下载fuse和glusterfs,以及python-ctypes

wget http://download.gluster.com/pub/gluster/glusterfs/3.2/LATEST/glusterfs-3.2.2.tar.gz
wget http://downloads.sourceforge.net/project/fuse/fuse-2.X/2.8.5/fuse-2.8.5.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Ffuse%2Ffiles%2Ffuse-2.X%2F2.8.5%2F&ts=1313661051&use_mirror=cdnetworks-kr-2
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/python-ctypes-1.0.2-2.el5.x86_64.rpm

安装python-ctypes和fuse以及glusterfs

rpm -ivh python-ctypes-1.0.2-2.el5.x86_64.rpm
tar zxvf fuse-2.8.5.tar.gz && cd fuse* && ./configure && make && make install
tar zxvf glusterfs-3.2.2.tar.gz && cd glusterfs* && ./configure --enable-fusermount && make && make install

安装完成后会自动生成/etc/init.d/glusterd

将fuse模块放入到开机自动启动中

echo "modprobe fuse" > /etc/sysconfig/modules/fuse.modules
chmod 755 /etc/sysconfig/modules/fuse.modules
modprobe fuse

把glusterd加入到开机启动项中

chkconfig glusterd on

修改/etc/init.d/glusterd 文件

server端

#!/bin/bash
#
# chkconfig: 35 90 12
# description: Gluster File System service for volume management
#

# Get function from functions library
. /etc/rc.d/init.d/functions

BASE=glusterd
GLUSTERFSD=glusterfsd
GLUSTERFS=glusterfs
GLUSTERD_BIN=/usr/local/sbin/$BASE
GLUSTERD_OPTS="-l /var/log/glusterfs.log -f /usr/local/etc/glusterfs/glusterfsd.vol"
GLUSTERD="$GLUSTERD_BIN $GLUSTERD_OPTS"
RETVAL=0

# Start the service $BASE
start()
{
       echo -n $"Starting $BASE:"
       daemon $GLUSTERD
       RETVAL=$?
       echo
       [ $RETVAL -ne 0 ] && exit $RETVAL
}

# Stop the service $BASE
stop()
{
       echo -n $"Stopping $BASE:"
       killproc $BASE
       echo
       pidof -c -o %PPID -x $GLUSTERFSD &> /dev/null
       [ $? -eq 0 ] &&  killproc $GLUSTERFSD &> /dev/null

       #pidof -c -o %PPID -x $GLUSTERFS &> /dev/null
       #[ $? -eq 0 ] &&  killproc $GLUSTERFS &> /dev/null

       if [ -f /etc/glusterd/nfs/run/nfs.pid ] ;then
       pid=`cat /etc/glusterd/nfs/run/nfs.pid`;
       cmd=`ps -p $pid -o comm=`

       if [ $cmd == "glusterfs" ]; then
       kill `cat /etc/glusterd/nfs/run/nfs.pid`
       fi
       fi
}

### service arguments ###
case $1 in
 start)
       start
       ;;
 stop)
       stop
       ;;
 status)
       status $BASE
       ;;
 restart)
       $0 stop
       $0 start
       ;;
 *)
       echo $"Usage: $0 {start|stop|status|restart}."
       exit 1
esac

exit 0

client端

#!/bin/bash
#
# chkconfig: 35 90 12
# description: Gluster File System service for volume management
#

# Get function from functions library
. /etc/rc.d/init.d/functions

BASE=glusterd
GLUSTERFSD=glusterfsd
GLUSTERFS=glusterfs
GLUSTERD_BIN=/usr/local/sbin/$GLUSTERFS
GLUSTERD_OPTS="-l /var/log/glusterfs.log -f /usr/local/etc/glusterfs/glusterfs.vol /home/filecluster"
GLUSTERD="$GLUSTERD_BIN $GLUSTERD_OPTS"
RETVAL=0

# Start the service $BASE
start()
{
       echo -n $"Starting $GLUSTERFS:"
       daemon $GLUSTERD
       RETVAL=$?
       echo
       [ $RETVAL -ne 0 ] && exit $RETVAL
}

# Stop the service $BASE
stop()
{
       echo -n $"Stopping $GLUSTERFS:"
       killproc $GLUSTERFS
       echo
       pidof -c -o %PPID -x $GLUSTERFSD &> /dev/null
       [ $? -eq 0 ] &&  killproc $GLUSTERFSD &> /dev/null

       #pidof -c -o %PPID -x $GLUSTERFS &> /dev/null
       #[ $? -eq 0 ] &&  killproc $GLUSTERFS &> /dev/null

       if [ -f /etc/glusterd/nfs/run/nfs.pid ] ;then
       pid=`cat /etc/glusterd/nfs/run/nfs.pid`;
       cmd=`ps -p $pid -o comm=`

       if [ $cmd == "glusterfs" ]; then
       kill `cat /etc/glusterd/nfs/run/nfs.pid`
       fi
       fi
}

### service arguments ###
case $1 in
 start)
       start
       ;;
 stop)
       stop
       ;;
 status)
       status $BASE
       ;;
 restart)
       $0 stop
       $0 start
       ;;
 *)
       echo $"Usage: $0 {start|stop|status|restart}."
       exit 1
esac

exit 0

修改server端的/usr/local/etc/glusterfs/glusterfsd.vol, 这个配置就是在option bind-address 部分2台server会有所不同,其它全部一致

### file: server-volume.vol.sample

#####################################
###  GlusterFS Server Volume File  ##
#####################################

#### CONFIG FILE RULES:
### "#" is comment character.
### - Config file is case sensitive
### - Options within a volume block can be in any order.
### - Spaces or tabs are used as delimitter within a line.
### - Multiple values to options will be : delimitted.
### - Each option should end within a line.
### - Missing or commented fields will assume default values.
### - Blank/commented lines are allowed.
### - Sub-volumes should already be defined above before referring.

### Export volume "brick" with the contents of "/home/export" directory.
volume brick
  type storage/posix                   # POSIX FS translator
  option directory /home/filecluster        # Export this directory
end-volume
volume locker
  type features/posix-locks
  subvolumes brick
end-volume

### Add network serving capability to above brick.
volume server
  type protocol/server
  option transport-type tcp/server
# option transport-type unix
# option transport-type ib-sdp
 option bind-address 192.168.0.202     # Default is to listen on all interfaces # xen3上修改成192.168.0.203
# option listen-port 9999

# option transport-type ib-verbs
# option transport.ib-verbs.bind-address 192.168.1.10     # Default is to listen on all interfaces
# option transport.ib-verbs.listen-port 24016
# option transport.ib-verbs.work-request-send-size  131072
# option transport.ib-verbs.work-request-send-count 64
# option transport.ib-verbs.work-request-recv-size  131072
# option transport.ib-verbs.work-request-recv-count 64

# option client-volume-filename /etc/glusterfs/glusterfs-client.vol
  subvolumes brick
# NOTE: Access to any volume through protocol/server is denied by
# default. You need to explicitly grant access through # "auth"
# option.
  option auth.addr.brick.allow 192.168.0.* # Allow access to "brick" volume
  option auth.addr.locker.allow 192.168.0.* # Allow access to "locker" volume
end-volume

修改client端的/usr/local/etc/glusterfs/glusterfs.vol文件

### Add client feature and attach to remote subvolume
volume xen2
  type protocol/client
  option transport-type tcp/client
  option remote-host xen2
  option remote-port 24007
  option remote-subvolume locker       #name of the remote volume
end-volume

volume xen3
  type protocol/client
  option transport-type tcp/client
  option remote-host xen3
  option remote-port 24007
  option remote-subvolume locker
end-volume

#volume replicate2
#  type cluster/replicate
#  subvolumes xen2
#end-volume
#
#volume replicate3
#  type cluster/replicate
#  subvolumes xen3
#end-volume
#
volume bricks
  type cluster/replicate
  subvolumes xen2 xen3
#  subvolumes replicate1
end-volume
#
#volume writebehind
#  type performance/write-behind
#  option cache-size 1MB
#  subvolumes distribute
#end-volume
#
#volume cache
#  type performance/io-cache
#  option cache-size 64MB
#  subvolumes writebehind
#end-volume

最后就是启动server端的glusterd程序

/etc/init.d/glusterd start

然后启动client端的glusterd程序

/etc/init.d/glusterd start

这样你在client端用df就能看到如下这样的显示

[root@xen1 filecluster]# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda1              29G  3.5G   24G  13% /
tmpfs                 512M     0  512M   0% /dev/shm
glusterfs#/usr/local/etc/glusterfs/glusterfs.vol
                       29G  3.3G   25G  12% /home/filecluster

然后我做了一个简单的跟NFS的对比测试

   1. NFSv4
         1. dd if=/dev/zero of=xen.img bs=1M count=500
            524288000 bytes (524 MB) copied, 13.9683 seconds, 37.5 MB/s
         2. dd if=/dev/zero of=xen.img bs=1M count=32
            33554432 bytes (34 MB) copied, 0.710816 seconds, 47.2 MB/s
   2. gluster
         1. dd if=/dev/zero of=xen.img bs=1M count=500
            524288000 bytes (524 MB) copied, 18.4192 seconds, 28.5 MB/s
         2. dd if=/dev/zero of=xen.img bs=1M count=32
            33554432 bytes (34 MB) copied, 0.591001 seconds, 56.8 MB/s

当然server端可以有2个以上的服务器来充当,但是由于我这里使用的是replication,所以用再多的服务器是比较浪费的,因为replication的模式下所有服务器的容量大小都是相同的。

gluster共提供以下几种模式

1. Distributed Volumes
2. Replicated Volumes
3. Striped Volumes
4. Distributed Striped Volumes
5. Distributed Replicated Volumes

一个系统上线必须要做一些故障测试。这里主要是对于服务器端的故障测试,因为到时候所有数据都是存储在服务器端的。我们就模拟在client写入的时候服务器端挂掉的情况
先是在客户端上执行一个大文件写入,这个时候我们关闭xen2上的glusterd程序

dd if=/dev/zero of=xen1.img bs=1M count=500

当客户端写入完成后我们看3台服务器上的xen1.img文件的大小

[root@xen1 filecluster]# ll
总计 512508
-rw-r--r-- 1 root root 524288000 08-24 15:33 xen1.img

[root@xen2 filecluster]# ll
总计 241652
-rw-r--r-- 1 root root 247201792 08-24 15:32 xen1.img

[root@xen3 filecluster]# ll
总计 512508
-rw-r--r-- 1 root root 524288000 08-24 15:33 xen1.img

我们可以看到xen2上的数据大小是不对的。然后我们启动xen2上的glusterd程序

当启动完成后我们看到的结果还是跟前面一样的。但是我们可以在client端执行

[root@xen1 filecluster]# ll

这样xen2上数据大小也正确了

但是我们不知道在有目录的情况这个方法是否还是可以。在client端执行

mkdir file
cd file
dd if=/dev/zero of=xen1.img bs=1M count=500

其它条件还是跟之前一样,发现如果是在/home/filecluster目录下执行ls的话,xen2上数据还是不正确的。
所以我们一旦发现某个server挂了之后必须执行如下命令才能完全同步

[root@xen1 filecluster]# find ./ -name "*" | xargs ls

###########################################

Best regards
Timo Seven
blog:http://www.timoseven.com
twitter: http://twitter.com/zauc
Linux System Admin & MySQL DBA

Advertisements

{译}RedHat GFS对比NFS :提高性能和可扩展性

本文翻译自:http://www.redhat.com/magazine/008jun05/features/gfs_nfs/

原文作者: Matthew O’Keefe

译者: Timo

本文是对比Red Hat GFS(Global Filesystem)和NFS的基础文档,用来说明2种文件系统的区别。以及GFS的优势在哪里。

数据共享在今天的现代计算机世界是必须的。当收到数据请求,包括允许一个服务器群集对一个存储连接池的访问请求, RedHat GFS是简化您的数据架构,最大限度地减少存储成本,增加存储的速度,并实现最大的正常运行时间的方案。
类似于红帽GFS的集群文件系统像使用基于IP分块网络的iSCSI共享协议,以提供可扩展低成本的文件服务。网络文件系统( NFS )是一种常见的共享存储解决方案通过使用许多设备。然而,在某些情况下,这一解决方案并不可扩展。GFS和NFS如何比较? 下文讲进行解释。
红帽®企业版Linux ®客户遇到有性能问题的NFS并且只使用Linux下的NFS客户端可以使用基于iSCSI的IP分块联网Red Hat GFS来很快提高它们的性能和扩展性。

比较 :
NFS的是Linux和UNIX下一种流行的文件共享协议。 图1 显示 不同的NFS和GFS在服务器群集下数据共享硬件拓扑。 图1  显示了典型和最常见的NFS的部署:一个单一的NFS服务器有自己的本地存储连接到在网络上的客户端。 GFS的数据共享群集构建一个具有相同的硬件架拓扑iSCSI服务器,并在实践中,拥有更好的性能。此外,不同于NFS ,GFS像一个本地文件系统因为它兼容POSIX行为。这意味着,分布式Linux应用程序可以取得良好的访问性能访问共享文件通过实现兼容POSIX标准的集群。
注:
特别是, NFS不支持UNIX (和Linux )进程的所支持的同一文件同步语义:在UNIX ,如果一个进程写入一个文件,另一个进程读该文件在稍后时间保证看到前面所写的。  NFS没有这种保证,除非特别设置写入缓存,但使用可能产生负面影响。

single图1 。 Comparing NFS and Red Hat GFS/iSCSI hardware topologies

图2 显示两组NFS服务器作为故障切换和后端的存储区域网络( SAN ); 相对的数据共享群集拓扑显示,包含两个iSCSI服务器共享SAN存储。就像图1 一样物理拓扑结构是一样的,但功能可在这两个系统已经相差很远。 在NFS的服务器只是作为一个容错互备:他们不共享文件,只有物理块存储(每个NFS服务器输出本地文件系统来映射到SAN一个共享卷) 。 必须维护两个单独的文件系统,而且在同一时间只有一个NFS服务器可以提供的处理能力来处理NFS的要求特定的文件系统。 相比之下,在数据共享集群里一个单一的文件系统可以被映射到SAN存储:这两个iSCSI服务器协作,以提供共享文件系统。 如果一个iSCSI服务器出现故障,GFS的服务器节点可以通过路由绕开周围的失效的节点来访问仍在运作的iSCSI存储服务器。

paired图2 。 Paired NFS and Red Hat GFS/iSCSI servers

图3 显示系统拓扑规模扩展到四个NFS和四个iSCSI服务器。  请注意, NFS服务器不同于是iSCSI节点是它没有一个SAN的存储空间。 这意味着,每一个NFS服务器可以提供访问的只是一个单一的文件系统,它是不可能增加更多的NFS服务器的处理能力增加服务以提供部分的文件系统。 相比之下, 4个iSCSI服务器通过SAN连接到共享存储,并提供所有四个服务器处理能力的GFS服务器。事实上,更多的iSCSI服务器可以按需添加到GFS服务器数据共享集群,但是必须与SAN的处理能力想匹配。 存储容量也可逐步增加的SAN,可以提供访问一个或多个文件系统。四个的NFS服务器在图3中显示的是四个独立的存储空间,并且性能和效率含有瓶颈的NFS服务器。

multiple图3.Multiple NFS servers and a Red Hat GFS/iSCSI data sharing cluster

摘要
红帽GFS可结合iSCSI存储网络,以提供更好的性能相比单独的NFS实现。

comparing-gfs-and-nfsTable 1. Comparing GFS/iSCSI and NFS

NFS在ubuntu 7.10上简单安装

NFS在ubuntu7.10下安装

server端:

首先是安装服务器相关软件

sudo apt-get install nfs-kernel-server

vi /etc/exports

添加:
/home 172.16.30.211(rw,subtree_check)

exports文件的具体修改方式可以通过 man exports

/home为服务器上需要映射的目录

172.16.30.211为客户端IP,也可以写成 172.16.30.0/24 这样的网段形式

执行

 exportfs -rv

用来重新进行同步共享,并显示出来

最后重启下nfs服务器程序就可以了

sudo /etc/init.d/nfs-kernel-server start

client端

在7.10中client端需要安装nfs-common

sudo apt-get install nfs-common
映射服务器端的/home目录
sudo mount -t nfs 172.16.30.189:/home /home