Ceph

一、简介

Ceph 是一个开源的分布式存储系统。

可靠的自主分布式对象存储(RADOS)

统一存储(支持多种类型,根据使用场景选择),提供对象,块和文件存储。

Ceph 特点:

  • 高扩展性:使用普通x86服务器,支持10~1000台服务器,支持TB到PB级的扩展。

  • 高可靠性:没有单点故障,多数据副本,自动管理,自动修复。

  • 高性能:数据分布均衡,并行化度高。对于objects storage和block storage,不需要元数据服务器。

硬件推荐

架构

Ceph 高度可靠、易于管理且免费。

Ceph 提供了一个基于 RADOS 的可无限扩展的Ceph 存储集群。

模块名称 功能描述
RADOS RADOS(Reliable Autonomic Distributed Object Store,RADOS)是Ceph存储集群的基础。Ceph中的一切都以对象的形式存储,而RADOS就负责存储这些对象,而不考虑它们的数据类型。RADOS层确保数据一致性和可靠性。对于数据一致性,它执行数据复制、故障检测和恢复,还包括数据在集群节点间的recovery。
OSD 实际存储数据的进程。通常一个OSD daemon绑定一个物理磁盘。Client write/read数据最终都会走到OSD去执行write/read操作。
MON Monitor在Ceph集群中扮演者管理者的角色,维护了整个集群的状态,是Ceph集群中最重要的组件。MON保证集群的相关组件在同一时刻能够达成一致,相当于集群的领导层,负责收集、更新和发布集群信息。为了规避单点故障,在实际的Ceph部署环境中会部署多个MON,同样会引来多个MON之前如何协同工作的问题。
MGR MGR目前的主要功能是一个监控系统,包含采集、存储、分析(包含报警)和可视化几部分,用于把集群的一些指标暴露给外界使用。
MDS Ceph元数据服务器,跟踪文件层次结构并存储只供CephFS使用的元数据。Ceph块设备和RADOS网关不需要元数据。MDS不直接给Client提供数据服务。
Librados 简化访问RADOS的一种方法,目前支持PHP、Ruby、Java、Python、C和C++语言。它提供了Ceph存储集群的一个本地接口RADOS,并且是其他服务(如RBD、RGW)的基础,此外,还为CephFS提供POSIX接口。Librados API支持直接访问RADOS,使开发者能够创建自己的接口来访问Ceph集群存储。
RBD Ceph块设备,对外提供块存储。可以像磁盘一样被映射、格式化和挂载到服务器上。
RGW Ceph对象网关,提供了一个兼容S3和Swift的RESTful API接口。RGW还支持多租户和OpenStack的Keystone身份验证服务。
CephFS 提供了一个任意大小且兼容POSlX的分布式文件系统。CephFS依赖Ceph MDS来跟踪文件层次结构,即元数据。

CRUSH 算法 ?

  • CRUSH算法 (Controlled Scalable Decentralized Placement of Replicated Data),可控的、可扩展的、分布式的副本数据放置算法。

  • PG 到 OSD 的映射的过程算法叫做CRUSH 算法。

  • 数据存储到 Ceph 分两步:

  • 1.计算PG

  • 2.计算OSD

Ceph把客户端的数据以对象的形式存储到了存储池里。利用CRUSH算法,Ceph可以计算出安置组所包含的对象,并能进一步计算出Ceph OSD集合所存储的安置组。CRUSH算法能够使Ceph存储集群拥有动态改变大小、再平衡和数据恢复的能力。

存储类型对比

类型 使用场景 优点 缺点
块存储(RBD) 容器、虚拟机磁盘存储分配,日志、文件储存 数据冗余;廉价;硬盘组合提高容量,提升读写效率 无法共享数据;采用SAN架构组网时,光纤交换机,造价成本高。
文件存储(CephFS) 日志存储,FTP,NFS,文件存储 造价低,方便共享 读写速率低;传输速率慢
对象存储(RGW) 图片、视频存储 块设备的效率,文件存储的共享特性

Ceph 对比其他集群架构优势

Pools

Pools 是用于存储对象的逻辑分区。规定了数据冗余的类型和对应的副本分布策略;支持两种类型:副本(replicated)和 纠删码( Erasure Code)

Ceph 将数据作为对象存储在逻辑存储池中。使用 CRUSH算法,Ceph 计算出哪个归置组应该包含该对象,并进一步计算出哪个 Ceph OSD Daemon 应该存储该归置组。CRUSH 算法使 Ceph 存储集群能够动态扩展、重新平衡和恢复。

# 列出集群池
ceph osd lspools

# 创建
ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]] [replicated] \
     [crush-rule-name] [expected-num-objects]
ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]]   erasure \
     [erasure-code-profile] [crush-rule-name] [expected_num_objects] [--autoscale-mode=]

# 修改 ceph osd pool set {pool-name} {key} {value}
ceph osd pool set {pool-name} pg_num {pg_num}

# 设置每个池的最大字节数和/或最大对象数设置池配额。
ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]
ceph osd pool set-quota data max_objects 10000

# 删除 pools,监视器的配置中将 mon_allow_pool_delete 标志设置为 true。否则他们将拒绝移除游泳池。
ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]

# ceph 查看存储池利用率
rados df
# 获取特地池的I/O信息
ceph osd pool stats [{pool-name}]

# 重命名池
ceph osd pool rename {current-pool-name} {new-pool-name}

# 创建快照
ceph osd pool mksnap {pool-name} {snap-name}
# 删除快照
ceph osd pool rmsnap {pool-name} {snap-name}

Erasure-code

创建 Pool 默认是复制,该类型可以用来代替 replicated 以节省空间。类似于 RAID5

erasure pool 将每个对象存储为K+M块。它分为 K数据块和M编码块。该池被配置为具有大小,K+M以便每个块都存储在代理集中的 OSD 中。块的等级存储为对象的属性。

默认情况适用于 RGW。

Erasure-coding

Erasure-code-profile

# 创建 erasure pool 
ceph osd pool create ecpool erasure

