Ubuntu22.04搭建ceph 集群

桂高义
2023-12-01

Ceph是一个开源的、提供软件定义的、统一的分布式存储系统,设计初衷是提供较好的性能、
可靠性和可扩展性。(open-source,distributed,reliable,scalable,unified)
“统一的”意味着一套存储系统同时提供块存储、文件存储、对象存储三种功能。
“分布式”意味着Ceph实现了无中心结构和没有理论上限的系统规模可扩展性

• 高性能
a. 摒弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布均衡,并行度高。
b.考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。
c. 能够支持上千个存储节点的规模,支持TB到PB级的数据。
• 高可用性
a. 副本数可以灵活控制。
b. 支持故障域分隔,数据强一致性。
c. 多种故障场景自动进行修复自愈。
d. 没有单点故障,自动管理。
• 高可扩展性
a. 去中心化。
b. 扩展灵活。
c. 随着节点增加而线性增长。
• 特性丰富
a. 支持三种存储接口:块存储、文件存储、对象存储。
b. 支持自定义接口,支持多种语言驱动。
• 运行在通用商用硬件之上

Ubuntu2204LTS默认仓库已包含ceph软件,版本号为17(Q版)

设置主机名,同步网络时间和修改时区,免密认证

vim /etc/hosts

hostnamectl set-hostname cephnode01
hostnamectl set-hostname cephnode02
hostnamectl set-hostname cephnode03

ssh-keygen  -t  rsa
ssh-copy-id root@cephnode02
ssh-copy-id root@cephnode03

安装 NTP 服务

sudo apt-get update
sudo apt-get install ntp
配置 NTP 服务器

编辑 /etc/ntp.conf 文件:

sudo nano /etc/ntp.conf
将下面这行注释掉:

#pool 0.ubuntu.pool.ntp.org iburst
在文件末尾添加以下内容:

server ntp.ubuntu.com
启动 NTP 服务

sudo systemctl start ntp
检查 NTP 服务状态

sudo systemctl status ntp

客户端安装ntpdate
sudo apt install -y ntpdate
同步时间
sudo ntpdate 192.168.0.11各节点安装ceph
apt install ceph –y

查看版本

ceph –v

初始节点node01上生成初始配置文件,生成一个UUID做为集群唯一标识符

# uuidgen
5b01c9c9-e237-42a0-a93a-653d1a405a2d
# vim /etc/ceph/ceph.conf
[global]
fsid = 5b01c9c9-e237-42a0-a93a-653d1a405a2d
mon initial members = node01
mon host = 172.16.249.111
public network = 172.16.249.0/24
cluster network = 192.168.100.0/24
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 32
osd pool default pgp num = 32
osd crush chooseleaf type = 1

初始化添加mon节点

创建mon令牌环
# sudo ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
创建管理令牌环
# sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd
'allow *' --cap mds 'allow *' --cap mgr 'allow *'
创建osd引导令牌环(每个节点添加osd需要)
# sudo ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' --cap mgr 'allow r'
将mon令牌环添加给管理和osd引导令牌环中
# sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
# sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
修改用户组
# sudo chown ceph:ceph /tmp/ceph.mon.keyring
生成monmap,命令格式如下:
monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
例如
# monmaptool --create --add node01 172.16.249.111 --fsid 5b01c9c9-e237-42a0-a93a-653d1a405a2d /tmp/monmap
*注意将节点名、节点IP地址和集群fsid改为实际对应


创建mon目录,命令格式如下,如果目录属主不是ceph需修改为ceph。
sudo -u ceph mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}
默认集群名称为ceph,当前节点名称为node01,例如
# sudo -u ceph mkdir /var/lib/ceph/mon/ceph-node01
# chown -R ceph /var/lib/ceph/mon/ceph-node01/
初始化mon节点守护进程,命令格式如下:
sudo -u ceph ceph-mon [--cluster {cluster-name}] --mkfs -i {hostname} --monmap
/tmp/monmap --keyring /tmp/ceph.mon.keyring
默认集群名称为ceph,使用monmap和mon密钥换进行初始化,例如
# sudo -u ceph ceph-mon --mkfs -i node01 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
为了防止重新被安装创建一个空的done文件
# sudo touch /var/lib/ceph/mon/ceph-node01/done
启动服务,并设置开机自动启动
# systemctl start ceph-mon@node01
# systemctl status ceph-mon@node01
# systemctl enable ceph-mon@node01
查看集群健康状态:
# ceph -s
有如下告警:
mon is allowing insecure global_id reclaim
1 monitors have not enabled msgr2
消除告警
# ceph config set mon mon_warn_on_insecure_global_id_reclaim_allowed false
# ceph mon enable-msgr2
将/etc/ceph/下所有文件拷贝至其他节点
# ls /etc/ceph/
# scp /etc/ceph/* node02:/etc/ceph/
# scp /etc/ceph/* node03:/etc/ceph/

添加其他mon节点(可选)

