安装GlusterFS、NFS、CTDB构建高可用、低价格的存储集群




*声明:本人也是在摸索当中,也许本人的一些做法并不正确,写下的这些东西不是什么教程,仅供参考而已。


       本方案尚处于测试阶段,并未经过生产环境的考验,因此要慎重,不要直接往生产服务器上装,否则可能带来灾难性后果。


*另外,不差钱的话,还是买套专业存储吧,别苦了自己。省了钱不会有人记得你,出了问题肯定是你的责任。  --蓝蜻蜓




特点:


1、高可用,基于GlusterFS分布式文件系统,数据文件分布存放,扩展性强;


2、既可以用glusterfs-fuse做对外的挂载接口(不存在单点故障),也可以使用NFS做对外的挂载接口(给不便于安装glusterfs客户端的机器使用),简单易用;


3、使用CTDB做对外NFS接口管理(虚拟ip的方式),一台服务器挂掉时可自动切换到其它服务器,避免了NFS单点故障;


4、设备可采用普通的服务器来兼职,服务器还可以做别的应用(只要它的硬盘不是很忙,就可以做兼职),一个字:廉价。






本人的GlusterFS系统用cloudstack系统的服务器做兼职。


搞这个存储集群是为了配合cloudstack云系统应用,但也可以给其它的系统做存储使用。


cloudstack主存储用glusterfs客户端挂载到各KVM host服务器(目录名必须相同),然后用sharemountpoint方式挂载到云平台;


cloudstack辅存储用glusterfs客户端挂载到两台manage服务器(目录名必须相同),然后用NFS方式挂载到云平台。


(NFS挂载方式实际上是经过了二次挂载,性能有损失,能用glusterfs客户端挂载的地方尽量用)




GlusterFS、CTDB、NFS分别是什么?有什么特点?这里不再说,这里说的是这三个怎么配合使用。




系统环境:centos6.5(64位)


硬件为4台普通服务器:


10.10.10.15 nfs01.mycloud.com.cn (CTDB虚拟出来的ip地址,没有实际服务器)
10.10.10.11 gls01.mycloud.com.cn (cloudstack manage1 兼职)
10.10.10.12 gls02.mycloud.com.cn (cloudstack manage2 兼职)
10.10.10.21 gls03.mycloud.com.cn (cloudstack KVM host1 兼职)
10.10.10.22 gls04.mycloud.com.cn (cloudstack KVM host2 兼职)






以下gluster开头的命令只要在其中一台服务器上输入就可以了,其它的命令每服务器都要输入。


如果你有更多的服务器,配置也是类似的




#  vi /etc/yum.repos.d/glusterfs.repo
[glusterfs]
name=glusterfs
#baseurl=http://download.gluster.org/pub/gluster/glusterfs/3.4/3.4.3/CentOS/epel-6.5/x86_64/
baseurl=http://10.10.10.12/glusterfs/glusterfs3.4.3/  (这是把上面的文件下载到了本地)
enabled=1
gpgcheck=0




#  yum install glusterfs glusterfs-server


#  chkconfig glusterd on


#  service glusterd start


#  vi /etc/hosts
10.10.10.15 nfs01.mycloud.com.cn
10.10.10.11 gls01.mycloud.com.cn
10.10.10.12 gls02.mycloud.com.cn
10.10.10.21 gls03.mycloud.com.cn
10.10.10.22 gls04.mycloud.com.cn




创建用于cloudstack主存的卷(以glusterfs客户端方式挂载):




#  mkdir -p /glusterfs/nfsp  (建立用于主存的文件目录)


# gluster peer probe gls01.mycloud.com.cn (添加节点)


# gluster peer probe gls02.mycloud.com.cn


# gluster peer probe gls03.mycloud.com.cn


# gluster peer probe gls04.mycloud.com.cn


# gluster peer status


# gluster volume info


# gluster volume create nfsp replica 2 gls01.mycloud.com.cn:/glusterfs/nfsp gls02.mycloud.com.cn:/glusterfs/nfsp force   


(创建对外提供服务的卷,这里只指定使用2个节点,如果以后有更多的主机要加入,使用卷扩容就可以了;


distribute分布式, stripe条带式, replica副本式,可叠加组合,


“replica 2”表示每个文件保存为两个副本,最少需要2台服务器。


“stripe 2 replica 2”表示每个文件切成条保存到2个地方,且保存为两个副本,最少需要4台服务器。


如果卷目录位于根分区下,后面要加force)


# gluster volume start nfsp


