一、Ceph 简介
一个 Ceph 存储集群需要至少一个 Ceph 监视器、Ceph 管理器和 Ceph OSD(对象存储守护进程)。在运行 Ceph 文件系统客户端时,也需要 Ceph 元数据服务器。
Monitors:
- Ceph 监视器(
ceph-mon)维护着展示集群状态的各种图表,包括监视器图、管理器图、OSD 图、MDS 图和 CRUSH 图。这些图是 Ceph 守护进程相互协调所必需的关键集群状态。 - 监视器还负责管理守护进程和客户端之间的身份验证。为了实现冗余和高可用性,通常需要至少三个监视器。
- Ceph 监视器(
Managers: Ceph Manager守护程序(
ceph-mgr)OSDs: Ceph OSD (object storage daemon,
ceph-osd)存储数据,处理数据复制,恢复,重新平衡,并提供一些监视信息到 Ceph 监视器和管理器,通过检查其他 Ceph OSD 守护进程检测信号.冗余和高可用性通常需要至少 3 个 Ceph OSD。MDSs: Ceph 元数据服务器(MDS,
ceph-mds)代表Ceph 文件系统存储元数据(即 Ceph 块设备和 Ceph 对象存储不使用 MDS)。Ceph 元数据服务器允许 POSIX 文件系统用户执行基本命令 (如ls,find,etc等),而不会给 Ceph 存储群集带来巨大负担。
Ceph 将数据存储为逻辑存储池中的对象。使用CRUSH 算法,Ceph 计算哪个放置组应包含对象,并进一步计算哪个 Ceph OSD 守护程序应存储该放置组。CRUSH 算法使 Ceph 存储群集能够动态扩展、重新平衡和恢复。
参考链接:
- https://mp.weixin.qq.com/s/TWXPPk7hE1D4AGsHg7CIMg
- https://www.jianshu.com/p/cc3ece850433
- https://mp.weixin.qq.com/s/QXRdyYKSKIa1aLNI8dOGcQ
- https://blog.csdn.net/xiaoquqi/article/details/43055031
二、Cephadm 部署集群
简单,简述,详细参考:https://docs.ceph.com/en/latest/cephadm/#cephadm
1.环境规划
| 主机名 | 内网 IP | 操作系统 | 角色 | 配置 |
|---|---|---|---|---|
| ceph1 | 192.168.200.128 | Debian11 | cephadm,mon,mgr,osd | 2C,2G,20G 系统盘,20G 数据盘 |
| ceph2 | 192.168.200.131 | Debian11 | cephadm,mon | 2C,2G,20G 系统盘,20G 数据盘 |
| ceph3 | 192.168.200.132 | Debian11 | cephadm,mon | 2C,2G,20G 系统盘,20G 数据盘 |
典型的 Ceph 集群有三个或五个监视器守护程序,分布在不同的主机上。如果群集中有五个或更多节点,我们建议部署五个监视器。
当 Ceph 知道 mon 应该使用什么 IP 子网时,它可以随着群集的增长(或收缩)自动部署和缩放 mon。默认情况下,Ceph 假定其他 mon 使用与第一个 mon 的 IP 相同的子网。
在单个子网的情况下,如果向集群中添加主机,默认最多只会添加 5 个 mon 如果有特定的 IP 子网给 mon 使用,可以使用 CIDR 格式配置该子网。
2.前置(所有节点)
各节点配置 hosts
1 | |
3.安装 CEPHADM(所有节点)
1 | |
4.引导新群集(第一台)
创建新的 Ceph 集群的第一步是在 Ceph 集群的第一台主机上运行 cephadm bootstrap 命令,运行此命令的操作将创建 Ceph 集群的第一个“监视程序守护程序”。
而该监视程序守护程序需要一个 IP 地址,必须将 Ceph 集群的第一个主机的 IP 地址传递给 ceph bootstrap 命令。
1 | |
此命令将会:
1 | |
5.向群集添加主机
在解析主机名等方面,cephadm 的要求非常低, 通过以下命令可以明确 IP 与主机名之间的解析:ceph orch host add
注意:添加主机时会自动创建 mon 服务,先按照 禁用监视器自动部署( 5.4 (1) ) 或 调整默认值监视器数量 (5.2 节),再添加主机。
在新主机 root 用户的 authorized_keys 文件中安装集群的公共 SSH 密钥
1 | |
添加方式两种:
- 命令方式添加
1 | |
- yaml 方式添加
host.yml
1 | |
3.检查状态
1 | |
6.部署 OSD
https://docs.ceph.com/en/pacific/cephadm/services/osd/#
当有新的 osd 加入集群或者移除了 osd,就会把状态上报给 Monitor,Monitor 知道了 osd map 发生了变化就会触发 rebalancing,确保 pg 能够平滑的移动到各个 osd 上,以 pg 为整体进行数据重平衡,重平衡的过程中可能会影响性能,一次性加入的 osd 越多,数据 rebalancing 就越频繁。
当在做 rebalance 的时候,每个 osd 都会按照 osd_max_backfills 指定数量的线程来同步,如果该数值比较大,同步会比较快,但是会影响部分性能;为了避免 rebalance 带来的性能影响,可以对 rebalance 进行关闭;添加完 osd 后再打开。
1).rebalance 关闭
1 | |
2).rebalance 开启
1 | |
3).列出节点可用设备
1 | |
如果满足以下所有条件,则认为存储设备可用
1 | |
4).创建 osd
1 | |
7.集群高可用
1 | |
8.CephFS 部署
9.部署 RGW
https://docs.ceph.com/en/pacific/cephadm/services/rgw/
三、运维
https://www.cnblogs.com/royaljames/p/9807532.html
1.向群集添加主机
1 | |
2.部署其他监视器(monitor)
典型的 Ceph 群集具有分布在不同主机的三个或五个监视器守护程序。如果群集中有五个或更多节点,我们建议部署五个监视器。
当 Ceph 知道监视器应该使用什么 IP 子网时,它可以随着群集的增长(或收缩)自动部署和缩放监视器。默认情况下,Ceph 假定其他监视器应使用与第一个监视器的 IP 相同的子网。
如果您的 Ceph 监视器(或整个群集)住在单个子网中,则在向群集添加新主机时,默认情况下,cephadm 会自动添加多达 5 个监视器。无需进一步步骤。
1 | |
使用 YAML 规范
1 | |
1 | |
3.部署 OSD
1.所有群集主机上的存储设备清单可以显示
1 | |
- 设备必须没有分区。
- 设备不得具有任何 LVM 状态。
- 不得安装设备。
- 设备不能包含文件系统。
- 设备不得包含 Ceph BlueStore OSD。
- 设备必须大于 5 GB。
2.创建新 OSD 的方法
1 | |
4.部署 MDS
使用 CephFS 文件系统需要一个或多个 MDS 守护程序。如果使用较新的接口创建新文件系统,则会自动创建这些接口。有关详细信息,请参阅 FS 卷和子卷。
1 | |
5.部署 RGW
6.管理 Monitor map
1).多 Monitor 同步机制
在生产环境建议最少三节点 monitor,以确保 cluster map 的高可用性和冗余性,monitor 节点不应该过多甚至操作 9 节点的行为,会导致数据读写时间下降,影响系统集群的性能。
- monitor 使用 paxos 算法作为集群状态上达成一致的机制。paxos 是一种分布式一致性算法。每当 monitor 修改 map 时,它会通过 paxos 发送更新到其他 monitor。Ceph 只有在大多数 monitor 就更新达成一致时提交 map 的新版本。
- cluster map 的更新操作需要 Paxos 确认,但是读操作不经由 Paxos,而是直接访问本地的 kv 存储。
2).Monitor 选举机制
- 多个 monitor 之间需要建立仲裁并选择出一个 leader,其他节点则作为工作节点(peon)。
- 在选举完成并确定 leader 之后,leader 将从所有其他 monitor 请求最新的 map epoc,以确保 leader 具有集群的最新视图。
- 要维护 monitor 集群的正常工作,必须有超过半数的节点正常。
3).Monitor 租约
- 在 Monitor 建立仲裁后,leader 开始分发短期的租约到所有的 monitors。让它们能够分发 cluster map 到 OSD 和 client。
- Monitor 租约默认每 3s 续期一次。
- 当 peon monitor 没有确认它收到租约时,leader 假定该 monitor 异常,它会召集新的选举以建立仲裁。
- 如果 peon monitor 的租约到期后没有收到 leader 的续期,它会假定 leader 异常,并会召集新的选举。
- 所以如果生产环境中存在多个 monitor 时候某个节点的超时会猝发节点的重新选举导致 client 无法第一时间拿到最新的 crushmap 图像也就无法去对应的 osd 上的 pv 写入数据了。
4).常用的 monitor 管理
1 | |
7.管理 OSD Map
- 每当 OSD 加入或离开集群时,Ceph 都会更新 OSD map。
- OSD 不使用 leader 来管理 OSD map,它们会在自身之间传播同步 map。OSD 会利用 OSD map epoch 标记它们交换的每一条信息,当 OSD 检测到自己已落后时,它会使用其对等 OSD 执行 map 更新。
- 在大型集群中 OSD map 更新会非常频繁,节点会执行递增 map 更新。
- Ceph 也会利用 epoch 来标记 OSD 和 client 之间的消息。当 client 连接到 OSD 时 OSD 会检查 epoch。如果发现 epoch 不匹配,则 OSD 会以正确的 epoch 响应,以便客户端可以更新其 OSD map。
- OSD 定期向 monitor 报告自己的状态,OSD 之间会交换心跳,以便检测对等点的故障,并报告给 monitor。
- leader monitor 发现 OSD 故障时,它会更新 map,递增 epoch,并使用 Paxos 更新协议来通知其他 monitor,同时撤销租约,并发布新的租约,以使 monitor 以分发最新的 OSD map。
1).OSD 状态解读
- 1.正常状态的 OSD 为 up 且 in
- 2.当 OSD 故障时,守护进程 offline,在 5 分钟内,集群仍会将其标记为 up 和 in,这是为了防止网络抖动
- 3.如果 5 分钟内仍未恢复,则会标记为 down 和 out。此时该 OSD 上的 PG 开始迁移。这个 5 分钟的时间间隔可以通过 mon_osd_down_out_interval 配置项修改
- 4.当故障的 OSD 重新上线以后,会触发新的数据再平衡
- 5.当集群有 noout 标志位时,则 osd 下线不会导致数据恢复
- 6.OSD 每隔 6s 会互相验证状态。并每隔 120s 向 mon 报告一次状态。
2).OSD map 命令
1 | |
3.)OSD 的状态
OSD 运行状态
- up
- down
- out
- in
OSD 容量状态
- nearfull
- full
常用指令
1 | |
4.)OSD 容量
- 当集群容量达到 mon_osd_nearfull_ratio 的值时,集群会进入 HEALTH_WARN 状态。这是为了在达到 full_ratio 之前,提醒添加 OSD。默认设置为 0.85,即 85%
- 当集群容量达到 mon_osd_full_ratio 的值时,集群将停止写入,但允许读取。集群会进入到 HEALTH_ERR 状态。默认为 0.95,即 95%。这是为了防止当一个或多个 OSD 故障时仍留有余地能重平衡数据
设置方法:
1 | |
5).OSD 状态参数
1 | |
8.管理 PG
1).管理文件到 PG 映射
test 对象所在 pg id 为 10.35,存储在三个 osd 上,分别为 osd.2、osd.1 和 osd.8,其中 osd.2 为 primary osd
1 | |
2).管理 struck 状态的 PG
如果 PG 长时间(mon_pg_stuck_threshold,默认为 300s)出现如下状态时,MON 会将该 PG 标记为 stuck:
- inactive:pg 有 peering 问题
- unclean:pg 在故障恢复时遇到问题
- stale:pg 没有任何 OSD 报告,可能其所有的 OSD 都是 down 和 out
- undersized:pg 没有充足的 osd 来存储它应具有的副本数
默认情况下,Ceph 会自动执行恢复,但如果未能自动恢复,则集群状态会一直处于 HEALTH_WARN 或者 HEALTH_ERR
如果特定 PG 的所有 osd 都是 down 和 out 状态,则 PG 会被标记为 stale。要解决这一情况,其中一个 OSD 必须要重生,且具有可用的 PG 副本,否则 PG 不可用
Ceph 可以声明 osd 或 PG 已丢失,这也就意味着数据丢失。需要说明的是,osd 的运行离不开 journal,如果 journal 丢失,则 osd 停止
3).struck 状态操作
1 | |
4).手动控制 PG 的 Primary OSD
可以通过手动修改 osd 的权重以提升 特定 OSD 被选为 PG Primary OSD 的概率,避免将速度慢的磁盘用作 primary osd。
需要先在配置文件中配置如下参数:
1 | |
5).调整权重示例
1 | |
9.Pool(存储池)管理
https://blog.csdn.net/weixin_42440345/article/details/81118964
PG 和 PGP 的区别
https://www.cnblogs.com/zphj1987/p/13575377.html
PG 是指定存储池存储对象的目录有多少个,PGP 是存储池 PG 的 OSD 分布组合个数
PG 的增加会引起 PG 内的数据进行分裂,分裂到相同的 OSD 上新生成的 PG 当中
PGP 的增加会引起部分 PG 的分布进行变化,但是不会引起 PG 内对象的变动
4.)限制 pool 配置更改
1 | |
1.查看 pool
1 | |
2.创建 pool
1 | |
在{}内的参数为必选项,[]内的参数均设有默认值,如果没有更改设计,可以不添加。
参数的含义如下:
- pool-name: POOL 的名字;必须添加。
- pg-num: POOL 拥有的 PG 总数;必须添加。
- pgp-num: POOL 拥有的 PGP 总数;非必须添加。默认与 pg-num 相同。
- replicated|erasure: POOL 类型;非必须添加。如不指定为 erasure,则默认为 replicated 类型。
- ruleset: POOL 所用的 CRUSH 规则 ID。非必须添加。默认为 0,若需指定其他 ruleset,需确保 ruleset 必须存在。
- erasure-code-profile: 仅用于纠删码类型的 POOL。指定纠删码配置框架,此配置必须已由 osd erasure-code-profile set 定义
这里强制选择 pg_num 和 pgp_num,因为 ceph 集群不能自动计算 pg 数量。下面有一些官方建议的 pg 使用数量:
- 小于 5 个 osd 设置 pg_num 为 128
- 5 到 10 个 osd 设置 pg_num 为 512
- 10 到 50 个 osd 设置 pg_num 为 1024
- 如果超过 50 个 osd 你需要自己明白权衡点,并且能自行计算 pg_num 的数量
pg_num 通用计算方法:
(OSDs * 100)
Total PGs = ————
pool size
3.修改 pool
1 | |
4.删除存储池
1 | |
5.重命名存储池
1 | |
6.查看存储池统计信息
1 | |
7.给存储池做快照
1 | |
8.删除存储池的快照
1 | |
9.获取存储池选项值
1 | |
10.获取对象副本数
1 | |
11.设置存储池配额
1 | |
10.自定义 Crush Map
crush map 决定了客户端数据最终写入的 osd 的位置,在某些情况下存在 hdd 和 ssd 两种盘想让某些数据写入到指定的 osd 中这个时候就是需要去人为的手动编译 crush-map,编辑要修改的部分,再导入集群中达到我们特定的目的
1).Crush 的放置策略
- Ceph 使用 CRUSH 算法(Controlled Replication Under Scalable Hashing 可扩展哈希下的受控复制)来计算哪些 OSD 存放哪些对象
- 对象分配到 PG 中,CRUSH 决定这些 PG 使用哪些 OSD 来存储对象。理想情况下,CRUSH 会将数据均匀的分布到存储中
- 当添加新 OSD 或者现有的 OSD 出现故障时,Ceph 使用 CRUSH 在活跃的 OSD 上重平衡数据 CRUSH map 是 CRUSH 算法的中央配置机制,可通过调整 CRUSHmap 来优化数据存放位置默认情况下,CRUSH 将一个对象的多个副本放置到不同主机上的 0SD 中。可以配置 CRUSH map 和 CRUSH rules,使一个对象的多个副本放置到不同房间或者不同机柜的主机上的 0SD 中。
- 也可以将 SSD 磁盘分配给需要高速存储的池
2).编译与翻译和更新
1 | |
例子
1 | |
11.admin sockets 管理守护进程
- 通过 admin sockets,管理员可以直接与守护进程交互。如查看和修改守护进程的配置参数。
- 守护进程的 socket 文件一般是/var/run/ceph/cluster-cluster−type.$id.asok
- 基于 admin sockets 的操作:
1 | |
12.用户管理
Ceph 把数据以对象的形式存于各存储池中。Ceph 用户必须具有访问存储池的权限才能够读写数据。另外,Ceph 用户必须具有执行权限才能够使用 Ceph 的管理命令。
1、查看用户信息
1 | |
2、添加用户
1 | |
3、修改用户权限
1 | |
4、删除用户
1 | |
13.增加和删除 Monitor
一个集群可以只有一个 monitor,推荐生产环境至少部署 3 个。 Ceph 使用 Paxos 算法的一个变种对各种 map 、以及其它对集群来说至关重要的信息达成共识。建议(但不是强制)部署奇数个 monitor 。Ceph 需要 mon 中的大多数在运行并能够互相通信,比如单个 mon,或 2 个中的 2 个,3 个中的 2 个,4 个中的 3 个等。初始部署时,建议部署 3 个 monitor。后续如果要增加,请一次增加 2 个.
1、新增一个 monitor
1 | |
2、删除 Monitor
1 | |
四、集群监控管理
1.集群整体运行状态
1 | |
2.PG 状态
查看 pg 状态查看通常使用下面两个命令即可,dump 可以查看更详细信息
1 | |
3.Pool 状态
1 | |
4.OSD 状态
1 | |
5.Monitor 状态和查看仲裁状态
1 | |
6.集群空间用量
1 | |
五、集群配置管理(临时和全局,服务平滑重启)
有时候需要更改服务的配置,但不想重启服务,或者是临时修改。这时候就可以使用 tell 和 daemon 子命令来完成此需求。
1.查看运行配置
1 | |
2.tell 子命令格式
使用 tell 的方式适合对整个集群进行设置,使用 * 号进行匹配,就可以对整个集群的角色进行设置。而出现节点异常无法设置时候,只会在命令行当中进行报错,不太便于查找。
1 | |
- daemon-type:为要操作的对象类型如 osd、mon、mds 等。
- daemon id:该对象的名称,osd 通常为 0、1 等,mon 为 ceph -s 显示的名称,这里可以输入*表示全部。
- injectargs:表示参数注入,后面必须跟一个参数,也可以跟多个
3.daemon 子命令
- 使用 daemon 进行设置的方式就是一个个的去设置,这样可以比较好的反馈,此方法是需要在设置的角色所在的主机上进行设置。
1 | |
4.集群操作
- 命令包含 start、restart、status
1 | |
5.添加和删除 OSD
1).添加 OSD
纵向扩容(会导致数据的重分布)
生产环境下最好的做法就是不要一次性添加大量的 osd,最好逐步添加等待数据同步后再进行添加操作
- 当影响生产数据时候临时可以停止同步:ceph osd set [nobackfill|norebalance],unset 取消对应的参数
1 | |
2).删除 OSD
如果机器有盘坏了可以使用 dmdsg 查看坏盘
存在一种情况就是某 osd 的写入延迟大盘有坏道很大可能会拖垮 ceph 集群:
- ceph osd tree: 查看当前集群的 osd 状态
- ceph osd perf: 查看当前的 OSD 的延迟
当某一快 osd 踢出集群时候立即做数据重分布(默认 10 分钟)
1 | |
6.扩容 PG
- 扩容大小取跟它接近的 2 的 N 次方
- 在更改 pool 的 PG 数量时,需同时更改 PGP 的数量。PGP 是为了管理 placement 而存在的专门的 PG,它和 PG 的数量应该保持一致。如果你增加 pool 的 pg_num,就需要同时增加 pgp_num,保持它们大小一致,这样集群才能正常 rebalancing。
1 | |
六、调优
1.系统层面调优
选择正确的 CPU 和内存。OSD、MON 和 MDS 节点具有不同的 CPU 和内存需求
- mon 的需求和 osd 的总个数有关需要的是计算力
- mds 对 CPU 和内存要求很高,会将大量的元数据缓存到自己的内存中,存储元数据的尽量的使用 ssd
- osd 最低要求 1H2G 的配置例如:24 块硬盘最少是 24H36G,磁盘方面必须高 I/O 有多好上多好
尽可能关闭 NUMA
规划好存储节点的数据以及各节点的磁盘要求(不考虑钱忽略)
磁盘的选择尽可能在成本、吞吐量和延迟之间找到良好的平衡
journal 日志应该使用 SSD
如果交换机支持(MTU 9000),则启用巨型帧(减少数据的分片),前提是 ceph 在一个单独的网络环境中切有独立交换机。
启用 ntp。Ceph 对时间敏感,集群网络至少 10GB 带宽
1).系统调优工具
- 使用 tuned-admin 工具,它可帮助系统管理员针对不同的工作负载进行系统调优
- tuned-admin 使用的 profile 默认存放在/usr/lib/tuned/目录中,可以参考其模板来自定义 profile
- 对于 ceph 而言,network-latency 可以改进全局系统延迟,network-throughput 可以改进全局系统吞吐量,如果两个都开启可以使用 Custom 自定义模式
1 | |
2).I/O 调度算法
- noop:电梯算法,实现了一个简单的 FIFO 队列。基于 SSD 的磁盘,推荐使用这种调度方式
- Deadline:截止时间调度算法,尽力为请求提供有保障的延迟。对于 Ceph,基于 sata 或者 sas 的驱动器,应该首选这种调度方式
- cfq:完全公平队列,适合有许多进程同时读取和写入大小不等的请求的磁盘,也是默认的通用调度算法
1 | |
3).网络 IO 子系统调优
- 用于集群的网络建议尽可能使用 10Gb 网络
以下参数用于缓冲区内存管理
1 | |
- 交换机启用大型帧
默认情况下,以太网最大传输数据包大小为 1500 字节。为提高吞吐量并减少处理开销,一种策略是将以太网网络配置为允许设备发送和接收更大的巨型帧。
- 在使用巨型帧的要谨慎,因为需要硬件支持,且全部以太网口配置为相同的巨型帧 MTU 大小。
4).虚拟内存调优
设置较低的比率会导致高频但用时短的写操作,这适合 Ceph 等 I/O 密集型应用。设置较高的比率会导致低频但用时长的写操作,这会产生较小的系统开销,但可能会造成应用响应时间变长
1 | |
2.Ceph 本身调优
1).最佳实践
- MON 的性能对集群总体性能至关重要,应用部署于专用节点,为确保正确仲裁,数量应为奇数个
- 在 OSD 节点上,操作系统、OSD 数据、OSD 日志应当位于独立的磁盘上,以确保满意的吞吐量
- 在集群安装后,需要监控集群、排除故障并维护,尽管 Ceph 具有自愈功能。如果发生性能问题,首先在磁盘、网络和硬件层面上调查。然后逐步转向 RADOS 块设备和 Ceph 对象网关
2).影响 I/O 的 6 大操作
- 业务数据写入
- 数据恢复
- 数据回填
- 数据重平衡
- 数据一致性校验
- 快照清理
3).OSD 生产建议
- 更快的日志性能可以改进响应时间,建议将单独的低延迟 SSD 或者 NVMe 设备用于 OSD 日志。
- 多个日志可以共享同一 SSD,以降低存储基础架构的成本。但是不能将过多 OSD 日志放在同一设备上。
- 建议每个 SATA OSD 设备不超过 6 个 OSD 日志,每个 NVMe 设备不超过 12 个 OSD 日志。
- 需要说明的是,当用于托管日志的 SSD 或者 NVMe 设备故障时,使用它托管其日志的所有 OSD 也都变得不可用
4).硬件建议
- 将一个 raid1 磁盘用于 ceph 操作系统
- 每个 OSD 一块硬盘,尽量将 SSD 或者 NVMe 用于日志
- 使用多个 10Gb 网卡,每个网络一个双链路绑定(建议生产环境 2 个网卡 4 个光模块,2 个万兆口做为数据的交换,2 个万兆口做业务流量)
- 每个 OSD 预留 1 个 CPU,每个逻辑核心 1GHz,分配 16GB 内存,外加每个 OSD 2G 内存
5).RBD 生产建议
- 块设备上的工作负载通常是 I/O 密集型负载,例如在 OpenStack 中虚拟机上运行数据库。
- 对于 RBD,OSD 日志应当位于 SSD 或者 NVMe 设备上
- 对后端存储,可以使用不同的存储设备以提供不同级别的服务
6).对象网关生产建议
- Ceph 对象网关工作负载通常是吞吐密集型负载。但是其 bucket 索引池为 I/O 密集型工作负载模式。应当将这个池存储在 SSD 设备上
- Ceph 对象网关为每个存储桶维护一个索引。Ceph 将这一索引存储在 RADOS 对象中。当存储桶存储数量巨大的对象时(超过 100000 个),索引性能会降低,因为只有一个 RADOS 对象参与所有索引操作。
- Ceph 可以在多个 RADOS 对象或分片中保存大型索引。可以在 ceph.conf 中设置 rgw_override_bucket_index_max_shards 配置参数来启用该功能。此参数的建议值是存储桶中预计对象数量除以 10000
- 当索引变大,Ceph 通常需要重新划分存储桶。rgw_dynamic_resharding 配置控制该功能,默认为 true
7).CephFS 生产建议
- 存放目录结构和其他索引的元数据池可能会成为 CephFS 的瓶颈。因此,应该将 SSD 设备用于这个池
- 每个 MDS 维护一个内存中缓存 ,用于索引节点等不同类型的项目。Ceph 使用 mds_cache_memory_limit 配置参数限制这一缓存的大小。其默认值为 1GB,可以在需要时调整,得不得超过系统总内存数
8).Monitor 生产建议
- 最好为每个 MON 一个独立的服务器/虚拟机
- 小型和中型集群,使用 10000RPM 的磁盘,大型集群使用 SSD
- CPU 使用方面:使用一个多核 CPU,最少 16G 内存,最好不要和 osd 存放在同一个服务器上
9).将 OSD 日志迁移到 SSD
强烈建议生产中千万不要这么干,一定在集群初始化的时候就定制好
1 | |
10).存储池中 PG 的计算方法
通常,计算一个池中应该有多少个归置组的计算方法 = 100 * OSDs(个数) / size(副本数)
一种比较通用的取值规则:
- 少于 5 个 OSD 时可把 pg_num 设置为 128
- OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512
- OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096
- OSD 数量大于 50 时,建议自行计算
自行计算 pg_num 聚会时的工具
- pgcalc:https://ceph.com/pgcalc/
- cephpgc:https://access.redhat.com/labs/cephpgc/
注意:在实际的生产环境中我们很难去预估需要多少个 pool,每个 pool 所占用的数据大小的百分百。所以正常情况下需要在特定的情况选择动态扩缩容 pg 的大小
11).PG 与 PGP
通常而言,PG 与 PGP 是相同的当我们为一个池增加 PG 时,PG 会开始分裂,这个时候,OSD 上的数据开始移动到新的 PG,但总体而言,此时,数据还是在一个 OSD 的不同 PG 中迁移而我们一旦同时增加了 PGP,则 PG 开始在多个 OSD 上重平衡,这时会出现跨 OSD 的数据迁移
- ceph osd pool create poolName PgNum PgpNum
- 当变动 pg 数量只是针对当前的特定池中的 osd 发生变动影响范围只是一个池的 pg 平衡
- 正常情况下一个 osd 最多承载 100 个 pg
- 当 pgp 发生大变动的时候会导致原本这个池中的 pg 变动导致池中 osd,过载或者有很大剩余性能,ceph 集群会将过大的性能均衡到各个性能使用小的 osd 上,这个时候就会发生数据的大规模迁移,大量的 i/O 写入会占有网络带宽会严重影响使用中的 pg 性能导致阻塞发生。
- 建议的做法是将 pg_num 直接设置为希望作为最终值的 PG 数量,而 PGP 的数量应当慢慢增加,以确保集群不会因为一段时间内的大量数据重平衡而导致的性能下降
12).Ceph 生产网络建议
- 尽可能使用 10Gb 网络带宽以上的万兆带宽(内网)
- 尽可能使用不同的 cluster 网络和 public 网络
- 做好必要的网络设备监控防止网络过载
13).OSD 和数据一致性校验
清理会影响 ceph 集群性能,但建议不要禁用此功能,因为它能提供完数据的完整性
- 清理:检查对象的存在性、校验和以及大小
- 深度清理:检查对象的存在性和大小,重新计算并验证对象的校验和。(最好不开严重影响性能)
1 | |
1 | |
14).快照的生产建议
- 快照在池级别和 RBD 级别上提供。当快照被移除时,ceph 会以异步操作的形式删除快照数据,称为快照修剪进程
- 为减轻快照修剪进程会影响集群总体性能。可以通过配置
osd_snap_trim_sleep来在有客户端读写操作的时候暂停修剪,参数的值范围是0到1 - 快照修剪的优先级通过使用
osd_snap_trim_priority参数控制,默认为5
15).保护数据和 osd
需要控制回填和恢复操作,以限制这些操作的影响
回填发生于新的 osd 加入集群时,或者 osd 死机并且 ceph 将其 pg 分配到其他 osd 时。在这种场景中,ceph 必须要在可用的 osd 之间复制对象副本
恢复发生于新的 osd 已有数据时,如出现短暂停机。在这种情形下,ceph 会简单的重放 pg 日志
- 管理回填和恢复操作的配置项
1 | |
16).OSD 数据存储后端
BlueStore 管理一个,两个或(在某些情况下)三个存储设备。在最简单的情况下,BlueStore 使用单个(主)存储设备。存储设备通常作为一个整体使用,BlueStore 直接占用完整设备。该主设备通常由数据目录中的块符号链接标识。数据目录挂载成一个 tmpfs,它将填充(在启动时或 ceph-volume 激活它时)所有常用的 OSD 文件,其中包含有关 OSD 的信息,例如:其标识符,它所属的集群,以及它的私钥。还可以使用两个额外的设备部署 BlueStore
- WAL 设备(在数据目录中标识为 block.wal)可用于 BlueStore 的内部日志或预写日志。只有设备比主设备快(例如,当它在 SSD 上并且主设备是 HDD 时),使用 WAL 设备是有用的。
- 数据库设备(在数据目录中标识为 block.db)可用于存储 BlueStore 的内部元数据。 BlueStore(或者更确切地说,嵌入式 RocksDB)将在数据库设备上放置尽可能多的元数据以提高性能。如果数据库设备填满,元数据将写到主设备。同样,数据库设备要比主设备更快,则提供数据库设备是有帮助的。
- 如果只有少量快速存储可用(例如,小于 1GB),我们建议将其用作 WAL 设备。如果还有更多,配置数据库设备会更有意义。 BlueStore 日志将始终放在可用的最快设备上,因此使用数据库设备将提供与 WAL 设备相同的优势,同时还允许在其中存储其他元数据。
- 正常 L 版本推荐使用 filestore,M 版本可以考虑使用 bluestore
- 推荐优化文章:https://www.cnblogs.com/luxiaodai/p/10006036.html#_lab2_1_9
17).关于性能测试
- 推荐使用 fio 参考阿里云文档:https://help.aliyun.com/document_detail/95501.html?spm=a2c4g.11174283.6.659.38b44da2KZr2Sn
- dd
1 | |
- rados bench 性能测试
1 | |
- rbd bench 性能测试
1 | |
3.设置集群的标志
flag 操作
只能对整个集群操作,不能针对单个 osd
- ceph osd set
- ceph osd unset
1 | |
| 标志名称 | 含义用法详解 |
|---|---|
| noup | OSD 启动时,会将自己在 MON 上标识为 UP 状态,设置该标志位,则 OSD 不会被自动标识为 up 状态 |
| nodown | OSD 停止时,MON 会将 OSD 标识为 down 状态,设置该标志位,则 MON 不会将停止的 OSD 标识为 down 状态,设置 noup 和 nodown 可以防止网络抖动 |
| noout | 设置该标志位,则 mon 不会从 crush 映射中删除任何 OSD。对 OSD 作维护时,可设置该标志位,以防止 CRUSH 在 OSD 停止时自动重平衡数据。OSD 重新启动时,需要清除该 flag |
| noin | 设置该标志位,可以防止数据被自动分配到 OSD 上 |
| norecover | 设置该 flag,禁止任何集群恢复操作。在执行维护和停机时,可设置该 flag |
| nobackfill | 禁止数据回填 |
| noscrub | 禁止清理操作。清理 PG 会在短期内影响 OSD 的操作。在低带宽集群中,清理期间如果 OSD 的速度过慢,则会被标记为 down。可以该标记来防止这种情况发生 |
| nodeep-scrub | 禁止深度清理 |
| norebalance | 禁止重平衡数据。在执行集群维护或者停机时,可以使用该 flag |
| pause | 设置该标志位,则集群停止读写,但不影响 osd 自检 |
| full | 标记集群已满,将拒绝任何数据写入,但可读 |