如果在其他节点也要启用mon服务,即添加新的mon节点(mon节点一般为奇数个,中小型集群推荐3个),可按如下步骤:
1、登录到新节点
# ssh node02
2、创建节点mon目录
# sudo -u ceph mkdir /var/lib/ceph/mon/ceph-node02
3、在临时目录获取监视器密钥环和监视器运行图
# ceph auth get mon. -o /tmp/ceph.mon.keyring
# ceph mon getmap -o /tmp/ceph.mon.map
4、修改监视器密钥环属主和属组为ceph
# chown ceph.ceph /tmp/ceph.mon.keyring
5、初始化节点mon
# sudo -u ceph ceph-mon --mkfs -i node02 --monmap /tmp/ceph.mon.map --keyring /tmp/ceph.mon.keyring
6、启动服务,查看服务并使能开机启动
# systemctl start ceph-mon@node02
# systemctl status ceph-mon@node02
# systemctl enable ceph-mon@node02
7、验证
# ceph -s
8、为了防止重新被安装在监视器节点目录下创建一个空的done文件
# sudo touch /var/lib/ceph/mon/ceph-node02/done 39

OSD

Ceph OSDs:Ceph OSD 守护进程( Ceph OSD )的功能是存储数据,处理数据的复制、恢复、回填、
再均衡,并通过检查其他OSD 守护进程的心跳来向 Ceph Monitors和Managers 提供一些监控信息。
当 Ceph 存储集群设定为有2个副本时,至少需要2个 OSD 守护进程,集群才能达到 active+clean 状态
( Ceph 默认有3个副本,但你可以调整副本数)。一般至少需要3个osd来保证冗余和可靠性。
40
OSD性能是整个集群性能的关键因素。
主要考虑:
Raid+硬盘+网络
通常一个OSD守护进程会被捆绑到集
群中的一块物理硬盘上。

首先将osd引导密钥环文件/var/lib/ceph/bootstrap-osd/ceph.keyring 密钥环从初始 mon 节点拷贝到
集群中其他节点相同目录下。
或使用如下命令直接从集群导出:
# ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
查看可用磁盘,并验证磁盘,确保磁盘为空闲:
# ls /dev/vd* (或ls /dev/sd*,如果有NVME磁盘则以nvme开头)
# fdisk -l /dev/vdc
硬盘如果有分区信息应先清除分区信息,否则创建 osd 会报错,全新硬盘可跳过此步骤。
# dd if=/dev/zero of=/dev/vdc bs=512K count=1
*注意, 一定要再三检查目标硬盘是否是期望的硬盘, 如果操作错了硬盘, 分区表直接就没了。
创建OSD会使用到LVM卷工具,确保LVM工具已安装。
# apt install -y lvm2
生产环境中通常使用大容量SATA做为数据存储盘,并使用NVME进行加速。或还同时有SSD盘、SAS盘。
OSD使用SATA做为data存储盘,对db和wal日志使用NVME存储,可有效提高OSD性能。
可使用如下命令创建OSD:
# sudo ceph-volume lvm create --data /dev/vdc
当前版本默认底层默认存储机制为 BlueStore,其性能较早先的filestore要好,并针对SSD磁盘做了优化。
有NVME固态盘可用如下命令对 db 和 wal 使用单独存储空间进行加速。
# sudo ceph-volume lvm prepare --data {dev/vg/lv} --block.wal {partition} --block.db { partition }
wal和db既可以单独存储,也可以分开存储,根据实践其容量应保证不小于data容量的5%。
查看
# sudo ceph-volume lvm list
对准备就绪的osd进行激活:
# sudo ceph-volume lvm activate {ID} {FSID}
或
# sudo ceph-volume lvm activate -all
OSD编号会从0开始自动增加,可逐个节点创建OSD,OSD守护进程也是用该ID作为标识。
启动服务:
# systemctl start ceph-osd@0
查看服务:
# systemctl status ceph-osd@0
设置开机自启动
# systemctl enable ceph-osd@0
各节点都添加完OSD可使用命令查看:
# ceph osd tree
查看集群状态:
# ceph –s

Manager

Managers: Ceph管理进程(ceph-mgr)主要负责持续监控当前集群的运行指标和运行状态,包括存储利
用率、当前性能指标、系统负载。还通过基于python的模块组管理和为外界提供统一的入口获取集群运行
信息,包括一个基于web的dashboard和REST API。一个集群一般需要主备冗余的两个节点运行管理进程。
mgr可以安装配置在任一节点,我们在节点一进行部署。以在node01节点添加为例,步骤如下:
1、创建mgr密钥环
# ceph auth get-or-create mgr.node01 mon 'allow profile mgr' osd 'allow *' mds 'allow *'
2、创建mgr节点目录,节目目录默认名称为集群名称+节点名称
# sudo -u ceph mkdir /var/lib/ceph/mgr/ceph-node01
3、获取mgr密钥环,导出到节点目录下,名称为默认为keyring
# ceph auth get mgr.node01 -o /var/lib/ceph/mgr/ceph-node01/keyring
4、启动服务
# systemctl daemon-reload
# systemctl start ceph-mgr@node01
# systemctl status ceph-mgr@node01
# systemctl enable ceph-mgr@node01
再次查看集群状况,显示已经HEALTH_OK。此时集群已可以提供基本的块存储服务了。
# ceph -s

dashboard安装配置

