安装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 ''
 123

















 123














 123


 123


 123


 123







 123 123 123 123 123 123 123 123 123 123





































 123































































 123

























































































 123 123 123
 123 123 123












 123 123 123 123 123 123 123 123 123
 123 123 123 123 123 123 123
 123 123 123 123 123 123
 123 123 123 123 123 123 123 123
 123 123 123 123 123 123 123
 123 123 123 123
 123 123 123 123 123 123
 123 123 123 123 123 123 123 123
 123 123 123 123 123 123 123 123
 123 123 123 123 123 123 123 123
 123 123 123 123 123 123 123 123
 123 123 123 123 123 123 123 123 123
 123 123











 123 123 123
 123 123 123










































 123



















 123 123
 123 123 123
 123 123 123 123 123
 123 123 123 123
 123 123 123
 123 123 123 123 123 123
 123 123 123
 123 123
 123 123 123 123 123 123
 123 123
 123 123