一.MFS分布式文件系统
MooseFS是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。通用文件系统,不需要修改上层应用就可以使用,通过附加新的计算机或者硬盘可以实现容量的动态扩展,体系架构可伸缩性极强,删除的文件可以根据配置的时间周期进行保留(一个文件系统级别的回收站),高可靠(数据的多个拷贝被存储在不同的计算机上),提供 web 监控接口,提高随机读或写的效率,提高海量小文件的读写效率。但是mfs 把文件系统的结构缓存到 master 的内存中,文件越多,master 的内存消耗越大,8g 对应 2500w 的文件数,2 亿文件就得 64GB 内存。支持特殊文件(块和字符设备、管道以及套接字),符号连接和硬连接。
二.MFS文件系统的部署(rhel6.5)
MFS 文件系统结构包含 4 种角色:
管理服务器 managing server (master):负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝。
元数据日志服务器 Metalogger server(Metalogger):负责备份 master 服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在 master server 出问题的时候接替其进行工作。
数据存储服务器 data servers (chunkservers):负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数据传输以及存储。
客户机挂载使用 client :通过 fuse 内核接口挂接远程管理服务器上所管理的数据存储服务器,看起来共享的文
件系统和本地 unix 文件系统使用一样的效果。
实验环境:
172.25.78.12、172.25.78.13 | chunkserver |
172.25.78.11 | master |
172.25.78.250 | client |
三.MFS的构建
1.源码包的编译安装(moosefs-3.0.80-1.tar.gz)
(1)使用rpm-build软件生成mfs的安装包
(2)rpmbuild -tb moosefs-3.0.80-1.tar.gz
2.master安装:
moosefs-cgiserv ##mfs的web监控页面
3.chunkserver安装(数据的存储):
4.client安装(客户端):
5.在每台节点上做本地解析
172.25.78.11 mfsmaster ##指定mfsmaster的位置
vim /etc/mfs/mfsmaster.cfg ##mfsmaster配置文件(用#注释掉的变量均使用其默认值)
WORKING_USER 和 WORKING_GROUP:是运行 master server 的用户和组;
SYSLOG_IDENT:是 master server 在 syslog 中的标识;
6.在master启动mfsmaster以及mfs
7.测试
可以添加想看到的信息,chunkserver、内存的使用、磁盘的使用、节点的状态等
8.端口信息
9422:chunkserver连接client
9421:master连接client
9420:master连接chunkserver
9425:mfs的web页面访问接口
四.MFS的基本配置
1.chunkserver(每个数据存储服务器是同样的操作,都要设置共享点):
vim /etc/mfs/mfshdd.cfg ##定义mfs共享点
:/mnt/chunk1
mkdir /mnt/chunk1
chown mfs.mfs /mnt/chunk1/ ##更改用户以及用户组,mfs是以mfs用户身份进行数据的读写操作,为了系统安全,mfs用户没有登陆系统的权限,mfs的服务的数据目录是/var/lib/mfs(启动所需的文件)
mfschunkserver ##开启chunkserver
2.client:
vim /etc/mfs/mfsmount.cfg
:/mnt/mfs ##定义客户端默认挂载
mfsmount ##挂载
3.mfs测试
(1)在 MFS 挂载点下创建两个目录,并设置其文件存储份数:
mfssetgoal -r 1 dir1/ ##设置在 dir1 中文件存储份数为1个,默认是存储两份
mfsgetgoal ##查看目录下文件的存储个数
(2)拷贝文件分别到两个目录下,查看文件信息,可见文件存储所在的数据存储服务器(dir1目录下的文件存储一份,遵从上一步goal的设置)
(3)大文件分散存储
文件以chunk大小存储,每chunk最大为64M,小于64M的,该chunk的大小即为该文件大小,超过64M的文件将被切分存储到不同的数据存储节点。执行写数据时,是同时向每个数据存储节点去写入,这样加快了数据的写入速度;读取时,也从每个数据节点去读取。
4.恢复误删的文件
(1)mfsgettrashtime ##查看文件在垃圾箱的存放时间,文件在删除后不会立即删除,有一个隔离时间(默认是86400s,也就是一天)
(2)删除文件,并挂载MFSmeta文件系统(包含目录trash和trash/undel(用于获取文件))
(3)在trash目录下查找要恢复的文件(把删除的文件,移到/ trash/undel 下,就可以恢复此文件))
五.MFS文件系统的基本原理
1.读操作原理:客户端查询数据时,首先向master发起查询请求;管理服务器(master)检索自己的数据,获取到数据所在的数据服务器位置ip|port|chunkid;master将数据服务器的地址发送给客户端;客户端向具体的数据服务器发起数据获取请求;数据服务器将数据发送给客户端。
2.写操作原理:当客户端需要写入数据时,首先向master提供文件元数据信息请求存储地址(元数据信息如:文件名|大小|份数等);master根据写文件的元数据信息,到数据服务器创建新的数据块;master返回创建成功的消息;master将数据服务器的地址返回给客户端(chunkIP|port|chunkid);客户端向数据服务器写数据;数据服务器返回给客户端写成功的消息;客户端将此次写成功信号和信息发送到master更新文件信息。
MFS 读写原理:原始的读/写速度很明显是主要取决于所使用的硬盘的性能、网络的容量和拓扑结构的,使用的硬
盘和网络的吞吐量越好,整个系统的性能也就会越好。
3.删除文件过程:客户端进行删除时,首先向Master发送删除信息;Master定位到相应元数据信息进行删除,并将chunk server上块的删除操作加入队列异步清理;响应客户端删除成功的信号。
4.修改文件内容的过程:客户端修改文件内容时,首先向Master发送操作信息;Master申请新的块给.swp文件,客户端关闭文件后,会向Master发送关闭信息;Master会检测内容是否有更新,若有,则申请新的块存放更改后的文件,删除原有块和.swp文件块;若无,则直接删除.swp文件块。
5.遍历文件的过程:遍历文件不需要访问chunkserver,当有客户端遍历请求时,向Master发送操作信息;Master返回相应元数据信息;客户端接收到信息后显示。
6.Master记录着管理信息:文件路径|大小|存储的位置(ip,port,chunkid)|份数|时间等,元数据信息存在于内存中,会定期写入metadata.mfs.back文件中,操作实时写入changelog.*.mfs。master启动将metadata.mfs载入内存,重命名为metadata.mfs.back文件。Chunkserver上的剩余存储空间要大于1GB,新的数据才会被允许写入。changelog中记录了对文件的操作,metadata记录文件的大小和位置。因此metadata是比较重要的,在进行修复的过程中是采用metadata和最后一次的changelog进行修复的。
7.主要元数据文件metadata.mfs,当mfsmaster运行的时候会被命名为metadata.mfs.back元数据改变日志changelog.*.mfs,存储了过去的N小时的文件改变(N的数值是由BACK_LOGS参数设置的,参数的设置在vim /etc/mfs/mfsmaster.cfg配置文件中。
六.MFS高可用(MFS+pacemaker)(关于pacemaker的详细介绍在之前博客有)
MFS文件系统中,master负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷
贝,是MFS的关键点,显然有极大可能存在单点故障。虽然有Metalogger,但是不能实现故障实时切换,服务要停止之后在Metalogger恢复元数据以及changelog_ml.*.mfs(服务器的变化日志文件),再次重新指定新的mfsmaster节点。
可以采用keepalived实现,但是要注意的是不仅仅是VIP的漂移,mfsmaster的工作目录都要进行漂移,这就涉及存储的共享,在这里采用pacemaker+corosync来实现故障切换
实验环境(rhel6.5):
172.25.78.14、172.25.78.11 | mfsmaster+pacemaker、iscsi |
172.25.78.100 | VIP |
/var/lib/mfs | mfsmaster的工作目录 |
172.25.78.12 | scsi |
1.配置存储共享
(1)因为目录也要漂移,172.25.78.12共享一块虚拟存储,共享给mfsmaster去挂载工作目录
(2)分配虚拟磁盘
(3)共享磁盘
vim /etc/tgt/targets.conf
(4)查看共享信息
2.共享磁盘客户端登陆
(1)安装iscsi
(2)登陆共享磁盘
3.通过fdisk -l 查看磁盘信息,共享成功,对磁盘进行分区格式化
4.部署pacemaker+corosync
crmsh ##集群管理工具
(1)安装pacemaker
(2)配置corosync(两台mfsmaster同样操作)
开启rpcbind以及corosync服务,以插件形式运行pacemaker,pacemaker随着corosync的开启而开启
5.使用crm添加资源到集群(在此之前把VIP添加到本地解析,每一个节点都做解析,mfsmaster改变了)
(1)检查配置是否正确
crm_verify -LV
(2)关闭stonith,因为还没有配置,每次配置都要提交
(3)添加VIP资源
(4)添加存储共享资源
mount /dev/sda1 /mnt ##把磁盘挂载到/mnt下,把 /var/lib/mfs目录的信息到复制过来,不然直接挂载的话, /var/lib/mfs目录是空的
cp -p /var/lib/mfs/* /mnt ##和权限一块复制
umount /dev/sda1
把/var/lib/mfs的用户以及用户组都改为mfs,不然挂载之后,不能开启mfsmaster服务
(5)添加mfsmaster脚本
(6)把VIP、mfsdata、mfsd添加到一个组(这三个部分是统一漂移)
(7)忽略投票规则(不然一个节点down,整个服务宕机)
(8)添加fence_xvm(用软件实现,避免master突然crash,因为已经添加了fence设备,就开启stonith)
6.fence设备的添加
(1)物理机开启fence_virt(控制fence的关键)
(2)创建fence密钥,把密钥发给mfsmaster
(3)mfsmaster安装fence_virt
(4)查看mfsmaster是否支持fence_xvm(fence的关键,物理机通过密钥给fence_xvm下发任务)
(5)查看fence_xvm的信息
7.crm_mon ##监控pacemaker
(1)当下线server11后,server14接管服务
(2)查看pacemaker的配置
fence在对立的那个master,不然主机crash,fence_virt服务也关闭,无法执行fence操作
七.测试
(1)查看mfs的web页面(http://172.25.78.100:9425)
(2)在客户端写数据时,把server14下线,用户写不进去数据,大概4秒多,数据写入成功,资源也成功切换
server14下线
资源也成功切换
vip漂移
注意:
(1)如果客户端误杀 killall -9 mfsmount 进程,需要先 umount /mnt/mfs,然后再 mfsmount。否则会
提示:/mnt/mfs: Transport endpoint is not connected。文件设置存储两份,数据传输过程中,关掉 chunker1,等待数据传输完毕后,启动chunker1.chunker1 启动后,会自动从 chunker2 复制数据块。整个过程中文件访问不受影响。
(2)文件设置存储两份,数据传输过程中,关掉 chunker1,不等待数据传输完毕,开机启动chunker1.chunker1 启动后,client 端会向 chunker1 传输数据,同时 chunker1 也从 chunker2 复制缺失的块。只要不是两个 chunker 服务器同时挂掉的话,就不会影响文件的传输,也不会影响服务的使用。
(3)使用mfsmaster -a(略高的版本已经用mfsmaster -a代替mfsmetarestore -a)也无法修复也无法启动master服务,有个应急的办法是将 metadata.mfs.back 复制成metadata.mfs,然后再启动 master。这样将会丢失那些正在传输的数据。