在mgr所在节点可以安装ceph-mgr-dashboard以方便使用web管理控制面板。
# apt install -y ceph-mgr-dashboard
在 mgr 所在节点启用 dashboard
# ceph mgr module enable dashboard
自建证书供ssl使用
# ceph dashboard create-self-signed-cert
# openssl req -new -nodes -x509 \
-subj "/O=IT/CN=ceph-mgr-dashboard" -days 3650 \
-keyout dashboard.key -out dashboard.crt -extensions v3_ca
会在当前目录生成证书文件dashboard.crt和私钥文件dashboard.key。
导入证书文件和私钥文件:
# ceph dashboard set-ssl-certificate -i dashboard.crt
# ceph dashboard set-ssl-certificate-key -i dashboard.key
设置dashbaord地址和端口
# ceph config set mgr mgr/dashboard/server_addr 172.16.249.147
# ceph config set mgr mgr/dashboard/server_port 8080
# ceph config set mgr mgr/dashboard/ssl_server_port 8443

存储池

存储池(Pool):是Ceph存储数据时的逻辑分区,是Ceph中一些对象的逻辑分组。每个Pool包含一定数
量的PG,PG里的对象被映射到不同的OSD上,因此pool是分布到整个集群的。除了隔离数据,对不同的
pool可以设置不同的优化策略,,比如副本数、数据清洗次数、数据块及对象大小等。一个pool里面有多
个image,我们在使用块存储时是使用的rbd存储池中的image。存储池分为两种类型:Replicated 复制
型,对象具有多份拷贝,确保部分OSD丢失时数据不丢失,需要更多的磁盘空间。复制份数可以动态调整,
默认为3;Erasure-coded 纠错码型,节约空间,但是速度慢,不支持所有对象操作(例如局部写)。
查看集群存储池:
# ceph osd lspools
初始只有一个默认存储池,创建存储池命令格式如下,默认为replicated类型
ceph osd pool create <pool_name> pg_mun pgp_mun
如果不写pg_num数和pgp_num数会使用集群配置文件种的默认值。
我们创建一个rbd存储池:
# ceph osd pool create rbd 16 16
使用rbd工具对存储池进行初始化(rbd工具默认存储池为rbd):
# rbd pool init rbd
块存储使用的存储池我们都初始化为rbd类型。存储池还可以根据应用类型初始化为cephfs和rgw,对应
文件存储池和对象存储池。

镜像

镜像(image):rbd 存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把
映像文件作为块设备使用。镜像将被条带化为N个子数据块,每个数据块以对象(object)的形式存在,保
存在RADOS对象存储中。
rbd 命令还可用于创建、查看及删除块设备相对应的镜像(image),以及克隆镜像、创建快照、将镜像
回滚到快照和查看快照等管理操作。
创建镜像命令:
rbd create --size {megabytes} {pool-name}/{image-name}
# rbd create --size 10240 rbd/image1
查看存储池中的镜像
# rbd ls rbd
查看镜像信息
# rbd info rbd/image1

size:镜像的大小与被分割成的条带数
order 22:条带的编号,有效范围是12到25,对应4K到32M,而22代表2的22次方,这样刚好是4M。
id:镜像的ID标识。
block_name_prefix:名称前缀。
Format默认为2,即使用了rbd2格式,此格式增加了克隆支持,使得扩展更容易,还允许以后增加新功能。
Features:开启的特性。默认开启了特性layering(支持分层,快照特性必须)、exclusive-lock(支持独占锁)、
object-map(支持对象映射)、fast-diff(快速计算差异)、deep-flatten(支持快照扁平化操作)
op_features:可选的功能特性。

映射镜像(当前使用的是admin管理员账户):
# rbd device map rbd/image1
/dev/rbd0
查看映射情况:
# rbd showmapped
此时对块设备/dev/rbd0就可以进行分区格式化文件系统挂载使用了。
断开映射:
# rbd device unmap /dev/rbd0
删除镜像:
# rbd remove rbd/image1
或#
rbd rm rbd/image1
这种方法删除镜像后,镜像将不可恢复。推荐使用trash命令,这个命令删除是将镜像移动一回收站,如果想找回还可以恢复。trash move代表将镜像移动到回收站,list查看回收站所有镜像、remove从回收站删除镜像,restore从回收站恢复、purge清空回收站。使用trash在操作的时候同样需要指定--pool。在restore的时候需要指定镜像的ID,在list的时候可以显示出镜像的ID。
rbd trash move <pool name>/<image name>
rbd trash list --pool <pool name>
rbd trash restore <pool name>/<id>
调整镜像大小使用ceph resize命令,一般建议只增不减,如果是减少的话需要加一个选项--allow-shrink。
语法:rbd resize <pool name>/<image name> --size <size number>
在增加了镜像大小后可扩展文件系统来利用增加了的存储空间。Linux XFS文件系统支持在线调整大小,其他需要阅读
文件系统文档。

镜像快照

Ceph全面支持快照,快照是在某个时间点上生成的只读RBD镜像副本。可以通过创建和恢复快照来保持
镜像的状态以及从快照恢复原始数据。快照技术是我们经常使用的一种数据备份技术。快照并不知道镜像
中的文件系统,一般使用快照应停止I/O操作。
为镜像创建快照:
语法: rbd snap create {pool-name}/{image-name}@{snap-name}
# rbd snap create rbd/image1@20221217
查看镜像快照
语法: rbd snap ls {pool-name}/{image-name}
或使用rbd ls –l <pool name> 查看存储池所有镜像信息时会列出。
恢复快照使用回滚(rollback)操作,它会使用快照版本覆盖当前版本镜像和里面的数据。
语法:rbd snap rollback <pool name>/<image name>@<snap name>
当不需要快照时,可以删除快照,删除快照不会影响当前镜像上的数据
语法: rbd snap rm <pool name>/<image name>@<snap name>
当镜像有多个快照,可以用purge一条命令删除所有快照。
语法: rbd snap purge <pool name>/<image name>
删除一个镜像必须先删除它所有的快照,即有快照的镜像是不允许直接删除的。