# 默认纠删码配置文件支持丢失两个 OSD。相当于一个大小为 3 的复制池,存储 1TB 的是数据要 2TB 而不是 3TB。
ceph osd erasure-code-profile get default
k=2
m=2
plugin=jerasure
technique=reed_sol_van

# 正确配置,创建 pool 后无法修改,最重要的参数是K、M和 crash-failure-domain,因为它们定义了存储开销和数据持久性。
$ ceph osd erasure-code-profile set myprofile \
   k=3 \  # 对象将在三个(被划分K = 3)
   m=2 \  # M 的值定义了可以同时丢失多少 OSD 而不会丢失任何数据。
   crush-failure-domain=rack # 创建一个 CRUSH 规则,以确保没有两个块存储在同一个机架中。
$ ceph osd pool create ecpool erasure myprofile
$ echo ABCDEFGHI | rados --pool ecpool put NYAN -
$ rados --pool ecpool get NYAN -
ABCDEFGHI

# 获取配置文件名称 {name}
ceph osd erasure-code-profile ls

# 获取配置文件
ceph osd erasure-code-profile get {name}

# 删除配置文件
ceph osd erasure-code-profile rm {name}

PG

PG是 Ceph 如何分发数据的内部实现细节。每个池都有多个归置组。CRUSH 动态地将 PG 映射到 OSD。

放置策略组,它是对象的集合,该集合里的所有对象都具有相同的放置策略;简单点说就是相同PG内的对象都会放到相同的硬盘上;

PG ID

Ceph 客户端将计算对象应该在哪个归置组中。它通过散列对象 ID 并根据定义的池中 PG 的数量和池的 ID 应用操作来实现这一点。

  1. 客户端输入池名称和对象 ID。(例如,pool = “liverpool” 和 object-id = “john”)

  2. Ceph 获取对象 ID 并对其进行哈希处理。

  3. Ceph 以 PG 的数量为模计算哈希。(例如,58)获得PG ID。

  4. Ceph 根据池名称获取池 ID(例如,“liverpool” = 4

  5. Ceph 将池 ID 附加到 PG ID(例如,4.58)。

计算 PG

How Data Is Stored In CEPH Cluster

# 每个 pool 的 pg 数目计算,同样要取最接近的 2 的幂。
Total PGs = ((Total_number_of_OSD * 100) / max_replication_count) / pool_count

                        (OSDs * 100)
Total PGs = ------------
              Replicas
# 官方例子,200 个 OSD 和 3个副本集的 pool,计算 PG 数量
(200×100)/ 3=6667.2 的最近幂:8192

PG 配置参考

基础操作

# 创建 pool,如果有 50 个以上的 OSD,每个 OSD 大约 50 个 PG 的值可能是合理的。
ceph osd pool create {pool-name} [pg_num]

# 每个pools、其相对利用率以及对PG计数 
ceph osd pool autoscale-status

# 更改归置组的数量
ceph osd pool set {pool-name} pg_num {pg_num}
ceph osd pool set {pool-name} pgp_num {pgp_num}
# 获取池中归置组的数量
ceph osd pool get {pool-name} pg_num
# 获取 PG 的统计信息
ceph pg dump --format {plain|json}
# 获取特定归置组的归置组映射
ceph pg map {pg-id}

# 清理 PG
ceph pg scrub {pg-id}
# 特定池中清除所有归置组
ceph osd pool scrub {pool-name}

# 设置每个 OSD 的目标 PG 数量(默认:100)
ceph config set global mon_target_pg_per_osd 100

# 设置自动缩放模式 pg_autoscale_mode (off|on|warn)
# 设置 pool 默认值 ceph config set global osd_pool_default_pg_autoscale_mode 
# off: 禁用此池的自动缩放
# on: 启用自动缩放
# warn: 健康警报
ceph osd pool set  pg_autoscale_mode 

# 设置 pool 使用率,mypool 预计将消耗 100 TiB 的空间
ceph osd pool set mypool target_size_bytes 100T
ceph osd pool set mypool target_size_ratio 1.0

CephX

为了识别用户并防止中间人攻击,Ceph 提供了其cephx身份验证系统来对用户和守护程序进行身份验证。

cephx 协议不涉及传输中的数据加密(例如 SSL/TLS)或静态加密。

# 1.创建client.admin密钥,会覆盖现在有的密钥。对已有的集群不建议执行
ceph auth get-or-create client.admin mon 'allow *' mds 'allow *' mgr 'allow *' osd 'allow *' -o /etc/ceph/ceph.client.admin.keyring

# 2.为 MON 密钥环并生成一个监视器密钥。集群的每个 MON 都需要ceph-{$id}/keyring
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'

# 3.为 MGR 生成一个秘钥。
ceph auth get-or-create mgr.{$id} mon 'allow profile mgr' mds 'allow *' osd 'allow *' -o /var/lib/ceph/mgr/ceph-{$id}/keyring

# 4.为 OSD 生成一个秘钥。
ceph auth get-or-create osd.{$id} mon 'allow rwx' osd 'allow *' -o /var/lib/ceph/osd/ceph-{$id}/keyring

# 5.为 MDS 生成一个秘钥。
ceph auth get-or-create mds.{$id} mon 'allow rwx' osd 'allow *' mds 'allow *' mgr 'allow profile mds' -o /var/lib/ceph/mds/ceph-{$id}/keyring

# 配置文件中 ceph.conf 禁用 CephX
auth_cluster_required = none
auth_service_required = none
auth_client_required = none

# 启动当前机器所有 ceph 服务
systemctl start ceph.target

Ceph 协议

Ceph 客户端

Ceph Bluestore

REFERNECE-bluestore-config

Ceph 后端存储引擎

从 Ceph Luminous v12.2.z 开始,默认采用了新型的 BlueStore 作为 Ceph OSD 后端,用于管理存储磁盘。

传统的 Ceph OSD 是将数据存储到现有的文件存储模块,例如XFS文件系统。但是这样的性能开销较大,因为需要实现 Ceph 数据到 POSIX 的转换。

BlueStore 是在底层裸块设备上建立的存储系统,内建了 RocksDB key/value 数据库用于管理内部元数据。一个小型的内部接口组件称为 BludFS 实现了类似文件系统的接口,以便提供足够功能让 RocksDB 来存储它的"文件"并向 BlueStroe 共享相同的裸设备。

BlueStore 的优势:

  • 对于大型写入操作,避免了原先 FileStore 的两次写入 (注意,很多FileStore将journal日志存放到独立到SSD上,也能够获得类似的性能提升,不过分离journal的部署方式是绕开FileStore的短板)

  • 对于小型随机写入,BlueStore 比 FileStore with journal 性能还要好

  • 对于 Key/value 数据 BlueStore 性能明显提升

  • 当集群数据接近爆满时,BlueStore 避免了 FileStore 的性能陡降问题

  • 在 BlueStore 上使用 raw 库的小型顺序读性能有降低,和 BlueStore 不采用预读 (readahead) 有关,但可以通过上层接口(如 RBD 和 CephFS )来实现性能提升

  • BlueStore 在 RBD 卷或 CephFS 文件中采用了 copy-on-write 提升了性能

Firestore 的问题:

  • 数据前需要先写journal,会有一倍的写放大;

  • filestore一开始只是对于SATA/SAS这一类机械盘进行设计的,没有专门针对SSD这一类的Flash介质盘做考虑。

组件

一个Ceph存储集群要求至少有一个Ceph监视器和两个Ceph OSD守护进程。当运行Ceph文件系统客户端时,必须要有Ceph元数据服务器。

  • 块存储:通过RBD,支持精简配置、快照、克隆 。

  • 读写快,不利于共享

  • 文件存储:通过CEPHFS ,Posix接口,支持快照 。

  • 读写慢,利于共享

  • 对象存储:通过RADOSGW

  • 读写快,利于共享

  • 原生存储:通过LIBRADOS 库

1.Monitors (ceph-mon)

HA ceph-mon > 3

只维护集群的主副本,对CPU需求不高。

  • 维护集群状态的映射,包括 Maps 。

    • Monitor Map:包含fsid每个监视器的集群、位置、名称地址和端口。它还指示当前时期、地图创建时间以及上次更改时间。要查看监视器映射,请执行。`ceph mon dump

    • OSD Map:包含集群fsid、映射创建和上次修改的时间、池列表、副本大小、PG 编号、OSD 列表及其状态(例如upin)。要查看 OSD 地图,请执行 。ceph osd dump

    • PG Map:包含 PG 版本、它的时间戳、最后一个 OSD 映射 epoch、完整比率以及每个归置组的详细信息,例如 PG ID、Up Set、Acting Set、PG 的状态(例如, ) 和每个池的数据使用统计信息。active + clean

    • CRUSH Map:包含存储设备列表、故障域层次结构(例如,设备、主机、机架、行、房间等)以及存储数据时遍历层次结构的规则。要查看 CRUSH 地图,请执行 ; 然后,通过执行反编译它 。您可以在文本编辑器中或使用.ceph osd getcrushmap -o {filename}``crushtool -d {comp-crushmap-filename} -o {decomp-crushmap-filename}``cat

    • MDS Map:包含当前 MDS 地图时期、地图创建时间以及上次更改时间。它还包含用于存储元数据的池、元数据服务器列表以及哪些元数据服务器是upin。要查看 MDS 映射,请执行。ceph fs dump

  • Ceph 守护进程通过这些集群状态相互协调。

  • 负责管理守护进程和客户端之间的身份验证。

2.Manager (ceph-mgr)

HA ceph-mgr > 2

  • 负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率、当前性能指标和系统负载。

3.OSDs (ceph-osd)

REFERNECE-osd-config

HA ceph-osd > 3

Ceph OSD 守护进程将数据作为对象存储在平面命名空间中。

  • cpu密集型,运行RADOS服务,使用CRUSH计算数据放置,复制数据,维护集群映射副本。

OSD是负责物理存储的进程,一般配置成和磁盘一一对应,一块磁盘启动一个OSD进程。

  • 创建存储池命令最后的两个数字,比如ceph osd pool create default.rgw.buckets.data 1024 1024中的两个1024分别代表存储池的pg_num和pgp_num,即存储池对应的pg数量。Ceph官方文档建议整个集群所有存储池的pg数量之和大约为:(OSD数量 * 100)/数据冗余因数,数据冗余因数对副本模式而言是副本数,对EC模式而言是数据块+校验块之和。例如,三副本模式是3,EC4+2模式是6。

  • 此处整个集群3台服务器,每台服务器15个OSD,总共45个OSD,按照上述公式计算应为1500,一般建议pg数取2的整数次幂。由于default.rgw.buckets.data存放的数据量远大于其他几个存储池的数据量,因此该存储池也成比例的分配更多的pg。

综上,default.rgw.buckets.data的pg数量取1024,default.rgw.buckets.index的pg数量取128或者256。

  • 对象存储守护进程,存储数据,处理数据复制,恢复,平衡。

  • 获取心跳信息为 ceph-mon 和 ceph-mgr 提供些监视信息。

4.MDS (ceph-mds)

CephFS 使用元数据来存储文件属性

  • cpu密集型,动态分配负载
  • 代表 Ceph 文件系统存储元数据(对象存储和块设备不使用),允许POSIX文件系统的用户执行命令。

二、Deploy

从 Ceph 10.x(Jewel)开始,你应该使用至少一个 4.x 内核。如果您必须使用较旧的内核,则应使用fuse客户端而不是内核客户端。

REFERNECE-Ceph-系统版本

REFERNECE-Ansible

Ceph 存储集群

Install Ceph Storage Cluster — Ceph Documentation

  1. 集群至少需要一个监视器。

  2. OSD,一块硬盘可以是一个OSD,一个分区可以是一个OSD。

  3. 启动初始监视器是部署 Ceph 存储集群的第一步。

1.安装 Ceph

# 1.安装依赖
yum install yum-plugin-priorities
# 确保文件存在
cat /etc/yum/pluginconf.d/priorities.conf 
[main]
enabled = 1

# 2.配置 ceph.repo
cat > /etc/yum.repos.d/ceph.repo << EOF
[ceph]
name=Ceph packages for $basearch
baseurl=https://download.ceph.com/rpm-15.2.9/el7/\$basearch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://download.ceph.com/keys/release.asc

[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-15.2.9/el7/noarch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://download.ceph.com/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=https://download.ceph.com/rpm-15.2.9/el7/SRPMS
enabled=0
priority=2
gpgcheck=1
gpgkey=https://download.ceph.com/keys/release.asc
EOF

# 3.安装必要的 packages
yum install snappy leveldb gdisk python-argparse gperftools-libs -y

# 4.安装 ceph
yum install ceph -y

2.配置 ceph-mon

Monitor Config Reference — Ceph Documentation

MONITOR CONFIG REFERENCE

  1. 集群唯一标识符 fsid

  2. 集群名称(default: Ceph)

  3. 集群每个监视器名称唯一

  4. 监视器映射:fsid、集群名称、主机名和 IP 地址。

  5. 监视器密钥:监视器通过密钥通信

  6. 管理员密钥:CLI 工具

# 1.生成集群唯一ID "fsid"
$ uuidgen

# 2.创建 ceph-mon 配置文件。
# https://docs.ceph.com/en/latest/rados/configuration/common/#example-ceph-conf
cat > /etc/ceph/ceph.conf < 2
osd_pool_default_pg_num = 333     # pg放置组数量
osd_pool_default_pgp_num = 333    # 与pg一致即可
osd_crush_chooseleaf_type = 1     # 默认是1,表示不允许把数据的不同副本放到1个节点上
mon_allow_pool_delete = true      # 默认false,是否允许删除pool。生产不建议开启
EOF

# 3.集群创建一个密钥环并生成一个监控密钥。(注意其中的点.)
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'

# 4.生成管理员密钥环,生成 client.admin 用户并将用户添加到密钥环。
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 *'

# 5.生成 bootstrap-osd 密钥环,生成 client.bootstrap-osd 用户并将用户添加到密钥环。
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'

# 6.将生成的密钥添加到 ceph.mon.keyring
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring

# 7.更改所有者 ceph.mon.keyring
chown ceph:ceph /tmp/ceph.mon.keyring

# 8.使用主机名、主机IP地址和FSID 生成一个monitor映射。将其保存为/tmp/monmap。
# 格式为:monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
monmaptool --create --add mon-node01 192.168.83.62 --fsid 99bd63b3-31a1-4b82-b731-c9a396b3ad56 /tmp/monmap

# 9.创建数据目录。
# 默认目录 mon_data = /var/lib/ceph/mon/$cluster-$id 通过配置文件 ceph.conf 修改
# mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}
mkdir -pv /data/ceph/mon

# 10.使用监视器映射和密钥环填充监视器守护程序。
# 格式:sudo -u ceph ceph-mon [--cluster {cluster-name}] --mkfs -i {hostname} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
sudo -u ceph ceph-mon --mkfs -i mon-node01 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring

# 11.启动监视器。
systemctl start ceph-mon@mon-node01
systemctl enable ceph-mon@mon-node01

# 12.验证监视器是否正在运行。
$ ceph status
  cluster:
    id:     091bbf99-0937-43f7-a47a-969936d15a23
    health: HEALTH_WARN
            1 monitors have not enabled msgr2 
  services:
    mon: 1 daemons, quorum mon-node01 (age 24m)
    mgr: no daemons active
    osd: 0 osds: 0 up, 0 in
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:

其他节点

# 1.配置 hosts
# 2.copy 配置文件
scp /etc/ceph/* 192.168.83.63:/etc/ceph/
scp /var/lib/ceph/bootstrap-osd/ceph.keyring 192.168.83.63:/var/lib/ceph/bootstrap-osd/
scp /tmp/ceph.mon.keyring 192.168.83.63:/tmp/

# 3.创建数据目录
mkdir -pv /data/ceph/mon && chown -R ceph. /data/ceph

# 4.更改 ceph.mon.keyring 所有者
chown ceph.ceph /tmp/ceph.mon.keyring

# 5.获取密钥和 monmap 信息
ceph auth get mon. -o /tmp/ceph.mon.keyring && ceph mon getmap -o /tmp/monmap

# 6.用监视器 map 和密钥填充监视器守护进程
sudo -u ceph ceph-mon --mkfs -i mon-node02 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring

# 7.启动监视器
systemctl start ceph-mon@mon-node02
systemctl enable ceph-mon@mon-node02

3.配置 ceph-mgr

ceph-mgr administrator’s guide — Ceph Documentation

运行 ceph-mon 守护进程的每个节点上,还应该设置一个 ceph-mgr 守护进程。

# 1.创建 mgr 密钥目录,命名为:集群名-主机名
sudo -u ceph mkdir /var/lib/ceph/mgr/ceph-mgr-node01

# 2.创建 mgr 身份验证密钥 注意里面的 mgr.mgr-node01, mgr-node01 为主机名
ceph auth get-or-create mgr.mgr-node01 mon 'allow profile mgr' osd 'allow *' mds 'allow *' -o /var/lib/ceph/mgr/ceph-mgr-node01/keyring

# 3.安装依赖
pip3 install pecan werkzeug

# 4.启动 mgr (最好与 monitor 设置的 $name 保持一致)
# 手动启动 `ceph-mgr -i mgr-node01 --setuser ceph --setgroup ceph`
systemctl start ceph-mgr@mgr-node01

# 5.验证
ceph -s
mgr active: $name

4.配置 OSD

https://docs.ceph.com/en/latest/install/manual-deployment/?#adding-osds

# 创建过程可以分为两个阶段
# 1.准备 OSD
ceph-volume lvm prepare --data /dev/sdc
# 2.激活 OSD ,需要 ID 和 FSID (FSID 通过 ceph-volume lvm list 获取)
ceph-volume lvm activate 0 e5d3ed81-2e24-47b8-8749-24178e848199

# 验证
systemctl status ceph-osd@0

Tips: 手动添加 OSD 到集群

5.配置 MDS

https://docs.ceph.com/en/latest/cephfs/add-remove-mds/#deploying-metadata-servers

每个 CephFS 文件系统至少需要一个 MDS。建议为 MDS 服务器配备具有足够内核的高级 CPU。 MDS 是单线程和 CPU 密集型的大多数活动,包括响应客户端请求。

mds config refernece

mds states

# node01 节点,格式:/var/lib/ceph/mds/{cluster-name}-{id},id可以随意
# 1.创建 msd 数据目录,用来存放密钥
sudo -u ceph mkdir -p /var/lib/ceph/mds/ceph-mds-node01

# 2.创建 mds 密钥环
sudo -u ceph ceph-authtool --create-keyring /var/lib/ceph/mds/ceph-mds-node01/keyring --gen-key -n mds.mds-node01

# 3.导入 key 并设置 caps
ceph auth add mds.mds-node01 osd "allow rwx" mds "allow *" mon "allow profile mds" -i /var/lib/ceph/mds/ceph-mds-node01/keyring

# 4.添加配置到 ceph.conf
cat << EOF >> /etc/ceph/ceph.conf 

[mds.mds-node01]
host = mds-node01
EOF

# 5.启动 msd 服务,systemctl start ceph-mds@mds-node01
# 格式:ceph-mds --cluster {cluster-name} -i {id} -m {mon-hostname}:{mon-port} [-f]
ceph-mds --cluster ceph --id mds-node01 --setuser ceph --setgroup ceph

# 删除 MDS
systemctl stop ceph-mds@${id}
rm -rf /var/lib/ceph/mds/ceph-${id}

6.配置 Dashboard

Ceph Dashboard — Ceph Documentation

# 1.安装 Dashboard 依赖
yum -y install ceph-grafana-dashboards ceph-prometheus-alerts
pip3 install CherryPy
pip3 install Routes
pip3 install PyJWT

# 2.安装 Dashboard https://download.ceph.com/rpm-15.2.9/el7/noarch/
wget https://mirrors.ustc.edu.cn/ceph/rpm-15.2.9/el7/noarch/ceph-mgr-dashboard-15.2.9-0.el7.noarch.rpm
rpm -ivh ceph-mgr-dashboard-15.2.9-0.el7.noarch.rpm --nodeps

# 3.验证是否安装成功
ceph mgr module ls | jq .enabled_modules

# 4.启动 Dashboard 模块
ceph mgr module enable dashboard

# 5.生成并安装自签名证书
# 禁用ssl `ceph config set mgr mgr/dashboard/ssl false` 
ceph dashboard create-self-signed-cert

# 6.创建管理员用户
# ceph dashboard ac-user-create   administrator
ceph dashboard ac-user-create admin ABCabc123 administrator

# 7.查看mgr服务
ceph mgr services

# 8.修改仪表盘地址
$ ceph config set mgr mgr/dashboard/server_addr $IP
$ ceph config set mgr mgr/dashboard/server_port $PORT
$ ceph config set mgr mgr/dashboard/ssl_server_port $PORT

# 9.单独配置每个实例的地址,$name 为 ceph-mgr 实例 ID
$ ceph config set mgr mgr/dashboard/$name/server_addr $IP
$ ceph config set mgr mgr/dashboard/$name/server_port $PORT
$ ceph config set mgr mgr/dashboard/$name/ssl_server_port $PORT

4.1 Dashboard 进阶

REFERNECE-配置SSL/TLS 支持

# 生成自签名证书
$ ceph dashboard create-self-signed-cert

# 更改 SSL 证书和密钥,需要重启 Ceph 管理进程,也可以通过模块开关来处理
$ ceph mgr module disable dashboard
$ ceph mgr module enable dashboard

# 检查是否启用了 SSL/TSL 支持:
$ ceph config get mgr mgr/dashboard/ssl
# 获取证书
$ ceph config-key get mgr/dashboard/crt
$ ceph config-key get mgr/dashboard/key

REFERNECE-Dashboard-用户角色管理

用户权限和角色

# 显示用户
$ ceph dashboard ac-user-show []
# 创建账号
$ ceph dashboard ac-user-create  -i  administrator
# 更改密码
$ ceph dashboard ac-user-set-password [--force-password]  -i 
# 解锁账号
# 禁用尝试次数 `$ ceph dashboard set-account-lockout-attempts 0`
$ ceph dashboard ac-user-enable 

# 查看角色
$ ceph dashboard ac-role-show []
# 创建角色
$ ceph dashboard ac-role-create  []

REFERNECE-启用 ISCSI 管理

REFERNECE-启用 GRAFANA 仪表板

# 配置 Ceph 仪表板将用于访问 Grafana 的连接信息,url 的格式为:::
$ ceph dashboard set-grafana-api-url   # default: ''
# 清配置的 Grafana API URL
$ ceph dashboard reset-grafana-api-url
# 禁用证书验证避免拒接连接
$ ceph dashboard set-grafana-api-ssl-verify False

REFERNECE-启用单点登录 (SSO)

REFERNECE-启用 PROMETHEUS 警报

REFERNECE-代理配置

# 配置 URL 前缀 http://$IP:$PORT/$PREFIX/
$ ceph config set mgr mgr/dashboard/url_prefix $PREFIX

# 禁用重定向,配置错误代码和 HAPROXY 配置

REFERNECE-审计

REFERNECE-Troubleshooting the dashboard

# 查看 Dashboard 访问路口
$ ceph mgr services | jq .dashboard
"https://host:port"

# 验证模块是否启用
$ ceph mgr module ls | jq .enabled_modules

# 查看日志
$ ceph config get mgr log_to_file
$ ceph config get mgr log_file

# 启用 Debug 日志
$ ceph dashboard debug enable

# 提高管理器守护进程的日志记录级别
$ ceph tell mgr config set debug_mgr 20
# CLI 调整 Ceph Dashboard 模块的日志记录级别
$ bin/ceph config set mgr mgr/dashboard/log_level debug

# 10 daemons have recently crashed
$ ceph crash ls

Ceph 文件系统 (CephFS)

https://docs.ceph.com/en/latest/cephfs/#ceph-file-system

  • 符合 POSIX 的文件系统。

  • 构建在 Ceph 的分布式对象存储 RADOS 之上。

  • CephFS 致力于为各种应用程序提供最先进的、多用途、高可用性和高性能的文件存储。

1.创建文件系统

Create a Ceph file system — Ceph Documentation

Ceph 文件系统至少需要两个 RADOS 池,一个用于数据,一个用于元数据。元数据池最多只有几 GB 的数据。因此,通常建议使用较小的 PG 计数。64 或 128 在实践中通常用于大型集群。

# 1.创建 Ceph Pools
ceph osd pool create cephfs_data 128
ceph osd pool create cephfs_metadata 128

# 2.创建 Pools 后,启用文件系统 `$ ceph fs new   `
ceph fs new cephfs cephfs_metadata cephfs_data

2.CephFS 添加 MDS

Deploying Metadata Servers — Ceph Documentation

# 1.创建一个 mds 数据点,守护进程只使用这个目录来存储它的密钥
sudo -u ceph mkdir /var/lib/ceph/mds/ceph-${id}

# 2.使用 CephX,创建身份验证密钥
sudo ceph auth get-or-create mds.${id} mon 'profile mds' mgr 'profile mds' mds 'allow *' osd 'allow *' > /var/lib/ceph/mds/ceph-${id}/keyring

# 3.启动服务
systemctl start ceph-mds@${id}

# 4.配置 MDS 应该加入的文件系统 
# ceph config set mds.${id} mds_join_fs ${fs}
ceph config set mds.b mds_join_fs cephfs

3.CephFS 客户端配置

CephFS Client Capabilities — Ceph Documentation

使用 Ceph 身份验证功能

默认情况下,客户端在允许挂载的路径上不受限制。

# 配置对指定目录的 rw 访问权限
ceph fs authorize  client.  rw

# 客户端 foo 只能在 bar cephfs_a 文件系统的目录中读写
ceph fs authorize cephfs_a client.foo / r /bar rw

results in:
client.foo
  key: *key*
  caps: [mds] allow r, allow rw path=/bar
  caps: [mon] allow r
  caps: [osd] allow rw tag cephfs data=cephfs_a

# 限制客户端在指定的子目录中
ceph-fuse -n client.foo mnt -r /bar

# 客户端只能看到它授权的FS
ceph fs authorize cephfs client.someuser / rw
ceph fs ls -n client.someuser -k ceph.client.someuser.keyring

# MDS 限制 https://docs.ceph.com/en/latest/cephfs/client-auth/#mds-communication-restriction

4.CephFS 挂载

Mount CephFS: Prerequisites — Ceph Documentation

  1. 客户端主机具有访问 Ceph 配置文件 和 MDS 的 CephX 用户密钥的权限

  2. 这两个文件必须已经存在于 Ceph MON 所在的主机上。

# 1.修改目录权限
# on client host
mkdir -p -m 755 /etc/ceph
ssh {user}@{mon-host} "sudo ceph config generate-minimal-conf" | sudo tee /etc/ceph/ceph.conf
chmod 644 /etc/ceph/ceph.conf

# 2.创建一个 CephX 用户并获取其密钥:
ssh {user}@{mon-host} "sudo ceph fs authorize cephfs client.foo / rw" | sudo tee /etc/ceph/ceph.client.foo.keyring
chmod 600 /etc/ceph/ceph.client.foo.keyring

内核驱动挂载

需要Linux内核的支持

# 内核驱动挂载 CephFS 的命令如下所示:
# mount -t ceph {device-string}:{path-to-mounted} {mount-point} -o {key-value-args} {other-args}
# option 之后的键值参数-o是 CephX 凭证; name是我们用来挂载 CephFS 的 CephX 用户的用户名。其缺省值name是guest。
mkdir /mnt/mycephfs
mount -t ceph 192.168.0.1:6789,192.168.0.2:6789:/ /mnt/mycephfs -o name=foo,secret=AQATSKdNGBnwLhAAnNDKnH65FmVKpXZJVasUeQ==
# 确保对密钥文件的权限是适当的(最好是 600)。
mount -t ceph :/ /mnt/mycephfs -o name=foo,secretfile=/etc/ceph/foo.secret

# 挂载 CephFS 根的子树,请将路径附加到设备字符串:
mount -t ceph :/subvolume/dir1/dir2 /mnt/mycephfs -o name=fs

# Ceph 集群上有多个文件系统,你可以按如下方式挂载非默认文件系统:
mount -t ceph :/ /mnt/mycephfs2 -o name=fs,fs=mycephfs2

# 开机启动 /etc/fstab
# [{ipaddress}:{port}]:/ {mount}/{mountpoint} ceph [name=username,secret=secretkey|secretfile=/path/to/secretfile],[{mount.options}]
:/     /mnt/ceph    ceph    name=admin,noatime,_netdev    0       2

FUSE 挂载 CEPHFS

空间文件系统 FUSE(Filesystem in Userspace)进行的网络磁盘挂载,Linux上的一个应用软件

# 不是 root 用户,需要在/etc/fuse.conf添加选项 user_allow_other
# 挂载,option: --id 用户名 
mkdir /mnt/mycephfs
ceph-fuse --id foo /mnt/mycephfs
ceph-fuse --id foo -k /path/to/keyring /mnt/mycephfs
ceph-fuse --id foo -m 192.168.0.1:6789 /mnt/mycephfs

# 特定目录
ceph-fuse --id foo -r /path/to/dir /mnt/mycephfs
# 多个文件系统
ceph-fuse --id foo --client_fs mycephfs2 /mnt/mycephfs2

# 开机启动 /etc/fstab
# none    /mnt/mycephfs  fuse.ceph ceph.id={user-ID}[,ceph.conf={path/to/conf.conf}],_netdev,defaults  0 0
none    /mnt/mycephfs  fuse.ceph ceph.id=myuser,_netdev,defaults  0 0
none    /mnt/mycephfs  fuse.ceph ceph.id=myuser,ceph.conf=/etc/ceph/foo.conf,_netdev,defaults  0 0

# 挂载子目录
none    /mnt/mycephfs  fuse.ceph ceph.id=myuser,ceph.client_mountpoint=/path/to/dir,_netdev,defaults  0 0

5.CephFS 管理命令

CephFS Administrative commands — Ceph Documentation

# 列出所有 CephFS 功能
ceph fs feature ls

# 命令详解
ceph tell mds.* help

# 默认只允许创建一个文件系统。多个文件系统需要设置
ceph fs flag set enable_multiple true
ceph fs new   

# 更改文件系统上的设置
ceph fs set   
# 文件系统添加数据池
ceph fs add_data_pool  
# 文件系统的数据池列表中删除指定的池
ceph fs rm_data_pool  

# 重命名 Ceph 文件系统
ceph fs rename   [--yes-i-really-mean-it]

# 删除文件系统,元数据池和数据池不受影响,必须单独销毁。
ceph fs rm  [--yes-i-really-mean-it]

# 关闭集群
ceph fs set  down true
# 重新联机
ceph fs set  down false

# 文件系统状态重置为默认值,名称和池除外。非零等级保存在停止集合中
ceph fs reset 

CephFS Volume

  • FS 卷,CephFS 文件系统的抽象

  • FS 子卷,独立 CephFS 目录树的抽象

  • FS 子卷组,对高于 FS 子卷的目录级别的抽象,以跨一组子卷影响策略

# 创建一个 CephFS 文件系统及其数据和元数据池。
ceph fs volume create  []

# 删除卷
ceph fs volume rm  [--yes-i-really-mean-it]

CephFS Quotas 配额设置

# CephFS 允许在系统中的任何目录上设置配额。配额可以限制字节数或 目录层次结构中该点下存储的文件数。
# 设置
setfattr -n ceph.quota.max_bytes -v 100000000 /some/dir     # 100 MB
setfattr -n ceph.quota.max_files -v 10000 /some/dir         # 10,000 files

# 查看,扩展属性的值为0,则表示未设置配额。
getfattr -n ceph.quota.max_bytes /some/dir
getfattr -n ceph.quota.max_files /some/dir

# 删除
setfattr -n ceph.quota.max_bytes -v 0 /some/dir
setfattr -n ceph.quota.max_files -v 0 /some/dir

CephFS MDS 集群升级

CephFS 插件 cephfs-top

CephFS 文件系统清理

CephFS 元数据修复工具

CephFS 数据恢复

Ceph 块设备 (RBD)

Ceph Block Device — Ceph Documentation

Ceph 块设备利用 RADOS功能,包括快照、复制和强一致性。Ceph 块存储客户端通过内核模块或librbd库与 Ceph 集群通信。

rbd-config-settings

[图片上传失败...(image-b56df8-1650644760963)]

1.创建块设备

# 创建块设备池,初始化 rbd
ceph osd pool create rbd
rbd pool init rbd

# 创建块设备用户
# ceph auth get-or-create client.{ID} mon 'profile rbd' osd 'profile {profile name} [pool={pool-name}][, profile ...]' mgr 'profile rbd [pool={pool-name}]'
ceph auth get-or-create client.test mon 'profile rbd' osd 'profile rbd pool=rbd, profile rbd-read-only pool=rbd' mgr 'profile rbd pool=rbd' -o /etc/ceph/ceph.client.test.keyring
# 验证用户
ceph auth ls

# 创建块映像,不指定 pool 默认 rbd。rbd create --size {megabytes} {pool-name}/{image-name}
rbd create --size 1024 test
# 调整块设备映像大小
rbd resize --size 2048 foo (to increase)
rbd resize --size 2048 foo --allow-shrink (to decrease)

2.Ceph 块设备操作

Ceph Block Device Operations — Ceph Documentation

# 查询块设备映像
rbd ls
# 查询延迟删除的设备
rbd trash ls 

# 查询映像
rbd info {pool-name}/{image-name}
# 删除映像设备
rbd rm {pool-name}/{image-name}
# 将块设备丢至垃圾桶
rbd trash mv {pool-name}/{image-name}
# 延迟删除映像设备
rbd trash rm {pool-name}/{image-id}

# 恢复映像设备
rbd trash restore {pool-name}/{image-id}

RBD 快照

# 创建
rbd snap create {pool-name}/{image-name}@{snap-name}
# 回滚
rbd snap rollback {pool-name}/{image-name}@{snap-name}
# 清除
rbd snap purge {pool-name}/{image-name}
# 删除
rbd snap rm {pool-name}/{image-name}@{snap-name}

RBD 镜像

RBD 镜像可以在两个 Ceph 集群之间异步镜像。

# 启用池上的镜像。image:镜像;pool:日志
rbd mirror pool enable {pool-name} {image|pool}

# 禁用
rbd mirror pool disable {pool-name}

RBD 镜像迁移

RBD 镜像可以在同一个集群内的不同池之间实时迁移;在不同的图像格式和布局之间;或来自外部数据源。启动时,源将被深度复制到目标映像,提取所有快照历史记录,同时尽可能保留数据的稀疏分配。

RBD 持久只读缓存

RBD 持久写回缓存

3.Ceph 块设备第 3 方集成

Ceph Block Device 3rd Party Integration — Ceph Documentation

  • 集成内核

  • Qemu

  • VM

  • Kubernetes

  • Nomad

  • Openstack

  • Cloudstack

  • ISCSI

  • Windows

Ceph 对象网关 (RGW)

Ceph Object Gateway — Ceph Documentation

Ceph 对象存储使用 Ceph 对象网关守护进程 ( radosgw),它是一个 HTTP 服务器,用于与 Ceph 存储集群交互。

对象存储的核心资源有用户(User)、存储桶(Bucket)和对象(Object)。

Ceph 对象网关有自己的用户管理。Ceph RGW 可以使用 RBD 和 CephFS 的存储集群。

  • radosgw : 用来启动radosgw服务,并且提供restful的访问方式,也是下文讨论的对象

  • radosgw-admin : 用来提供admin的管理服务,如创建user等

1.创建对象网关

radosgw – rados REST gateway — Ceph Documentation

rgw 相关资源池

.rgw:region和zone配置信息。
.rgw.root:region和zone配置信息。
.rgw.control:存放notify信息。
.rgw.gc:用于资源回收。
.rgw.buckets:存放数据。
.rgw.buckets.index:存放元数据信息。
.rgw.buckets.extra:存放元数据扩展信息。
.log:日志存放。
.intent-log:日志存放。
.usage:存放用户已用容量信息。
.users:存放用户信息。
.users.email:存放用户E-mail信息。
.users.swift:存放swift类型的账号信息。
.users.uid:存放用户信息。

# 参考文档:https://docs.ceph.com/en/latest/man/8/radosgw/
# 1.安装radosgw
yum -y install ceph-radosgw

# 2.配置,重启mon
vim /etc/ceph/ceph.conf
[global]
mon_max_pg_per_osd = 1000

# 3.生成用户密钥
# 格式:ceph-authtool -C rgw/ceph-{id}/keyring -n client.radosgw.{id} --cap 子系统类型 "权限"
ceph-authtool -C -n client.rgw.rgw001 --gen-key /etc/ceph/ceph.client.rgw.keyring
# 添加用户权限
ceph-authtool -n client.rgw.rgw001 --cap mon 'allow rw' --cap osd 'allow rwx' /etc/ceph/ceph.client.rgw.keyring
# 添加用户身份验证
ceph auth add client.rgw.rgw001 --in-file=/etc/ceph/ceph.client.rgw.keyring

# 4.编辑 ceph.conf
[client.rgw.rgw001]      # 实例会获取此配置信息,对应用户密钥名称
host = rgw001            # 必须是主机名,不包括域名
keyring = /etc/ceph/ceph.client.rgw.keyring
log file = /var/log/ceph/client.rgw.rgw001.log
rgw frontends = civetweb port=17801
# print continue 执行 PUT 操作时可能会遇到问题,
rgw print continue = false

# 5.启动radosgw网关
systemctl start [email protected]
systemctl enable [email protected]

2.启用网关管理

Ceph Dashboard — Ceph Documentation

# 启用网关管理前端
# 创建一个系统用户
# 格式:radosgw-admin user create --uid= --display-name= --system
radosgw-admin user create --uid=dashboard --display-name="dashboard" --system
## 注意记录输出中的access_key和secret_key,后面会用到
            "access_key": "RG8Q7LB92B2J80J8MUEF",
            "secret_key": "I8iP4zZIXpNtRh5LLRLBZD7IolNB9N554rTmB0O5"

# 获取用户凭证,如果忘记了用户凭证可以使用该方法获取
# radosgw-admin user info --uid=
radosgw-admin user info --uid=dashboard

# 将accessKey和secretKey提供给dashboard,dashboard需要凭证才能访问到对象存储网关
ceph dashboard set-rgw-api-access-key 
ceph dashboard set-rgw-api-secret-key 

# 手动设置主机
$ ceph dashboard set-rgw-api-host 
$ ceph dashboard set-rgw-api-port 

3.配置引导密钥环

Ceph 对象网关 | 部署指南 | SUSE Enterprise Storage 6

替代方法是创建对象网关引导密钥,然后基于该密钥创建对象网关密钥环:

# 1.在某个 Monitor 节点上创建对象网关引导密钥
ceph \
 auth get-or-create client.bootstrap-rgw mon 'allow profile bootstrap-rgw' \
 --connect-timeout=25 \
 --cluster=ceph \
 --name mon. \
 --keyring=/var/lib/ceph/mon/ceph-NODE_HOST/keyring \
 -o /var/lib/ceph/bootstrap-rgw/keyring

# 2.创建 /var/lib/ceph/radosgw/ceph-RGW_NAME 目录以存储引导密钥
mkdir \
/var/lib/ceph/radosgw/ceph-RGW_NAME

# 3.基于新建的引导密钥环创建对象网关密钥:
ceph \
 auth get-or-create client.rgw.RGW_NAME osd 'allow rwx' mon 'allow rw' \
 --connect-timeout=25 \
 --cluster=ceph \
 --name client.bootstrap-rgw \
 --keyring=/var/lib/ceph/bootstrap-rgw/keyring \
 -o /var/lib/ceph/radosgw/ceph-RGW_NAME/keyring

# 4.对象网关密钥环复制到对象网关主机
scp \
/var/lib/ceph/radosgw/ceph-RGW_NAME/keyring \
RGW_HOST:/var/lib/ceph/radosgw/ceph-RGW_NAME/keyring

Ceph Error

ceph osd

Error ERANGE: pg_num 333 size 3 would mean 1002 total pgs, which exceeds max 750 (mon_max_pg_per_osd 250 * num_in_osds 3

问题原因:

osd (near) full

# 解决方法
# 手动修改配置
osd pool default pg num = 200
osd pool default pgp num = 200

# 根本解决之道是添加 osd,临时解决方法是删除无用数据,osd full 时所有的读写操作都无法进行,可通过两种方法恢复读写后再执行删除数据的命令:
# 一是调整 full osd 的权重:
ceph osd crush reweight osd.33 0.7 或者 ceph osd reweight-by-utilization
# 二是调高 full 的上限:
# https://docs.ceph.com/en/latest/rados/troubleshooting/troubleshooting-osd/#no-free-drive-space
ceph osd set-full-ratio 0.98

ceph rbd

Events:

kubernetes.io/csi: blockMapper.SetUpDevice failed to get CSI client: driver name rbd.csi.ceph.com not found in the list of registered CSI drivers

问题原因:

ceph-csi官方的deploy目录下的daemonset的配置中,默认是不允许在master节点上部署pod的,这样导致,master节点上通过ceph-csi申请volume的pod,可以申请到PV但却无法挂载到pod

# 解决方法
# csi-rbdplugin.yaml 中的DaemonSet的spec中添加如下配置 csi-rbdplugin.yaml
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      serviceAccountName: rbd-csi-nodeplugin
      hostNetwork: true
      hostPID: true

你可能感兴趣的:(Ceph)