最近在某个外包项目上用到了ceph,迫不得已学习了一下安装部署和优化. 把学习使用过程总结一下。于ceph一路纯新手,不喜勿喷。

项目背景是一数据仿真项目,需要将实验数据导入到一个存储集群中,然后经过裁剪优化,以动画形式仿真还原导弹飞行过程和雷达扫描范围等。数据量较大,包含视频等内容,大约每次实验几百G到十几T不等。需求方将项目包给一国企,国企将项目包给一有资质私企,资质私企将项目中存储和仿真还原生成实时动画的部分包给了我们,大致就是这么个情况。国企那边定好了基础技术架构方案就是用ceph,挑好了软件,我们没得挑。让干啥干啥。为此我还专门跑了趟外地,劝说不要用ceph,效率低。但是国企不听,躺地上打滚那种就要就要。没辙,就只能开始学习ceph了。

以上为项目技术背景,下面是我的学习笔记,不一定都对,学个大概齐,前前后后加起来学了有一个月吧。其实我挺讨厌ceph的,太麻烦了,但挣钱么,不寒碜。

甲方要求使用ubuntu 20.04, ceph版本尽可能新一些,我使用18版本,官方deb安装包。

ceph-deploy是第三方开发的部署包,简化ceph部署过程,但是目前处于废弃状态,官方推荐使用cephadm替代,但经本人实测,ubuntu20.04上的ceph-deploy 2.0.1仍可用于ceph18部署。ceph-deploy网上资料很多,学起来相对容易。

前置条件是安装部署好操作系统,和ceph相关软件包,已经apt install ceph-mon ceph-mgr ceph-mds ceph-osd radosgw ceph-deploy等,然后hosts等也都设置好,跟hadoop一样。分布式集群都需要ip和主机名互通,做dns也行。

下面是我的整个部署过程,deb或rpm安装好ceph后,应会有/etc/ceph目录,进入该目录执行ceph-deploy才可以,ceph-deploy要求当前目录下必须有ceph.conf

ceph-deploy new hostname #初始化新节点, 需要创建初始keyring等

#如单节点,则编辑ceph.conf加入如下,多节点则不需要这步
osd crush chooseleaf type = 0
osd journal size = 1024
osd pool default size = 1
osd pool default min size = 1

#单节点多节点通用
ceph-deploy mon create-initial #初始化第一台mon角色
ceph-deploy admin hostname #在hostname主机上设置admin角色
ceph-deploy mgr create hostname # 在hostname上创建mgr角色

# 硬盘如已分区格式化,则执行
    sgdisk --zap-all /dev/sdx # 擦除整个硬盘,抹掉分区表等信息
# 或使用
    ceph-deploy disk zap hostname /dev/sdx #清理, 不太好用

ceph-deploy osd create --data /dev/sdx hostname # 创建osd, osd为ceph管理硬盘的角色,一般是一块硬盘是对应一个osd进程,此处为wal,db不分离的方式,有分离方式后面说。
ceph -s # 查看当前ceph状态

ceph-deploy rgw create hostname #在hostname上创建radosgw角色,简答理解就是s3协议网关
ceph osd pool set .rgw.root pg_num 128 #设置存储池
ceph osd pool set .rgw.root pgp_num 128 #pgp我还没学到是什么玩意
radosgw-admin user create --uid="admin" --display-name="admin" --system # 并记录access_key和secret_key
# 创建s3初始用户admin, 一定要把显示的access_key和secret_key记录下来
radosgw-admin  caps add --uid="admin" --caps="users=read,write; usage=read,write; buckets=read,write"
# 设置admin用户权限

#接下来创建cephfs, 就是要挂载成本地磁盘
#cephfs相关
ceph-deploy mds create hostname # 创建ceph fs 需要用到元数据服务
ceph osd pool create cephfs-metadata 128 128 # 创建fs的元数据存储池
ceph osd pool create cephfs-data 128 128 # 创建fs的数据存储池
ceph fs new cephfs cephfs-metadata cephfs-data # 创建fs namespace
ceph config set osd osd_pool_default_size 1 # 设置ceph默认副本数
ceph config set osd osd_pool_default_min_size 1 # ceph默认最小副本数
ceph osd pool set cephfs-data size 1 # 设置该存储池副本数
ceph osd pool set cephfs-metadata size 1 # 同上
ceph-fuse /cephfs # 使用fuse 挂载为本地磁盘

#删除cephfs的话,需要先停止元数据服务也就是mds
umount /cephfs
ceph fs rm cephfs
# 然后删除相关pool,ceph默认禁止删除pool,需要一些繁琐步骤
ceph osd pool set cephfs-metadata nodelete false
ceph osd pool set cephfs-data nodelete false
ceph tell mon.* injectargs --mon-allow-pool-delete=true
ceph osd pool rm cephfs-metadata cephfs-metadata --yes-i-really-really-mean-it
ceph osd pool rm cephfs-data cephfs-data --yes-i-really-really-mean-it