镜像快照在云计算平台中的应用原理

Ceph RBD镜像format-2格式支持layering特性,这一特性支持以写时复制(COW)的方式从RBD镜像快照
快速创建克隆(Clone)。这以特性也被称为快照分层(Snapshot Layering)。分层特性允许客户端创建多个
Ceph RBD克隆实例。这在以QEMU/KVM为主要技术的各种云计算平台中非常有用。快照是只读的,并
且对快照进行了保护,但COW克隆是完全可写的,这些快照用来被孵化实例。在对接了Ceph的
Openstack云计算平台中,生成的虚拟机实例正是glance保存在ceph存储池中的镜像的快照的一个COW
克隆,而这个镜像的快照是受到保护的一个镜像快照,如果要删除这个镜像首先得取消镜像快照的保护,
再删除其所有快照,方能删除镜像。

创建两个存储池images和vms
# ceph osd pool create images 64 64
# ceph osd pool create vms 64 64
在images存储池中创建一个镜像,并检查它的详细信息
# rbd create --size 1024 images/image1
# rbd info images/image1
给这个镜像创建快照
# rbd snap create images/image1@20221217

查看镜像快照
# rbd snap ls images/image1
或查看存储池中所有镜像和快照
# rbd ls -l images
对这个快照进行保护,这一步是必须的,否则父镜像快照一旦被删除,所有的COW克隆都将被摧毁。
# rbd snap protect images/image1@20221217
使用快照克隆一个新的子镜像,这一过程是非常快的。
语法: rbd clone <pool-name>/<parent-image>@<snap-name> <pool-name>/<child-image name>
# rbd clone images/image1@20221217 vms/image1_clone
可以通过检查子镜像会看到它有父镜像。
# rbd info vms/image1_clone
如果让克隆的子镜像独立于它的父镜像,需要将父镜像信息合并(flattern)到子镜像,合并操作的时间长短取决于父镜像
快照的数据量大小。一旦合并完成,两个镜像之间将不会存在任何依赖关系。
# rbd flatten vms/image1_clone
# rbd info vms/image1_clone

PG and PGP

归置组(Placement Group):PG是Pool组织对象的方式,它是ceph的逻辑存储单元。Pool由若
干PG组成,PG 的数量会影响Ceph集群的行为和数据的持久性。在数据存储到ceph时,先打散成一
系列对象,再结合基于对象名的哈希操作、复制级别、PG数量,产生目标PG号。根据复制级别的不
同,每个PG在不同的OSD上进行复制和分发。可以把PG想象成存储了多个对象的逻辑容器,这个容
器映射到多个具体的OSD。PG存在的意义是提高ceph存储系统的性能和扩展性。如果没有PG,就
难以管理和跟踪数以亿计的对象,它们分布在数百个OSD上。对ceph来说,管理PG比直接管理每个
对象要简单得多。每个PG需要消耗一定的系统资源包括CPU、内存等。集群的PG数量应该被精确计
算得出。通常来说,增加PG的数量可以减少OSD的负载,但是这个增加应该有计划进行。一个推荐
配置是每OSD对应50-100个PG。如果数据规模增大,在集群扩容的同时PG数量也需要调整。
CRUSH会管理PG的重新分配。
每个pool应该分配多少个PG,与OSD的数量、复制份数、pool数量有关。
有个计算公式:
Total PGs = ((Total_number_of_OSD * 100) / max_replication_count) / pool_count
结算的结果往上取靠近2的N次方的值。比如总共OSD数量是160,复制份数3,pool数量也是3,那
么按上述公式计算出的结果是1777.7。取跟它接近的2的N次方是2048,那么每个pool分配的PG数
量就是2048。

PGP(Placement Group for Placement purpose)是为了管理placement而存在的专门的PG,它和
PG的数量应该保持一致。相当于是pg存放的一种osd排列组合。举个例子:假设集群有3个osd,即osd1,
osd2,osd3,副本数为2,如果pgp=1,那么pg存放的osd的组合就有一种,可能是[osd1,osd2],那
么所有的pg主从副本都会存放到osd1和osd2上;如果pgp=2,那么其osd组合可能就两种,可能是
[osd1,osd2]和[osd1,osd3],pg的主从副本会落在[osd1,osd2]或者[osd1,osd3]中,和我们数学中的排列组合很像,所以pg是存放对象的归属组是一种虚拟概念,pgp就是pg对应的osd排列组合。如果增加
pool的pg_num,就需要同时增加pgp_num,保持它们大小一致,这样集群才能正常rebalancing。在更
改pool的PG数量时,需同时更改PGP的数量。
查询和修改pg_num和pgp_num使用如下命令:
ceph osd pool get <pool_name> pg_num
ceph osd pool get <pool_name> pgp_num
ceph osd pool set <pool_name> pg_num <pg_num>
ceph osd pool set <pool_name> pgp_num <pgp_num>
例如,查询和修改rbd存储池pg_num和pgp_num:
# ceph osd pool get rbd pg_num
# ceph osd pool get rbd pgp_num
# ceph osd pool set rbd pg_num 64
# ceph osd pool set rbd pgp_num 64

