Ceph部署

1. 简介

Ceph是一个高性能、可扩容的分布式存储系统,它提供三大功能:

  1. 对象存储:提供RESTful接口,也提供多种编程语言绑定。兼容S3、Swift
  2. 块存储:由RBD提供,可以直接作为磁盘挂载,内置了容灾机制
  3. 文件系统:提供POSIX兼容的网络文件系统CephFS,专注于高性能、大容量存储

Ceph将客户端的数据作为对象存储在它的存储池中,基于CRUSH算法,Ceph计算出每个对象应该位于那个PG,计算哪个OSD负责存储PG

Ceph集群由一系列节点(机器)组成,在这些节点上运行以下组件:

  1. Ceph OSDs:OSD即对象存储守护程序,但是它并非针对对象存储。OSD负责存储数据、处理数据复制、恢复、回填(Backfilling)、再平衡。此外OSD还对其它OSD进行心跳检测,检测结果汇报给Monitor
  2. Monitors:监视器,维护集群状态的多种映射,同时提供认证和日志记录服务
  3. MDSs:元数据服务器,存储CephFS的元数据信息

1.1 架构

1.1.1 组件层次

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sAp6VL8v-1680552467828)(assets/image-20230404030601-hjsgr63.png)]

1.1.2 数据读写流程

在这里插入图片描述

1.2术语

术语说明
RADOS可靠的、自动化的分布式对象存储(Reliable, Autonomic Distributed Object Store)是Ceph的核心之一librados是RADOS提供的库,上层的RBD、RGW和CephFS都是通过librados访问RADOS的
RGW即RADOS Gateway,指Ceph的对象存储API或者RGW守护进程
RBD即RADOS Block Device,指Ceph提供的基于复制性的分布式的块设备。类似于LVM中的逻辑卷,RBD只能属于一个Pool
MDS即Ceph元数据服务器,是CephFS服务依赖的元数据服务
CephFSCeph File System,是Ceph对外提供的文件系统服务
Pool存储池是Ceph中一些对象的逻辑分组。它不是一个连续的分区,而是一个逻辑概念,类似LVM中的卷组(Volume Group)存储池分为两个类型:1. Replicated 复制型,对象具有多份拷贝,确保部分OSD丢失时数据不丢失,需要更多的磁盘空间。复制份数可以动态调整,可以置为11. Erasure-coded 纠错码型,节约空间,但是速度慢,不支持所有对象操作(例如局部写)
PG归置组(Placement Group),PG是Pool组织对象的方式,便于更好的分配数据和定位数据,Pool由若干PG组成PG 的数量会影响Ceph集群的行为和数据的持久性。集群扩容后可以增大PG数量:5个以下OSD设置为128即可PG的特点:同一个PG中所有的对象,在相同一组OSDs上被复制。复制型Pool中PG可以有一个作为主(Primary)OSD,其它作为从OSD。一个对象仅仅属于一个PG,也就是说对象存储在固定的一组OSDs上PG在OSD的/var/lib/ceph/osd/ceph-2/current目录下,表现为目录
CRUSHCRUSH即基于可扩容哈希的受控复制(Controlled Replication Under Scalable Hashing),是一种数据分发算法,类似于哈希和一致性哈希。哈希的问题在于数据增长时不能动态添加Bucket,一致性哈希的问题在于添加Bucket时数据迁移量比较大,其他数据分发算法依赖中心的Metadata服务器来存储元数据因而效率较低,CRUSH则是通过计算、接受多维参数的来解决动态数据分发的场景CRUSH算法接受的参数包括:1. Cluster map,也就是硬盘分布的逻辑位置,例如这有多少个机房、多少个机柜、硬盘是如何分布的等等。Cluster map是类似树的结构,子节点是真正存储数据的device,每个device都有id和权重,中间节点是bucket,bucket有多种类型用于不同的查询算法,例如一个机柜一个机架一个机房就是bucket1. Placement rules,它指定了一份数据有多少备份,数据的分布有什么限制条件(例如同一份数据不能放在同一个机柜里)。每个Rule对应一系列操作:1. take,选取一个bucket1. select,选择n个类型为t的项1. emit,提交CRUSH与一致性哈希最大的区别在于接受的参数多了Cluster map和Placement rules,这样就可以根据目前Cluster的状态动态调整数据位置,同时通过算法得到一致的结果基于此算法,Ceph存储集群能够动态的扩容、再平衡、恢复
ObjectCeph最底层的存储单元是Object,每个Object包含元数据和原始数据一个RBD会包含很多个Object
OSD对象存储守护进程(Object Storage Daemon),负责响应客户端请求返回具体数据的进程。Ceph集群中有大量OSD一个节点上通常只运行一个OSD守护进程,此守护进程在一个存储驱动器上只运行一个 filestore
ECErasure Code(EC),即纠删码,是一种前向错误纠正技术(Forward Error Correction,FEC),主要应用在网络传输中避免包的丢失, 存储系统利用它来提高可靠性。相比多副本复制而言, 纠删码能够以更小的数据冗余度获得更高数据可靠性, 但编码方式较复杂,需要大量计算 。纠删码只能容忍数据丢失,无法容忍数据篡改,纠删码正是得名与此EC将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来纠删码技术在分布式存储系统中的应用主要有三类:1. 阵列纠删码(Array Code: RAID5、RAID6等):RAID是EC的特例,RAID5只支持一个盘失效,RAID6支持两个盘失效,而EC支持多个盘失效1. RS(Reed-Solomon)里德-所罗门类纠删码1. LDPC(LowDensity Parity Check Code)低密度奇偶校验纠删码:目前主要用于通信、视频和音频编码等领域,与RS编码相比,LDPC编码效率要略低,但编码和解码性能要优于RS码以及其他的纠删码

2. 组件

2.1 MON

监视器维护集群状态的多种映射—— 包monmap、OSD map、PG map、CRUSH map、MDS map,同时提供认证和日志记录服务。Ceph会记录Monitor、OSD、PG的每次状态变更历史(此历史称作epoch)。客户端连到单个监视器并获取当前映射就能确定所有监视器、 OSD 和元数据服务器的位置。依赖于CRUSH算法和当前集群状态映射,客户端就能计算出任何对象的位置,直连OSD读写数据。

Ceph客户端、其它守护进程通过配置文件发现mon,但是mon之间的相互发现却依赖于monmap的本地副本。所有mon会基于分布式一致性算法Paxos,确保各自本地的monmap是一致的,当新增一个mon后,所有现有mon的monmap都自动更新为最新版本。

2.1.1 监视器同步

使用多个mon时,每个mon都会检查其它mon是否具有更新的集群状态映射版本 —— 存在一个或多个epoch大于当前mon的最高epoch。太过落后的mon可能会离开quorum,同步后再加入quorum。执行同步时,mon分为三类角色:

  1. Leader:具有最新版本状态映射的mon
  2. Provider:同上,但是它的最新状态是从Leader同步获得
  3. Requester:落后于Leader,必须获取最新集群状态映射才能重回quorum

2.1.2 时钟偏移

如果mon的时钟不同步,可能会导致:

  1. 守护进程忽略收到的消息(时间戳过时)
  2. 消息未及时收到时,超时触发得太快或太晚

2.2 OSD

2.2.1 日志

OSD使用日志的原因有两个:

  1. 速度: 日志使得 OSD 可以快速地提交小块数据的写入, Ceph 把小片、随机 IO 依次写入日志,这样,后端文件系统就有可能归并写入动作,并最终提升并发承载力。因此,使用 OSD 日志能展现出优秀的突发写性能,实际上数据还没有写入 OSD ,因为文件系统把它们捕捉到了日志
  2. 一致性:OSD需要一个能保证原子化复合操作的文件系统接口。 OSD 把一个操作的描述写入日志,并把操作应用到文件系统。这确保了对象(例如归置组元数据)的原子更新。每隔一段时间(由filestore max sync interval 和 filestore min sync interval控制 ), OSD 会停止写入,把日志同步到文件系统,这样允许 OSD 修整日志里的操作并重用空间。若失败, OSD 从上个同步点开始重放日志。日志的原子性表现在,它不使用操作系统的文件缓存(基于内存),避免断电丢数据的问题

注意:OSD进程在往数据盘上刷日志数据的过程中,是停止写操作的。

通常使用独立SSD来存储日志,原因是:

  1. 避免针对单块磁盘的双重写入 —— 先写日志,再写filestore
  2. SSD性能好,可以降低延迟提升IOPS

2.2.2 OSD状态矩阵

INOUT
UP正常状态,OSD位于集群中,且接收数据OSD虽然在运行,但是被踢出集群 —— CRUSH不会再分配归置组给它
DOWN这种状态不正常,集群处于非健康状态正常状态

2.3 Bluestore

在Luminous中,Bluestore已经代替Filestore作为默认的存储引擎。Bluestore直接管理裸设备,不使用OS提供的文件系统接口,因此它不会收到OS缓存影响。