# gluster volume set nfsp auth.allow 10.10.10.*  (设置允许访问的地址,如果有多个地址可以用逗号连接)


# gluster volume info


 创建完毕,测试一下:


# mkdir /nfsp


# mount -t glusterfs 10.10.10.11:/nfsp /nfsp/  (挂载到本地目录来使用,不要直接往/glusterfs/nfsp里面写文件,ip随便写哪个都可以,建议写本机ip)


# vi /nfsp/test1.txt 
testtesttest


到另一台机上看一下目录里面有没有文件同步生成:


# ls -lh /glusterfs/nfsp








创建用于cloudstack辅存的卷(以NFS方式挂载):




#  mkdir -p /glusterfs/nfss  (建立用于辅存的文件目录)


# gluster volume create nfss gls03.mycloud.com.cn:/glusterfs/nfss gls04.mycloud.com.cn:/glusterfs/nfss force   


# gluster volume start nfss


# gluster volume set nfss auth.allow 10.10.10.*  (设置允许访问的地址,如果有多个地址可以用逗号连接)


# gluster volume info


 创建完毕,测试一下:


# mkdir /nfss


# mount -t glusterfs 10.10.10.21:/nfss /nfss/  (挂载到本地目录来使用,下面要把这个目录以NFS的方式对外提供服务)


# vi /nfsp/test1.txt 
testtesttest


到另一台机上看一下目录里面有没有文件同步生成:


# ls -lh /glusterfs/nfsp








# yum install nfs-utils


# yum install ctdb


# mkdir /glusterfs/ctdb


# gluster volume create ctdb replica 4 gls01.mycloud.com.cn:/glusterfs/ctdb gls02.mycloud.com.cn:/glusterfs/ctdb gls03.mycloud.com.cn:/glusterfs/ctdb gls04.mycloud.com.cn:/glusterfs/ctdb force
 (创建用来保存ctdb和nfs配置文件的卷,文件很小的,可以多存几份)


# gluster volume start ctdb


# gluster volume set ctdb auth.allow 10.10.10.*   


# gluster volume info


# mkdir /ctdb


# mount -t glusterfs 10.10.10.11:/ctdb /ctdb/




创建nfs配置文件


# vi /etc/sysconfig/nfs


CTDB_MANAGES_NFS=yes
NFS_TICKLE_SHARED_DIRECTORY=/ctdb/nfs-tickles
STATD_PORT=595
STATD_OUTGOING_PORT=596
MOUNTD_PORT=597
RQUOTAD_PORT=598
LOCKD_UDPPORT=599
LOCKD_TCPPORT=599
STATD_SHARED_DIRECTORY=/ctdb/lock/nfs-state
NFS_HOSTNAME="gls.mycloud.com.cn"
STATD_HOSTNAME="$NFS_HOSTNAME -P "$STATD_SHARED_DIRECTORY/$PUBLIC_IP" -H /etc/ctdb/statd-callout -p 97"
RPCNFSDARGS="-N 4"




# mv /etc/sysconfig/nfs /ctdb/   (放到存储卷里面,给其他服务器共用)


# vi /etc/exports


/nfss  *(fsid=1235,insecure,rw,async,no_root_squash,no_subtree_check)






# mv /etc/exports /ctdb/




# cd /etc/


# ln -s /ctdb/exports exports


# cd sysconfig/


# ln -s /ctdb/nfs nfs




创建ctdb配置文件,同样是放到存储卷里面,给其他服务器共用


# vi /ctdb/ctdb


CTDB_RECOVERY_LOCK=/ctdb/lockfile
CTDB_PUBLIC_INTERFACE=eth0
CTDB_PUBLIC_ADDRESSES=/ctdb/public_addresses
CTDB_MANAGES_NFS=yes
CTDB_NODES=/ctdb/nodes
CTDB_DEBUGLEVEL=ERR




# cd /etc/sysconfig/


# ln -s /ctdb/ctdb ctdb






# vi /ctdb/public_addresses


10.10.10.15/24 eth0  (定义对外虚拟ip)




# vi /ctdb/nodes


10.10.10.21
10.10.10.22




# chkconfig ctdb on  (启动)


# chkconfig nfs off (取消nfs自启动,由ctdb来管理)


# /etc/init.d/ctdb start


# ctdb status (查看信息)


# ctdb ping -n all


# ctdb ip
Public IPs on node 1
10.10.10.15 node[0] active[] available[eth0] configured[eth0]  (显示10.10.10.15这个接口地址正工作在node0上)


# ctdb pnn
PNN:1      (自己是node1)