Ceph身份验证

Ceph提供两种身份验证:
none:None模式下,任何用户可以在不经过身份认证时就访问集群。如果确信你的网络非常安全,可以
禁用验证来节省计算成本。
Cephx:Ceph提供了Cephx身份验证系统来验证用户和守护进程。Cephx协议并不加密数据。默认情况
下,ceph集群启用cephx。
注意:CephX 身份验证功能仅限制在Ceph 的各组件之间,不能扩展到其他非ceph 组件
Ceph 只负责认证授权,不能解决数据传输的加密问题
要访问Ceph集群,用户或应用将调用Ceph客户端和集群的monitor节点通信。一个客户端可以连接任何
一个monitor节点来开始身份验证。
# ceph auth list
一个有效的用户名语法是 TYPE.ID ,如client.admin或client.cinder。
Ceph使用术语“权限(capabilities)”缩写为caps表示用户被授予的权限

创建新账户需要使用集群管理员client.admin调用ceph auth get-or-create命
令产生一个用户名(username)和密钥(secret key),并将它保存在monitor上,
再将用户密钥返回给client.admin。Ceph管理员将用户名和密钥提供给需要安
全地访问Ceph存储服务的客户端。

1、客户端发送用户名给monitor。双方都有密钥副本,无需发送密钥。
2、monitor为该用户产生一个会话密钥,并用该用户的密钥对它加密后发回给客户端。
3、客户端解密使用它的密钥对会话密钥解密得到会话密钥。该会话密钥会在当前会话中一直保持有效。
4、客户端使用该会话密钥申请一个ticket
5、客户端使用获得的ticket对和ceph节点间传递的所有消息签名Cephx 协议会对客户端和 Ceph 集群节点之间的通信进行身份验证。在最初的身份验证之后,客户端和 Ceph 节点之间传递的所有消息都会被这个 ticket 签名,然后这些消息会被 monitor、OSD 和元数据节点使用共享的密钥做验证。而且,Cephx ticket 是会过期的,因此一个攻击者无法使用一个过期的 ticket 或者会话密钥来获取 Ceph 集群的访问权限。

Ceph用户授权

用户通过身份验证后,会被授予不同的访问类型或角色(role)的权限。Ceph使用术语“权限
(Capabilities)”,缩写为caps。它是用户被授予的权限,定义了该用户对Ceph集群的访问级别。
基本语法如下:
{daemon-type} ‘allow {capability}’ {daemon-type} ‘allow {capability}’
Monitor caps,包括r、w、x参数以及allow profiles {cap} 。比如
mon ‘allow rwx’ 或 mon ‘allow profile osd’
OSD caps,包括r、w、x、class-read、class-write,以及profile osd 。比如:
osd ‘allow rwx’ 或 osd ‘allow class-read,allow rwx pool=rbd’
MDS caps,只允许allow,如 mds ‘allow’
allow:只用于赋值用户MDS的rw权限。
R:赋予用户读取权限,从monitor读取CRUSH map时必须有的。
W:赋予用户写入数据权限。
X:赋予用户调用对象方法的权限,包括读和写,以及在monitor上执行用户身份验证的权限。

Ceph用户添加

客户端使用ceph块存储需要在集群创建client账户并授权
# ceph auth get-or-create client.rbd mon 'allow r' osd 'allow rwx pool=rbd'
可以从集群导出为令牌环文件,将该文件和认证信息在客户端需要
# ceph auth get client.rbd -o ceph.client.rbd.keyring
将该文件发送给客户端
并将ceph.conf(只含基本信息)也发送给客户端。

Ceph客户端

客户端安装ceph-common,并创建/etc/ceph/ceph.conf文件,但客户端集群配置文件中只包含集群基本
信息,主要为集群基本信息和mon节点网络信息,有时还添加客户端keyring信息。
[global]
fsid = 738fc39e-9aba-463a-bbbe-b5d130fd7208
mon initial members = node01,node02,node03
mon host = 172.16.249.147,172.16.249.148,172.16.249.149
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
[client.rbd]
keyring = /etc/ceph/ceph.client.rbd.keyring
在客户端测试到集群的连接性,配置文件中已经配置了令牌环,命令中可以不使用令牌环,但是必须得声
明客户端用户名,使用--name或-n参数
# ceph --name client.rbd --keyring /etc/ceph/ceph.client.rbd.keyring -s
# ceph -n client.rbd -s

Ceph客户端使用块存储

在客户端创建镜像
# rbd -n client.rbd create --size 1024 rbd/image1
查看创建的镜像信息
# rbd -n client.rbd info rbd/image1
连接块存储
# rbd -n client.rbd map rbd/image1
# rbd showmapped
/dev/rbd0
对/dev/rbd0进行分区格式化挂载后就可以和使用本地硬盘一样了。
设置自动map,以便客户端启动时自动连接镜像,需在/etc/ceph/rbdmap中添加连接信息,
# vi /etc/ceph/rbdmap
rbd/image1 id=rbd,keyring=/etc/ceph/ceph.client.rbd.keyring
该功能依赖于rbdmap服务,而文件系统自动挂载在/etc/fstab中配置。
# mkfs.xfs /dev/rbd0
# mount /dev/rbd/rbd/image1 /mnt
设置开机挂载,在/etc/fstab中添加
/dev/rbd/rbd/image1 /mnt xfs defaults,noatime,_netdev 0 0