使用Bluestore时,你不需要配备SSD作为独立的日志存储,Bluestore不存在双重写入问题,它直接把数据落盘到块上,然后在RockDB中更新元数据(指定数据块的位置)。

一个基于Bluestore的OSD最多可以利用到三块磁盘,例如下面的最优化性能组合:

  1. 使用HDD作为数据盘
  2. 使用SSD作为RockDB元数据盘
  3. 使用NVRAM作为RockDB WAL

2.4 PG

一些概念:

  1. Acting Set:牵涉到PG副本的OSD集合
  2. Up Set:指Acting Set中排除掉Down掉的OSD的子集

Ceph依赖于Up Set来处理客户端请求。如果 Up Set 和 Acting Set 不一致,这可能表明集群内部在重均衡或者有潜在问题。

写入数据前,归置组必须处于 active 、而且应该是 clean 状态。假设一存储池的归置组有 3 个副本,为让 Ceph 确定归置组的当前状态,一归置组的主 OSD (即 acting set 内的第一个 OSD )会与第二和第三 OSD 建立连接,并就归置组的当前状态达成一致意见。

由于以下原因,集群状态可能显示为HEALTH WARN:

  1. 刚刚创建了一个存储池,归置组还没互联好
  2. 归置组正在恢复
  3. 刚刚增加或删除了一个 OSD
  4. 刚刚修改了 CRUSH 图,并且归置组正在迁移
  5. 某一归置组的副本间的数据不一致
  6. Ceph 正在洗刷一个归置组的副本
  7. Ceph 没有足够空余容量来完成回填操作

这些情况下,集群会自行恢复,并返回 HEALTH OK 状态,归置组全部变为active+clean。

2.3.1 归置组状态表

状态说明
Creating在你创建存储池时,Ceph会创建指定数量的PG,对应此状态创建PG完毕后,Acting Set中的OSD将进行互联,互联完毕后,PG变为Active+Clean状态,PG可以接受数据写入
PeeringActing Set中的OSD正在进行互联,它们需要就PG中对象、元数据的状态达成一致。互联完成后,所有OSD达成一致意见,但是不代表所有副本的内容都是最新的
Active互联完成后归置组状态会变为Active
Clean主OSD和副本OSD已成功互联,并且没有偏离的归置组。 Ceph 已把归置组中的对象复制了规定次数
Degraded当客户端向主 OSD 写入数据时,由主 OSD 负责把数据副本写入其余副本 OSD 。主 OSD 把对象写入存储器后,在副本 OSD 创建完对象副本并报告给主 OSD 之前,主 OSD 会一直停留在 degraded 状态如果OSD挂了, Ceph 会把分配到此 OSD 的归置组都标记为 degraded。只要它归置组仍然处于active 状态,客户端仍可以degraded归置组写入新对象如果OSD挂了(down)长期( mon osd down out interval ,默认300秒)不恢复,Ceph会将其标记为out,并将其上的PG重新映射到其它OSD
Recovering当挂掉的OSD重启(up)后,其内的PG中的对象副本可能是落后的,副本更新期间OSD处于此状态
Backfilling新 OSD 加入集群时, CRUSH 会把现有集群内的部分归置组重分配给它。强制新 OSD 立即接受重分配的归置组会使之过载,用归置组回填可使这个过程在后台开始回填执行期间,你可能看到以下状态之一:1. backfill_wait,等待时机,回填尚未开始1. backfill_too_full,需要进行回填,但是因存储空间不足而不能完成
Remapped负责某个PG的Acting Set发生变更时,数据需要从久集合迁移到新集合。此期间老的主OSD仍然需要提供服务,直到数据迁移完成
Stale默认情况下,OSD每0.5秒会一次报告其归置组、出流量、引导和失败统计状态,此频率高于心跳如果:1. 归置组的主 OSD 所在的 Acting Set 没能向MON报告1. 或者其它MON已经报告,说主 OSD 已 down了则MONs就会把此归置组标记为 stale集群运行期间,出现此状态,所有PG的主OSD挂了
Inactive归置组不能处理读写请求,因为它们在等着一个持有最新数据的 OSD 回到 up 状态
Unclean归置组里有些对象的副本数未达到期望次数,它们应该在恢复中
Down归置组的权威副本OSD宕机,必须等待其开机,或者被标记为lost才能继续

2.5 CRUSH

2.5.1 简介

CRUSH 算法通过计算数据存储位置来确定如何存储和检索。 CRUSH授权Ceph 客户端直接连接 OSD ,而非通过一个中央服务器或代理。数据存储、检索算法的使用,使 Ceph 避免了单点故障、性能瓶颈、和伸缩的物理限制。

CRUSH 需要一张集群的 Map,利用该Map中的信息,将数据伪随机地、尽量平均地分布到整个集群的 OSD 里。此Map中包含:

  1. OSD 列表
  2. 把设备汇聚为物理位置的“桶”(Bucket,也叫失败域,Failure Domain)列表
  3. 指示 CRUSH 如何复制存储池中的数据的规则列表

通过CRUSH map来建模存储设备的物理位置,Ceph能够避免潜在的关联性故障 —— 例如一个机柜中的设备可能共享电源、网络供应,它们更加可能因为断电而同时出现故障,Ceph会刻意的避免把数据副本放在同一机柜。

新部署的OSD自动被放置到CRUSH map中,位于一个host节点(OSD所在主机名)。在默认的CRUSH失败域(Failure Domain) 设置中,副本/EC分片会自动分配在不同的host节点上,避免单主机的单点故障。在大型集群中,管理员需要更加仔细的考虑失败域设置,将副本分散到不同的Rack、Row。

2.5.2 crush location

OSD在CRUSH map中的位置,称为CRUSH location。此Location以如下形式来描述:

# 一系列键值对,虽然是有层次结构的,但是列出的顺序无所谓
# 键必须是有效的CRUSH type。默认支持root,regin, datacenter, room, row, pod, pdu, rack, chassis, host
# 你不需要声明所有键,默认情况下Ceph自动把新OSD放在root=default host=hostname下,因此这两个键你可以不声明
root=default row=a rack=a2 chassis=a2a host=a2a1

你可以在Ceph配置文件中,用crush location选项来声明。每当OSD启动时,它会验证当前CRUSH map是否匹配crush location设置,如果不匹配会更新CRUSH map。设置下面的选项可以禁用此行为:

osd crush update on start = false

2.5.3 crush结构

CRUSH map是一个树状的层次结构,它是对存储设备物理位置松散的建模。

在这个层次结构中,叶子节点是Device,对应了OSD守护程序(通常管理一块或几块磁盘)。设备的以name.id来识别,通常是osd.N。设备可以关联一个设备类别(Device Class),取值例如hdd、ssd,CRUSH rule可以使用到设备类别。

除了叶子节点之外的,都称为桶(Bucket),每个桶都具有类型,默认支持的类型包括root,regin, datacenter, room, row, pod, pdu, rack, chassis, host。大部分集群仅仅使用一部分类型的桶。

每个节点都具有一个权重(Weight)字段,指示子树负责存储的数据的比例。权重应该仅仅在叶子节点上设置,由Ceph自动向上类加。权重的单位通常是TB。

执行命令 ceph osd crush tree可以查看CRUSH的层次,包括节点权重。

2.5.4 规则

CRUSH rule定义了数据如何跨越设备分布的规则。大部分情况下你可以通过命令行来创建CRUSH rule,少数情况下需要手工便捷CRUSH map。

2.5.5 TUNABLES

随着Ceph的发展,CRUSH算法被不断的优化。Ceph允许你自由选择新或旧的算法变体,这依赖Tunable实现。

要使用新的Tunable,客户端、服务器必须同时支持。Tunable的命名就是最初支持对应算法变体的那个Ceph版本的名称(例如jewel)。

2.6 RBD

2.6.1 缓存

用户空间的Ceph块设备实现(librbd)不能使用Linux的页面缓存,因此它自己实现了一套基于内存的LRU缓存——RBD Cacheing。

此缓存的行为类似于页面缓存,当OS发送屏障/Flush请求时,内存中的脏数据被刷出到OSD。

2.7 CephFS

这是一个POSIX兼容的文件系统,它使用Ceph的存储集群来保存数据。

一个Ceph集群可以有0-N个CephFS文件系统,每个CephFS具有可读名称和一个集群文件系统ID(FSCID)。每个CephFS可以指定多个处于standby状态的MDS进程。

每个CephFS包含若干Rank,默认是1个。Rank可以看作是元数据分片。CephFS的每个守护进程(ceph-mds)默认情况下无Rank启动,Mon会自动为其分配Rank。每个守护进程最多持有一个Rank。

如果Rank没有关联到ceph-mds,则其状态为failed,否则其状态为up。

