目录
一、moosefs(mfs)
1.什么是mfs?
MooseFS是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
2.常规特征
- 分层次的结构(目录树)
- 存储POSIX文件属性(权限、最后访问和修改时间)
- 支持特殊文件(块和字符设备、管道以及套接字)
- 符号连接和硬连接
- 对文件系统的访问可以通过IP地址和(或者)密码进行限制
3.独有特征
- 高可靠(数据的多个拷贝被存储在不同的计算机上)
- 通过附加新的计算机或者硬盘可以实现容量的动态扩展
- 删除的文件可以根据一个可配置的时间周期进行保留(一个文件系统级别的回收站)
- 不受访问和写入影响的文件连贯快照
4.体系机构
1、管理服务器(master server)
一台管理整个文件系统的独立主机,存储着每个文件的元数据(文件的大小、属性、位置信息,包括所有非常规文件的所有信息,例如目录、套接字、管道以及设备文件)
2、数据服务器群(chunk servers)
任意数目的商用服务器,用来存储文件数据并在彼此之间同步(如果某个文件有超过一个备份的话)
3、元数据备份服务器(metalogger server)
任意数量的服务器,用来存储元数据变化日志并周期性下载主要元数据文件,以便用于管理服务器意外停止时好接替其位置。
4、访问mfs的客户端
任意数量的主机,可以通过mfsmount进程与管理服务器(接收和更改元数据)和数据服务器(改变实际文件数据)进行交流。
二、部署moosefs(mfs)
环境:
mfs1 | mfs_master | 172.25.1.1 |
mfs2 | mfs_chunkserver | 172.25.1.2 |
mfs3 | mfs_chunkserver | 172.25.1.3 |
mfs4 | metalogger server | 172.25.1.4 |
orange | client | 172.25.1.254 |
软件下载: mfs ===> 点击下载 提取码: 7a58
开始部署之前所有主机一定要做好解析,可以将下面这个文件scp到其他节点
[root@mfs1 ~]# vim /etc/hosts
172.25.1.1 mfs1 mfsmaster
172.25.1.2 mfs2
172.25.1.3 mfs3
172.25.1.4 mfs4
1.mfs1节点
[root@hadoop 3.0.103]# ls
moosefs-cgi-3.0.103-1.rhsystemd.x86_64.rpm ##监控mfs
moosefs-cgiserv-3.0.103-1.rhsystemd.x86_64.rpm ##显示监控mfs的web端
moosefs-chunkserver-3.0.103-1.rhsystemd.x86_64.rpm ##数据存储节点软件包
moosefs-cli-3.0.103-1.rhsystemd.x86_64.rpm ##命令行
moosefs-client-3.0.103-1.rhsystemd.x86_64.rpm ##客户端
moosefs-master-3.0.103-1.rhsystemd.x86_64.rpm ##master端
moosefs-metalogger-3.0.103-1.rhsystemd.x86_64.rpm ##元数据端
[root@hadoop 3.0.103]# yum install moosefs-cgi-3.0.103-1.rhsystemd.x86_64.rpm moosefs-cgiserv-3.0.103-1.rhsystemd.x86_64.rpm moosefs-cli-3.0.103-1.rhsystemd.x86_64.rpm moosefs-master-3.0.103-1.rhsystemd.x86_64.rpm -y
moosefs的配置文件在/etc/mfs下,元数据存储在/var/lib/mfs下
root@mfs1 ~]# ll /var/lib/mfs/
total 12
-rw-r----- 1 mfs mfs 45 Apr 9 08:26 changelog.0.mfs
-rw-r--r-- 1 mfs mfs 8 Apr 9 08:07 metadata.mfs.back
-rw-r--r-- 1 mfs mfs 8 Nov 23 07:46 metadata.mfs.empty
[root@mfs1 ~]# systemctl stop moosefs-master
[root@mfs1 ~]# ll /var/lib/mfs/
total 3608
-rw-r----- 1 mfs mfs 45 Apr 9 08:26 changelog.1.mfs
-rw-r----- 1 mfs mfs 120 Apr 9 08:28 metadata.crc
-rw-r----- 1 mfs mfs 2901 Apr 9 08:28 metadata.mfs
-rw-r--r-- 1 mfs mfs 8 Apr 9 08:07 metadata.mfs.back.1
-rw-r--r-- 1 mfs mfs 8 Nov 23 07:46 metadata.mfs.empty
-rw-r----- 1 mfs mfs 3672832 Apr 9 08:28 stats.mfs
如上面代码框,当我们开启moosefs-master服务后,服务会读取metadata.mfs并将其变为metadata.mfs.back,停掉moosefs-master服务,又会变成metadata.mfs,metadata.mfs是存放元数据的文件
接下来开启mfsmaster
[root@mfs1 ~]# systemctl start moosefs-master
2.mfs2节点
[root@mfs2 3.0.103]# yum install moosefs-chunkserver-3.0.103-1.rhsystemd.x86_64.rpm -y
建立数据存储用的文件夹
[root@mfs2 3.0.103]# mkdir /mnt/chunk1
[root@mfs2 3.0.103]# ll -d /mnt/chunk1/
drwxr-xr-x 2 root root 6 Apr 9 08:43 /mnt/chunk1/
[root@mfs2 3.0.103]# chown mfs.mfs /mnt/chunk1/
[root@mfs2 3.0.103]# cd /etc/mfs/
[root@mfs2 mfs]# vim mfshdd.cfg ##在这里面写了,数据就会存到这里
/mnt/chunk1
接下来开启moosefs-chunkserver
[root@mfs2 mfs]# systemctl start moosefs-chunkserver
文件存储是以块的形式存在的,共256个块,一个块是128m
3.使用cgi-server在web端查看mfs存储
[root@mfs1 ~]# systemctl start moosefs-cgiserv
浏览器访问http://172.25.1.1:9425/mfs.cgi
4.添加mfs3存储节点
[root@mfs3 3.0.103]# yum install moosefs-chunkserver-3.0.103-1.rhsystemd.x86_64.rpm -y
[root@mfs3 3.0.103]# mkdir /mnt/chunk2
[root@mfs3 3.0.103]# vim /etc/mfs/mfshdd.cfg
/mnt/chunk2
[root@mfs3 3.0.103]# chown mfs.mfs /mnt/chunk2
[root@mfs3 3.0.103]# systemctl start moosefs-chunkserver
5.客户端应用
[root@nelws 3.0.103]# yum install moosefs-client-3.0.103-1.rhsystemd.x86_64.rpm -y
新建挂载mfs存储
[root@nelws ~]# mkdir /mnt/mfs
[root@nelws ~]# vim /etc/hosts
172.25.1.1 mfs1 mfsmaster
172.25.1.2 mfs2
172.25.1.3 mfs3
172.25.1.4 mfs4
[root@nelws ~]# cd /etc/mfs/
[root@nelws mfs]# vim mfsmount.cfg ##挂载mfs到/mnt/mfs下
/mnt/mfs
[root@nelws mfs]# mfsmount
客户端基本操作
[root@nelws mfs]# mkdir dir1
[root@nelws mfs]# mfsgetgoal dir1 ##显示为2意味着数据是在两个节点存储的
dir1: 2
[root@nelws mfs]# mkdir dir2
[root@nelws mfs]# mfsgetgoal dir2
dir2: 2
我们也可以设置某个文件夹只在一个节点存储数据
[root@nelws mfs]# mfssetgoal -r 1 dir1/
dir1/:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
[root@nelws mfs]# mfsgetgoal dir1
dir1: 1
我们尝试这拷贝数据进来,然后查看是存储在哪个节点
[root@nelws mfs]# cp /etc/passwd dir1/
[root@nelws mfs]# cp /etc/fstab dir2/
[root@nelws mfs]# mfsfileinfo dir1/passwd
dir1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 172.25.1.3:9422 (status:VALID)
[root@nelws mfs]# mfsfileinfo dir2/fstab
dir2/fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.1.2:9422 (status:VALID)
copy 2: 172.25.1.3:9422 (status:VALID)
如上,dir1下的文件只存储在mfs3节点,dir2下的文件储存在mfs2和mfs3节点,此时我们停掉mfs3会怎么样呢?
[root@mfs3 3.0.103]# systemctl stop moosefs-chunkserver
此时passwd文件就无法查看了,而fstab还可以查看,这就是分布式的好处,到这里,一个简单的mfs就部署好了
三、mfs回收站机制
当我们删除了一个文件,又想恢复怎么办呢?
[root@nelws mfs]# mfsgettrashtime . ##一个文件默认的缓存是24天
.: 86400
这里模拟删除了passwd
[root@nelws mfs]# mkdir /mnt/mfsmeta
[root@nelws mfs]# mfsmount -m /mnt/mfsmeta/ -H mfsmaster
mfsmaster accepted connection with parameters: read-write,restricted_ip
[root@nelws mfs]# cd /mnt/mfsmeta/trash/
[root@nelws trash]# find -name *passwd*
./004/00000004|dir1|passwd
[root@nelws trash]# mv 00000004\|dir1\|passwd undel/
[root@nelws trash]# ll /mnt/mfs/dir1/
total 3
-rw-r--r-- 1 root root 2309 Apr 9 09:41 passwd
如上图,这样就可以找回
只要master节点不关掉,数据不会丢失,master节点宕掉后会发生数据丢失,所以我们需要做双机热备
四、双机热备高可用
这里为了实验更好的开展,修改了master的启动脚本
[root@mfs1 ~]# 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 ##这里改为-a,master非正常关闭时就可以直接开启了
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@mfs1 ~]# systemctl daemon-reload ##重新加载脚本
还有就是mfs4的解析一定要做好,也要安装好moosefs-master软件
1.配置yum源(对mfs1和mfs4都要进行配置)
[root@mfs1 ~]# vim /etc/yum.repos.d/yum.repo ##添加以下内容
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.1.254/rhel7.3/addons/HighAvailability
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.1.254/rhel7.3/addons/ResilientStorage
gpgcheck=0
2.安装热备软件(对mfs1和mfs4都要进行配置)
[root@server1 yum.repos.d]# yum install -y pacemaker corosync
[root@server1 yum.repos.d]# yum install pcs -y
3.server1和server4做免密
先做ssh免密
[root@mfs1 ~]# ssh-keygen ##如果已经有密钥,可以跳过这一步
[root@mfs1 ~]# ssh-copy-id mfs4
[root@mfs1 ~]# ssh-copy-id mfs1
开启pcsd服务(mfs4也要做),修改用户名密码(mfs4也要做)
[root@mfs1 ~]# systemctl start pcsd
[root@mfs1 ~]# systemctl enable pcsd
[root@mfs1 ~]# passwd hacluster
创建集群并启动
认证
[root@mfs1 ~]# pcs cluster auth mfs1 mfs4
Username: hacluster
Password:
mfs4: Authorized
mfs1: Authorized
pcs启动命令
[root@mfs1 ~]# pcs cluster setup --name mycluster mfs1 mfs4 ##设置集群
Destroying cluster on nodes: mfs1, mfs4...
mfs1: Stopping Cluster (pacemaker)...
mfs4: Stopping Cluster (pacemaker)...
mfs4: Successfully destroyed cluster
mfs1: Successfully destroyed cluster
Sending cluster config files to the nodes...
mfs1: Succeeded
mfs4: Succeeded
Synchronizing pcsd certificates on nodes mfs1, mfs4...
mfs4: Success
mfs1: Success
Restarting pcsd on the nodes in order to reload the certificates...
mfs4: Success
mfs1: Success
[root@mfs1 ~]# pcs cluster start --all ##开启集群内所有结点
mfs1: Starting Cluster...
mfs4: Starting Cluster...
[root@mfs1 ~]# pcs status nodes ##显示所有集群集节点
Pacemaker Nodes:
Online: mfs1 mfs4
Standby:
Maintenance:
Offline:
Pacemaker Remote Nodes:
Online:
Standby:
Maintenance:
Offline:
[root@mfs1 ~]# pcs status corosync ##查看corosync状态
Membership information
----------------------
Nodeid Votes Name
1 1 mfs1
2 1 mfs4 (local)
查看是否有错误,注意这里mfs1和mfs4都需要检查一下是不是有下面的错误
[root@mfs1 ~]# journalctl | grep -i error ##过滤日志中的错误
[root@mfs1 ~]# crm_verify -L -V ##根据错误提示,运行这个
error: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
error: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option
error: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity
Errors found during check: config not valid
[root@mfs1 ~]# pcs property set stonith-enabled=false ##修正错误
[root@mfs1 ~]# crm_verify -L -V ##再次查看
[root@mfs1 ~]# ##没有错误了
4.添加资源
查看资源:
pcs resource standards
pcs resource providers
pcs resource agents ocf:heartbeat
我们可以使用crm_mon命令进行监控,下图为监控界面,没有添加资源的监控图
接下来添加资源
[root@mfs1 3.0.103]# pcs resource create vip ocf:heartbeat:IPaddr2 ip=172.25.1.100 cidr_netmask=32 op monitor interval=30s
查看资源
现在在看crm_mon监控
vip有了
5.进行测试
此时我的vip是在mfs1上面的
接下来我故意停掉mfs1
[root@mfs1 3.0.103]# pcs cluster stop mfs1
mfs1: Stopping Cluster (pacemaker)...
mfs1: Stopping Cluster (corosync)...
会发现监控
vip成功的漂移到了mfs4,实现了高可用,mfs存储依旧是在线的
当我们把mfs1节点重新开启的时候,vip也不会漂移回mfs1
五、iscsi存储方式的mfs
1.清理之前的环境
客户端
[root@nelws ~]# umount /mnt/mfsmeta
master端
[root@mfs4 pcsd]# systemctl stop moosefs-master
chunkserver端
[root@mfs2 ~]# systemctl stop moosefs-chunkserver
[root@mfs3 ~]# systemctl stop moosefs-chunkserver
2.在所有主机添加解析
[root@mfs1 3.0.103]# vim /etc/hosts ##将mfs的解析单独列出
172.25.1.1 mfs1
172.25.1.100 mfsmaster
172.25.1.2 mfs2
172.25.1.3 mfs3
172.25.1.4 mfs4
然后通过scp的方式传到剩余的主机
3.建立iscsi存储
首先在mfs2上添加虚拟硬盘
查看硬盘
[root@mfs2 ~]# fdisk -l
Disk /dev/vda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
安装软件配置存储
[root@mfs2 ~]# yum install -y targetcli
[root@mfs2 ~]# targetcli
/> ls
o- / .................................................................... [...]
o- backstores ......................................................... [...]
| o- block ............................................. [Storage Objects: 0]
| o- fileio ............................................ [Storage Objects: 0]
| o- pscsi ............................................. [Storage Objects: 0]
| o- ramdisk ........................................... [Storage Objects: 0]
o- iscsi ....................................................... [Targets: 0]
o- loopback .................................................... [Targets: 0]
/> cd backstores/block
/backstores/block> create my_disk1 /dev/vda
Created block storage object my_disk1 using /dev/vda.
/backstores/block> cd /iscsi
/iscsi> create iqn.2019-04.com.example:mfs2
Created target iqn.2019-04.com.example:mfs2.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/iscsi> cd iqn.2019-04.com.example:mfs2/tpg1/luns
/iscsi/iqn.20...fs2/tpg1/luns> create /backstores/block/my_disk1
/iscsi/iqn.20...fs2/tpg1/luns> cd ../acls
/iscsi/iqn.20...fs2/tpg1/acls> create iqn.2019-04.com.example:client
Created Node ACL for iqn.2019-04.com.example:client
Created mapped LUN 0.
在mfs1端
[root@mfs1 3.0.103]# yum install -y iscsi-*
[root@mfs1 3.0.103]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2019-04.com.example:client
[root@mfs1 ~]# iscsiadm -m discovery -t st -p 172.25.1.2
172.25.1.2:3260,1 iqn.2019-04.com.example:mfs2
[root@mfs1 ~]# iscsiadm -m node -l
Logging in to [iface: default, target: iqn.2019-04.com.example:mfs2, portal: 172.25.1.2,3260] (multiple)
Login to [iface: default, target: iqn.2019-04.com.example:mfs2, portal: 172.25.1.2,3260] successful.
建立分区并格式化
[root@mfs1 ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x25e0b294.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last 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 set
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x25e0b294
Device Boot Start End Blocks Id System
/dev/sdb1 2048 41943039 20970496 83 Linux
Command (m for help): wq
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.[root@mfs1 ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=1310656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242624, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
挂载
[root@mfs1 ~]# mount /dev/sdb1 /mnt/
[root@mfs1 ~]# cd /var/lib/mfs/
[root@mfs1 mfs]# cp -p * /mnt
[root@mfs1 mfs]# cd /mnt
[root@mfs1 mnt]# chown mfs.mfs /mnt/
[root@mfs1 mnt]# cd
[root@mfs1 ~]# umount /mnt
[root@mfs1 ~]# mount /dev/sdb1 /var/lib/mfs
[root@mfs1 ~]# systemctl start moosefs-master
[root@mfs1 ~]# systemctl stop moosefs-master
在mfs4端也挂载
[root@mfs4 pcsd]# yum install -y iscsi-*
[root@mfs4 pcsd]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2019-04.com.example:client
[root@mfs4 pcsd]# vim /etc/iscsi/initiatorname.iscsi
[root@mfs4 pcsd]# iscsiadm -m discovery -t st -p 172.25.1.2
172.25.1.2:3260,1 iqn.2019-04.com.example:mfs2
[root@mfs4 pcsd]# iscsiadm -m node -l
Logging in to [iface: default, target: iqn.2019-04.com.example:mfs2, portal: 172.25.1.2,3260] (multiple)
Login to [iface: default, target: iqn.2019-04.com.example:mfs2, portal: 172.25.1.2,3260] successful.
[root@mfs4 pcsd]# mount /dev/sdb1 /var/lib/mfs
[root@mfs4 pcsd]# systemctl start moosefs-master
[root@mfs4 pcsd]# systemctl stop moosefs-master
再次创建资源,注意要在mfsmaster上
[root@mfs4 pcsd]# pcs resource create mfsdata ocf:heartbeat:Filesystem device=/dev/sdb1 directory=/var/lib/mfs fstype=xfs op monitor interval=30s
[root@mfs4 pcsd]# pcs resource create mfsd systemd:moosefs-master op monitor interval=1min
[root@mfs4 pcsd]# pcs resource group add mfsgroup vip mfsdata mfsd
4.测试
我们停掉mfs4,来测试
[root@mfs4 pcsd]# pcs cluster stop mfs4
mfs4: Stopping Cluster (pacemaker)...
mfs4: Stopping Cluster (corosync)...
查看监控
六、fence
配置fence是为了防止脑裂情况的出现
1.server1,server4安装fence-virt
[root@mfs1 3.0.103]# yum install -y fence-virt
[root@mfs1 3.0.103]# pcs stonith list
fence_virt - Fence agent for virtual machines
fence_xvm - Fence agent for virtual machines
2.客户端安装 fence-virtd,并做配置
[root@nelws ~]# yum install -y fence-virtd
[root@nelws ~]# mkdir /etc/cluster
[root@nelws ~]# cd /etc/cluster
[root@nelws cluster]# fence_virtd -c
Interface [virbr0]: br0 ##注意br0需要修改,其余回车即可
[root@nelws cluster]# dd if=/dev/urandom of=fence_xvm.key bs=128 count=1
1+0 records in
1+0 records out
128 bytes (128 B) copied, 0.000109645 s, 1.2 MB/s
[root@nelws cluster]# ls
fence_xvm.key
[root@nelws cluster]# scp fence_xvm.key mfs1:
[root@nelws cluster]# scp fence_xvm.key mfs4:
[root@nelws cluster]# systemctl start fence_virtd ##死活起不来
这里我遇到了一个问题就是我无论如何都启动不起来fence_virtd,后来发现是因为fence组件缺失
[root@nelws cluster]# yum install fence-virtd-libvirt
[root@nelws cluster]# yum install fence-virtd-multicast -y
[root@nelws cluster]# fence_virtd -c
[root@nelws cluster]# systemctl start fence_virtd
ok了
在mfs1上继续进行配置策略
未完待续