ceph iscsi块存储服务

iSCSI由于使用以太网技术在传输距离、传输速度方面有一定优势而得到了广泛的应用。Ceph使用了LIOTCMU的方式也能提供iSCSI服务,并且支持多路径(MultiPath)提高连接可靠性。
iSCSI网关提供高可用性(HA)iSCSI目标,该目标将RADOS块设备(RBD)映像导出为SCSI磁盘。iSCSI
协议允许客户端(启动器)通过TCP/IP网络向存储设备(目标)发送SCSI命令,从而使没有本机Ceph客
户端支持的客户端能够访问Ceph块存储。
每个iSCSI网关都利用Linux IO目标内核子系统(LIO)提供iSCSI协议支持。LIO利用用户空间传递
(TCMU)与Ceph的librbd库交互,并向iSCSI客户端公开RBD映像。使用Ceph的iSCSI网关,可以提供
一个完全集成的块存储基础架构,该基础架构具有传统存储区域网络(SAN)的所有功能和优势。

在ubuntu2204上我们可以安装ceph-iscsi,可以安装多个节点服务,既可以使用单独的节点也可以使用
ceph集群已有节点。我们使用node02和node03节点安装两个iscsi网关。
首先,Ceph集群降低检测关闭的OSD的默认心跳间隔以减少启动器超时的可能性。
在ceph配置文件中添加如下配置:
# vi /etc/ceph/ceph.conf
[osd]
osd heartbeat grace = 20
osd heartbeat interval = 5
执行以下命令让配置立即生效
# ceph tell osd.* config set osd_heartbeat_grace 20
# ceph tell osd.* config set osd_heartbeat_interval 5


安装ceph-iscsi
# apt update
# apt install -y ceph-iscsi
修改配置文件
# vi /etc/ceph/iscsi-gateway.cfg
[config]
cluster_name = ceph
gateway_keyring = ceph.client.admin.keyring
api_secure = false
api_user = admin
api_password = admin
api_port = 5001
trusted_ip_list = 172.16.249.148,172.16.249.149
使能服务设置开机重启
# systemctl enable --now tcmu-runner
# systemctl enable --now rbd-target-api
# systemctl enable --now rbd-target-gw
重启服务
# systemctl restart tcmu-runner
# systemctl restart rbd-target-api
# systemctl restart rbd-target-gw

dashboard 添加
# vi iscsigw-node02
http://admin:admin@node02:5001
# ceph dashboard set-iscsi-api-ssl-verification false
# ceph dashboard iscsi-gateway-add -i iscsigw-node02
# ceph dashboard iscsi-gateway-list
有多个 iscsi 网关的话可继续添加,添加完毕在Dashboard即可使用Web进行管理操作。

ceph iscsi Target

配置 iSCSI Target 将一个 rbd 镜像输出为 LUN0
1、在一个 iSCSI 网关节点,以 root 用户运行 gwcli 命令开启一个命令行接口
# gwcli
/> ls
2、进入 iscsi-targets,创建一个 target,名称为 iqn.2022-01.com.test:test1
命名在同一子网内确保是唯一的,命名格式为:iqn.yyyy-mm.<主机名域名反写>:自定义名称
(自定义名称内不能有下划线)
/> cd /iscsi-targets
/iscsi-targets> create iqn.2022-01.com.test:test1
3、创建 iSCSI 网关,如果有多个网关节点可以创建多个。
/iscsi-targets> cd iqn.2022-01.com.test:test1/gateways
/iscsi-target...est1/gateways> create node02 172.16.249.148
/iscsi-target...est1/gateways> create node03 172.16.249.149 skipchecks=true
4、添加镜像
/iscsi-target...est1/gateways> cd /disks
/disks> create pool=rbd image=disk_1 size=10G
5、添加客户端 initiator,名称为 iqn.2022-03.cn.edu.lzu.cg:desktop-cg2021
/disks> cd /iscsi-targets/iqn.2022-01.com.test:test1/hosts
/iscsi-target...t:test1/hosts> create iqn.2022-03.cn.edu.lzu.cg:desktop-cg2021
6、给客户端添加硬盘
/iscsi-target...esktop-cg2021> disk add rbd/disk_1
7、如果需要认证,再设置认证
/iscsi-target...esktop-cg2021> auth username=username2022 password=password2022

ceph iscsi initiator

客户端:
安装open-iscsi和multipath-tools
# apt -y install open-iscsi multipath-tools
编辑/etc/iscsi/initiatorname.iscsi设置InitiatorName
# vi /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2022-03.cn.edu.lzu.cg:desktop-cg2021
编辑/etc/iscsi/iscsid.conf,设置认证方式或用户名密码
# vi /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = username2022
node.session.auth.password = password2022
重启服务
# systemctl restart iscsid open-iscsi


编辑multipath.conf
# vi /etc/multipath.conf
defaults {
    user_friendly_names yes
}
devices {
device {
vendor "LIO-ORG"
hardware_handler "1 alua"
path_grouping_policy "failover"
path_selector "queue-length 0"
failback 60
path_checker tur
prio alua
prio_args exclusive_pref_bit
fast_io_fail_tmo 25
no_path_retry queue
}
}
重启服务
# systemctl restart multipathd
#补充错误
[root@server ~]# systemctl restart iscsid