找台机子来测试一下,如果连不上,注意看下防火墙是不是阻挡了


# mkdir /test


# mount -t nfs 10.10.10.15:/nfss /test


# cd /test






添加开机自动挂载glusterfs卷:


# vi /etc/rc.local 


/bin/sleep 60s
/bin/mount -t glusterfs 10.10.10.11:/ctdb /ctdb/
/bin/mount -t glusterfs 10.10.10.11:/nfss /nfssecond/
/etc/init.d/ctdb restart


为什么不加到/etc/fstab中?因为服务器启动的时候要花点时间去启动glusterfs服务,加到/etc/fstab中是不会成功挂载的。






接下来.........测试吧


反复读写大量文件...


运行过程中拔网线...


尽量折腾看会不会死...






* 注意 *


本人把ctdb安装在2台cloustack manage服务器上,如果装到cloustack kvm host上云系统会有问题,可能是对网桥模式有干扰,你可以自己试一下,也许运气比我好也说不定。


使用ctdb后还有个福利,一台cloustack manage服务器挂掉后,另一台会自动把虚拟地址接手过来。


(当然访问manage必须用虚拟地址,另外要检查下kvm主机中的/etc/cloudstack/agent/agent.properties 文件写的是不是虚拟地址)




另外,glusterfs跟cloudstack配合用,各种模式会产生完全不一样的效果。


千兆网络下,主存用replica模式,写入速度大约有70MB/S;辅存用distribute模式,写入速度大约有50MB/S。


本人测试cloudstack辅存用replica模式的时候做快照写入速度只有1MB/S,用stripe模式则根本写不进快照文件。


不过辅存没有主存那么重要,不用replica模式也不是很要紧(还可以节省存储空间)。


不过辅存挂掉的时候ssvm等系统虚拟机会无法重启,为了解决这个问题,本人建立了2个辅存卷nfss1、nfss2(注意所用的节点不要相同),


分别挂载到manage1服务器的/nfssecond目录和manage2服务器的/nfssecond目录(没有错,两个目录同名,这样cloudstack中看到的是一个,实际上是两个不同的glusterfs卷),


把ssvm等系统虚拟机模板文件放到manage1服务器的/nfssecond中,再复制一份到manage2服务器的/nfssecond中。


在ctdb的作用下,平时只有一个nfssecond在用,当一个挂掉的时候,切换到另一个,系统虚拟机模板文件还在,ssvm等可以正常启动。


快照文件都没了,需要重新生成,没关系,反正快照一般都是配置成定时生成新的覆盖旧的。










* 再注意 *


某些版本下qemu-kvm和glusterfs会端口冲突


本人版本如下


# rpm -q qemu-kvm
qemu-kvm-0.12.1.2-2.415.el6_5.8.x86_64


# rpm -q glusterfs
glusterfs-3.4.3-3.el6.x86_64




在做虚拟机迁移的时候,会出现以下错误


qemu-kvm: Migrate: socket bind failed: Address already in use Migration failed. Exit code tcp:[::]:49152(-1), exiting.




解决办法,在所有安装glusterfs的机器上执行:


# vi /etc/glusterfs/glusterd.vol


在“end-volume”之前加入一行:


    option base-port 50152  (写其它端口也可以,反正不要写49152)


关闭云系统中的所有虚拟机,


再关闭相关程序


# /etc/init.d/cloudstack-management stop


# /etc/init.d/cloudstack-agent stop


# /etc/init.d/ctdb stop


# /etc/init.d/glusterd stop


# /etc/init.d/glusterfsd stop


启动程序


# /etc/init.d/glusterd start


# /etc/init.d/ctdb start


# /etc/init.d/cloudstack-management start


# /etc/init.d/cloudstack-agent start


启动云系统中的虚拟机,迁移测试。










** 特别注意 **


使用replica模式的时候,如果发生网络故障(比如交换机坏了、网线被碰掉了),而两台机器都还活着的时候,它们各自的数据读写还会继续。


当网络恢复时,它们都会认为自己的数据才是正确的,对方的是错误的,这就是俗称的脑裂。


双方谁都不肯妥协,结果就是文件数据读取错误,系统无法正常运行,


/var/log/glusterfs/glustershd.log中类似有以下错误记录


Unable to self-heal contents of ''
&nbsp123

















&nbsp123














&nbsp123


&nbsp123


&nbsp123


&nbsp123







&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123





































&nbsp123































































&nbsp123

























































































&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123












&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123











&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123










































&nbsp123



















&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123
&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123&nbsp123
&nbsp123&nbsp123
&nbsp123&nbsp123