一、集群化存储概述
什么是集群存储
在集群里,一组独立的节点或主机可以像一个系统一样步调一致地工作。它们不仅可以共享公用的存储阵列或者SAN(存储区域网文件系统),也可以拥有只有一个命名空间的公用文件系统。
定义
集群存储是将多台存储设备中的存储空间聚合成一个能够给应用服务器提供统一访问接口和管理界面的存储池,应用可以通过该访问接口透明地访问和利用所有存储设备上的磁盘,可以充分发挥存储设备的性能和磁盘利用率。数据将会按照一定的规则从多台存储设备上存储和读取,以获得更高的并发访问性能。
1、用于存储的网络技术
①DASDirect-AttachedStorage(DAS直接附加存储)
说明:直接附加存储,等同于存储设备通过数据线、光缆、SATA直连主机
优点
1)技术简单
2)传输效率最高
缺点:存储设备与主机相互绑定,不利于后期扩展与共享
网络拓扑
②NetworkAttachedStorage
说明:网络附加存储,通过网络在存储主机与使用主机之间传输数据
优点
1)技术相对简单
2)不要求存储设备直连本机,只需在局域网下即可
缺点:存储速率较慢
网络拓扑
③StorageAreaNetwork(NAS网络附加存储)
说明:存储区域网络,将生产网络与存储网络进行隔离,有效增加各部效率,减轻网络设备压力,适
合大并发业务
优点
1)存储安全性较高
2)存储速率较高
缺点
1)造价昂贵
2)技术难度相对较高
网络拓扑
2、实现存储的技术分类
常见设备
①块存储
优点
1)可用通过Raid、LVM等简单技术实现高可用
2)可独立使用
缺点:不利于在多台网络设备之间进行共享
②文件存储、网络存储
常见设备
优点
1)构建资金较低
2)可在不同主机之间共享存储
缺点:读写效率低,传输效率慢
③对象存储、分布式存储、存储桶
常见设备
优点
1)读写效率高
2)可在不同主机之间共享存储
缺点
1)造价昂贵
2)技术实现难度较高
3、常见的一些存储名词以及背后使用技术对应关系
文件存储、网络存储 FTP、SAMBA、Apache、Nginx
对象存储、分布式存储、云存储 CEPH、MooseFS、RHCS、ClusterFS
块存储 ISCSI
4、存储实现技术与存储网络之间的联系
①块存储+DAS
结构描述:块存储直连主机设备是最常见的存储方式,也是后边所有存储方式的基石
结构拓扑
②块存储+NAS
结构描述:将块设备通过局域网络共享至其它使用主机节点,提升空间利用率,便于后期扩展
结构拓扑
③块存储+SAN
结构描述:将块设备通过局域网络共享至其它使用主机节点,提升空间利用率。并且将用户访问网络
与存储网络相隔离,利用提升存储效率以后后期维护扩展
结构拓扑
④文件存储+NAS
结构描述:利用共享服务将文件通过网络传输至使用设备,便于文件在多台机器之间的共享操作
结构拓扑
⑤对象存储+SAN
结构描述:利用分布式文件存储结构提升文件读写并发效率,并且将用户访问网络与存储网络相隔离,
利用提升存储效率以后后期维护扩展
结构拓扑
二、文件存储–NFS
1、NFS概述
①何为NFS?
NFS(NetworkFileSystem)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中
的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写
位于远端NFS服务器上的文件,就像访问本地文件一样。NFS最早是由Sun公司发展出来的,后被
逐渐完整以及整合至Linux内核
②NFS功能
它就是是可以透过网络,让不同的主机、不同的操作系统可以共享存储
③NFS原理
NFS在文件传送或信息传送过程中依赖于RPC协议。远程过程调用(RemoteProcedureCall)是能使
客户端执行其他系统中程序的一种机制所以只要用到NFS的地方都要启动RPC服务,不论是NFS
SERVER或者NFSCLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAMPORT
的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传
输
④NFS优点
1)节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端
将可以减少自身存储空间的使用
2)用户不需要在网络中的每个机器上都建有Home目录,Home目录可以放在NFS服务器上且可
以在网络上被访问使用
3)一些存储设备CDROM和Zip等都可以在网络上被别的机器使用。这可以减少整个网络上可移
动介质设备的数量
2、NFS安装及配置
①安装软件包介绍
1)nfs-utils:这个是NFS服务主程序(包含rpc.nfsd、rpc.mountd、daemons)
2)rpcbind:这个是CentOS6.X的RPC主程序(CentOS5.X的为portmap)
NFS 实验搭建
NFS server 配置
实验环境(centos 7)
10.1.1.11
10.1.1.12
配置好 IP 地址
搭建本地 yum 源
关闭防火墙与 selinux
[root@nfs ~]# yum -y install rpcbind nfs-utils
[root@nfs ~]# mkdir /nfs1 /nfs2
[root@nfs ~]# chown -R nobody.nobody /nfs1 /nfs2
[root@nfs ~]# vim /etc/exports
/nfs1 10.1.1.12(rw,async,no_root_squash)
/nfs2 10.1.1.0/24(ro,async,no_root_squash)
[root@nfs ~]# systemctl start rpcbind && systemctl enable rpcbind
#一般情况 rpcbind 的是已经启动并自启动的
[root@nfs ~]# systemctl start nfs && systemctl enable nfs
[root@nfs ~]# showmount -e 10.1.1.11
Export list for 10.1.1.11:
/nfs2 10.1.1.0/24
/nfs1 10.1.1.12
[root@nfs ~]# cp -a /root/anaconda-ks.cfg /nfs1
[root@nfs ~]# cp -a /var/log/messages /nfs2
client 配置
[root@client ~]# yum -y install nfs-utils
[root@client ~]# mkdir /nfs1 /nfs2
[root@client ~]# chown -R nobody.nobody /nfs1 /nfs
[root@client ~]# showmount -e 10.1.1.11
Export list for 10.1.1.11:
/nfs2 10.1.1.0/24
/nfs1 10.1.1.12
[root@client ~]# mount -t nfs 10.1.1.11:/nfs1 /nfs1
[root@client ~]# touch "123123123" > /nfs1/1.txt
[root@client ~]# mount -t nfs 10.1.1.11:/nfs2 /nfs2
[root@client ~]# touch "123123123" > /nfs2/1.txt
-bash: /nfs2/1.txt: 只读文件系统
[root@client ~]# umount /nfs1
[root@client ~]# umount /nfs2
[root@client ~]# vim /etc/fstab
10.1.1.11:/nfs1 /nfs1 nfs defaults 0 0
10.1.1.11:/nfs2 /nfs2 nfs defaults 0 0
[root@client ~]# mount -a
`服务器取消共享`
[root@nfs ~]# exportfs -au
[root@nfs ~]# showmount -e 10.1.1.11
Export list for 10.1.1.11:
`服务器共享`
[root@nfs ~]# exportfs -a
[root@nfs ~]# showmount -e 10.1.1.11
Export list for 10.1.1.11:
/nfs2 10.1.1.0/24
/nfs1 10.1.1.12
配置文件书写规则
/etc/exports
文件的配置格式为:
NFS共享目录 NFS客户端地址 1(参数 1,参数 2,参数 3......) 客户端地址 2(参数 1,参数 2,参数 3......)
NFS共享目录 NFS客户端地址(参数 1,参数 2,参数 3......)
NFS共享目录: 共享目录是指 NFS 服务器共享给客户机使用的目录
NFS客户端: 客户端是指网络中可以访问这个 NFS 共享目录的计算机
NFS客户端常用的指定方式:
指定 ip 地址的主机:192.168.0.200
指定子网中的所有主机:192.168.88.0
指定域名的主机:www.baidu.com
指定域中的所有主机:*.baidu.com
所有主机:*
④共享权限解释
rw:read-write,可读写,注意,仅仅这里设置成读写客户端还是不能正常写入,还要正确地设置共享
目录的权限;
ro:read-only,只读;
sync:文件同时写入硬盘和内存;
async:文件暂存于内存,而不是直接写入内存;
no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,
也拥有root权限。显然开启这项是不安全的;
root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥
有匿名用户权限,通常他将使用nobody或nfsnobody身份;
all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用
户权限;
anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;
anongid:匿名用户的GID值;
三、分布式存储–MFS
1、什么是MFS?
①MFS相关介绍
MooseFS是一个具备冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理服务器或单
独磁盘或分区上,确保一份数据有多个备份副本,然而对于访问MFS的客户端或者用户来说,整个
分布式网络文件系统集群看起来就像一个资源一样,从其对文件系统的情况看MooseFS就相当于
UNIX的文件系统
②MFS的特性说明
1)高可靠性:每一份数据可以设置多个备份(多分数据),并可以存储在不同的主机上
2)高可扩展性:可以很轻松的通过增加主机的磁盘容量或增加主机数量来动态扩展整个文件系统的
存储量
3)高可容错性:我们可以通过对mfs进行系统设置,实现当数据文件被删除后的一段时间内,依旧
存放于主机的回收站中,以备误删除恢复数据
4)高数据一致性:即使文件被写入、访问时,我们依然可以轻松完成对文件的一致性快照
③MFS缺点
master目前是单点,虽然会把数据信息同步到备份服务器,但是恢复需要时间
master服务器对主机的内存要求略高
默认metalogger复制元数据时间较长(可调整)
内存使用问题
对于master服务器来说,资源型要求就是内存大小,为了整个系统访问更快,mfs会把所以访问
的元数据metadada信息放在内存中提供用户访问,因此,当文件数量增加时,内存使用量就会增加,
根据官方说法,处理一百万个文件chunkserver,大概需要300M的内存空间。据此,推算如果未来要
出来1个亿的文件chunkserver,大概需要30G内存空间
④MFS的应用场景
1)大规模高并发的线上数据存储及访问(小文件,大文件都适合)
2)大规模的数据处理,如日志分析,小文件强调性能不用HDFS
2、MFS组件说明
①管理服务器
管理服务器managingserver简称master:这个组件的角色是管理整个mfs文件系统的主服务器,除
了分发用户请求外,还用来存储整个文件系统中每个数据文件的metadata信息,metadate(元数据)
信息包括文件(也可以是目录,socket,管道,块设备等)的大小,属性,文件的位置路径等
②元数据备份服务器.
元数据备份服务器Metadatabackupservers简称metalogger:这个组件的作用是备份管理服务器
master的变化的metadata信息日志文件,文件类型为changelog_ml.*.mfs。以便于在管理服务器出问
题时,可以经过简单的操作即可让新的主服务器进行工作
③数据存储服务器组
数据存储服务器组dataservers(chunkservers)简称data:这个组件就是真正存放数据文件实体的服
务器了,这个角色可以有多台不同的物理服务器或不同的磁盘及分区来充当,当配置数据的副本多于
一
份时,据写入到一个数据服务器后,会根据算法在其他数据服务器上进行同步备份
④客户机服务器组
客户机服务器组(clientservers)简称client:这个组件就是挂载并使用mfs文件系统的客户端,当读
写文件时,客户端首先会连接主管理服务器获取数据的metadata信息,然后根据得到的metadata信息,
访问数据服务器读取或写入文件实体,mfs客户端通过fusemechanism实现挂载mfs文件系统的,因
此,只有系统支持fuse,就可以作为客户端访问mfs整个文件系统
3、数据操作组件之间的协同过程
基础结构拓扑
1MFS的读数据过程
1)client当需要一个数据时,首先向masterserver发起查询请求;
2)管理服务器检索自己的数据,获取到数据所在的可用数据服务器位置ip|port|chunkid;
3)管理服务器将数据服务器的地址发送给客户端;
4)客户端向具体的数据服务器发起数据获取请求;
5)数据服务器将数据发送给客户端;
2MFS的写数据过程
1)当客户端有数据写需求时,首先向管理服务器提供文件元数据信息请求存储地址(元数据信息如:
文件名|大小|份数等);
2)管理服务器根据写文件的元数据信息,到数据服务器创建新的数据块;
3)数据服务器返回创建成功的消息;
4)管理服务器将数据服务器的地址返回给客户端(chunkIP|port|chunkid);
5)客户端向数据服务器写数据;
6)数据服务器返回给客户端写成功的消息;
7)客户端将此次写完成结束信号和一些信息发送到管理服务器来更新文件的长度和最后修改时间;
3MFS的删除文件过程
1)客户端有删除操作时,首先向Master发送删除信息;
2)Master定位到相应元数据信息进行删除,并将chunkserver上块的删除操作加入队列异步清理;
3)响应客户端删除成功的信号
4MFS修改文件内容的过程
1)客户端有修改文件内容时,首先向Master发送操作信息;
2)Master申请新的块给.swp文件;
3)客户端关闭文件后,会向Master发送关闭信息;
4)Master会检测内容是否有更新,若有,则申请新的块存放更改后的文件,删除原有块和.swp文件
块;
5)若无,则直接删除.swp文件块;
5MFS重命名文件的过程
1)客户端重命名文件时,会向Master发送操作信息;
2)Master直接修改元数据信息中的文件名;返回重命名完成信息;
6MFS遍历文件的过程
1)遍历文件不需要访问chunkserver,当有客户端遍历请求时,向Master发送操作信息;
2)Master返回相应元数据信息;
3)客户端接收到信息后显示;
4、补充描述
1)Master记录着管理信息,比如:文件路径|大小|存储的位置(ip,port,chunkid)|份数|时间等,元数据信
息存在于内存中,会定期写入metadata.mfs.back文件中,定期同步到metalogger,操作实时写入
changelog.*.mfs,实时同步到metalogger中。master启动将metadata.mfs载入内存,重命名为
metadata.mfs.back文件。
2)文件以chunk大小存储,每chunk最大为64M,小于64M的,该chunk的大小即为该文件大小(验
证实际chunk文件略大于实际文件),超过64M的文件将被切分,以每一份(chunk)的大小不超过
64M为原则;块的生成遵循规则:目录循环写入(00-FF256个目录循环,step为2)、chunk文件递增
生成、大文件切分目录连续。
3)Chunkserver上的剩余存储空间要大于1GB(ReferenceGuide有提到),新的数据才会被允许写入,
否则,你会看到Nospaceleftondevice的提示,实际中,测试发现当磁盘使用率达到95%左右的时候,
就已经不行写入了,当时可用空间为1.9GB。
4)文件可以有多份copy,当goal为1时,文件会被随机存到一台chunkserver上,当goal的数大于1
时,copy会由master调度保存到不同的chunkserver上,goal的大小不要超过chunkserver的数量,否
则多出的copy,不会有chunkserver去存。
MFS实验搭建
实验环境(centos 7)
五台服务器
10.1.1.11-------master
10.1.1.12-------metadate
10.1.1.13-------chunkserver-1(添加一块新硬盘)
10.1.1.14-------chunkserver-2(添加一块新硬盘)
10.1.1.15-------client
配置好 IP 地址
搭建本地 yum 源
关闭防火墙与 selinux
master 服务器配置
[root@master ~]# tar -xf moosefs-3.0.84-1.tar.gz
[root@master ~]# useradd -s /sbin/nologin -M mfs
[root@master ~]# yum -y install gcc gcc-c++ zlib zlib-devel
[root@master ~]# cd moosefs-3.0.84/
[root@master moosefs-3.0.84]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs
[root@master moosefs-3.0.84]# make && make install
[root@master moosefs-3.0.84]# cd
[root@master ~]# chown -R mfs.mfs /usr/local/mfs
[root@master ~]# chmod a+x /usr/local/mfs/sbin/*
[root@master ~]# ln -s /usr/local/mfs/bin/* /usr/local/bin/
[root@master ~]# ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
[root@master ~]# cd /usr/local/mfs/etc/mfs/
[root@master mfs]# cp -a mfsmaster.cfg.sample mfsmaster.cfg
[root@master mfs]# cp -a mfsexports.cfg.sample mfsexports.cfg
[root@master mfs]# vim mfsexports.cfg
#末尾添加一行
10.1.1.0/24 . rw,alldirs,maproot=0
#10网段,`.`表示MFSMETA文件系统,rw,读写权限,alldirs 任何z子目录都允许挂载,maproot=0,登陆就是root用户
[root@master mfs]# cd
[root@master ~]# mfsmaster start
[root@master ~]# mfscgiserv
把软件包传到其余几台机器上
[root@master ~]# scp moosefs-3.0.84-1.tar.gz root@10.1.1.12:/root
[root@master ~]# scp moosefs-3.0.84-1.tar.gz root@10.1.1.13:/root
[root@master ~]# scp moosefs-3.0.84-1.tar.gz root@10.1.1.14:/root
[root@master ~]# scp moosefs-3.0.84-1.tar.gz root@10.1.1.15:/root
浏览器访问 10.1.1.11:9425
测试,DNS处输入 IP 地址即可
主配置文件说明解释
WORKING_USER = mfs
WORKING_GROUP = mfs
SYSLOG_IDENT = mfsmaster #在 syslog 中的表示, 说明这是 mfsmaster 产生的
LOCK_MEMORY = 0 # 是否执行 mlockall()以避免 mfsmaster 内存溢出(默认为 0)
NICE_LEVEL = -19 # 运行的优先级(默认-19, 注意, 这进程必须是 root 启动 )
DATA_PATH = /usr/local/mfs/var/mfs # 数 据 存 放 路 径 , 该 目 录 下 有 三 大 类 文 件 , changelog,sessions,stats
EXPORTS_FILENAME = /usr/local/mfs/etc/mfs/mfsexports.cfg #被挂载目录以及其权限控制文 件的存放位置
BACK_LOGS = 50 #元数据的改变日志文件数量(默认是 50) MATOML_LISTEN_HOST = * # 元数据日志服务器监听的 IP 地址(默认是*, 代表任何 IP)
MATOML_LISTEN_PORT = 9419 # 元数据日志服务器监听的端口地址, 默认是 9419
MATOCS_LISTEN_HOST = * # 用于存储服务器(Chunk Server) 连接的 IP 地址
MATOCS_LISTEN_PORT = 9420 # 是存储服务器(Chunk server) 连接的端口地址
REPLICATIONS_DELAY_INIT = 300 # 延迟复制的时间(默认是 300)
CHUNKS_LOOP_MIN_TIME = 300 # chunks 的回环率
CHUNKS_SOFT_DEL_LIMIT = 10
CHUNKS_WRITE_REP_LIMIT = 2,1,1,4 在一个循环里复制到一个
CHUNK Server 的最大 chunks 数目
CHUNKS_READ_REP_LIMIT = 10,5,2,5
MATOCL_LISTEN_PORT = 9421 #用于客户端对外连接的端口地址
metadata 配置
[root@metadata ~]# tar -xf moosefs-3.0.84-1.tar.gz
[root@metadata ~]# useradd -s /sbin/nologin -M mfs
[root@metadata ~]# yum -y install gcc gcc-c++ zlib zlib-devel
[root@metadata ~]# cd moosefs-3.0.84/
[root@metadata moosefs-3.0.84]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs
[root@metadata moosefs-3.0.84]# make && make install
[root@metadata moosefs-3.0.84]# cd
[root@metadata ~]# chown -R mfs.mfs /usr/local/mfs/
[root@metadata ~]# ln -s /usr/local/mfs/bin/* /usr/local/bin/
[root@metadata ~]# ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
[root@metadata ~]# chmod a+x /usr/local/mfs/sbin/*
[root@metadata ~]# cd /usr/local/mfs/etc/mfs/
[root@metadata mfs]# cp -a mfsmetalogger.cfg.sample mfsmetalogger.cfg
[root@metadata mfs]# vim mfsmetalogger.cfg
#取消注释,修改以下内容
META_DOWNLOAD_FREQ = 2 #设置完整同步间隔为2小时
MASTER_HOST = 10.10.10.11 #设置MFS-Master服务器IP地址
[root@metadata mfs]# mfsmetalogger start
[root@metadata mfs]# lsof -i :9419
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mfsmetalo 71376 mfs 8u IPv4 737618 0t0 TCP metadata:46744->10.1.1.11:9419 (ESTABLISHED)
chunk-1 配置
[root@chunk-1 ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x9220bd48 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):m
命令操作
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
[root@chunk-1 ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x88efe001 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):1
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@chunk-1 ~]# mkfs.ext4 /dev/sdb1
[root@chunk-1 ~]# mkdir /mnt/mfs
[root@chunk-1 ~]# mount -t ext4 /dev/sdb1 /mnt/mfs/
[root@chunk-1 ~]# useradd -s /sbin/nologin -M mfs
[root@chunk-1 ~]# chown -R mfs.mfs /mnt/mfs/
[root@chunk-1 ~]# tar -xf moosefs-3.0.84-1.tar.gz
[root@chunk-1 ~]# yum -y install gcc gcc-c++ zlib zlib-devel
[root@chunk-1 ~]# cd moosefs-3.0.84/
[root@chunk-1 moosefs-3.0.84]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-default-group=mfs
[root@chunk-1 moosefs-3.0.84]# make && make install
[root@chunk-1 moosefs-3.0.84]# cd
[root@chunk-1 ~]# chown -R mfs.mfs /usr/local/mfs/
[root@chunk-1 ~]# ln -s /usr/local/mfs/bin/* /usr/local/bin/
[root@chunk-1 ~]# ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
[root@chunk-1 ~]# chmod a+x /usr/local/mfs/sbin/*
[root@chunk-1 ~]# cd /usr/local/mfs/etc/mfs/
[root@chunk-1 mfs]# cp -a mfschunkserver.cfg.sample mfschunkserver.cfg
[root@chunk-1 mfs]# cp -a mfshdd.cfg.sample mfshdd.cfg
[root@chunk-1 mfs]# vim mfschunkserver.cfg
#取消注释,修改以下配置
MASTER_HOST = 10.10.10.11 # 指定 MFS-Master 服务器地址
MASTER_PORT = 9420 # 指定 MFS-Master 服务器端口
HDD_CONF_FILENAME = /usr/local/mfs/etc/mfs/mfshdd.cfg # 指定提供存储的配置文 件位置
#这一行直接取消注释即可,不用修改
[root@chunk-1 mfs]# vim mfshdd.cfg
#在末端添加存储位置(挂载点目录)
/mnt/mfs
[root@chunk-1 ~]# mfschunkserver start
另一台 chunk-2 服务器动态添加
client
[root@client ~]# yum -y install fuse fuse-devel fuse-libs gcc gcc-c++ zlib zlib-devel
[root@client ~]# tar -xf moosefs-3.0.84-1.tar.gz
[root@client ~]# useradd -s /sbin/nologin -M mfs
[root@client moosefs-3.0.84]# cd moosefs-3.0.84
[root@client moosefs-3.0.84]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver
[root@client moosefs-3.0.84]# make && make install
[root@client moosefs-3.0.84]# cd
[root@client ~]# chown -R mfs.mfs /usr/local/mfs/
[root@client ~]# ln -s /usr/local/mfs/bin/* /usr/local/bin/
[root@client ~]# ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
[root@client ~]# chmod a+x /usr/local/sbin/*
[root@client ~]# mkdir /mfsclient
[root@client ~]# mfsmount /mfsclient/ -H 10.1.1.11
[root@client ~]# chown -R mfs.mfs /mfsclient/
[root@client ~]# echo "1223334444" > /mfsclient/1.txt
[root@client ~]# mfsfileinfo /mfsclient/1.txt
/mfsclient/1.txt:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 10.1.1.13:9422 (status:VALID)
[root@client ~]#
chunk-2 配置
[root@chunk-2 ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x586ab912.
Changes will remain in memory only, until you decide to write them.
[root@chunk-2 ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xcc2edc47.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p #输入 p 添加主分区
Partition number (1-4): 1
First cylinder (1-2610, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610):
Using default value 2610
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@chunk-2 ~]# mkfs.ext4 /dev/sdb1
[root@chunk-2 ~]# mkdir /mnt/mfs
[root@chunk-2 ~]# mount -t ext4 /dev/sdb1 /mnt/mfs/
[root@chunk-2 ~]# useradd -s /sbin/nologin -M mfs
[root@chunk-2 ~]# chown -R mfs.mfs /mnt/mfs/
[root@chunk-2 ~]# tar -xf moosefs-3.0.84-1.tar.gz
[root@chunk-2 ~]# yum -y install gcc gcc-c++ zlib zlib-devel
[root@chunk-2 ~]# cd moosefs-3.0.84
[root@chunk-2 moosefs-3.0.84]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs
[root@chunk-2 moosefs-3.0.84]# make && make install
[root@chunk-2 moosefs-3.0.84]# cd
[root@chunk-2 ~]# chown mfs.mfs /usr/local/mfs/
[root@chunk-2 ~]# ln -s /usr/local/mfs/bin/* /usr/local/bin/
[root@chunk-2 ~]# ln -s /usr/local/mfs/sbin/* /usr/local/bin/
[root@chunk-2 ~]# chmod a+x /usr/local/mfs/sbin/*
[root@chunk-2 ~]# cd /usr/local/mfs/etc/mfs/
[root@chunk-2 mfs]# cp -a mfschunkserver.cfg.sample mfschunkserver.cfg
[root@chunk-2 mfs]# cp -a mfshdd.cfg.sample mfshdd.cfg
[root@chunk-2 mfs]# vim mfschunkserver.cfg
#修改以下配置
MASTER_HOST = 10.1.1.11 # 指定 MFS-Master 服务器地址
MASTER_PORT = 9420 # 指定 MFS-Master 服务器端口
HDD_CONF_FILENAME = /usr/local/mfs/etc/mfs/mfshdd.cfg # 指定提供存储的配置文件位置,取消注释即可,不用修改
[root@chunk-2 mfs]# vim mfshdd.cfg
#末尾添加存储位置(挂载点)
/mnt/mfs
[root@chunk-2 mfs]# mfschunkserver start #启动服务
client 测试
[root@client ~]# echo "2222222222" > /mfsclient/2.txt
[root@client ~]# mfsfileinfo /mfsclient/2.txt
/mfsclient/2.txt:
chunk 0: 0000000000000004_00000001 / (id:4 ver:1)
copy 1: 10.1.1.13:9422 (status:VALID)
copy 2: 10.1.1.14:9422 (status:VALID)
[root@client ~]#
误删除文件恢复
[root@client ~]# ls /mfsclient/
1.txt 2.txt
[root@client ~]# rm -f /mfsclient/2.txt
[root@client ~]# mkdir /mfsback
[root@client ~]# mfsmount -m /mfsback/ -H 10.1.1.11
[root@client ~]# yum -y install tree
[root@client ~]# tree /mfsback/trash/ > /root/1.txt
[root@client ~]# vim /root/1.txt
#文件内搜索文件名
├── 004
│ ├── 00000004|2.txt
│ └── undel
[root@client ~]# mv /mfsback/trash/004/00000004\|2.txt /mfsback/trash/undel/
[root@client ~]# ls /mfsclient/
1.txt 2.txt
[root@client ~]# mfsgettrashtime /mfsclient/2.txt
/mfsclient/2.txt: 86400
[root@client ~]# mfsgettrashtime 170000 /mfsclient/2.txt
170000: realpath error on (/root/170000): ENOENT (No such file or directory)
/mfsclient/2.txt: 172800 #它会转换为最近的小时整数,两天
快照功能
[root@client mfsclient]# mkdir back
[root@client mfsclient]# chown mfs.mfs back/
[root@client mfsclient]# mfsmakesnapshot 1.txt back/
[root@client mfsclient]# ls -l back/
总用量 1
-rw-r--r-- 1 mfs mfs 22 2月 2 19:48 1.txt
#与 /mfsclient 下的 1.txt 共用一个元数据,不占用空间,类似于软连接
冗余 goal 设置
[root@client ~]# cd /mfsclient/
[root@client mfsclient]# echo "333333333" > 3.txt
[root@client mfsclient]# mfsfileinfo 3.txt
3.txt:
chunk 0: 0000000000000006_00000001 / (id:6 ver:1)
copy 1: 10.1.1.13:9422 (status:VALID)
copy 2: 10.1.1.14:9422 (status:VALID)
[root@client mfsclient]# mfssetgoal 1 3.txt
3.txt: goal: 1
[root@client mfsclient]# mfsfileinfo 3.txt
3.txt:
chunk 0: 0000000000000006_00000001 / (id:6 ver:1)
copy 1: 10.1.1.14:9422 (status:VALID)
还原
10.1.1.11 Master 服务器操作
[root@master ~]# mfsmaster stop
[root@master ~]# rm -rf /usr/local/mfs/var/mfs/*
10.1.1.12 Metadata 服务器操作
[root@metadata ~]# scp /usr/local/mfs/var/mfs/* root@10.1.1.11:/usr/local/mfs/var/mfs
10.1.1.15 client 服务器操作
[root@master ~]# mfsmaster -a
四、块存储之ISCSI服务
1、ISCSI概述
①ISCSI与SCSI原理差别
② 常见用于ISCSI服务的网络拓扑类型
1)SAN:StorageAreaNetwork,存储区域网络,多采用高速光纤通道,对速率、冗余性要求高
2)NetworkAttachmentStorage,网络附加存储,采用普通以太网,对速率、冗余无特别要求
③ISCSI工作方式
1)工作模式C/S结构
服务(设备)端----target
客户(应用)端----initiator
2)工作拓扑图
ISCSI 实验搭建
命令配置
实验环境(centos 6)
10.1.1.15 server(添加一块硬盘)
10.1.1.16 client
target 配置
LVM 整合
[root@target ~]# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created
[root@target ~]# vgcreate vg0 /dev/sdb
Volume group "vg0" successfully created
[root@target ~]# lvcreate -L 5G -n lv0 vg0
Logical volume "lv0" created.
[root@target ~]# mkfs -t ext4 /dev/vg0/lv0
[root@target ~]# yum -y install scsi-target-utils
[root@target ~]# service tgtd start
正在启动 SCSI target daemon: [确定]
[root@target ~]# netstat -natp |grep tgtd
tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN 18638/tgtd
tcp 0 0 :::3260 :::* LISTEN 18638/tgtd
[root@target ~]# tgtadm -L iscsi -o new -m target -t 1 -T iqn.2021-02.com.test.www
[root@target ~]# tgtadm -L iscsi -o show -m target
Target 1: iqn.2021-02.com.test.www
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
Backing store type: null
Backing store path: None
Backing store flags:
Account information:
ACL information:
[root@target ~]# tgtadm -L iscsi -o new -m logicalunit -t 1 -l 1 -b /dev/vg0/lv0
[root@target ~]# tgtadm -L iscsi -o bind -m target -t 1 -I 10.1.1.16
客户端配置
[root@client ~]# yum -y install iscsi-initiator-utils
[root@client ~]# fdisk -l
……
Disk /dev/sdb: 5368 MB, 5368709120 bytes
……
[root@client ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xb9ff4827.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1018, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1018, default 1018):
Using default value 1018
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@client ~]# mkfs.ext4 /dev/sdb1
[root@client ~]# mkdir /iscsi
[root@client ~]# mount -t ext4 /dev/sdb1 /iscsi/
[root@client ~]# df -h |grep sdb
/dev/sdb1 4.8G 10M 4.6G 1% /iscsi
[root@client ~]# umount /iscsi/
[root@client ~]# iscsiadm -m node -T iqn.2021-02.com.test.www --logout
永久挂载
[root@client ~]# iscsiadm -m node -T iqn.2021-02.com.test.www --login
[root@client ~]# mkdir /mnt/iscsi
[root@client ~]# vim /etc/fstab
/dev/sdb /mnt/iscsi ext4 defaults,_netdev 0 0
[root@client ~]# mount -a
[root@client ~]# df -h |grep sdb
/dev/sdb 4.8G 10M 4.6G 1% /mnt/iscsi
[root@client ~]# mount -a
通过配置文件持久化配置
target 配置
[root@target ~]# yum -y install scsi-target-utils
[root@target ~]# vim /etc/tgt/targets.conf
<target iqn.2021-02.com.tgt:teststore.sdb>
<backing-store /dev/sdb>
vendor_id iscsi
lun 7
</backing-store>
incominguser iscsi iscsi
initiator-address 10.1.1.0/24
</target>
[root@target ~]# service tgtd start && chkconfig tgtd on
[root@target ~]# tgtadm -L iscsi -o show -m target
客户端配置
[root@client ~]# yum -y install iscsi-initiator-utils
[root@client ~]# vim /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = iscsi
node.session.auth.password = iscsi
[root@client ~]# iscsiadm -m discovery -t st -p 10.1.1.15
10.1.1.15:3260,1 iqn.2021-02.com.tgt:teststore.sdb
[root@client ~]# iscsiadm -m node -T iqn.2021-02.com.tgt:teststore.sdb --login
Logging in to [iface: default, target: iqn.2021-02.com.tgt:teststore.sdb, portal: 10.1.1.15,3260] (multiple)
Login to [iface: default, target: iqn.2021-02.com.tgt:teststore.sdb, portal: 10.1.1.15,3260] successful.
[root@server6 ~]# fdisk -l |grep sdb
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
#格式化挂在后就可以使用了