[root@server ~]# systemctl restart iscsi

发现 target
# iscsiadm -m discovery -t st -p 172.16.249.211
查看状态
# iscsiadm -m node -o show
登录
# iscsiadm -m node --login
或# iscsiadm -m node -T iqn.2022-01.com.test:test1 -l
登录成功后查看会话
# iscsiadm -m session -o show
查看 multipath
# multipath -ll
8704.891861 | device config in /etc/multipath.conf missing vendor or product parameter
mpatha (3600140584a0d2db06bc4808b267c02f9) dm-0 LIO-ORG,TCMU device
size=10G features='0' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 2:0:0:0 sda 8:0 active ready running
`-+- policy='service-time 0' prio=10 status=enabled
`- 3:0:0:0 sdb 8:16 active ready running
设备名称为dm-0,大小为10G。分区格式化后挂载即可使用。
注销会话
# iscsiadm -m node –logout
设置开机自动连接需在连接时添加参数-n node.startup -v automatic即可。
# iscsiadm -m node --login -n node.startup -v automatic
目前Ceph的iSCSI网关功能还处于development阶段,官方并不推荐在生产环境使用。

CephFS

Ceph文件系统,即CephFS,是一个标准的POSIX文件系统,它将用户数据存储在Ceph集群中。除了需
要一个Ceph存储集群,还需要至少一个元数据服务器(Metadata Server,MDS)来管理它的元数据,以实
现和数据分类。数据和元数据的分离降低了复杂度,同时也增加了系统的可靠性。
Ceph MDS是以一个守护进程(daemon)的方式运行的,MDS不会直接向客户端提供任何数据,所有的数
据都由OSD提供。MDS提供了一个包含智能缓存层的共享一致的文件系统,因此极大地降低了读写次数。
MDS服务可以启用多个,当主MDS节点变为活跃时,其他的MDS节点将进入“standby”状态,当主
MDS节点发生故障时,我们可以指定一个standby节点去跟踪活动节点,它会在内存中维护一份和活跃节
点一样的数据,以达到预加载缓存的目的。
由于目前CephFS还缺少稳健的文件系统检查和修改功能,以及多活跃MDS节点支持和文件系统快照功能,
在生产系统中不推荐,在非关键业务中可以以单MDS节点、无快照模式使用CephFS。

Ceph MDS

MDS服务添加,以node01节点为例:
1、创建节点目录
# sudo -u ceph mkdir -p /var/lib/ceph/mds/ceph-node01
2、生成 mds.node01 密钥
# ceph auth get-or-create mds.node01 osd "allow rwx" mds "allow" mon "allow profile mds"
3、导出 mds 密钥
# ceph auth get mds.node01 -o /var/lib/ceph/mds/ceph-node01/keyring
4、在 ceph.conf 中添加配置
[mds.node01]
host = node01
5、启动服务
# systemctl start ceph-mds@node01
# systemctl status ceph-mds@node01
# systemctl enable ceph-mds@node01
# ceph –s

创建文件存储所需存储池,文件存储服务需要两个存储池: data 数据需要一个存储池,meta 数据一个存储池。
# ceph osd pool create cephfs_data 32
# ceph osd pool create cephfs_metadata 32
# ceph osd pool application enable cephfs_data cephfs
# ceph osd pool application enable cephfs_metadata cephfs
# ceph fs new cephfs cephfs_metadata cephfs_data
# ceph fs ls
# ceph fs status cephfs
# ceph mds stat
# ceph –s
创建文件系统后,MDS将进入active状态。
创建cephfs用户,并允许这个用户访问cephfs池:
# ceph fs authorize cephfs client.cephfs / rw
导出client.cephfs令牌环,客户端使用该凭证访问cephfs文件共享系统
# ceph auth get-or-create client.cephfs -o /etc/ceph/client.cephfs.keyring

客户端使用CephFS

客户端安装ceph-common(还需要包含基础信息的ceph.conf文件),将client.cephfs.keyring文件拷贝到客户端并重命名为/etc/ceph/keyring,使用该凭证访问cephfs文件共享系统
# mkdir /mnt/fs
# mount -t ceph 172.16.249.147:6789:/ /mnt/fs -o name=cephfs
或
# sudo mount -t ceph 192.168.0.11:6789:/ /mnt/fs -o name=admin,secret=AQAsdy5kx1n+GRAAknELaVaGw2LohAU7fLpAnA==
查看文件系统挂载
# df –hT
卸载使用umount命令
# umount /mnt/fs
如果要设置开机启动,在/etc/fstab中添加以下内容
172.16.249.147:/ /mnt/fs ceph name=cephfs,secret=cephfskey,noatime,_netdev 0 0
注意将cephfskey替换为cephfs的令牌环密钥

客户端使用fuse挂载CephFS

CephFS还可以使用ceph-fuse来进行挂载使用安装ceph-fuse,创建目录/etc/ceph并在目录下创建包含集群基本信息的ceph.conf文件和cephfs用户认证文件密钥环文件keyring,
# mkdir /mnt/fuse
# ceph-fuse -m 172.16.249.147:6789 -r / /mnt/fuse -n client.cephfs
开机自动挂载在/etc/fstab中添加
id=cephfs,conf=/etc/ceph/ceph.conf /mnt/fuse fuse.ceph defaults 0 0

