集群技术主要分为三类:

高可用:(High Available Cluster) :Heartbeat corosync pacemaker keepalived

负载均衡:(Load balancing Cluster:lvs nginx haproxy

高性能计算(High Performance Computing:Beowulf

 

 

 

mfs+ha:moosefs+corosync+pacemaker+iscsi高可用集群文件系统

 

mfs的优点:

通用文件系统,不需要修改上层应用

可以在线扩容,体系架构可伸缩,可扩容

部署简单

可以任意设置冗余程度

可在指定的时间内回收删除的文件

可以提供netapp等商业存储的的快照特性

提供网络监控接口

提高读写效率

提高海量小文件的读写效率

劣势:

master的单点故障

体系架构存储文件的总数有可预见的上限。

 

本文提供corosync的双机热备实现高可用,使用iscsi提供双机存储,并通过crm对相关资源进行整理。

pacemaker具有监测并恢复节点和服务器级别的故障

不需要共享存储

资源无关,任何能用脚本控制的资源都可以为其服务

支持集群

crm命令行管理工具。

 

corosyncpacemaker都由红帽6.5内核提供,修改本地yum源,加入高可用资源点。

 

 

机器配置:server1/2 高可用 server3/4 chunkserver  server5 client

 

1、配置高可用

安装corosyncpacemaker 

[root@server1 x86_64]# yum install -y pacemaker 

[root@server1 x86_64]# yum install corosync -y

 

 

 

 

修改corosync的配置文件

 

totem {

        version: 2

        secauth: off

        threads: 3

        interface {

                ringnumber: 0

                bindnetaddr: 172.25.28.0//网关

                mcastaddr: 226.94.1.1//多播地址,根据多播协议确定的

                mcastport: 5406//端口,不要和别人冲突

                ttl: 1

        }

}

 

logging {

        fileline: off

        to_stderr: no

        to_logfile: yes

        to_syslog: yes

        logfile: /var/log/cluster/corosync.log

debug:off

timestamp: on

logger_subsys {

         subsys: AMF 

         debug: off 

        }   

}

amf {

        mode: disabled

}

service {

        name:pacemaker//corosync支持pacemaker服务

        ver:0//pacemakercorosync一起启动

 

}

 

 

 

yum install crmsh-1.2.6-0.rc2.2.1.x86_64.rpm pssh-2.3.1-2.1.x86_64.rpm  -y

 

 

进入crm命令行进行资源添加和管理

 

由于是用虚拟机模拟,所以使用的是fence_virtd服务,添加fence,需要在真机安装

fence-virt.x86_64,然后使用fence-virtd -c 生成fence_xvm.key

然后通过dd if=/dev/urandom of=fence_xvm.key bs =128 count=1 复制一串随机数,然后向server1server2发送

在虚拟机的客户端安装fence-virt

此时,就可以通过vmfence控制虚拟机了

使用stonith-admin -I 如果查看到fence_xvm即成功

node server1.example.com

node server2.example.com

primitive vip ocf:heartbeat:IPaddr2 \

params cidr_netmask="24" ip="172.25.28.100"

primitive vmfence stonith:fence_xvm

property $id="cib-bootstrap-options" \

dc-version="1.1.10-14.el6-368c726" \

cluster-infrastructure="classic openais (with plugin)" \

expected-quorum-votes="2" \

stonith-enabled="false" \

no-quorum-policy="ignore"

 

2

mfs的共享存储:

 

共享存储使用iscsi进行:

server5提供磁盘的共享

安装 

[root@server5 ~]# yum install scsi-* -y

 

[root@server5 ~]# vim /etc/tgt/targets.conf 

 

    backing-store /dev/vdb

    initiator-address 172.25.28.1

    initiator-address 172.25.28.2

 

 

server1/2上安装[root@server1 ~]# yum install  -y iscsi-* 

登陆共享磁盘

[root@server2 ~]# iscsiadm -m discovery -t st -p 172.25.28.5

Starting iscsid:                                           [  OK  ]

172.25.28.5:3260,1 iqn.2017-03.com.example:server.target1

[root@server2 ~]# iscsiadm -m node -l

Logging in to [iface: default, target: iqn.2017-03.com.example:server.target1, portal: 172.25.28.5,3260] (multiple)

Login to [iface: default, target: iqn.2017-03.com.example:server.target1, portal: 172.25.28.5,3260] successful.

使用fdisk -l 发现/dev/sda即为成功

sda进行磁盘分区,格式化为ext4

尝试挂载,能挂载成功,并在写入数据后双侧同步即成功

 

 

3、配置mfs

 

下载:mfs源码包,

libpcap-1.4.0-4.20130826git2dbcaa1.el6.x86_64.rpm

moosefs-3.0.80-1.tar.gz

libpcap-devel-1.4.0-4.20130826git2dbcaa1.el6.x86_64.rpm

由于要进行双机热备,所以使用rpmbuild生成rpm包比较方便,

安装rpm-build 

使用rpmbuild moosefs-3.0.80-1.tar.gz -tb

它会提示报错:

error: File /root/mfs/moosefs-3.0.80-1.tar.gz does not appear to be a specfile.

执行:

[root@server1 mfs]# ln -s moosefs-3.0.80-1.tar.gz moosefs-3.0.80.tar.gz

然后继续执行

[root@server1 mfs]# rpmbuild moosefs-3.0.80-1.tar.gz  -tb

缺少的开发包下载并安装,然后会在

[root@server1 ~]# cd /root/rpmbuild/RPMS/

安装

[root@server1 x86_64]# rpm -ivh moosefs-cgi-3.0.80-1.x86_64.rpm moosefs-cgiserv-3.0.80-1.x86_64.rpm//提供网页cgi接口包 moosefs-cli-3.0.80-1.x86_64.rpm//命令行执行包 moosefs-master-3.0.80-1.x86_64.rpm//master

 

 

scsi共享并在server1/2上发现的磁盘挂载到/va/lib/mfs/

修改/var/lib/mfs/的所属主为mfs.mfs

启动mfsmaster mfscgiserv

此时可以在网页上通过9425端口访问到mfs的内容。

登陆页面后,他会提示没有找到mfsmaster,这是由于没有mfsmaster host解析的原因

在不使用高可用的情况下,可以将解析添加到对应的主机后边,如果使用高可用,那么可以将解析添加到vip后边

 

 

由于pacemaker控制资源需要使用脚本进行,所以要编写mfs的启动脚本

mfs的启动脚本在//root/rpmbuild/BUILD/moosefs-3.0.80/rpm/rh中有相应的模版

 12 # Source function library.

 13 . /etc/init.d/functions

 

21 # Check that networking is up.

 22 [ "${NETWORKING}" == "no" ] && exit 0

 23 [ -x "/usr/sbin/mfsmaster" ] || exit 1

 24 [ -r "/etc/mfs/mfsexports.cfg" ] || exit 1

29 start () {

 30     echo -n $"Starting $prog: "

 31     $prog -a >/dev/null 2>&1 && success || failure    //使用-a选项可以恢复意外停止进程导致的无法启动msmaster

 32     RETVAL=$?

 

 

使用service mfsd startservice mfsd stop成功即为OK

 

 

4、mfsd 加入pacemaker

crm(live)configure# primitive mfs lsb:mfsd op monitor interval=1min

crm(live)configure# group vip_with_mfsd vip mfs

commit

通过server2的监控可以看到正常的工作

Online: [ server1.example.com server2.example.com ]

 

vmfence (stonith:fence_xvm):    Started server2.example.com

 Resource Group: vip_with_mfsd

     vip        (ocf::heartbeat:IPaddr2):Started server1.example.com

     mfs        (lsb:mfsd):     Started server1.example.com

 

 

将磁盘文件系统加入pacemaker

crm(live)configure# primitive mfsdate ocf:heartbeat:Filesystem params device=/dev/sda1 directory=/var/lib/mfs/ fstype=ext4 op monitor interval=1min

crm(live)configure# group mfs_with_data vip mfsdate mfs 

 

 

禁止资源回切:

crm(live)configure# rsc_defaults resource-stickiness=100

 

5、继续配置mfs,实现

 

mfs文件系统mfschunkclient的添加

 

 

server3server4添加硬盘:

格式化,挂载到一个挂载点

然后将挂载点写入/etc/mfs/mfshdd.cfg中,启动mfschunkserver 即可

然后在网页的9245可以看到磁盘的挂载情况

 

 

 

6、安装客户端:

 

server5上安装

 

[root@server5 ~]# yum install -y moosefs-client-3.0.80-1.x86_64.rpm 

 

创建一个挂载点

[root@server5 mnt]# mfsmount /mnt/mfs -H mfsmaster

 

mfs中创建两个目录用来做测试:dir1 dir2

 

[root@server5 mfs]# mfssetgoal -r 1 dir1///指定此目录中的文件的备份数量,默认是

dir1/:

 inodes with goal changed:                       1

 inodes with goal not changed:                   0

 inodes with permission denied:                  0

 

[root@server5 dir1]# dd if=/dev/zero of=bigfile bs=1M count=100

100+0 records in

100+0 records out

104857600 bytes (105 MB) copied, 0.499389 s, 210 MB/s

[root@server5 dir1]# ls

bigfile

[root@server5 dir1]# mfsfileinfo bigfile 

bigfile:

chunk 0: 0000000000000001_00000001 / (id:1 ver:1)

copy 1: 172.25.28.4:9422 (status:VALID)

chunk 1: 0000000000000002_00000001 / (id:2 ver:1)

copy 1: 172.25.28.3:9422 (status:VALID)

[root@server5 dir2]# dd if=/dev/zero of=bigfile bs=1M count=100

100+0 records in

100+0 records out

104857600 bytes (105 MB) copied, 0.529634 s, 198 MB/s

[root@server5 dir2]# mfsfileinfo bigfile 

bigfile:

chunk 0: 0000000000000003_00000001 / (id:3 ver:1)

copy 1: 172.25.28.3:9422 (status:VALID)

copy 2: 172.25.28.4:9422 (status:VALID)

chunk 1: 0000000000000004_00000001 / (id:4 ver:1)

copy 1: 172.25.28.3:9422 (status:VALID)

copy 2: 172.25.28.4:9422 (status:VALID)

 

 

server1master下,可以使用文本工具mfscli -SHD进行文本查看。

 

 

 

误删撤回:

 

所有的资源记录都在master上,mfs为已经删除的文件保留一个恢复时间:

使用

[root@server5 dir2]# mfsgettrashtime -H .

.: 86400

如果要恢复误删操作,那么要将master的元数据挂载到客户端上,然后进行。

 

[root@server5 mfs]# mkdir mfsmeta

[root@server5 mfs]# mfsmount -m /mnt/mfs/mfsmeta/ -H mfsmaster

mfsmaster accepted connection with parameters: read-write,restricted_ip

[root@server5 mfs]# cd mfsmeta/

mfsmeta中执行find命令,找到删除的文件后,将其移到undel中即可恢复。

[root@server5 mfsmeta]# ls

sustained  trash

[root@server5 mfsmeta]# cd trash/

[root@server5 trash]# find -name **passwd** 

./006/00000006|dir2|passwd

[root@server5 trash]# mv ./006/00000006\|dir2\|passwd undel/

回到原来的位置,就会发现文件已经恢复。