每个ceph-mds都有一个关联的名称,典型情况下设置为所在的节点的主机名。每当ceph-mds启动时,会获得一个GID,在进程生命周期中,它都使用此GID。

如果MDS进程超过 mds_beacon_grace seconds没有和MON联系,则它被标记为laggy。

2.8 RGW

Ceph对象存储网关是基于librados构建的一套RESTful服务,提供对Ceph存储集群的访问。此服务提供两套接口:

  1. S3兼容接口:Amazon S3的子集
  2. Swift兼容接口: OpenStack Swift的子集

这两套接口可以混合使用。

对象存储网关由守护程序radosgw负责,它作为客户端和Ceph存储集群之间的媒介。radosgw具有自己的用户管理系统。

从firefly版本开始,对象存储网关在Civetweb上运行,Civetweb内嵌在ceph-radosw这个Daemon中。在老版本中,对象网关基于Apache+FastCGI。

2.9 Dashboard

Ceph仪表盘是一个内置的、基于Web的管理/监控工具。通过它你能够管理集群中各种资源。仪表盘作为Ceph Manager的模块实现。

3. 命令

3.1 ceph orch

包含一系列集群编排有关的命令。

3.1.1 orch ls

列出对编排器可见的服务:

ceph orch ls [<service_type>] [<service_name>] [--export] [plain|json|json-pretty|yaml] [--refresh]
 
ceph orch ls
# 守护进程类型              数量                     归置规则               使用的镜像
NAME                       RUNNING  REFRESHED  AGE  PLACEMENT             IMAGE NAME                            IMAGE ID  
alertmanager                   1/1  77s ago    2w   count:1               docker.io/prom/alertmanager:v0.20.0   0881eb8f169f  
crash                          2/3  79s ago    2w   *                     docker.io/ceph/ceph:v15               mix       
grafana                        1/1  77s ago    2w   count:1               docker.io/ceph/ceph-grafana:6.7.4     80728b29ad3f  
mds.cephfs                     2/3  79s ago    2w   ceph-1;ceph-2;ceph-3  docker.io/ceph/ceph:v15               mix       
mgr                            1/1  77s ago    2w   ceph-1                docker.io/ceph/ceph:v15               5b724076c58f  
mon                            2/3  79s ago    40m  count:3               docker.io/ceph/ceph:v15               mix       
nfs.ganesha                    1/1  78s ago    7d   count:1               docker.io/ceph/ceph:v15               5b724076c58f  
node-exporter                  2/3  79s ago    2w   *                     docker.io/prom/node-exporter:v0.18.1  mix       
osd.all-available-devices      2/3  79s ago    2w   *                     docker.io/ceph/ceph:v15               mix       
prometheus                     1/1  77s ago    2w   count:1               docker.io/prom/prometheus:v2.18.1     de242295e225  
rgw.china.zircon               2/3  79s ago    2w   count:3               docker.io/ceph/ceph:v15               mix       

3.1.2 orch ps

列出对编排器可见的守护进程,守护进程是服务的实例

orch ps [<hostname>] [<service_name>] [<daemon_type>] [<daemon_id>] [plain|json|json-pretty|yaml] [--refresh] 
 
ceph orch ps
NAME                            HOST    STATUS         REFRESHED  AGE  VERSION    IMAGE NAME                            IMAGE ID      CONTAINER ID  
alertmanager.ceph-1             ceph-1  running (69m)  3m ago     2w   0.20.0     docker.io/prom/alertmanager:v0.20.0   0881eb8f169f  bef9ab4dcc98  
crash.ceph-1                    ceph-1  running (69m)  3m ago     2w   15.2.10    docker.io/ceph/ceph:v15               5b724076c58f  3bb0c129d4d4  
crash.ceph-2                    ceph-2  error          3m ago     2w   <unknown>  docker.io/ceph/ceph:v15               <unknown>     <unknown>   
crash.ceph-3                    ceph-3  running (69m)  3m ago     2w   15.2.10    docker.io/ceph/ceph:v15               5b724076c58f  f5c22d2c854b  
grafana.ceph-1                  ceph-1  running (69m)  3m ago     2w   6.7.4      docker.io/ceph/ceph-grafana:6.7.4     80728b29ad3f  17d84abdd9e6  
mds.cephfs.ceph-1.nivqqf        ceph-1  running (69m)  3m ago     2w   15.2.10    docker.io/ceph/ceph:v15               5b724076c58f  4be1504a4c6f  
mds.cephfs.ceph-2.djnipz        ceph-2  error          3m ago     2w   <unknown>  docker.io/ceph/ceph:v15               <unknown>     <unknown>   
mds.cephfs.ceph-3.cgngbk        ceph-3  running (69m)  3m ago     2w   15.2.10    docker.io/ceph/ceph:v15               5b724076c58f  7e514989bc6c  
mgr.ceph-1.adpioc               ceph-1  running (69m)  3m ago     2w   15.2.10    docker.io/ceph/ceph:v15               5b724076c58f  a66dd815c2b1  
mon.ceph-1                      ceph-1  running (69m)  3m ago     2w   15.2.10    docker.io/ceph/ceph:v15               5b724076c58f  0c87ed6da097  
mon.ceph-2                      ceph-2  error          3m ago     2w   <unknown>  docker.io/ceph/ceph:v15               <unknown>     <unknown>   
mon.ceph-3                      ceph-3  running (69m)  3m ago     2w   15.2.10    docker.io/ceph/ceph:v15               5b724076c58f  836ec2a7c34d  
nfs.ganesha.ceph-3              ceph-3  running (68m)  3m ago     7d   3.3        docker.io/ceph/ceph:v15               5b724076c58f  440a1bcef7c5  
node-exporter.ceph-1            ceph-1  running (69m)  3m ago     2w   0.18.1     docker.io/prom/node-exporter:v0.18.1  e5a616e4b9cf  26bf34b93188  
node-exporter.ceph-2            ceph-2  error          3m ago     2w   <unknown>  docker.io/prom/node-exporter:v0.18.1  <unknown>     <unknown>   
node-exporter.ceph-3            ceph-3  running (69m)  3m ago     2w   0.18.1     docker.io/prom/node-exporter:v0.18.1  e5a616e4b9cf  fb60a5b31bfd  
osd.0                           ceph-2  error          3m ago     2w   <unknown>  docker.io/ceph/ceph:v15               <unknown>     <unknown>   
osd.1                           ceph-1  running (69m)  3m ago     2w   15.2.10    docker.io/ceph/ceph:v15               5b724076c58f  49cad5daf8f8  
osd.2                           ceph-3  running (69m)  3m ago     2w   15.2.10    docker.io/ceph/ceph:v15               5b724076c58f  17ef075e16a4  
prometheus.ceph-1               ceph-1  running (69m)  3m ago     2w   2.18.1     docker.io/prom/prometheus:v2.18.1     de242295e225  7b61f27c6a0e  
rgw.china.zircon.ceph-1.dsctvb  ceph-1  running (69m)  3m ago     2w   15.2.10    docker.io/ceph/ceph:v15               5b724076c58f  b7d6166aae36  
rgw.china.zircon.ceph-2.ulzfto  ceph-2  error          3m ago     2w   <unknown>  docker.io/ceph/ceph:v15               <unknown>     <unknown>   
rgw.china.zircon.ceph-3.qjhszd  ceph-3  running (69m)  3m ago     2w   15.2.10 

3.1.3 orch apply

设置某种组件(服务/守护进程)的数量或者归置规则,格式:

# 更新守护程序副本数量、归置规则,或者apply一段YAML格式的配置
orch apply [mon|mgr|rbd-mirror|crash|alertmanager|grafana|node-exporter|prometheus] [<placement>]  
 [--dry-run] [plain|json|json-pretty|yaml] [--unmanaged] 
 
# 扩缩容iSCSI服务
orch apply iscsi <pool> <api_user> <api_password> [<trusted_ip_list>] [<placement>] [--dry-run]
 [plain|json|json-pretty|yaml] [--unmanaged]  
 
# 更新指定fs_name的MDS实例数
orch apply mds <fs_name> [<placement>] [--dry-run] [--unmanaged] [plain|json|json-pretty|yaml]
 
# 扩缩容NFS服务
orch apply nfs <svc_id> <pool> [<namespace>] [<placement>] [--dry-run] [plain|json|json-pretty|
 yaml] [--unmanaged] 
 
# 创建OSD守护进程
orch apply osd [--all-available-devices] [--dry-run] [--unmanaged] [plain|json|json-pretty|yaml]
 
# 为指定的Zone更新RGW实例的数量
orch apply rgw <realm_name> <zone_name> [<subcluster>] [<port:int>] [--ssl] [<placement>] 
[--dry-run] [plain|json|json-pretty|yaml] [--unmanaged] 

下面是一些简单的例子:

# 指定副本数
ceph orch apply mon 3
# 制定归置规则
ceph orch apply mon ceph-1 ceph-2 ceph-3
 