使用NFS挂载cephfs

Ceph的NFS功能还处于开发阶段,可以使用NFS Ganesha NFS服务器通过NFS协议导出CephFS命名空间。
安装nfs-ganesha-ceph,对/etc/ganesha/ganesha.conf进行配置:
NFS_CORE_PARAM
{
Enable_NLM = false;
Enable_RQUOTA = false;
Protocols = 4;
}
EXPORT
{
Export_ID=100;
Protocols = 4;
Transports = TCP;
Path = /;
Pseudo = /vfs_ceph/;
Access_Type = RW;
Squash = "No_root_squash";
FSAL {
Name = CEPH;
Filesystem = "cephfs";
User_Id = "cephfs";
Secret_Access_Key = "**************************************************";
}
}
CEPH
{
Ceph_Conf = /etc/ceph/ceph.conf;
}
LOG {
Default_Log_Level =WARN;
}
重启服务
# systemctl restart nfs-ganesha


在客户端安装nfs-common后用NFS的方式进行挂载:
# mkdir /mnt/nfs
# mount -t nfs4 172.16.249.147:/vfs_ceph /mnt/nfs
查看:
# df –kh
172.16.249.147:/vfs_ceph 52G 0 52G 0% /mnt/nfs
设置开机挂载,在/etc/fstab中添加
172.16.249.147:/vfs_ceph /mnt/nfs nfs defaults,_rnetdev 0 0

Ceph对象存储

Ceph通过Ceph对象网关提供对象存储服务,Ceph对象网关是一个建立在librados之上的对象存储接口。它提
供了应用程序和Ceph存储集群之间的RESTful网关。
Ceph对象存储支持两个接口:
S3兼容:提供与AmazonS3RESTfulAPI的一个子集兼容的接口的对象存储功能。
Swift兼容:提供与OpenStack Swift API的一个子集兼容的接口的对象存储功能。
Ceph对象存储使用Ceph对象网关守护程序(radosgw),这是一个设计用于与Ceph存储集群交互的HTTP服务
器。Ceph对象网关提供了与AmazonS3和OpenStackSwift兼容的接口,并且有自己的用户管理。
Ceph对象存储网关可以部署在已有ceph集群任一节点之上,也可以单独部署。生产环境中一般使用物理专用服
务器配置RGW,RGW是一个从外面连接到Ceph集群的独立服务,由它向客户端提供对象访问。为了提高其可
靠性可以部署多个网关服务器。

对象存储网关radosgw

对象存储网关需要安装radosgw,并在/etc/ceph/ceph.conf中添加[client.radosgw.{instance-name}]部分配置文件。
apt install radosgw

# vi /etc/ceph/ceph.conf
[client.rgw.node01]
host = node01
rgw frontends = "beast port=7480"
rgw dns name = node01
创建节点目录:
# sudo -u ceph mkdir -p /var/lib/ceph/radosgw/ceph-rgw.node01
创建client.rgw用户和授权并导出密钥环到节点目录下
# ceph auth get-or-create client.rgw.node01 osd 'allow rwx' mon 'allow rw' -o /var/lib/ceph/radosgw/ceph-rgw.node01/keyring

创建存储池:
# ceph osd pool create .rgw.root 16 16
# ceph osd pool create default.rgw.control 16 16
# ceph osd pool create default.rgw.meta 16 16
# ceph osd pool create default.rgw.log 16 16
# ceph osd pool create default.rgw.buckets.index 16 16
# ceph osd pool create default.rgw.buckets.data 16 16
# ceph osd pool create default.rgw.buckets.non-ec 16 16
设置存储池类型为rgw
# ceph osd pool application enable .rgw.root rgw
# ceph osd pool application enable default.rgw.control rgw
# ceph osd pool application enable default.rgw.meta rgw
# ceph osd pool application enable default.rgw.log rgw
# ceph osd pool application enable default.rgw.buckets.index rgw
# ceph osd pool application enable default.rgw.buckets.data rgw
# ceph osd pool application enable default.rgw.buckets.non-ec rgw
启动服务
# systemctl start ceph-radosgw@rgw.node01
# systemctl status ceph-radosgw@rgw.node01
# systemctl enable ceph-radosgw@rgw.node01

RGW生成了多个存储池,由于默认单个OSD pg数不能超过250,可修改已有存储池pg数和pgp数,还可
在配置中修改默认osd的pg数,以及新建存储池的pg数和pgp数,
可在/etc/ceph/ceph.conf 中修改添加:
[global]
osd pool default pg num = 16
osd pool default pgp num = 16
mon_max_pg_per_osd = 1000
重新启动 mon 服务即可生效。
systemctl restart ceph-mon@node01

在RGW节点添加一个对象存储网关的管理员账户
# radosgw-admin user create --uid="admin" --display-name="admin user" --system
创建账户完成后可用以下命令查询账户信息:
# radosgw-admin user list
# radosgw-admin user info --uid=admin
注意显示的 key 信息中的access_key和secret_key,将其值分布保存到两个文件rgw_access_key和
rgw_secret_key中。
radosgw 集成到 dashboard,使用web界面管理会更加方便:
# ceph dashboard set-rgw-api-ssl-verify false
# ceph dashboard set-rgw-api-access-key -i rgw_access_key
# ceph dashboard set-rgw-api-secret-key -i rgw_secret_key
 类似资料: