MooseFS(下面统一称为MFS)由波兰公司Gemius SA于2008年5月30日正式推出的一款Linux下的开源存储系统,是OpenStack开源云计算项目的子项目之一,被称为对象存储,提供了强大的扩展性、高可靠性和持久性。它能够将文件分布存储于不同的物理机器上,对外却提供的是一个透明的接口的存储资源池。它还具有在线扩展、文件切块存储、节点无单点故障、读写效率高等特点。
MFS分布式文件系统由元数据服务器(Master Server)、元数据日志服务器(Metalogger Server)、数据存储服务器(Chunk Server)、客户端(Client)组成
(1)元数据服务器:MFS系统中的核心组成部分,存储每个文件的元数据,负责文件的读写调度、空间回收和在多个chunk server之间的数据拷贝等。目前MFS仅支持一个元数据服务器,因此可能会出现单点故障。针对此问题我们需要用一台性能很稳定的服务器来作为我们的元数据服务器,这样可以降低出现单点故障的概率。
(2) 元数据日志服务器:元数据服务器的备份节点,按照指定的周期从元数据服务器上将保存元数据、更新日志和会话信息的文件下载到本地目录下。当元数据服务器出现故障时,我们可以从该服务器的文件中拿到相关的必要的信息对整个系统进行恢复。
此外,利用元数据进行备份是一种常规的日志备份手段,这种方法在某些情况下并不能完美的接管业务,还是会造成数据丢失。
(3) 数据存储服务器:负责连接元数据管理服务器,听从元数据服务器的调度,提供存储空间,并为客户端提供数据传输,MooseFS提供一个手动指定每个目录的备份个数。假设个数为n,那么我们在向系统写入文件时,系统会将切分好的文件块在不同的chunk server上复制n份。备份数的增加不会影响系统的写性能,但是可以提高系统的读性能和可用性,这可以说是一种以存储容量换取写性能和可用性的策略。
(4) 客户端:使用mfsmount的方式通过FUSE内核接口挂接远程管理服务器上管理的数据存储服务器到本地目录上,然后就可以像使用本地文件一样来使用我们的MFS文件系统了。
MFS读文件工作步骤:
① MFS客户端向系统的元数据管理服务器提交读取文件的任务请求;
② 元数据服务器检索自己的数据并把数据所存放的位置发给客户端;
③ 客户端接收到元数据管理服务器返回的信息后,向已知的数据存储服务器发送数据请求。
MFS写文件工作步骤:
① MFS的客户端有数据写需求时,首先向元数据管理服务器提交些文件的任务请求;
② 元数据管理服务器接收到客户端请求后在数据服务器创建新的Chunk文件块;
③ 数据服务器将创建成功的消息返回给元数据管理服务器;
④ 元数据管理服务器将数据服务器的地址返回给客户端;
⑤ 客户端直接向已知的数据服务器写数据;
⑥ 数据服务器将写文件成功的消息返回给客户端;
⑦ 客户端将此次写完成的信号发送给元数据管理服务器。
Free(GPL)
通用文件系统,不需要修改上层应用就可以使用
可以在线扩容,体系架构可伸缩性极强。
部署简单。
高可用,可设置任意的文件冗余程度(提供比 raid1+0 更高的冗余级别,而绝对不会影响读或
写的性能,只会加速!)
可回收在指定时间内删除的文件( “ 回收站 ” 提供的是系统级别的服务,不怕误操作了,提供类
似 oralce 的闪回等高级 dbms 的即时回滚特性!)
提供 netapp,emc,ibm 等商业存储的 snapshot 特性。(可以对整个文件甚至在正在写入的文
件创建文件的快照)
google filesystem 的一个 c 实现。
提供 web gui 监控接口。
提高随机读或写的效率。
提高海量小文件的读写效率。
1 环境部署
IP | hostname | role |
172.25.1.2 | server2 | MFS Master |
172.25.1.5 | server5 | MFS Metalogger |
172.25.1.3 | server3 | MFS Chunkserver1 |
172.25.1.4 | server4 | MFS Chunkserver1 |
172.25.1.11 | server1 | MFS Client |
2 实验部署
1) MASRER(serever2)
软件安装
yum install -y moosefs-cgi-3.0.97-1.rhsysv.x86_64.rpm
moosefs-cgiserv-3.0.97-1.rhsysv.x86_64.rpm
moosefs-master-3.0.97-1.rhsysv.x86_64.rpm
rpm -ivh moosefs-cli-3.0.97-1.rhsysv.x86_64.rpm
主机解析
vim /etc/hosts
172.25.1.2 server2 mfsmaster
服务启动
/etc/init.d/moosefs-master start
/etc/init.d/moosefs-cgiserv start #启动CGI监控
在浏览器输入http://172.25.1.2:9425 查看master的状态
2 )元数据日志服务器 Metalogger server 安装
yum install -y moosefs-metalogger-3.0.80-1.x86_64.rpm
主机解析
vim /etc/hosts
172.25.1.2 server2 mfsmaster
服务启动
/etc/init.d/mfsmetalogger start
3 )存储块服务器 Chunk servers 安装
server3:
yum install -y moosefs-chunkserver-3.0.97-1.rhsysv.x86_64.rpm
主机解析
vim /etc/hosts
172.25.1.2 server2 mfsmaster
数据存放目录
mkdir /mnt/chunk1
chown mfs.mfs /mnt/chunk1 #存储是mfs的块文件
echo '/mnt/chunk1'>> /etc/mfs/mfshdd.cfg #定义mfs共享点
启动服务
/etc/init.d/moosefs-chunkserver start
server4:
yum install -y moosefs-chunkserver-3.0.97-1.rhsysv.x86_64.rpm
主机解析
vim /etc/hosts
172.25.1.2 server2 mfsmaster
数据存放目录
mkdir /mnt/chunk2
chown mfs.mfs /mnt/chunk2
echo '/mnt/chunk2'>> /etc/mfs/mfshdd.cfg #定义mfs共享点
启动服务
/etc/init.d/moosefs-chunkserver start
4 )客户端 client 安装
yum install -y moosefs-client-3.0.97-1.rhsystemd.x86_64.rpm
本地解析
vim /etc/hosts
172.25.1.2 server2 mfsmaster
定义客户端默认挂载
vim /etc/mfs/mfsmount.cfg
mfsmaster=mfsmaster
/mnt/mfs
挂载目录
[root@server1 ~]# mfsmount /mnt/mfs/
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
5)keepalived 服务配置(master)
1 keepalived 配置文件修改
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MFS_HA_MASTER #MASTER
# router_id LVS_DEVEL
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_script chk_mfs {
script "/usr/local/mfs/keepalived_check_mfsmaster.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 39
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_mfs
}
virtual_ipaddress {
172.25.1.100
}
}
notify_master "/etc/keepalived/clean_arp.sh 172.25.1.100"
2 编写监控脚本
mkdir -p /usr/local/mfs/
vim /usr/local/mfs/Palmolive_check_mfsmaster.sh
#!/bin/bash
STATUS=`ps -C mfsmaster --no-header | wc -l`
if [ $STATUS -eq 0 ];then
mfsmaster start
sleep 3
if [ `ps -C mfsmaster --no-header | wc -l ` -eq 0 ];then
/usr/bin/killall -9 mfscgiserv
/usr/bin/killall -9 keepalived
fi
fi
chmod +x /usr/local/mfs/keepalived_check_mfsmaster.sh
3 设置更新虚拟服务器(VIP)地址的arp记录到网关脚本
#!/bin/sh
VIP=$1
GATEWAY=172.25.1.250
/sbin/arping -I eth0 -c 5 -s $VIP $GATEWAY &>/dev/null
/bin/sh /usr/local/mfs/MFS_DATA_Sync.sh
chmod +x /etc/keepalived/clean_arp.sh
4 本地解析
vim /etc/hosts
172.25.1.100 mfsmaster
5 启动服务
[root@server2 yum.repos.d]# ip addr show
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:70:2c:af brd ff:ff:ff:ff:ff:ff
inet 172.25.1.2/24 brd 172.25.1.255 scope global eth0
inet 172.25.1.100/32 scope global eth0
inet6 fe80::5054:ff:fe70:2caf/64 scope link
valid_lft forever preferred_lft forever
6 )keepalived(slave)端配置
1 keepalived 配置文件修改
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MFS_HA_BACKUP #slave
# router_id LVS_DEVEL
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_script chk_mfs {
script "/usr/local/mfs/keepalived_check_mfsmaster.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 39
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_mfs
}
virtual_ipaddress {
172.25.1.100
}
}
notify_master "/etc/keepalived/clean_arp.sh 172.25.1.100"
2 编写监控脚本
mkdir -p /usr/local/mfs/
vim /usr/local/mfs/Palmolive_check_mfsmaster.sh
#!/bin/bash
STATUS=`ps -C mfsmaster --no-header | wc -l`
if [ $STATUS -eq 0 ];then
mfsmaster start
sleep 3
if [ `ps -C mfsmaster --no-header | wc -l ` -eq 0 ];then
/usr/bin/killall -9 mfscgiserv
/usr/bin/killall -9 keepalived
fi
fi
chmod +x /usr/local/mfs/keepalived_check_mfsmaster.sh
3 设置更新虚拟服务器(VIP)地址的arp记录到网关脚本
#!/bin/sh
VIP=$1
GATEWAY=172.25.1.250
/sbin/arping -I eth0 -c 5 -s $VIP $GATEWAY &>/dev/null
/bin/sh /usr/local/mfs/MFS_DATA_Sync.sh
chmod +x /etc/keepalived/clean_arp.sh
4 本地解析
vim /etc/hosts
172.25.1.100 mfsmaster
5 启动服务
[root@server5 ~]# ip addr show
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:70:2c:af brd ff:ff:ff:ff:ff:ff
inet 172.25.1.5/24 brd 172.25.1.255 scope global eth0
inet6 fe80::5054:ff:fe70:2caf/64 scope link
valid_lft forever preferred_lft forever
7 chunkServer的配置
server3:
[root@server3 chunk1]# vim /etc/mfs/mfschunkserver.cfg
MASTER_HOST = 172.25.1.100
本地解析
vim /etc/hosts
172.25.1.100 mfsmaster
/etc/init.d/moosefs-chunkserver restart
server4:
vim /etc/mfs/mfschunkserver.cfg
MASTER_HOST = 172.25.1.100
本地解析
vim /etc/hosts
172.25.1.100 mfsmaster
/etc/init.d/moosefs-chunkserver restart
8 客户端配置
主机解析
vim /etc/hosts
172.25.1.100 mfsmaster
卸载之前的挂载
umount -l /mnt/mfs
然后重新挂载
[root@server1 ~]# mfsmount
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
9 数据同步脚本的编写
master:
要提前做好双方的ssh无密码登陆的信任关系,并且需要安装rsync
yum install -y rsync
vim /usr/local/mfs/MFS_DATA_Sync.sh
#!/bin/bash
VIP=`ip addr|grep 172.25.1.100|awk -F" " '{print $2}'|cut -d"/" -f1`
if [ $VIP == 172.25.1.100 ];then
mfsmaster stop
rm -rf /var/lib/mfs/metadata.mfs /var/lib/mfs/metadata.mfs.bak /var/lib/mfs/changelog.*.mfs /var/lib/mfs/Metadata
rsync -e "ssh -p22" -avpgolr 172.25.1.5:/var/lib/mfs/* /var/lib/mfs/
mfsmetarestore -m
mfsmaster -ai
sleep 3
mfsmaster restart
echo "this server has become the master of MFS"
if [ $STATUS != 172.25.1.100 ];then
echo "this server is still MFS's slave"
fi
fi
chmod +x /usr/local/mfs/MFS_DATA_Sync.sh
~
backup:
yum install -y rsync
vim /usr/local/mfs/MFS_DATA_Sync.sh
#!/bin/bash
VIP=`ip addr|grep 172.25.1.100|awk -F" " '{print $2}'|cut -d"/" -f1`
if [ $VIP == 172.25.1.100 ];then
mfsmaster stop
rm -rf /var/lib/mfs/metadata.mfs /var/lib/mfs/metadata.mfs.bak /var/lib/mfs/changelog.*.mfs /var/lib/mfs/Metadata
rsync -e "ssh -p22" -avpgolr 172.25.1.2:/var/lib/mfs/* /var/lib/mfs/
mfsmetarestore -m
mfsmaster -ai
sleep 3
mfsmaster restart
echo "this server has become the master of MFS"
if [ $STATUS != 172.25.1.100 ];then
echo "this server is still MFS's slave"
fi
fi
chmod +x /usr/local/mfs/MFS_DATA_Sync.sh
10 故障切换
停掉servre2的mfsmaster和keepalived
[root@server2 ~]# ip add show
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:21:66:61 brd ff:ff:ff:ff:ff:ff
inet 172.25.1.2/24 brd 172.25.1.255 scope global eth0
inet6 fe80::5054:ff:fe21:6661/64 scope link
valid_lft forever preferred_lft forever
[root@server5 ~]# ip addr show
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:70:2c:af brd ff:ff:ff:ff:ff:ff
inet 172.25.1.5/24 brd 172.25.1.255 scope global eth0
inet 172.25.1.100/32 scope global eth0
inet6 fe80::5054:ff:fe70:2caf/64 scope link
valid_lft forever preferred_lft forever
发现VIP从server2 漂移到server5
这个时候会调用数据同步脚本,保证数据的一致性!