# 为所有空闲设备创建OSD
ceph orch apply osd --all-available-devices

3.1.4 orch daemon

管理守护进程。

add子命令,添加一个守护进程:

# 添加守护进程
ceph orch daemon add [mon|mgr|rbd-mirror|crash|alertmanager|grafana|node-exporter|prometheus [<placement>]
 
ceph orch daemon add iscsi <pool> <api_user> <api_password> [<trusted_ip_list>] [<placement>]
ceph orch daemon add mds <fs_name> [<placement>] 
ceph orch daemon add nfs <svc_id> <pool> [<namespace>] [<placement>]
ceph orch daemon add osd [<svc_arg>]
ceph orch daemon add rgw <realm_name> <zone_name> [<subcluster>] [<port:int>] [--ssl] [<placement>]

redeploy子命令,重新部署某个守护进程,可以指定使用的镜像:

ceph orch daemon redeploy <name> [<image>]

如果节点上的守护进程容器被意外删除,也就是 podman ps看不到对应容器,可以使用redeploy命令重新部署。

rm子命令,删除某个守护进程:

ceph orch daemon rm <names>... [--force]

你也可以启动、停止、重启、重新配置某个守护进程:

ceph orch daemon start|stop|restart|reconfig <name> 

如果需要启动、停止、重启、重新配置某种服务的所有守护进程:

ceph orch start|stop|restart|redeploy|reconfig <service_name> 

3.1.5 orch device

管理块设备。

显示某些主机上的块设备:

ceph orch device ls [<hostname>...] [plain|json|json-pretty|yaml] [--refresh] [--wide]

清除块设备上的内容:

ceph orch device zap <hostname> <path> [--force]

3.1.6 orch host

管理主机。

添加主机,可选的,添加标签:

ceph orch host add <hostname> [<addr>] [<labels>...]

为主机添加/移除标签:

ceph orch host label add <hostname> <label>
ceph orch host label rm <hostname> <label>

列出主机:

ceph orch host ls [plain|json|json-pretty|yaml]

检查是否可以在不损害可用性的前提下,停止主机:

ceph orch host ok-to-stop <hostname>

删除主机:

ceph orch host rm <hostname>

修改主机地址:

ceph orch host set-addr <hostname> <addr> 

3.1.7 orch osd rm

删除OSD实例:

ceph orch osd rm <svc_id>... [--replace] [--force]

检查删除OSD操作的进度:

3.1.8 orch pause

暂停编排器的后台任务

3.1.9 orch resume

恢复暂停的编排器后台任务

3.1.10 orch set backend

选择编排器后端: ceph orch set backend <module_name>

3.1.11 orch status

显示使用的编排器后端,以及它的状态:

ceph orch status [plain|json|json-pretty|yaml]
 
ceph orch status
Backend: cephadm
Available: True

cephadm就是一个编排器后端,下文会有介绍。

3.1.12 orch upgrade

升级相关操作:

orch upgrade check [<image>] [<ceph_version>]    # 检查镜像可用版本
orch upgrade pause                               # 暂停升级
orch upgrade resume                              # 恢复暂停的省级
orch upgrade start [<image>] [<ceph_version>]    # 触发升级
orch upgrade status                              # 升级状态
orch upgrade stop                                # 停止进行中的升级

3.2 ceph log

查看日志:

ceph log last [<num:int>] [debug|info|sec|warn|error] [*|cluster|audit|cephadm]
 
# 查看cephadm的最新日志
ceph log last cephadm

4. 通过cephadm部署

Cephadm是最新的Ceph部署工具,他利用容器和Systemd,仅仅支持Octopus或者更新的版本。

Cephadm的外部依赖包括容器运行时(Docker或者Podman),以及Python3。

4.1 安装Cephadm

cd /tmp
curl --silent --remote-name --location https://github.com/ceph/ceph/raw/octopus/src/cephadm/cephadm
chmod +x cephadm

安装支持cephadm命令及其依赖:

./cephadm add-repo --release octopus
./cephadm install

4.2 单节点自举

cephadm bootstrap --mon-ip 10.0.2.1
cephadm shell -- ceph -s

上述命令会安装一个单MON节点的Ceph集群。该命令会:

  1. 创建MON和MGR守护进程到本机
  2. 为Ceph集群生成SSH密钥,并添加到roo用户的/root/.ssh/authorized_keys
  3. 生成最小化配置的 /etc/ceph/ceph.conf,用于和新集群通信
  4. 生成Ceph管理密钥 /etc/ceph/ceph.client.admin.keyring
  5. 复制公钥副本到/etc/ceph/ceph.pub

4.3 安装Ceph Common

 cephadm install ceph-common

这样你就可以直接使用ceph命令了:

ceph status

4.4 添加节点

你需要提前为节点安装好Python3

列出现有节点:

ceph orch host ls

orch子命令用于Ceph集群相关的编排。

将集群的公钥安装到新节点的authorized_keys:

ssh-copy-id -f -i /etc/ceph/ceph.pub root@10.0.2.2
ssh-copy-id -f -i /etc/ceph/ceph.pub root@10.0.2.3

添加节点,注意要提供主机名:

ceph orch host add ceph-2
ceph orch host add ceph-3

4.4.1 修改节点地址

ceph orch host set-addr ceph-1 ceph-1.gmem.cc 

4.5 添加MON

 # 设置哪些子网中的主机可以作为MON
ceph config set mon public_network 10.0.2.0/24
 
# 确保三个MON
ceph orch apply mon 3
 
# 你也可以强制指定在哪些主机上部署MON
ceph orch apply mon ceph-1 ceph-2 ceph-3

4.6 添加OSD

使用下面的命令,可以将集群主机所有空闲设备作为OSD:

ceph orch apply osd --all-available-devices

将特定主机的特定磁盘作为OSD:

ceph orch daemon add osd ceph-1:/dev/vdb

4.7 部署CephFS

ceph fs volume create cephfs --placement="ceph-1 ceph-2 ceph-3"

4.8 部署RGW

ceph orch apply rgw china beijing '--placement=3' --port=80

4.9部署NFS

NFS Ganesha是一个用户模式的NFS,支持v3 4.0 4.1 4.2,可以同时运行这些协议。

使用下面的命令来部署NFS Ganesha网关。

# 为NFS创建存储池
ceph osd pool create nfs-ganesha 64 replicated
#                   服务ID  存储池      命名空间
ceph orch apply nfs ganesha nfs-ganesha china

5. 通过ceph-deploy部署

ceph-deploy是一个ceph部署工具,服务器只需要提供SSH、sudo、一些Python包即可完成ceph的安装部署。

准备好服务器集群后,选取一台作为管理主机,在其上执行:

wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
#                                  debian-luminous
echo deb https://download.ceph.com/debian-jewel/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
sudo apt-get update
sudo apt-get install ceph-deploy
 
 
# 也可以通过pip安装
apt install python-pip
pip install ceph-deploy
 
 
# BUG太多,直接Git最新源码安装吧
git clone https://github.com/ceph/ceph-deploy.git
cd ceph-deploy
chmod +x setup.py 
python setup.py install

5.1 安装NTP客户端

为了防止时钟不同步导致问题,建议安装NTP客户端,并保持和NTP服务器的同步。

5.2 创建部署用户

# 在所有节点上执行
ansible k8s -m raw -a 'useradd -d /home/ceph-ops -m ceph-ops'
ansible k8s -m raw -a 'echo "ceph-ops ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph-ops'
ansible k8s -m raw -a 'chmod 0440 /etc/sudoers.d/ceph-ops'
ansible k8s -m raw -a 'echo "ceph-ops:password" | chpasswd'
 
# 在管理节点上执行
# 生成密钥对,默认生成~/.ssh下的id_rsa和id_rsa.pub
ssh-keygen
# 将公钥拷贝到被管理机,便于免密码登陆
ansible k8s -m raw -a "mkdir /home/ceph-ops/.ssh"
ansible k8s -m raw -a "scp -oStrictHostKeyChecking=no root@master-node:/root/.ssh/id_rsa.pub /home/ceph-ops/.ssh/authorized_keys"
ansible k8s -m raw -a "chown -R ceph-ops:ceph-ops /home/ceph-ops/.ssh"

5.3 安装ceph

在集群中的管理主机上,执行:

ceph-deploy install {hostname [hostname] ...} --release {code-name}
# 示例:
ceph-deploy --username ceph-ops install Carbon Radon Neon Boron Xenon --release jewel
ceph-deploy --username ceph-ops install Carbon Radon Neon Boron Xenon  --release luminous
 
 
# 如果网络速度太慢,ceph-deploy会提前退出。这种情况下手工、通过代理安装为好
export http_proxy=http://10.0.0.1:8087
export https_proxy=http://10.0.0.1:8087
 
# 实际上就是安装这些软件
apt install ceph ceph-osd ceph-mds ceph-mon radosgw

5.4 卸载ceph

# 卸载软件
ceph-deploy uninstall {hostname [hostname] ...}
# 示例:
ceph-deploy --username ceph-ops uninstall  Carbon Radon Neon
 
# 下面的命令可以在Ubuntu上执行,清除配置文件
ceph-deploy purge {hostname [hostname] ...}
# 示例:
ceph-deploy --username ceph-ops purge  Carbon Radon Neon

5.5 创建集群

5.5.1 临时配置目录

# 在管理节点上执行:
# 创建一个目录,存放ceph-deploy生成的配置文件
mkdir /tmp/ceph
cd /tmp/ceph

5.5.2 新建集群

# 创建一个新集群,host为mon节点
ceph-deploy --cluster {cluster-name} new {host [host], ...}
 
# 示例
ceph-deploy --username ceph-ops new Xenon

5.5.3 分发配置文件

# 修改好当前目录的ceph.conf,执行下面的命令,分发到所有节点的/etc/ceph目录
# ceph.conf至少要提供网络配置
# public network = 10.0.0.0/16
# cluster network = 10.0.0.0/16
 
# 示例
ceph-deploy --username ceph-ops --overwrite-conf config push Carbon Radon Neon Boron Xenon

5.5.4 配置文件示例

[client]
rbd_cache = true
rbd_cache_max_dirty = 25165824
rbd_cache_max_dirty_age = 5
rbd_cache_size = 268435456
 
[global]
fsid = 9b92d057-a4bc-473e-b6ab-462092fcf205
max_open_files = 131072
mon_initial_members = Carbon, Radon, Neon
mon_host = 10.0.0.100,10.0.1.1,10.0.2.1
osd pool default min size = 1
osd pool default pg num = 384
osd pool default pgp num = 384
osd pool default size = 2
mon_max_pg_per_osd = 256
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
 
[mon]
mon_allow_pool_delete = true
 
[osd]
public network = 10.0.0.0/16
cluster network = 10.0.0.0/16
filestore max sync interval = 15
filestore min sync interval = 10
filestore op thread = 32
journal max write bytes = 1073714824
journal max write entries = 10000
journal queue max bytes = 10485760000
journal queue max ops = 50000
ms_bind_port_max = 7100
osd_client_message_size_cap = 2147483648
osd_crush_update_on_start = true
osd_deep_scrub_stride = 131072
osd_disk_threads = 4
osd_journal_size = 10240
osd_map_cache_bl_size = 128
osd_max_backfills = 4
osd_max_object_name_len = 256
osd_max_object_namespace_len = 64
osd_max_write_size = 512
osd_op_threads = 8
osd_recovery_op_priority = 4

5.6 初始mon

执行下面的命令,部署初始mon节点,并收集key:

ceph-deploy --username ceph-ops mon create-initial
 
# 将在当前目录生成以下文件:
# ceph.client.admin.keyring
# ceph.bootstrap-mgr.keyring
# ceph.bootstrap-osd.keyring
# ceph.bootstrap-mds.keyring
# ceph.bootstrap-rgw.keyring
# ceph.bootstrap-rbd.keyring
 
# 目标主机的/etc/ceph/ceph.conf被创建,如果此文件已经存在,你必须用--overwrite-conf选项重新运行上述命令

5.7 增减mon

# 增加
ceph-deploy mon create {host-name [host-name]...}
# 删除
ceph-deploy mon destroy {host-name [host-name]...}
 
# 示例:
ceph-deploy --username ceph-ops mon create Radon
ceph-deploy --username ceph-ops mon create Carbon

5.8 密钥收集

以ceph-deploy作为工具,将一台主机作为OSD或MDS时,需要收集MON、OSD、MDS的初始keyring:

ceph-deploy gatherkeys {monitor-host}
 
# 示例:
ceph-deploy --username ceph-ops gatherkeys Carbon Radon Neon Boron Xenon

不再使用ceph-deploy或者另外建立一个新集群时,需要删除管理主机、本地目录的密钥:

ceph-deploy forgetkeys

5.9 增加OSD

5.9.1 列出磁盘

ceph-deploy disk list {node-name [node-name]...}
# 示例:
ceph-deploy --username ceph-ops disk list Carbon Radon Neon Boron Xenon

5.9.2 擦净分区

下面的命令可以擦净(删除分区表)磁盘,以供Ceph使用 :

ceph-deploy disk zap {osd-server-name} {disk-name}
# 示例(luminous):
ceph-deploy --username ceph-ops disk zap xenial-100 /dev/vdb
ceph-deploy --username ceph-ops disk zap xenial-100 /dev/vdc
ceph-deploy --username ceph-ops disk zap Carbon     /dev/sdb
ceph-deploy --username ceph-ops disk zap Radon      /dev/sdb
ceph-deploy --username ceph-ops disk zap Neon       /dev/sdb
# 示例(jewel):
ceph-deploy --username ceph-ops disk zap xenial-100:vdb
ceph-deploy --username ceph-ops disk zap xenial-100:vdc
ceph-deploy --username ceph-ops disk zap Carbon:sdb
ceph-deploy --username ceph-ops disk zap Radon:sdb
ceph-deploy --username ceph-ops disk zap Neon:sdb

警告:所有数据会被删除。

5.9.3 准备OSD

此命令在ceph-deploy 2.0.0中已经废除

使用prepare命令来准备磁盘,会自动创建分区。在大部分OS中,activate会随后自动执行

ceph-deploy osd prepare {node-name}:{data-disk}[:{journal-disk}]
# 示例:
ceph-deploy --username ceph-ops osd prepare --fs-type xfs xenial-100:vdb
ceph-deploy --username ceph-ops osd prepare --fs-type xfs xenial-100:vdc
ceph-deploy --username ceph-ops osd prepare --fs-type xfs Carbon:sdb
ceph-deploy --username ceph-ops osd prepare --fs-type xfs Radon:sdb

建议:将日志存储在独立磁盘中以最优化性能,如果将日志和数据存储在一起,会有损性能。

5.9.4 激活OSD

此命令在ceph-deploy 2.0.0中已经废除

很多操作系统上,不需要手工激活OSD。

ceph-deploy osd activate {node-name}:{data-disk-partition}[:{journal-disk-partition}]
# 示例
ceph-deploy --username ceph-ops osd activate xenial-100:vdb
ceph-deploy --username ceph-ops osd activate xenial-100:vdc
ceph-deploy --username ceph-ops osd activate Carbon:sdb
ceph-deploy --username ceph-ops osd activate Radon:sdb

激活之后,系统运行ceph-osd进程,OSD进入up+in状态。

5.9.5 创建OSD

即prepare + activate:

ceph-deploy osd create {node-name}:{disk}[:{path/to/journal}]
# 示例
ceph-deploy osd create osdserver1:sdb:/dev/ssd1
 
# 示例(luminous):
ceph-deploy --username ceph-ops osd create --data /dev/vdb --bluestore xenial-100  
ceph-deploy --username ceph-ops osd create --data /dev/vdc --bluestore xenial-100  
ceph-deploy --username ceph-ops osd create --data /dev/sdb --bluestore Carbon
ceph-deploy --username ceph-ops osd create --data /dev/sdb --bluestore Radon
# 指定分区也可以
ceph-deploy --username ceph-ops osd create --data /dev/sda3 --bluestore Carbon

5.10 增加MDS

ceph-deploy --username ceph-ops mds create Carbon

5.11 部署MGR

仅仅luminous支持,否则报错Error EACCES: access denied could not create mgr

ceph-deploy --username ceph-ops mgr create Carbon

5.12 部署RGW

ceph-deploy --username ceph-ops rgw create Radon

默认情况下RGW监听7480端口,你可以验证RGW是否正常工作:

curl http://Carbon:7480

5.13 清除主机

如果只想清除 /var/lib/ceph 下的数据、并保留 Ceph 安装包,可以:

ceph-deploy purgedata {hostname} [{hostname} ...]
# 示例:
ceph-deploy --username ceph-ops purgedata Carbon Radon

如果向同时清除数据、Ceph安装包:

ceph-deploy purge {hostname} [{hostname} ...]

5.14 管理和分发

5.14.1 管理主机

要允许某些主机以管理员权限执行 Ceph 命令,可以:

ceph-deploy admin {host-name [host-name]...}
 
# 示例:
ceph-deploy --username ceph-ops admin Carbon Radon Neon Boron Xenon

上述命令执行后,当前目录中的ceph.client.admin.keyring被分发到所有指定的主机,在这些主机上可以执行ceph -s命令了。

5.14.2 分发配置文件

要将修改过的、当前目录下的配置文件分发给集群内其它主机,可以:

ceph-deploy config push {host-name [host-name]...}

5.14.3 拉取配置文件

要获取某台主机的配置文件,可以:

ceph-deploy config pull {host-name [host-name]...} 

6.配置

启动Ceph服务时,初始化进程会启动一系列守护进程,这些进程至少包含两类:

  1. ceph-mon 监控进程
  2. ceph-osd Ceph OSD的守护进程

要使用Ceph文件系统功能,则需要额外运行:

  1. ceph-mds Ceph元数据服务

要使用Ceph对象存储功能,则需要额外运行:

  1. ceph-rgw RADOS网关守护进程

6.1 运行时配置

要列出当前使用的所有配置值,可以访问守护进程的管理套接字。

在节点上执行下面的命令,获得管理套接字的位置:

ceph-conf --name mon.$(hostname -s) --show-config-value admin_socket
# /var/run/ceph/ceph-mon.a.asok

调用下面的命令列出所有配置:

ceph daemon /var/run/ceph/ceph-mon.a.asok config show 

对于osd或者其它守护进程,也可以使用上述方式获取运行时配置。

6.2 配置文件

所有守护进程从同一个配置文件ceph.conf中检索自己感兴趣的信息。该配置文件中包含了集群身份、认证配置、集群成员、主机名、主机 IP 地址、Keyring路径、日志路径、数据路径,以及其它运行时选项。

按照以下顺序来搜索,后面的可以覆盖前面的:

  1. 编译进二进制文件的默认值
  2. ceph-mon的集群中心配置数据库
  3. 本机上的配置文件:
    1. /etc/ceph/ceph.conf
    2. ~/.ceph/config
    3. ./ceph.conf
  4. 环境变量:$CEPH_CONF
  5. 命令行参数:-c path/path
  6. 管理员在运行时设置的选项

一个Ceph进程启动时,它会先从命令行、环境变量、本地配置文件收集配置项,然后连接ceph-mon读取集群中心配置信息,然后启动。

6.3 配置项格式

配置项的名称唯一,标准格式是小写字母 + 下划线

在命令行中指定配置项时,下划线_可以替换为短横线

在配置文件中指定配置项时,下划线可以替换为空格或短横线

6.4 配置项列表

配置项说明
公共选项 [global]
host用于指定节点的主机名
mon host指定mon节点的地址,逗号分隔
auth cluster required集群身份验证设置,默认值cephx。如果启用,集群守护进程之间必须相互验证身份
auth service required服务身份验证设置,默认值cephx。如果启用,服务端需要验证客户端身份
auth client required客户端身份验证设置,默认值cephx。如果启用,客户端需要验证服务端身份
keyring钥匙串的位置默认值:/etc/ceph/ c l u s t e r . cluster. cluster.name.keyring,/etc/ceph/$cluster.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin
public network公共网络配置,CIDR格式,多个则用逗号分隔
cluster network集群网络配置,CIDR格式,多个则用逗号分隔如果配置了集群网, OSD 将把心跳、对象复制和恢复流量路由到集群网
fsid存储集群的唯一标识,便于允许在同一套硬件上部署多个集群
max open files设置操作系统级的 max open fds建议值:131072
fatal signal handlers如果设置为true,则安装 SEGV 、 ABRT 、 BUS 、 ILL 、 FPE 、 XCPU 、 XFSZ 、 SYS 信号处理器,用于产生有用的日志信息
chdir进程一旦启动、运行就进入这个目录。默认 /
mon选项 [mon]
mon addr监听地址:端口,可以针对每个mon.$id段分别配置,或者在mon段下配置:10.0.0.10:6789,10.0.0.11:6789,10.0.0.12:6789
mon datamon存储数据的路径,默认/var/lib/ceph/mon/ c l u s t e r − cluster- clusterid
mon initial members集群初始化监视器ID,逗号分隔。这些MON必须在线以建立quorum,正确设置此参数可能让集群更快的可用
mon osd full ratio磁盘利用率总计多少认为满了,默认 .95当Ceph集群利用率达到此比率时,作为防止数据丢失的安全措施,它会阻止你读写 OSD注意:1. 删除OSD、OSD out都会导致利用率增加,甚至超过full ratio导致锁死1. 如果一些 OSD 快满了,但其他的仍有足够空间,你可能配错了CRUSH权重
mon osd nearfull ratio磁盘利用率总计多少认为快满了,默认.85
mon sync timeoutmon从其provider获取下一个更新消息的超时
mon tick interval监视器的心跳间隔,单位为秒。默认5
mon clock drift allowed监视器间允许的时钟漂移量。默认.050
mon timecheck interval和 leader 的时间偏移检查间隔。默认300秒
mon osd min down reportsOSD连续多少次向mon报告某个OSD宕掉,mon才采纳,默认3
mon osd min down reporters类似上面,mon要求多少个OSD都报告某个OSD宕掉,才采纳,默认1
mon osd min up ratio把 OSD 标记为 down 前,保持处于 up 状态的 OSD 最小比例。默认.3
mon osd min in ratio把 OSD 标记为 out 前,保持处于 in 状态的 OSD 最小比例。默认.3
mon osd auto mark in是否把任何启动中的 OSD 标记为在集群中。默认false
mon osd auto mark auto out in是否把正在启动、且被自动标记为 out 状态的 OSD 标记为 in 。默认true
mon osd auto mark new in是否把正在启动的新 OSD 标记为 in 。默认true
mon osd down out interval在 OSD 停止响应多少秒后把它标记为 down 且 out。默认300
mon osd downout subtree limit最大可以把什么级别的CRUSH单元标记为out,默认rack
osd选项 [osd]
osd dataosd存储数据的路径,默认/var/lib/ceph/osd/ c l u s t e r − cluster- clusterid
osd map cache sizeOSD map缓存大小,默认500M,建议1024
osd map cache bl sizeOSD进程的In-Memory OSD map缓存大小,默认50,建议128
osd heartbeat interval和其它OSD进行心跳检查的间隔,默认6秒
osd heartbeat grace多久没有心跳,认为其它OSD宕掉
osd max write sizeOSD一次写入的最大尺寸,默认90MB,建议512
osd mkfs options {fs-type}为OSD新建文件系统时的选项
osd mount options {fs-type}为OSD挂载文件系统时的选项
osd journalOSD 日志路径,可以指向文件或块设备(例如SSD分区)默认 /var/lib/ceph/osd/ c l u s t e r − cluster- clusterid/journal
osd journal size日志文件的尺寸(MB),如果为0,且日志路径为块设备,则自动使用整个设备推荐最少2G,有的用户则以 10GB 日志尺寸起步。合理的值是:osd journal size = {2 * (期望吞吐量* filestore max sync interval)}期望吞吐量应考虑两个参数:硬盘吞吐量(即持续数据传输速率)、网络吞吐量,例如一个 7200 转硬盘的速度大致是 100MB/s 。硬盘和网络吞吐量中较小的一个是相对合理的吞吐量
osd client message size cap客户端允许在内存中的最大数据量。默认524288000,建议2147483648
crush location此OSD的CRUSH location设置
crush location hook用于生成crush location的钩子
osd max scrubsOSD 的最大并发洗刷操作数除了为对象复制多个副本外, Ceph 还要洗刷归置组以确保数据完整性。这种洗刷类似对象存储层的 fsck ,对于每个归置组, Ceph 生成一个所有对象的目录,并比对每个主对象及其副本以确保没有对象丢失或错配。轻微洗刷(每天)检查对象尺寸和属性,深层洗刷(每周)会读出数据并用校验和方法确认数据完整性
osd scrub begin hour被调度的洗刷操作,允许的运行区间起点,默认0
osd scrub end hour被调度的洗刷操作,允许的运行区间终点,默认24
osd scrub load threshold系统负载高于该值,不进行洗刷操作,默认0.5
osd scrub min interval系统负载不高的前提下,多久进行一次洗刷,默认每天一次,606024秒
osd scrub max interval不论系统负载如何,最大多久进行一次洗刷,默认每周
osd deep scrub interval深度洗刷的间隔,默认每周
osd deep scrub stride深度洗刷允许读取的字节数。默认524288,建议131072
osd op threadsOSD 操作线程数, 0 禁用多线程。增大数量可以增加请求处理速度,默认2,建议8增加此线程数会增大CPU开销
osd disk threads硬盘线程数,用于在后台执行磁盘密集型操作,像数据洗刷和快照修复。默认1,建议4增加此线程数会增大CPU开销
osd max backfills当集群新增或移除 OSD 时,按照 CRUSH 算法应该重新均衡集群,它会把一些归置组移出或移入多个 OSD 以回到均衡状态。归置组和对象的迁移会导致集群运营性能显著降低,为维持运营性能, Ceph 用 backfilling 来执行此迁移,它可以使得 Ceph 的回填操作优先级低于用户读写请求单个 OSD 允许的最大回填操作数。默认10,建议4
osd backfill full ratioOSD 的占满率达到多少时拒绝接受回填请求,默认85%
osd recovery op priority恢复操作优先级,取值1-63,值越高占用资源越高。默认10,建议4
osd recovery delay start当集群启动、或某 OSD 守护进程崩溃后重启时,此 OSD 开始与其它 OSD 们建立互联(Peering),这样才能正常工作如果某 OSD 崩溃并重启,通常会落后于其他 OSD ,也就是没有同归置组内最新版本的对象。这时, OSD 守护进程进入恢复模式并检索最新数据副本,并更新运行图。根据 OSD 宕掉的时间长短, OSD 的对象和归置组可能落后得厉害,另外,如果挂的是一个失效域(如一个机柜),多个 OSD 会同时重启,这样恢复时间更长、更耗资源为保持性能, Ceph 进行恢复时会限制恢复请求数、线程数、对象块尺寸,这样在降级状态下也能保持良好的性能对等关系建立完毕后, Ceph 开始对象恢复前等待的时间。默认0秒
osd recovery max active每个OSD同时处理的活跃恢复请求最大数,增大此值能加速恢复,但它们会增加OSD的负担,甚至导致其无法提供服务
osd recovery max chunk恢复时一次推送的数据块的最大尺寸,可以用于防止网络拥塞
osd recovery threads数据恢复时的线程数,默认1
osd mount options xfsOSD的xfs挂载选项,默认rw,noatime,inode64,建议rw,noexec,nodev,noatime,nodiratime,nobarrier
rbd客户端调优 [client]
rbd cache是否启用RBD缓存,默认true用于用户空间块设备实现——librbd
rbd cache sizeRBD缓存大小,默认33554432,建议268435456
rbd cache max dirty缓存为write-back时允许的最大dirty字节数,如果为0,使用write-through。默认25165824,建议25165824
rbd cache max dirty age在被刷新到存储盘前dirty数据存在缓存的时间,默认1秒,建议5
filestore选项[osd]**
filestore max inline xattr size每个对象在文件系统中存储XATTR(扩展属性)的最大尺寸,不得超过文件系统限制。默认值根据底层文件系统自动设置
filestore max inline xattrs每个对象在文件系统中存储XATTR(扩展属性)的最大数量
filestore max sync intervalfilestore 需要周期性地静默(暂停)写入、同步文件系统 —— 创建了一个提交点,然后就能释放相应的日志条目了。较高的同步频率可减小执行同步的时间及保存在日志里的数据量,但是日志利用率较低较低的频率使得后端的文件系统能优化归并较小的数据和元数据写入,因此可能使同步更有效默认5秒。建议15
filestore min sync interval从日志到数据盘最小同步间隔。默认.01秒,建议10
filestore op threads并发文件系统操作数。默认2,建议32
filestore flusher是否启用回写器(Flusher)。回写器强制使用sync file range 来写出大块数据,这样处理可能减小最终同步的代价,禁用回写器有时可能提高性能默认false
filestore flusher max fds回写器的最大文件描述符数量。默认512
filestore fsync flushes journal data在fsync时是否也回写日志数据
filestore queue max ops文件存储在阻止新操作加入队列之前,可以接受的最大操作数。取值示例25000
filestore queue max bytes文件存储单个操作的最大字节数。取值示例10485760
filestore queue committing max ops文件存储单次可以提交的最大操作数
filestore queue committing max bytes文件存储单次可以提交的最大字节数
filestore journal parallel允许并行记日志,对 btrfs 默认开
filestore journal writeahead允许预写日志,对 xfs 默认开
journal选项[osd]**
journal dio启用日志的Direct I/O,要求journal block align=true。默认true
journal aio使用libaio库进行日志的异步写,要求journal dio =true。0.61+默认true
journal block align日志按块对齐。默认true
journal max write bytes日志写操作单次最大字节数。建议1073714824
journal max write entries日志写操作单次最大条目数。建议10000
journal queue max ops排队等候日志写的操作最大数。建议50000
journal queue max bytes排队等候日志写的最大字节数。建议10485760000
journal align min size对于大于此尺寸的数据,进行对齐操作
journal zero on create在创建文件系统( mkfs )期间用 0 填充整个日志
pool/pg/crush相关 [global]
osd pool default size对象默认副本份数
osd pool default min size降级情况下,默认允许写操作的最小可用副本份数
osd pool default pg num归置组的默认数量
osd pool default pgp num为归置使用的归置组数量,默认值等同于 mkpool 的 pgp_num 参数。当前 PG 和 PGP 应该相同
mon max pool pg num每个存储的最大归置组数量。默认65536
mon pg create interval在同一个 OSD 里创建 PG 的间隔秒数。默认30
mon pg stuck threshold多长时间无响应,则认为PG卡住了
mon pg min inactive如果大于此数量的PG处于inactive状态超过mon_pg_stuck_threshold,则显示集群为HEALTH_ERR。默认1
mon pg warn min per osd如果每OSD平均可用PG低于此数量,则显示集群为HEALTH_WARN。默认30
mon pg warn max per osd如果每OSD平均可用PG高于此数量,则显示集群为HEALTH_WARN。默认300
osd crush chooseleaf type在CRUSH 规则内用于 chooseleaf 的桶类型。用序列号而不是名字,默认1
osd crush initial weight新加入到CRUSH map中的OSD的权重默认情况下,权重是OSD的磁盘容量,单位TB
osd pool default crush rule创建复制型池时,使用的默认CRUSH规则。默认-1,表示使用ID最低的规则
osd pool erasure code stripe unitEC池中的对象条带尺寸
osd pool default flags新存储池的默认标志
ms选项
ms tcp nodelay禁用 nagle 算法,默认true
ms initial backoff出错时重连的初始等待时间
ms max backoff出错重连时等待的最大时间
ms nocrc禁用网络消息的 crc 校验, CPU 不足时可提升性能
mds选项
mds cache memory limitMDS缓存最大使用多少内存

6.5 配置变量

变量说明
$cluster展开为存储集群的名称,在相同硬件上运行多个集群时有用
$type展开为守护进程类型,例如mds, osd, or mon
$id展开为守护进程或者客户端的标识符,对于osd.0其标识符为0
$host展开为主机名
$name展开为 t y p e . type. type.id
$pid展开为守护进程的PID

6.6 配置段落

配置文件是INI格式的,可以分为以下段落:

段落用途
global这里的配置影响 Ceph 集群里的所有守护进程
osd影响存储集群里的所有 ceph-osd 进程,覆盖global相同选项
mon影响集群里的所有 ceph-mon 进程,覆盖global相同选项
mds影响集群里的所有 ceph-mds 进程,覆盖global相同选项
client影响所有客户端(如挂载的 Ceph 文件系统、挂载的块设备等等)

你还可以针对特定的实例配置段落:

  1. [osd.1],针对ID为1的OSD的配置
  2. [mon.HOSTNAME],针对名称为HOSTNAME的MON的配置

6.7 启动选项

进程连接ceph-mon、进行身份验证、抓取集群中心配置信息时需要一些配置,这些配置必须存放在本地:

选项说明
mon_hostceph-mon的主机列表
mon_dns_serv_nameceph-mon的DNS名称,默认 ceph-mon
mon_data, osd_data, mds_data, mgr_data守护进程在本地存放数据的路径
keyring, keyfile,key连接ceph-mon进行身份验证时,使用的凭证

6.8 集群中心配置

ceph-mon集群管理了配置配置选项的数据库,用于供整个集群来消费。为了简化管理,大部分的Ceph选项应该在此数据库中管理。

集群中心配置的分段情况,和上文的配置段落一致。

6.8.1 不使用集群配置

传入命令行选项 **–no-mon-**config,可以让进程不去读取集群中心配置,使用场景:

  1. 希望所有配置信息在本地文件中管理
  2. ceph-mon目前宕机,但是需要进行一些维护工作

6.8.2 掩码

集群中心配置的配置项,可以关联一个掩码,用于限定选项应用到哪种守护进程、哪种客户端。例如host:foo,限制foo选项仅仅应用到运行在host上的进程或客户端。

6.8.3 命令

以下命令可以用于修改集群中心配置:

命令说明
ceph config dumpDump出整个集群中心配置
ceph config get [who]获取指定的客户端/守护进程存放在集群中心的配置,例如mds.a
ceph config set [who] [opt] [val]设置指定客户端/守护进程的配置项,示例:
# 启用特定OSD的调试日志ceph config set osd.123debug_osd20
ceph tell [who] config set [opt] [val]
临时设置配置项,目标重启后失效
ceph config show [who]显示指定客户端/守护进程的当前使用的配置信息,可能和集群中心配置不一样
ceph config assimilate-conf -i -o从-i选项读取所有配置信息,注入到集群中心配置。任何无法识别、无效的配置项存放到-o

6.9 存储池选项

在运行时,你可以使用 ceph osd pool set命令来修改这些选项:

选项说明
size对象副本数
min_sizeI/O 需要的最小副本数
crush_rule此存储池使用的CRUSH规则
compression_algorithmBlueStore使用的压缩算法,可选值lz4, snappy, zlib, zstd
compression_modeBlueStore使用的压缩模式,可选值none, passive, aggressive, force
compression_min_blob_size
compression_max_blob_size
BlueStore启用压缩的阈值
hashpspool设置或者取消HASHPSPOOL标记。1设置0取消
nodelete设置或取消NODELETE标记。1设置0取消
nopgchange设置或取消NOPGCHANGE标记
nosizechange设置或取消NOSIZECHANGE标记
write_fadvise_dontneed设置或取消WRITE_FADVISE_DONTNEED标记
noscrub设置或取消NOSCRUB标记
nodeep-scrub设置或取消NODEEP_SCRUB标记
hit_set_type启用缓存存储池的命中集跟踪,设置命中集类型,生产环境仅仅支持bloom
hit_set_count为缓存存储池保留的命中集数量。此值越高, OSD消耗的内存越多
hit_set_fppbloom 命中集类型的误检率(false positive probability)
cache_target_dirty_ratio缓存存储池包含的修改(脏)对象达到多少比例时就把它们回写到后端的存储池
cache_target_dirty_high_ratio缓存存储池内包含的已修改(脏)对象达到什么比例时,缓存层代理就会更快地把脏对象刷回到后端存储池
cache_target_full_ratio缓存存储池包含的干净对象达到多少比例时,缓存代理就把它们清除出缓存存储池
target_max_bytes回写(Flushing)或清除(Evicting)对象的阈值,按字节数
target_max_objects回写(Flushing)或清除(Evicting)对象的阈值,按对象数
scrub_min_interval在负载低时,洗刷存储池的最大间隔秒数
scrub_max_interval不管集群负载如何,都要洗刷存储池的最大间隔秒数
deep_scrub_interval深度洗刷存储池的间隔秒数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/7929.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码规范(以后会补充)

目录 为什么要规范代码 不规范的代码有什么特点 ​编辑 不规范的坏处 规范代码是什么样的 如何规范代码 1.代码中不要出现莫名其妙的数字 2.深度嵌套 3.注释 4.避免创建大函数 5.重复代码 6.变量命名 7.函数命名 8.命名时注意动词的使用 9. 常量值所有都大写 10. 避免变…

PMP备考资料:如何掌握PMP应考中的计算题?

计算题总体来说考得非常简单&#xff0c;题量也少&#xff0c;有时候只考3道、4道简单计算。所以这部分内容大家要细心严谨&#xff0c;不要因为粗心而丢掉分数。 01三点估算 通过考虑估算中的不确定性和风险&#xff0c;可以提高活动持续时间估算的准确性。这个概念源自计划…

映射的概念以及用法

映射的概念以及用法前言映射的定义映射的应用前言 在数学里&#xff0c;映射是个术语&#xff0c;指两个元素的集之间元素相互 “对应”的关系&#xff0c;为名词。映射&#xff0c;或者射影&#xff0c;在数学及相关的领域经常等同于函数&#xff0c;函数是从非空数集到非空数…

PyCharm解决Git冲突

技术背景 在前面的一篇博客中&#xff0c;我们介绍了Fork到自己名下的本地仓库如何与远程原始仓库创建链接的方法。在这篇文章中&#xff0c;我们将要讲解如何应对在这种异步开发的过程中经常有可能会遇到的Git冲突问题&#xff0c;在Pycharm这个专业的Python开发工具中集成了一…

网络基础概念

本文目标&#xff1a; ①了解网络发展背景, 对局域网/广域网的概念有基本认识; ②了解网络协议的意义, 重点理解TCP/IP五层结构模型; ③学习网络传输的基本流程, 理解封装和分用; 1.计算机网络背景 OS与网络 在整个计算机体系中&#xff0c;是先由操作系统&#xff0c;再有网…

Windows下使用SSH密钥实现免密登陆Linux服务器

工具&#xff1a; win10、WinSCP 生成ssh密钥&#xff1a; 打开终端&#xff0c;使账号密码登录&#xff0c;输入命令 ssh-keygen -t rsa 会提示密钥存放路径&#xff0c;一般存放在默认路径&#xff0c;直接回车即可&#xff0c;中间会提示输入密码&#xff0c;这里需要注…

CC攻击原理以及如何防御策略

CC攻击原理以及如何防御策略 CC 攻击是一种 DDoS&#xff08;分布式拒绝服务&#xff09;&#xff0c;它似乎比其他 DDoS 攻击更具技术性。在这种攻击中&#xff0c;看不到假IP&#xff0c;看不到特别大的异常流量&#xff0c;但会导致服务器无法正常连接。 很多创业公司辛辛苦…

你是真的“C”——C语言测评总结

你是真的“C”——C语言测评总结&#x1f60e;前言&#x1f64c;BC146 添加逗号总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&#xff01;&#xff01; &#x1f60a;作者简介&#xf…

TreEnhance: A Tree Search Method For Low-Light Image Enhancement 论文阅读笔记

这是2023年PR这个期刊的论文主要思想是&#xff0c;利用一系列预定义好的操作序列来进行增强&#xff0c;然后利用强化学习来学习增强序列的预测。所以训练阶段有两个交替进行的阶段&#xff0c;一个是蒙特卡洛树搜索阶段&#xff0c;第二个是训练深度强化学习的阶段。而测试的…

中级软件设计师备考---计算机组成与体系结构3

目录①磁盘工作原理②计算机总线③系统可靠性分析④校验码CRC循环校验码海明校验码①磁盘工作原理 计算题 ②计算机总线 概念题 ③系统可靠性分析 计算可靠度 ④校验码 码距&#xff1a;是指两个码字之间的不同位数。例如&#xff0c;1010和1111之间的码距是2&#xff0c…

160. 相交链表 ——【Leetcode每日一题】

160. 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c…

生成式人工智能所面临的问题有哪些?

在生成式人工智能中工作需要混合技术、创造性和协作技能。通过发展这些技能&#xff0c;您将能够在这个令人兴奋且快速发展的领域应对具有挑战性的问题。 生成式人工智能是指一类机器学习技术&#xff0c;旨在生成与训练数据相似但不完全相同的新数据。 换句话说&#xff0c;…

【二分—STL】lower_bound()函数upper_bound()函数的使用总结

目录一、基本用法&#xff1a;二、具体到题目中如何应用1、数的范围2、递增三元组3、数组元素的目标和一、基本用法&#xff1a; lower_bound() 用于二分查找区间内第一个 大于等于某值(> x) 的迭代器位置 upper_bound() 用于二分查找区间内第一个 大于某值(> x) 的迭代器…

IP协议以及相关技术

这里写目录标题前言正文IP基本认识IP的作用IP和MAC的关系IP地址的基础知识IP地址定义IP地址分类(IPv4)无分类IP地址CIDR子网掩码IPv6基础知识相关技术DNS域名解析ARPDHCPNATICMPIGMP总结参考连接前言 大家好&#xff0c;我是练习两年半的Java练习生&#xff0c;今天我们来讲一…

Meta AI Segment Anything Model (SAM)初体验

最近Meta AI发布了Segment Anything模型&#xff0c;可以直接分割任何图片。我趁热乎体验了一下。 文章目录进入官网 & 上传图片Hover & Click——截取物体Box——框选物体Everything——提取所有物体Cut-Outs——提取结果进入官网 & 上传图片 打开Segment Anythi…

JMP指令寻址方式总结,JMP BX指令寻址方式是什么

jmp 指令的几种寻址方式 jmp short 标号 段间跳转 -128-127 jmp far ptr 标号 超段转移 跳转包含目标地址jmp reg 16位寄存器 jmp word ptr 内存单元地址 段内转移 jmp dword ptr 内存单元地址 ( 段间转移) 高字地址存放cs 低字节存放ip jmp指令用法总结 1.直接用法(只能在Deb…

hadoop3.2.4 集群环境搭建

本文介绍hadoop3.2.4集群环境搭建看本文之前最好先看看伪分布式的 搭建文章链接如下&#xff0c;因为有些问题是伪分布式的时候遇到的&#xff0c;这里就不重复展示解决办法了。 链接&#xff1a;伪分布式搭建 文章目录前言一、准备机器二、linux环境准备工作2.1 修改主机名2.2…

超详细从入门到精通,pytest自动化测试框架实战-钩子函数(五)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 pytest这个框架提供…

政务云建设与应用解决方案

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 政府信息化趋势-四大四新-政务云需求 大平台共享-新设施&#xff1a;打造形成“覆盖全市、统筹利用、统一投入”的大平台&#xff0c;有力促进政务信息系统整合&#xff1b; 大…

面试官:说一说mysql的varchar字段最大长度?

在mysql建表sql里&#xff0c;我们经常会有定义字符串类型的需求。 CREATE TABLE user (name varchar(100) NOT NULL DEFAULT COMMENT 名字 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 ;比方说user表里的名字&#xff0c;就是个字符串。mysql里有两个类型比较适合这个场景。 ch…
最新文章