#ceph 更换硬盘,需要先将原osd踢出集群并从crushmap中删除
ceph osd out {id} # 踢出osd id
ceph osd crush remove osd.{id} # 从crush表中移除
ceph auth del osd.{id} # 删除osd
systemctl stop ceph-osd@{id}.service #停止osd服务
ceph osd rm osd.{id} #删除该osd

# 查看当前ceph全部配置
ceph --admin-daemon /var/lib/ceph/ceph-osd.0.asok config show | grep something

#如使用日志和数据分离, 则osd创建方式如下
#使用日志数据分离
ceph-deploy osd create --data /dev/sdc --block-db /dev/sdd --block-wal /dev/sde hostname


通过学习,我了解到几个点:

  1. 日志和数据分离可以提升一些效率,但也没有特别大的提升
  2. ceph-deploy卸载后,需要用dmsetup remove去/dev/mapper里面移除设备,否则就要重启机器,然后清理/var/lib/ceph, /var/run/ceph, 然后重新装ceph
  3. radosgw经常会出现没有7480端口的问题,这大概率是由于osd没有正确提供服务导致的,使用ceph -s查看pgs是否存在不可用情况。这块坑了我很久,因为不懂,ceph又没有相关的日志,非常坑。
  4. ceph-fuse挂载本地磁盘方式效率非常低,通常用任何种类盘总并发累加都无法超过800MB/s,nvme也不行, 尽量就别用了。800MB/s的时候,无论什么硬盘,ceph-fuse本身会跑到350%的cpu,基本就是4线程满载,我也没找到fuse怎么增加线程,所以,我放弃用这个挂载ceph,但项目上需要把ceph挂载为本地磁盘,所以我选择了用libcephfs2原生直接挂载本地磁盘,这在ceph官方文档里是推荐的方式,速度比fuse快好几倍。但貌似国内用的人不多吧,不清楚。

附带一个libcephfs2原生挂载的测速报告,当然这不太严谨,看个大概吧。

测试使用linux命令dd

dd  if=/dev/zero bs=1M count=20480 status=progress of=/cephfs/z1-z5

中心测试在ceph-es-0001/10.0.9.11上进行,开5个终端,每个终端输入命令,输出文件为z1到z5

if=/dev/zero意思是从0设备中作为文件输入,输入内容全部为0

bs=1M意思是写入文件块大小为1M

count=20480为循环20480次,共计20GB

of=/cephfs/z1意思是输出文件为/cephfs/z1, 其中/cephfs为ceph挂载的本地磁盘目录


开5窗口同时写入5个20G文件,共计100G, 测试并发写入速度.每个终端测试5次.



5节点集群版单机写入速度测试,全机械sata3,每节点约28块

Ceph使用学习之一_分布式存储

进程1次数1-5: 314,318,335,350,337

Ceph使用学习之一_对象存储_02

进程2:328,332,329,373,356

Ceph使用学习之一_块存储_03

进程3:312,312,312,326,326

Ceph使用学习之一_对象存储_04

进程4:305,306,306,317,317

Ceph使用学习之一_ceph_05

进程5:304,305,304,318,314


进程1-5:

第一次分别为314+328+312+305+304=1563MB/s

第二次分别为318+332+312+306+305=1573MB/s

第三次分别为335+329+312+306+304=1586MB/s

第四次分别为350+373+326+317+318=1684MB/s

第五次分别为337+356+326+317+314=1650MB/s


dd 测速结果, 5进程同时写入, 共测试5次,如上图,基本维持在每进程300+MB,总速度大于1.5GB/s 考虑到samba和小文件等随机写因素造成的衰减,1.0-1.2G为保守写入速度范围。



单机版测速结果,全ssd,每节点24块

Ceph使用学习之一_云存储_06

进程1:300,259,267,259,267

Ceph使用学习之一_块存储_07

进程2:283,259,258,259,262

Ceph使用学习之一_ceph_08

进程3:276,269,260,260,262

Ceph使用学习之一_ceph_09

进程4:262,261,258,260,258

Ceph使用学习之一_ceph_10

进程5:258,273,256,256,260


进程1-5:

第一次分别为300+283+276+262+258=1379MB/s

第二次分别为259+259+269+261+273=1320MB/s

第三次分别为267+258+260+258+256=1299MB/s

第四次分别为259+259+260+260+256=1294MB/s

第五次分别为267+262+262+258+260=1309MB/s


dd 测速结果, 5进程同时写入, 共测试5次,如上图,基本维持在每进程250+MB,总速度大于1.2GB/s 考虑到samba和小文件等随机写因素造成的衰减,保守估计总体能在900M-1G左右维持

事实上,增加机器可以提升ceph速度,通过ceph -s查看写入时ceph的io状态,估计ceph集群写入大约也就是在2G左右,应该不会更快了,nvme貌似对挂载本地磁盘这种方式也不会有很大提升。