官方文档:https://docs.ceph.com/en/quincy/cephfs
CephFS即ceph filesystem,可以实现文件系统共享功能(POSIX标准),客户端通过ceph协议挂载并使用CephFS存储数据。
CephFs需要用到MDS(metadata-service)服务,其守护进程为ceph-mds,ceph-mds进程管理CephFS上存储的文件相关的元数据,并协调对ceph集群的访问。
在linux系统使用ls等操作查看某个目录下的文件时,会由保存在磁盘上的分区表记录文件的名称、创建日期、大小、inode及存储位置等元数据信息。在cephfs中,由于数据被分散为若干个object进行分布式存储,因此并没有统一的保存文件元数据,而是将元数据保存到一个单独的存储池(metadata pool),但是客户端并不能直接访问metadata pool中的元数据,而是在读写数据的时候由mds进行处理,读数据的时候由mds从metadata pool中加载元数据然后缓存在内存中(用于后期快速响应其它客户端请求)并返回给客户端,写数据的时候由MDS缓存在内存并定期同步到metadata pool。
如下图,mds的数据结构类似于linux系统的根型目录结构以及nginx中的缓存目录分层一样,是一个倒置的树状结构。使用多个mds时,cephfs会将文件系统树分割成子树,每个子树可以交给特定的MDS进行权威管理,从而达到了随着元数据服务器数量的增加,集群性能线性地扩展。例如,集群中有3个active的mds,假设根目录下有3个子目录/a、、/b和/c,此时/a的元数据可以交给mds1处理,/b的元数据可以交给mds2处理,/c的元数据可以交给mds2处理,这样就可以提升cephfs的性能。
创建两个存储池:cephfs_data和cephfs_metadata,前者用于存储cephfs的数据,后者用于存储cephfs的元数据
ceph osd pool create cephfs_data 32 32
ceph osd pool create cephfs_metatdata 64 64
创建一个CephFS,并验证其状态
ceph fs new cephfs cephfs_metatdata cephfs_data #创建一个名为cephfs的文件系统
ceph fs ls #列出集群中所有的文件系统
ceph fs status cephfs #查看cephfs的状态
cephalexin
客户端挂载CephFS时支持两种方式,分别是:
ceph auth get-or-create client.cephfs-user \
mon 'allow r' osd 'allow rwx pool=cephfs_data' mds 'allow' \
-o /etc/ceph/ceph.client.cephfs-user.keyring
ceph auth print-key client.cephfs-user -o /etc/ceph/cephfs-user.key
将keyring文件和ceph.conf分发至客户端
scp /etc/ceph/ceph.conf /etc/ceph/ceph.client.cephfs-user.keyring /etc/ceph/cephfs-user.key [email protected]:/etc/ceph/
客户端安装ceph-common
apt -y install ceph-common
挂载cephfs
#将cephfs挂载至/data目录
mount -t ceph 192.168.211.23:6789,192.168.211.24:6789,192.168.211.25:6789:/ /data -o name=cephfs-user,secretfile=/etc/ceph/cephfs-user.key
挂载点写入数据测试
cd /data/
cp /var/log/syslog ./
dd if=/dev/zero of=/data/testfile bs=1M count=100
stat /data #查看挂载点状态
配置开机自动挂载
vim /etc/fstab #添加下面一行内容
192.168.211.23:6789,192.168.211.24:6789,192.168.211.25:6789:/ /data ceph defaults,name=cephfs-user,secretfile=/etc/ceph/cephfs-user.key,_netdev,noatime 0 0
如果内核版本较低而没有ceph模块,那么可以使用用户空间挂载,但是推荐使用内核挂载
客户端安装ceph-fuse
apt -y install ceph-fuse
挂载cephfs
ceph-fuse -n client.cephfs-user -m 192.168.211.23:6789,192.168.211.24:6789,192.168.211.25:6789 /mnt
挂载点读写数据测试
cd /mnt
cp /etc/hosts ./
cat ./hosts
卸载cephfs
fusermount -u /mnt
设置开机自动挂载
vim /etc/fstab #添加下面一行
none /mnt fuse.ceph ceph.id=cephfs-user,ceph.conf=/etc/ceph/ceph.conf,_netdev,defaults 0 0
MDS作为CephFS的访问入口,需要实现高性能及数据备份,ceph支持多MDS结构,以实现MDS的高可用和高性能。集群存在多个MDS服务时,MDS的高可用实现方式有以下两种:
例如有4个mds服务,可以设置3个为主,一个为共用的备,也可以设置两个为主,剩余两个设置为一一对应两个主做备份,如下图所示:
设置备份mds常用的选项如下:
另外可以使用max_mds参数来控制处于启用状态的mds的数量
查看集群中当前mds的状态
ceph fs status
如上图所示,集群中有4个mds服务,处于激活状态的mds有一个,处于备份状态的mds有3个
可以通过以下两种方式优化mds的结构,实现高可用:
ceph fs set cephfs max_mds 3 #设置最多处于active的mds数量为3
ceph fs status #验证
ceph fs set cephfs max_mds 2 #将主mds的最大数量设置为2
#在所有mds节点修改ceph配置文件,添加以下内容
vim /etc/ceph.conf 添加以下内容
#################################
[mds.ceph-mon-03]
mds_standby_replay = true
mds_standby_for_name = ceph-mon-01
[mds.ceph-osd-01]
mds_standby_replay = true
mds_standby_for_name = ceph-mon-02
[mds.ceph-mon-01]
mds_standby_replay = true
mds_standby_for_name = ceph-mon-03
[mds.ceph-mon-02]
mds_standby_replay = true
mds_standby_for_name = ceph-osd-01
#################################
#依次在所有mds节点重启mds服务
systemctl restart ceph-mds.target
#验证mds状态
ceph fs status
如下图所示,目前mon-1和mon-02为主mds,osd-01和mon-03为备mds
测试停掉mon-01的mds服务,验证是否是mon-03来接替它
systemctl stop [email protected]
ceph fs status
如下图所示,停掉mon-01的mds后,mon-03的mds成为主
首先将ceph.client.admin.keyring和ceph.conf拷贝只ganesha服务端
scp /etc/ceph/ceph.conf /etc/ceph/ceph.client.admin.keyring [email protected]:/etc/ceph/
然后安装配置ganesha服务端
apt -y install nfs-ganesha-ceph
vim /etc/ganesha/ganesha.conf #修改ganesha配置
#############################
NFS_CORE_PARAM {
Enable_NLM = false;
Protocols = 3,4;
Enable_RQUOTA = false;
}
EXPORT_DEFAULTS {
Access_Type = RW;
}
EXPORT
{
Export_Id = 1;
Path = /; #cephfs的路径
Pseudo = /data; #对外提供nfs的路径
Access_Type = RW;
Squash = No_root_squash;
Sectype = sys;
FSAL {
Name = CEPH;
hostname = "192.168.211.15"; #本机地址
}
}
LOG {
Default_Log_Level = WARN;
}
#################################
systemctl restart nfs-ganesha #重启ganesha服务
tail -f /var/log/ganesha/ganesha.log #查看ganesha的日志,确没有报错
客户端挂载使用
#安装nfs客户端
apt -y install nfs-common
#挂载
mount -t nfs 192.168.211.15:/data /mnt
#挂载点写入数据验证
cd /mnt
cat hosts
dd if=/dev/zero of=./file1 bs=1M count=50