0%

cephfs集群测试

本文旨在帮助使用ceph-deploy工具的人们快速完成集群搭建,后续给出了使用mdtest对Cephfs的元数据操作性能进行测试。

四节点搭建示例

环境介绍

name IP
ca62* 192.168.3.39
ca44 192.168.3.16
ca45 192.168.3.17
ca46 192.168.3.18
使用了Centos 7.6.1810的linux版本。

首先需要在ca62节点上建立ssh密钥,之后把公钥复制到其余节点的.ssh目录下的authorize_host文件中完成免密登陆配置。

Ceph集群搭建准备工作

首先需要更换yum源并安装epel源

1
2
3
4
5
6
7

# 删除默认yum源并配置阿里yum源
rm -f /etc/yum.repos.d/*.repo
wget http://mirrors.aliyun.com/repo/Centos-7.repo -P /etc/yum.repos.d/
# 安装EPEL源
wget http://mirrors.aliyun.com/repo/epel-7.repo -P /etc/yum.repos.d/

接下来需要修改ceph源,这一步很重要,使用默认的ceph源会遇到各种奇怪的问题,这里选择了octopus发行版本,不建议下载太新的Ceph版本。

1
2
3
4
5
6
7
8
9
10
cat > /etc/yum.repos.d/ceph.repo <<EOF
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/x86_64/
gpgcheck=0
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch/
gpgcheck=0
EOF

在ca62节点上安装ceph-deploy

1
2
3
4
5
6
7
#更新yum源
yum update
#安装依赖包
yum install -y chrony conntrack ipset jq iptables curl sysstat libseccomp wget socat git python-setuptools
#安装ceph-deploy工具
yum install -y ceph-deploy

配置系统时间并设置时钟同步

1
2
3
4
5
6
7
8
9
10
11
12
timedatectl set-timezone Asia/Shanghai

timedatectl status

# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond

systemctl stop postfix && systemctl disable postfix

完成以上操作,重启所有主机。

部署Ceph集群步骤

建立一个工作目录,用来保存ceph集群部署过程中生成的密钥等文件。

1
2
mkdir ~/admin-node
cd ~/admin-node

在所有的节点上安装ceph,这里不建议使用ceph-deploy中提供的install指令,会重新定义epel源和ceph源,可能会发生依赖错误以及网络超时等错误。

1
2
#在所有的节点上执行该指令
yum install -y ceph ceph-radosgw

开始创建一个ceph集群

1
2
3
4
5
6
7
ceph-deploy new --public-network 192.168.3.0/24 ca62
#添加允许ceph时间偏移
echo "mon clock drift allowed = 2" >> ceph.conf
echo "mon clock drift warn backoff = 30" >> ceph.conf
#修改mds参数
echo "mds_cache_memory_limit = 17179869184" >> ceph.conf
echo "mds_cache_trim_decay_rate = 10" >> ceph.conf

执行完以上指令后会在当前目录下生成了ceph.conf,log文件,和ceph.mon.keyring认证管理密钥,注意到这里的ceph.conf可以配置ceph集群相关的参数,具体的参数以及含义可以通过官网进行查询。

接下来初始化mon节点

1
ceph-deploy mon create-initial

执行完上述指令可以执行ls指令查看当前目录下生成了很多的模块密钥,这些密钥保证了集群节点之间的认证,接下来需要把这些密钥以及ceph.conf配置文件拷贝到其余节点上

1
ceph-deploy --overwrite-conf admin ca62 ca44 ca45 ca46

这里的overwrite-conf参数帮助我们以后在修改了ceph.conf配置文件后能够把集群节点的配置文件更新覆盖。

此时可以查看ceph集群的状态:

1
ceph -s

可以看到此时的ceph集群状态是警告形式,需要关闭不安全模式

1
ceph config set mon auth_allow_insecure_global_id_reclaim false

之后就可以看到ceph集群的健康状态变成了ok,之后开始添加osd节点,首先需要确定在每个ceph节点上都有一块裸磁盘用来作为osd盘,一定要先解除磁盘挂载并格式化,再把磁盘作为osd添加进入集群。

name osd磁盘
ca44 /dev/sdb
ca45 /dev/sdb
ca46 /dev/sdb

上述介绍了三个数据存储节点的空闲磁盘的使用情况,首先格式化每个磁盘

1
mkfs.ext4 /dev/sdb 

之后在主节点中使用ceph-deploy工具创建osd节点

1
2
3
ceph-deploy osd create ca44 --data /dev/sdb
ceph-deploy osd create ca45 --data /dev/sdb
ceph-deploy osd create ca46 --data /dev/sdb

之后可以执行ceph -s指令查看此时的ceph集群状态,可以看到3个osd节点已经成功上线,但是系统会提示缺少mgr提供的守护进程,这个时候选在主节点创建一个mgr模块

1
ceph-deploy mgr create ca62

Cephfs文件系统

RBD块存储不支持多个主机共享一块磁盘,这个时候就需要添加cephfs文件系统。首先在每个节点上建立mds

1
ceph-deploy mds create ca62 ca44 ca45 ca46

接下来创建两个存储池,一个用来保存数据,一个用来保存元数据

1
2
ceph osd pool create cephfs_data 64 64
ceph osd pool create cephfs_metadata 64 64

接下来创建cephfs文件系统,把之前的两个数据池连接起来

1
2
3
ceph fs new cephfs-yyx cephfs_metadata cephfs_data
#可以修改mds的active数量
ceph fs set cephfs-yyx max_mds 12

执行完成后查看集群状态可以看到cephfs文件系统成功创建,接下来考虑挂载cephfs,一共有两种挂载方式,这里首先介绍在内核中挂载

1
2
3
4
5
6
7
8
#查看client的密钥
ceph auth list
#创建挂载目录
mkdir /mnt/fs{1,2,3,4}
#使用mount命令进行挂载
mount -t ceph 192.168.3.39:6789:/ /mnt/fs1 -o name=admin,secret=${client的密钥}
#使用df命令查看挂载情况
df -h

这里既没有选择fuse挂载,也没有使用内核挂载的方式,而是使用了mdtest中的cephfs中的测试工具,具体操作接下来进行介绍

使用ior中的mdtest对cephfs的元数据操作进行性能测试

  • MDTest 使用说明

mdtest 是一个简单的 I/O 基准测试工具,现在是IOR 工具套件的一部分,用于向存储系统发出高度并发的元数据操作流。IOR目前支持HDFS,CephFS,RADOS,以及POSIX标准接口文件系统的测试。它旨在展示文件系统能够为包括 mkdir、stat、rmdir、creat、open、close 和 mv在内的元数据操作提供服务的峰值速率。

1
2
3
4
5
yum install libcephfs-devel -y
./configure --with-cephfs
vim /usr/include/cephfs/libcephfs.h
#添加sys/time.h库
make
  • IOR目录:

  • doc - 包含IOR所有文档。

  • src - 所有源码文件,及编译生成的库文件,二进制文件。编译完成后,使用mdtest –help可查看帮助信息。

  • testing - 测试用脚本。该目录包含所有测试脚本。test-lib.sh脚本中配置了基本参数,如测试路径,输出路径,日志等级等,不需要修改。basic-tests.shcomplex-tests.sh为具体测试脚本。

  • test_log - 测试输出文件,包含所有测试结果。目录basic保存basic-tests.sh的测试结果,目录advanced保存complex-tests.sh测试结果。

  • mpi_server.conf,设置程序运行的所有节点。源程序中没有,我手动添加的文件。

目前只使用到IOR中的MDtest工具。

  • Cephfs测试流程:
  1. 功能性测试:

    src/mdtest -a CEPHFS --cephfs.user=xxx --cephfs.conf=xxx --cephfs.prefix=xxx

    进行简单测试,验证正确性。可附加其他参数,参数具体含义可使用src/mdtest --help查看。

    需要填写的配置信息,

    • cephfs.user ceph用户名 cephfs.conf;
    • 配置文件路径(/etc/ceph/ceph.conf);
    • cephfs.prefix:文件的统一前缀,不太清除具体含义。
  2. 本地多进程测试(注意要修改mpi_server.conf中的节点名称,这里先只使用ca62进行多进程测试)。进入complex-tests.sh,修改脚本为

    MDTEST 8 -a CEPHFS -n 100000 -b 200 -z 1 -x stonewall-md.log -u -L -R --cephfs.user=xxx --cephfs.conf=xxx --cephfs.prefix=xxx `

    回到ior目录,运行脚本。运行后将启动8个进程,进行带宽测试。修改进程数,直到测试出吞吐率上限。参数具体含义可使用src/mdtest --help查看。

  3. 分布式多进程测试。进入mpi_server.conf,配置节点名称。MDTest将在配置的节点上分配进程,进行分布式测试。

测试过程中可能会遇到的问题

创建osd的问题

在集群中添加新的osd时可能会遇到创建失败的情况,一般会有三种情况。

  • 第一种是网络通信出现了问题,建议检查每个节点是否能够和主节点进行通信。
  • 第二种情况比较复杂,会显示找不到设备。这种时候需要我们去每台机器上检查对应的磁盘情况,接触挂载后完成格式化才能使用。
  • 第三种情况会显示创建失败,这种情况去每台机器上查看对应的磁盘使用情况
    1
    2
    3
    4
    #查看挂载情况
    df -h
    #查看磁盘使用情况
    fdisk -l
    如果发现了有的磁盘以lvm的形式挂载在ceph目录下,需要彻底删除lvm设备
    1
    2
    ceph-volume lvm list
    vgremove ${查询到的ceph块设备号}

通过以上的方法应该可以解决osd相关的问题。

快速重新搭建ceph(16节点)

  • 有时可能会遇到集群故障等情况,可以选择重新搭建:

    1. 首先需要删除所有节点上安装的ceph,进入admin-node目录后:
      1
      2
      3
      4
      5
      6
      7
      8
      # 在每台机器上更新yum源
      yum update
      # 删除所有节点的ceph ceph-radosgw
      ceph-deploy purge ca62 ca34 ca37 ca39 ca44 ca45 ca46 ca47 ca48 ca57 ca59 ca66 ca68 ca94 ca95 ca96
      # 删除所有的ceph数据
      ceph-deploy purgedata ca62 ca34 ca37 ca39 ca44 ca45 ca46 ca47 ca48 ca57 ca59 ca66 ca68 ca94 ca95 ca96
      #删除所有key
      ceph-deploy forgetkeys
    2. 在每台机器上安装ceph:
      1
      2
      # 注意这里不要使用ceph-deploy的install指令进行安装,会修改ceph源
      yum install ceph ceph-radosgw
    3. 检查每台机器上的磁盘是否解除挂载了:
    name IP user password disk
    ca62* 192.168.3.39 none
    ca34 192.168.3.194 /dev/sdb
    ca37 192.168.3.197 /dev/sdb /dev/sdc
    ca39 192.168.3.11 none
    ca44 192.168.3.16 /dev/sdb /dev/sdc
    ca45 192.168.3.17 /dev/sdb
    ca46 192.168.3.18 /dev/sdb /dev/sdc
    ca47 192.168.3.19 /dev/sdb
    ca48 192.168.3.20 /dev/sdb /dev/sdc
    ca57 192.168.3.34 /dev/sdb /dev/sdc
    ca59 192.168.3.36 /dev/sda
    ca66 192.168.3.43 /dev/sda /dev/sdb
    ca68 192.168.3.45 none
    ca94 192.168.3.94 /dev/sdb
    ca95 192.168.3.95 /dev/sdc
    ca96 192.168.3.96 none
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #查看lvm格式的磁盘
    ceph-volume lvm list
    #移除挂载点,具体参数通过上面一条命令获取一般是/dev后面的一串参数,如:
    vgremove ceph-7c5449b9-9995-4cfa-b255-21e2a939b44b
    #删除admin-node文件夹:
    sudo rm -rf admin-node
    #新建admin-node文件夹:
    mkdir admin-node
    cd admin-node
    1. 重新部署集群
      开始创建一个ceph集群:
      1
      2
      3
      4
      5
      6
      7
      ceph-deploy new --public-network 192.168.3.0/24 ca62
      #添加允许ceph时间偏移
      echo "mon clock drift allowed = 2" >> ceph.conf
      echo "mon clock drift warn backoff = 30" >> ceph.conf
      #修改mds参数
      echo "mds_cache_memory_limit = 17179869184" >> ceph.conf
      echo "mds_cache_trim_decay_rate = 10" >> ceph.conf
    2. 接下来初始化mon节点
      1
      ceph-deploy mon create-initial
    3. 执行完上述指令可以执行ls指令查看当前目录下生成了很多的模块密钥,这些密钥保证了集群节点之间的认证,接下来需要把这些密钥以及ceph.conf配置文件拷贝到其余节点上
      1
      ceph-deploy --overwrite-conf admin ca62 ca34 ca37 ca39 ca44 ca45 ca46 ca47 ca48 ca57 ca59 ca66 ca68 ca94 ca95 ca96
      这里的overwrite-conf参数帮助我们以后在修改了ceph.conf配置文件后能够把集群节点的配置文件更新覆盖。

    此时可以查看ceph集群的状态:

    1
    ceph -s

    可以看到此时的ceph集群状态是警告形式,需要关闭不安全模式
    1
    ceph config set mon auth_allow_insecure_global_id_reclaim false

    之后就可以看到ceph集群的健康状态变成了ok,之后开始添加osd节点,首先需要确定在每个ceph节点上都有一块裸磁盘用来作为osd盘,一定要先解除磁盘挂载并格式化,再把磁盘作为osd添加进入集群。
    7. 之后在主节点中使用ceph-deploy工具创建osd节点
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ceph-deploy osd create ca34 --data /dev/sdb
    ceph-deploy osd create ca37 --data /dev/sdb
    ceph-deploy osd create ca37 --data /dev/sdc
    ceph-deploy osd create ca44 --data /dev/sdb
    ceph-deploy osd create ca44 --data /dev/sdc
    ceph-deploy osd create ca45 --data /dev/sdb
    ceph-deploy osd create ca46 --data /dev/sdb
    ceph-deploy osd create ca46 --data /dev/sdc
    ceph-deploy osd create ca47 --data /dev/sdb
    ceph-deploy osd create ca48 --data /dev/sdb
    ceph-deploy osd create ca48 --data /dev/sdc
    ceph-deploy osd create ca57 --data /dev/sdb
    ceph-deploy osd create ca57 --data /dev/sdc
    ceph-deploy osd create ca59 --data /dev/sda
    ceph-deploy osd create ca66 --data /dev/sda
    ceph-deploy osd create ca66 --data /dev/sdb

    8. 之后可以执行ceph -s指令查看此时的ceph集群状态,可以看到3个osd节点已经成功上线,但是系统会提示缺少mgr提供的守护进程,这个时候选在主节点创建一个mgr模块
    1
    ceph-deploy mgr create ca62 ca34 ca37

    9. cephfs文件系统创建
    RBD块存储不支持多个主机共享一块磁盘,这个时候就需要添加cephfs文件系统。首先在每个节点上建立mds
    1
    ceph-deploy mds create ca62 ca34 ca37 ca39 ca44 ca45 ca46 ca47 ca48 ca57 ca59 ca66 ca68 ca94 ca95 ca96

    接下来创建两个存储池,一个用来保存数据,一个用来保存元数据
    1
    2
    ceph osd pool create cephfs_data 128 128
    ceph osd pool create cephfs_metadata 128 128

    接下来创建cephfs文件系统,把之前的两个数据池连接起来
    1
    2
    3
    ceph fs new cephfs-yyx cephfs_metadata cephfs_data
    #可以修改mds的active数量,这里修改为16
    ceph fs set cephfs-yyx max_mds 16

    过一段时间所有的mds全部启动
    10. 添加两个monitor
    1
    2
    ceph-deploy mon add ca34 --address 192.168.3.194
    ceph-deploy mon add ca37 --address 192.168.3.197

    执行ceph -s可以看到集群已就绪,报警的是备用mds不够,可以通过修改9中最红一条指令的参数来调整active mds的数量

对比测试

对比测试介绍

为了进行论文实验部分的对比,在查阅了相关文献后,选择了SC’21上面的Lunule作为mds部分的优化对比测试。

  • Lunule组件简介:作者通过在mds模块中添加了多个模块进行mds子树分割算法的补充优化,很好的提升了mds的负载均衡。整个Lunule是基于特定版本的ceph-luminous开发的。大致的测试结果会在后文中进行介绍。
安装步骤
  1. 在github下载源码仓库,并完成编译,注意使用的gcc版本与作者推荐的保持一致gcc-4.8.5:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    git clone https://github.com/mdbal-lunule/lunule.git
    sudo yum install -y wget
    wget ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/epel/7.2020-04-20/x86_64/Packages/p/python34-Cython-0.28.5-1.el7.x86_64.rpm
    sudo yum install -y python34-Cython-0.28.5-1.el7.x86_64.rpm
    ./install-deps.sh
    ./do_cmake.sh
    cd Lunule/build
    make -j16
    sudo make install -j16
    可能会遇到需要安装依赖bzip2-devel包,直接使用yum源进行安装即可,但是仍旧会在编译的时候发生报错,具体原因是宏展开的时候同名宏发生冲突,具体的解决办法见链接,修改源玛后重新编译,成功。
  2. 修改安装的ceph版本
    注意到这里首先对ceph需要进行换源,修改后的ceph.conf如下:
    1
    2
    3
    4
    5
    6
    7
    8
    [ceph]
    name=ceph
    baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/x86_64/
    gpgcheck=0
    [ceph-noarch]
    name=cephnoarch
    baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch/
    gpgcheck=0
    这里替换成了阿里云上的ceph-luminous版本进行测试,原文推荐使用ceph-12.2.5版本,这里使用了ceph-12.2.13版本。下载完成后安装到mds模块中,修改ceph.conf参数:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    mon clock drift allowed = 2
    mon clock drift warn backoff = 30
    mon clock drift allowed = 2
    mon clock drift warn backoff = 30
    mds reconnect timeout = 180
    mds session timeout = 180
    mds_cache_memory_limit = 17179869184
    mds_cache_trim_decay_rate = 10
    mon_pg_warn_min_per_osd = 0
    #Lunule configuration
    mds bal ifenable = 1
    mds bal presetmax = 8000
    mds bal ifthreshold = 0.075
    [client]
    client cache size = 0
    这里使用mdtest进行测试,不同于文中作者进行的测试,我们测试了不同目录深度的情况。最终发现除了创建文件目录相比于原生ceph有一定提升外,其余操作的性能均发生大幅度的下降?