配置集群的前提:
时间同步
节点间相互的dns解析
实验环境部署
新增一台虚拟机serve5(172.25.81.5)作备master
主机IP | 作用 |
172.25.81.1 | mfsmaster server |
172.25.81.5 | mfsmaster server |
172.25.81.3 | mfschunk server |
172.25.81.4 |
mfschunk server |
172.25.81.250 | mfs client |
安装并配置mfsmaster
[root@server5 ~]# rpm -ivh moosefs-master-3.0.103-1.rhsystemd.x86_64.rpm
修改moosefs-master服务的启动脚本
[root@server5 ~]# vim /usr/lib/systemd/system/moosefs-master.service
[Unit]
Description=MooseFS Master server
Wants=network-online.target
After=network.target network-online.target[Service]
Type=forking
ExecStart=/usr/sbin/mfsmaster -a
ExecStop=/usr/sbin/mfsmaster stop
ExecReload=/usr/sbin/mfsmaster reload
PIDFile=/var/lib/mfs/.mfsmaster.lock
TimeoutStopSec=1800
TimeoutStartSec=1800
Restart=no[Install]
WantedBy=multi-user.target[root@server5 ~]# systemctl daemon-reload
配置master端(server1 server5)的yum源,以获取高可用安装包
[root@server1 ~]# vim /etc/yum.repos.d/yum.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.81.250/rhel7.3
gpgcheck=0[HighAvailability]
name=HighAvailability
baseurl=http://172.25.81.250/rhel7.3/addons/HighAvailability
gpgcheck=0[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.81.250/rhel7.3/addons/ResilientStorage
gpgcheck=0
mfsmaster配置(server1):
[root@server1 ~]# yum install -y pacemaker corosync pcs
[root@server1 ~]# ssh-keygen
[root@server1 ~]# ssh-copy-id server5 ##设置免密
[root@server1 ~]# ssh-copy-id server1
[root@server1 ~]# systemctl start pcsd
[root@server1 ~]# systemctl enable pcsd
[root@server1 ~]# passwd hacluster ##设置hacluster用户密码,主备master必须相同
Changing password for user hacluster.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
bankup-mfsmaster配置(serve5):
[root@server5 ~]# yum install -y pacemaker corosync pcs
[root@server5 ~]# systemctl start pcsd
[root@server5 ~]# systemctl enable pcsd
[root@server5 ~]# passwd hacluster ##设置hacluster用户密码,主备master必须相同
Changing password for user hacluster.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
主masetr配置 Corosync
hacluster 用户就是做统一的集群管理用的,这里配置corosync就是用到这个用户,配置完成后生成corosync.conf 发送到各个节点上
hacluster负责完成集群中的节点认证:
[root@server1 ~]# pcs cluster auth server1 server5
Username: hacluster ##输入hacluster 用户
Password: ##输入上面设置的密码
server5: Authorized
server1: Authorized
[root@server1 ~]# pcs cluster setup --name mycluster server1 server5 ##创建集群
[root@server1 ~]# pcs cluster start --all ##开启集群
[root@server1 ~]# pcs status nodes ##查看节点状态
[root@server1 ~]# corosync-cfgtool -s ##验证corosync是否正常
[root@server1 ~]# pcs status corosync ##查看corosync状态
在我们做出任何改变之前,最好检查配置文件:crm_verify -L -V
[root@server1 ~]# pcs property set stonith-enabled=false ##禁用stonith设备(如果有stonith设备,最好禁用)否则在crm_verify检测的时候会报错
[root@server1 ~]# crm_verify -L -V
配置mfsmaster高可用(主/备)
添加vip
首先要做的是配置一个IP地址,不管集群服务在哪运行,我们要一个固定的地址来提供服务。在这里我选择172.25.81.100作为浮动IP,给它取名为 vip并且告诉集群每30秒检查它一次。
[root@server1 ~]# pcs resource create vip ocf:heartbeat:IPaddr2 ip=172.25.81.100 cidr_netmask=32 op monitor interval=30s
ocf:heartbeat:IPaddr2 这告诉Pacemaker三件事情,第一个部分ocf,指明了这个资源采用的标准(类型)以及在哪能找到 它。第二个部分标明这个资源脚本的在ocf中的名字空间,在这个例子中是heartbeat。最后一个部分指明了资源脚本的名称。
[root@server1 ~]# pcs resource show ##查看我们已经创建好的资源,一个vip现在已经在server1 上运行
在server1上查看ip:发现vip现在已经在server1 上运行
在server5上实时查看集群状态:
[root@server5 ~]# crm_mon
关闭master查看故障的自动迁移情况:
[root@server1 ~]# pcs cluster stop server1 ##关闭master
通过监控可以看出vip已经自动漂移到了server5上
重新开启刚关闭的master,查看资源:
[root@server1 ~]# pcs cluster start server1
可以看出vip依旧在backup-master上,不会发生资源的抢占
存储共享
先恢复环境,写好解析:
客户端(物理机):
[root@foundation81 ~]# umount /mnt/mfs
[root@foundation81 ~]# umount /mnt/mfsmeta
[root@foundation81 ~]# vim /etc/hosts
172.25.81.1 server1
172.25.81.100 mfsmaster
master端(server1):
[root@server1 ~]# systemctl stop moosefs-master
[root@server1 ~]# vim /etc/hosts
172.25.81.1 server1
172.25.81.100 mfsmaster
backup-master端(server5)
[root@server5 ~]# vim /etc/hosts
172.25.81.1 server1
172.25.81.100 mfsmaster
chunk server端(server3 server4)
[root@server3 ~]# systemctl stop moosefs-chunkserver
[root@server3 ~]# vim /etc/hosts
172.25.81.1 server1
172.25.81.100 mfsmaster
給chunkserver的某一节点(server3)添加一块虚拟磁盘
[root@server3 ~]# fdisk -l ##查看虚拟磁盘的添加情况
在server3上安装并配置iscsi
[root@server3 ~]# yum install -y targetcli
[root@server3 ~]# systemctl start target
[root@server3 ~]# targetcli
/> cd /backstores/block
/backstores/block> create my_disk1 /dev/vdb
/backstores/block> cd /iscsi
/iscsi> create iqn.2019-04.com.example:server3
/iscsi> cd iqn.2019-04.com.example:server3
/iscsi/iqn.20...ample:server3> cd tpg1/luns
/iscsi/iqn.20...er3/tpg1/luns> create /backstores/block/my_disk1
/iscsi/iqn.20...er3/tpg1/luns> cd ../acls
/iscsi/iqn.20...er3/tpg1/acls> create iqn.2019-04.com.example:client
/> exit
在master上安装iscsi客户端软件
[root@server1 ~]# yum install -y iscsi-*
[root@server1 ~]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2019-04.com.example:client
[root@server1 ~]# iscsiadm -m discovery -t st -p 172.25.81.3 ##发现远程设备
[root@server1 ~]# iscsiadm -m node -l ##登录
当有以下报错出现时,可以尝试重启服务重新登录
[root@server1 ~]# fdisk -l ##查看远程共享出来的磁盘
[root@server1 ~]# fdisk /dev/sdb ##对共享磁盘建立分区
Command (m for help): n
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048):
Using default value 2048Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039):
Using default value 41943039
Partition 1 of type Linux and of size 20 GiB is setCommand (m for help): wq
[root@server1 ~]# mkfs.xfs /dev/sdb1 ##格式化分区
生产环境中一般只对磁盘分一个区,原因是在不小心破坏了该分区时,可以通过简单的操作恢复分区。
模拟分区被破坏的情况:
[root@server1 ~]# dd if=/dev/zero of=/dev/sdb bs=512 count=1 ##清空磁盘的512个字节
[root@server1 ~]# fdisk -l /dev/sdb ##fdisk -l查看磁盘发现分区消失了
使用磁盘分区时也报分区不存在的错误
恢复该分区的方法:
因为我们把/dev/sda下的所有空间都分给了/dev/sdb1,所以我们只需要重新建立分区即可,但是需要注意不能对该新建的分区进行格式化,否则会丢失所有的数据。
此时发现该分区可以使用了
[root@server1 ~]# mount /dev/sdb1 /mnt
[root@server1 ~]# cp -p /var/lib/mfs/* /mnt/ ##带权限拷贝/var/lib/mfs的所有数据文件到/dev/sdb1上
[root@server1 mnt]# chown mfs.mfs /mnt/ ##当目录属于mfs用户和组时,才能正常使用
[root@server1 /]# umount /mnt/
[root@server1 /]# mount /dev/sdb1 /var/lib/mfs/
[root@server1 /]# systemctl start moosefs-master ##服务开启成功,就说明数据文件拷贝成功,共享磁盘可以正常使用
[root@server1 /]# systemctl stop moosefs-master
配置backup-master,使之也可以使用共享磁盘:
[root@server5 ~]# yum install -y iscsi-*
[root@server5 ~]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2019-04.com.example:client
[root@server5 ~]# iscsiadm -m discovery -t st -p 172.25.81.3
[root@server5 ~]# iscsiadm -m node -l
[root@server5 ~]# fdisk -l ##查看该共享磁盘的分区
[root@server5 ~]# mount /dev/sdb1 /var/lib/mfs/
[root@server5 ~]# systemctl start moosefs-master ##同样进行测试
[root@server5 ~]# systemctl stop moosefs-master
在master上创建mfs文件系统
[root@server1 /]# pcs resource create mfsdata ocf:heartbeat:Filesystem device=/dev/sdb1 directory=/var/lib/mfs fstype=xfs op monitor interval=30s
[root@server5 ~]# crm_mon ##查看监控可以发现两个资源分布在不同的主机上
[root@server1 ~]# pcs resource create mfsd systemd:moosefs-master op monitor interval=1min
把vip,mfsdata,mfsd 同步在一个组中
[root@server1 ~]# pcs resource group add mfsgroup vip mfsdata mfsd
此时查看监控可以发现所有资源分布在一台主机上
[root@server5 ~]# pcs cluster stop server5 ##down掉当前工作的mster
所有资源会迁移到Online的master上:
[root@server5 ~]# pcs cluster start server5
当master恢复正常后,也不会发生资源的争抢
fence解决脑裂问题
(1)先在客户端测试mfsmaster的热备
打开chunkserver服务
[root@server3 ~]# systemctl start moosefs-chunkserver
[root@server4 ~]# systemctl start moosefs-chunkserver
查看当前vip的位置:
在客户端进行分布式存储测试:
[root@foundation81 ~]# mfsmount
测试:
在客户端上传一个大文件,同时关闭正在提供服务的master端,查看客户端上传文件是否能成功。
[root@foundation81 dir1]# dd if=/dev/zero of=file1 bs=1M count=2000
[root@foundation81 ~]# cd /mnt/mfs
[root@foundation81 mfs]# cd dir1/
[root@foundation81 dir1]# dd if=/dev/zero of=file1 bs=1M count=2000
[root@server1 ~]# pcs cluster stop server1
[root@foundation81 dir1]# mfsfileinfo file1 ##查看到文件上传成功,并没有受到影响
通过以上实验我们发现,当master挂掉之后,backup-master会立刻接替master的工作,保证客户端可以进行正常访问,但是,当master重新运行时,我们不能保证master是否会抢回自己的工作,从而导致master和backup-master同时修改同一份数据文件从而发生脑裂,此时fence就派上用场了。
在两个master节点上安装fence服务
[root@server1 ~]# yum install -y fence-virt
[root@server1 ~]# mkdir /etc/cluster
[root@server5 ~]# yum install -y fence-virt
[root@server5 ~]# mkdir /etc/cluster
在客户端生成一份fence密钥文件,传给服务端
[root@foundation81 ~]# yum install -y fence-virtd fence-virtd-libvirt fence-virtd-multicast
[root@foundation81 ~]# fence_virtd -c
Module search path [/usr/lib64/fence-virt]:
Listener module [multicast]:
Multicast IP Address [225.0.0.12]:
Multicast IP Port [1229]:
Interface [virbr0]: br0 # 注意此处要修改接口,必须与本机一致
Key File [/etc/cluster/fence_xvm.key]:
Backend module [libvirt]:
Replace /etc/fence_virt.conf with the above [y/N]? y
[root@foundation81 ~]# mkdir /etc/cluster ##存放密钥文件的目录,需要自己手动建立
[root@foundation81 ~]# dd if=/dev/urandom of=/etc/cluster/fence_xvm.key bs=128 count=1 ##采集随机信息到密钥文件中
[root@foundation81 ~]# systemctl start fence_virtd ##启动服务
[root@foundation81 ~]# netstat -anultp | grep :1229
将生成的密钥文件传给server1和server5
[root@foundation81 ~]# scp /etc/cluster/fence_xvm.key root@172.25.81.1:/etc/cluster/
[root@foundation81 ~]# scp /etc/cluster/fence_xvm.key root@172.25.81.5:/etc/cluster/
查看主机域名:
在master查看监控crm_mon :显示的是主机名(hostname)
[root@server1 ~]# cd /etc/cluster/
[root@server1 cluster]# pcs stonith create vmfence fence_xvm pcmk_host_map="base2:base2;base5:base5" op monitor interval=1min
[root@server1 cluster]# pcs property set stonith-enabled=true
[root@server1 cluster]# crm_verify -L -V
通常fence都运行在当前处于服务状态的master的另一端
使server1内核崩溃,模拟当前处于服务端的master服务down掉
[root@server1 ~]# echo c >/proc/sysrq-trigger
查看监控,server5会立刻接管所有服务
查看监控发现,server1重启成功之后,并不会抢占资源,服务依旧在server5端正常运行,说明fence生效
注意:当服务主机全部关机之后需要先启动iscsi的服务端主机并开启iscsi服务才能启动两台master主机,否则master主机起不来。
[root@server3 ~]# systemctl start target
然后挂载两台master的共享磁盘到/var/lib/mfs目录下就可以正常使用了。