0%

5.Ceph操作及管理

[TOC]

4.1 Ceph服务管理

4.1.1 sysinit

使用sysinit运行Ceph

在 RedHat 以及一些旧版的Debian/Ubuntu发行版中,sysinit是一个传统的但被推荐用于管理Ceph守护进程的方法

1
/etc/init.d/ceph [options] [command] [dameons]

[options]

1
2
3
--verbose(-v)	: 用于记录详细日志
--allhosts(-a) : 在Ceph.conf提及的所有节点上执行命令,否则只在本节点上运行
--conf(-c) : 使用可选的配置文件

[command]

1
2
3
4
5
status	: 显示守护进程状态
start : 启动守护进程
stop : 停止守护进程
restart : 重启守护进程
forcestop : 强制进程关闭 类似与kill -9

[dameons]

1
2
3
4
5
mon
mgr
osd
mds
ceph-radosgw
根据类型启动守护进程

若要在本机启动monitor进程

1
/etc/init.d/ceph start mon

若在本地及远程主机上启动所有的monitor进程,添加 -a 选项

1
/etc/init.d/ceph -a start mon

其他类型的进程同理

1
2
3
4
/etc/init.d/ceph -a start osd
/etc/init.d/ceph -a start mgr
/etc/init.d/ceph -a start mds
/etc/init.d/ceph -a start radosgw
根据类型停止守护进程
1
2
3
4
5
/etc/init.d/ceph -a stop mon
/etc/init.d/ceph -a stop osd
/etc/init.d/ceph -a stop mgr
/etc/init.d/ceph -a stop mds
/etc/init.d/ceph -a stop radosgw
启动及停止所有守护进程
1
2
/etc/init.d/ceph -a start
/etc/init.d/ceph -a stop
启动停止指定进程
1
2
3
4
5
/etc/init.d/ceph -a start osd.0

/etc/init.d/ceph -a status osd.0

/etc/init.d/ceph -a stop osd.0

把Ceph作为服务运行

1
service ceph [options] [command] [dameons]

[options]

1
2
3
--verbose(-v)	: 用于记录详细日志
--allhosts(-a) : 在Ceph.conf提及的所有节点上执行命令,否则只在本年级上运行
--conf(-c) : 使用可选的配置文件

[command]

1
2
3
4
5
status	: 显示守护进程状态
start : 启动守护进程
stop : 停止守护进程
restart : 重启守护进程
forcestop : 强制进程关闭 类似与kill -9

[dameons]

1
2
3
4
5
mon
mgr
osd
mds
ceph-radosgw

4.1.2 systemctl

开启、关闭、重启所有ceph服务

1
systemctl { start | stop | restart} ceph.target 

根据 进程 类型 开启、关闭 和 重启 ceph 服务

1
2
3
4
5
6
7
8
9
10
# mon 进程
systemctl { start | stop | restart} ceph-mon.target
# mgr 进程
systemctl { start | stop | restart} ceph-mgr.target
# osd 进程
systemctl { start | stop | restart} ceph-osd.target
# rgw 进程
systemctl { start | stop | restart} ceph-radosgw.target
# mds进程
systemctl { start | stop | restart} ceph-mds.target

根据 进程 实例 开启、关闭 和 重启 所有 ceph 服务

1
2
3
4
5
6
7
8
9
10
# mon 实例
systemctl { start | stop | restart} ceph-mon@{mon_instance}.service
# mgr 实例
systemctl { start | stop | restart} ceph-mgr@{hostname}.service
# osd 实例
systemctl start ceph-osd@${osd_id}.service
# rgw 实例
systemctl { start | stop | restart} ceph-radosgw@rgw.{hostname}.service
# mds 实例
systemctl { start | stop | restart} ceph-mds@{hostname}.service

4.2 各服务的操作操作

mon

1
2
3
4
5
6
7
ceph mon remove node1 # 删除一个mon 节点
ceph-deploy mon destory {hostname [hostname ...]}

添加mon注意先改配置目录配置文件,再推送到所有节点
ceph mon add node1 node1_ip #添加一个mon节点
ceph-deploy mon create {host-name [host-name]...}
ceph-deploy --overwrite-conf config push node1 node2 node3

OSD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
ceph osd stat #查看osd状态

ceph osd dump #osd的映射信息

ceph osd tree#查看osd目录树

ceph osd down 0 #down掉osd.0节点

ceph osd rm 0#集群删除一个osd硬盘

ceph osd crush remove osd.4#删除标记

ceph osd getmaxosd#查看最大osd个数

ceph osd setmaxosd 10#设置osd的个数

ceph osd out osd.3#把一个osd节点逐出集群

ceph osd in osd.3#把逐出的osd加入集群

ceph osd pause#暂停osd (暂停后整个集群不再接收数据)

ceph osd unpause#再次开启osd (开启后再次接收数据)

ceph osd df # 查看osd的使用信息

# 要定位对象,只需要对象名和存储池名字即可,例如:

ceph osd map {poolname} {object-name}

PG相关

查看PG组的映射信息

1
2
3
4
5
6
7
8
#查看pg状态
ceph pg stat

#查看pg组的映射信息
ceph pg dump

# 或者
ceph pg ls

查看一个PG的map

1
ceph pg map 7.1a

获取pg的详细信息

1
ceph pg {pg-id} query

显示一个集群中的所有的pg统计

1
ceph pg dump --format plain

mds

1
2
3
4
5
6
7
8
9
10
ceph mds stat #查看msd状态

ceph mds dump #msd的映射信息

ceph mds rm 0 mds.node1#删除一个mds节点

ceph-deploy mds create {host-name}[:{daemon-name}] [{host-name}[:{daemon-name}] ...]

# 查看连接
ceph tell mds.0 client ls

多MDS变成单MDS的方法:https://www.cnblogs.com/bandaoyu/p/16752154.html#ceph%20mds

更多MDS运维命令:https://www.jianshu.com/p/fa96b66f2949

rbd

https://www.cnblogs.com/bandaoyu/p/16752154.html#%E5%9D%97%E8%AE%BE%E5%A4%87%7Crbd%E7%9A%84%E4%B8%80%E4%BA%9B%E5%91%BD%E4%BB%A4

4.3 集群管理

4.3.1 池操作

rados集群池查看

1
2
3
4
5
6
7
8
9
$ ceph -s#查看集群信息
# 输出中,“pgmap” 属性包含池数量和一些对象信息

$ rados lspools # 查看池列表
data
rbd
metadata

$ rados -p metada metadata ls #查看指定池中的对信息

查看ceph集群中的pool数量

1
2
3
4
5
6
7
8
9
ceph osd lspools 
# 查看集群中的存储池名称
ceph osd pool ls

# 查看池的的详细信息
ceph osd pool ls detail

# 查看池的IO情况
ceph osd pool stats

池副本数

1
2
3
4
5
6
7
# 查看ceph 池副本数
ceph osd dump | grep size

# 修改已存在池的副本数
ceph osd pool set <poolname> size|min_size <val>
# 修改默认的池副本数
ceph config set global osd_pool_default_size/min_size <val>

在ceph集群中创建一个pool

1
2
3
$ ceph osd pool create [池名] [PG数] [PGP数] 
#这里的100指的是PG组:
ceph osd pool create <poolname> <num_pg> <num_pgs>

删除池

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 修改参数配置项允许删除池
ceph config get mon.ceph01 mon_allow_pool_delete
ceph config set global mon_allow_pool_delete true

$ ceph osd pool delete [池名] [池名] --yes-i-really-really-meant-it

#
vi /etc/ceph/ceph.conf

[mon]
mon allow pool delete = true

# 重启ceph-mon服务:
systemctl restart ceph-mon.target

删除池时会删除所有该池的所有快照。

  • 如果为池手动增加了CRUSH规则集,在删除池后,需要手动删除该CRUSH规则集
  • 如果为池的某个用户创建了一个权限,也需要删除该用户

显示集群中pool的详细信息

1
2
# 显示集群中pool的详细信息
rados df

显示集群中pool的详细信息

1
ceph osd pool get <pool_name> pg_num

池属性查看与修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ ceph osd pool get [池名] 属性名
$ ceph osd pool set [池名] [属性名] [属性值]

# 获取现有PG 和 PGP
$ ceph osd pool get data pg_num
$ ceph osd pool get data pgp_num

# 修改PG和PGP
$ ceph osd pool set data pg_num 256
$ ceph osd pool set data pgp_num 256

ceph osd pool set <pool_name> target_max_bytes 100000000000000#设置data池的最大存储空间为100T(默认是1T)

ceph osd pool set <pool_name> size 3 #设置data池的副本数是3

ceph osd pool set <pool_name> min_size 2 #设置data池能接受写操作的最小副本为2

ceph osd pool set <pool_name> pg_num 100#设置一个pool的pg数量

ceph osd pool set <pool_name> pgp_num 100#设置一个pool的pgp数量

#重命名池
$ ceph osd pool rename [池名] [新池名]

4.3.2 rados操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看ceph集群中有多少个pool (只是查看pool)
rados lspools

# 查看存储池使用情况:多少个pool,每个pool容量及利用情况
rados df

# 创建一个pool,名字:test
rados mkpool test

# testpool 中创建一个对象 testobject
rados create testobject -p testpool

# 删除(test存储池的)一个对象object
rados rm test-object-1 -p test

# 查看存储池test的对象
rados -p test ls

rados存储池快照

1
2
3
4
5
6
7
8
9
10
rados mkpool testpool
rados -p testpool create testobject
rados -p testpool ls
rados -p testpool ls |more
#存储池快照
rados -p testpool mksnap testpoolsnap
# 存储池快照查看
rados -p testpool lssnap
# 删除存储池快照
rados -p testpool rmsnap testpoolsnap

rados 上传一个文件到存储池

1
2
3
4
5
6
# ls
cfg.txt
# rados -p coolpool put cfg cfg.txt
# rados -p coolpool ls
coolobject
cfg

池中对象

1
2
3
4
5
6
#将指定文件转换为对象,并放入指定池中
$ rados -p [池名] put [对象名] [文件路径]
#从池中移除对象
$ rados -p [池名] rm [对象名]
#查看池中对象
$ rados -p [池名] ls

池快照

1
2
3
4
5
6
7
8
9
10
# 创建快照
$ rados mksnap [快照名] -p [池名]

# 查看快照
$ rados lssnap-p [快照名]
# 查看指定池的快照中指定对象
$ rados -p [池名] listsnaps [对象名]

# 快照回滚
$ rados rollback -p [池名] [对象名] [快照名]

4.3.3 设备管理

设备管理允许 Ceph 解决硬件故障。

设备跟踪

查看正在使用的存储设备的列表

1
ceph device ls

Ceph 跟踪硬件存储设备(HDD、SSD)以查看哪些设备由哪些守护进程管理

1
2
ceph device ls-by-daemon <daemon>  
ceph device ls-by-host <host>

要检索设备存储的运行状况指标(可以选择特定时间戳),请运行以下形式的命令:

1
ceph device get-health-metrics <devid> [sample-timestamp]

用户认证

https://www.cnblogs.com/bandaoyu/p/16752154.html#%E7%94%A8%E6%88%B7%E5%92%8C%E8%AE%A4%E8%AF%81

ceph-deploy

https://www.cnblogs.com/bandaoyu/p/16752154.html#ceph-deploy

4.2 管理CRUSHMAP

4.2.1 CRUSHMAP的管理思路

在 ceph-deploy 部署完Ceph后,生成一个默认的 CRUSH map,生产环境中需要定制 CRUSHMAP

对CRUSHMAP的管理思路:

  1. 在任意Monitor上获取集群CRUSHMAP信息
  2. 反编译CRUSHMAP
  3. 自定义修改
  4. 编译CRUSHMAP
  5. 将编译完成的CRUSHMAP注入Ceph集群中,CRUSHMAP会实时生效
1
2
3
4
5
6
7
8
# 在任一个monitor节点上提取CRUSHMAP
$ ceph osd getcrushmap -o crushmap.txt #获取现有CRUSH map , -o 表示编译输出到指定文件
$ crushtool -d crushmap.txt -o crushmap-decompile #-d 指定需要反编译的CRUSH map

$ vim crushmap-decompile # 编辑CRUSH map

$ crushtool -c crushmap-decompile -o crushmap-compiled #重新编译新的CRUSH map
$ ceph osd setcrushmap -i crushmap-compiled #将新的CRUSH map应用到Ceph集群中

4.2.2 CRUSHMAP定义

CRUSH map:从软件角度表示集群的物理布局

包含:OSD设备定义、Bucket节点定义、bucket实例定义、root节点定义、查找规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# begin crush map
...
# devices // OSD设备
device 0 osd.0 class hdd
...

# bucket //bucket节点情况
...

# bucket instances //bucket实例
...

# rules //可定制的规则
rule replicated_rule

# end crush map

设备列表(device)

包含所有的OSD的信息,由Ceph自行管理

  • 在一个Ceph集群中,无论何时新增或移除一个新的OSD,CRUSH map设备列表都会自动更新。

若自行修改,则需要为OSD标注唯一的设备号

1
2
3
4
5
# devices
device 0 osd.0
device 1 osd.1
device 2 osd.2
......

bucket类型(Bucket types)

定义了CURSH map中会用到的bucket类型,表示OSD在CRUSH分层结构中的位置

  • 节点bucket(nodes)表示物理位置,叶子bucket(leaves)表示OSD(ceph-osd+底层物理设备)

image-20231106093326016

Bucket由物理位置(磁盘、节点、机架(rack)、行(row)、开关、电源电路、房间、数据中心)的分层聚合以及它们被分配的权重(weights)组成。

image-20231110001821973

CRUSH map包含很多默认的bucket类型,可以自行添加或删除bucket类型

  • 添加bucket:输入ID与bucket名称
1
2
3
4
5
6
7
8
9
10
11
12
# types
type 0 osd
type 1 host #主机
type 2 chassis #机箱
type 3 rack #机架
type 4 row #行
type 5 pdu
type 6 pod
type 7 room #房间
type 8 datacenter # 数据中心
type 9 region
type 10 root #Ceph集群名

bucket实例(Bucket instances)

CRUSH map文件的buckets段定义了CRUSH层次结构中的bucket实例。

1
2
3
4
5
6
7
8
9
10
[bucket-type] [bucket-name] { 
# bucket-type必须在types段定义
# bucket name为唯一的名称字符串
id [CRUSHMAP内一个唯一的负整数]
type [bucket类型]
weight [相对权重=子节点权重和/与当前bucket总设备容量相关的权重和]
alg [bucket算法类型:uniform | list | tree | straw]
hash [默认为0,表示使用CURSH默认算法rjenkins1]
item [设备名] weight [权重]
}

如:

image-20231107213320736

weight :CRUSH算法为每个OSD分配一个权重,OSD权重越大,则物理存储容量越大。权重表示物理设备间的相对差异

alg

  • uniform:所有存储设备权重相等。当权重不统一时不能使用。在这种类型的bucket中添加或删除设备时数据都会被重新平衡(reshuffling of data)

  • List:bucket将内容聚合成链表,新设备以头插法的方式插入。数据迁移最少,但移动存储设备会产生很多的数据移动。

    适合很少或从不添加设备的场景,适合小集群,不适合大集群

  • tree:bucket被组织为带权二叉树,每个根节点都知道左右子树的总权重。提供优异的性能和重组效率

    适合大项目,比链表式bucket高效

  • straw:在列表和树型bucket中选择一个设备时,需要计算一定数量的Hash和相对权重。采用分治法,给一些特定设备赋予更高优先级(列表开头的项目)。这会改善副本放置过程的性能,但在bucket被添加、删除或调整权重时产生重组

    straw允许副本公平的放置在所有设备上。

    适合:有设备删除但重组性能也很重要的场景

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 原版straw
    max_x = -1;
    max_item = -1;
    for each item:
    # x为某节点hash值的后32位,从概率上x是随机的,介于0~65535间
    x = random value from 0..65535
    # 权重因子运算中涉及的scaling factor,不但与本节点的权重因子值有关,还与同级其他节点的权重因子值有关
    x *= scaling factor
    if x > max_x:
    max_x = x
    max_item = item
    return item=
  • straw2:改进的straw算法,减少了集群发生改变后的数据移动量

    在straw2模式下,仅下属子节点的权重值参与运算,因此一个OSD的权重变化时对整体的影响有限,权重变化时不会发生大规模数据迁移

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # straw2
    max_x = -1;
    max_item = -1;
    for each item:
    # x为某节点hash值的后32位,从概率上x是随机的,介于0~65535间
    x = random value from 0..65535
    # 权重因子运算只与当前节点的权重有关,某一OSD权重值的调整仅影响该OSD节点所在的分支,不会影响其他节点
    x = (2^44*log2(x+1)-0x1000000000000)/weight
    if x > max_x:
    max_x = x
    max_item = item
    return item

规则集(rules)

定义了如何从池中选择合适的bucket用于数据存放

要为每个池创建对应的CURSH规则集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rule <rulename>{//规则名称,Pool基于规则名称与规则关联
id <ruleset id> #整数值
# 表示副本策略
type [replicated | erasure]
# 多副本策略时,限制副本数量
min_size <min-size>
max_size <max-size>
# 选择一个bucket节点作为寻址起点,从该节点向下查找,default表示root
step take <bucket-type>
# 选择故障域模式
# - firstn 0表示按照副本数选择OSD
# - type host 表示故障域为host级,同一PG的目标OSD组成员应位于不同故障域
step [choose | chooseleaf] [firstn | indep] <N> <bucket-type>
step emit
}

image-20231107214400837

step chooseleaf firstn {num} type {bucket-type}

选择 {bucket-type} 类型的一组bucket,并从各bucket的子树里选择一个叶子节点。这个数字通常是存储池的副本数

  • N为池副本数

    • num==0,选择N个bucket
    • 0<num<N,选择num个bucket
    • 若num<0,则选择 N-num个bucket

    num=1,N=3,step choose firstn 1 type row 表示选择一个row类型的bucket

    num=0,N=3,step chooseleaf firstn 0 type row 表示选择3个row类型的bucket,从各row的子树中各选一个叶子节点(osd)

4.2.3 向集群导入CRUSHMAP并与池关联

1
2
3
4
5
6
7
#重新编译新的CRUSH map
$ crushtool -c crushmap-decompile -o crushmap-compiled
#将新的CRUSH map应用到Ceph集群中
$ ceph osd setcrushmap -i crushmap-compiled

# 将新建的CRUSH rule与指定池关联
ceph osd pool set PoolName crush_rule <rulename>

其他

CRUSH定位

CRUSH定位就是确定一个OSD在CRUSH map中的位置

image-20231107174927914

Ceph中的各种map

Ceph monitor 负责监控整个集群的健康状态,以及维护集群成员关系状态 (cluster membership state)、对等节点(peer nodes)的状态,和集群的配置信息等。

Ceph monitor通过维护 cluster map 的主复制来实现这些功能。cluster map 是多个 map 的组合,包括monitor map、OSD map、PG map、CRUSH map 以及MDS map 等。这些map统称为 cluster map。

monitor map
  • 集群ID
  • monitor 节点名称(hostname)、IP地址和端口号等
  • monitor map 被创建以来的最新版本号(epoch:每种 map 都维护着其历史版本,每个版本被称为一个epoch,epoch是一个单调递增的序列),以及最后修改时间等。
1
ceph mon dump
OSD map
  • 集群ID
  • 关于OSD的信息:数目、状态、权重、最近处于clean状态的间隔(last clean interval)及OSD主机等信息
  • OSD map创建版本和最后一次修改信息
  • 与池相关的信息:池名、池ID、类型、副本级别(replication level)和PG
1
ceph osd dump
PG map
  • 最新的OSD map版本
  • PG的版本、时间戳、容量充满比例(禁止客户端读写)以及容量接近充满(集群发出告警)的比例
  • 跟踪每个PG ID(poolname.pgID)、对象数、状态时间戳、OSD的up集(所有副本所在OSD的有序列表,第一个为主OSD)、acting集(所有副本所在OSD的列表)
1
ceph pg dump
CRUSH map
  • 集群的存储设备信息、故障域层次结构
  • 在故障域中定义如何存储数据的规则
1
ceph osd crush dump
MDS map
  • 集群中MDS的数目以及MDS状态
  • 当前MDS map的版本,创建时间和修改时间
  • 数据和元数据池的ID
1
ceph mds dump

4.2 将池放置于不同OSD

实际生产中,需要在多种类型的存储设备上创建存储集群

  • 基于SSD磁盘可以提供快速存储池
  • 对于不需要更好的I/O性能的数据,可以在较慢的磁盘驱动器创建存储池

假设:

ceph-node1有三个SSD,ceph-node2和ceph-node3分别有三个SATA磁盘

现要创建一个ssd池和一个sata池,ssd池的主副本都在ceph-node1上,sata池的主副本交叉存放于ceph-node2和ceph-node3上

4.2.1 获取CURSH map

从任一个monitor节点上提取CRUSH map并反编译

1
2
$ ceph osd getcrushmap -o crushmap-extract
$ crushtool -d crushmap-extract -o crushmap-decompiled

4.2.2 编辑CRUSH map

1
$ vim crushmap-decompiled

buckets定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# buckets
host ceph-node1 {
id -2
weight 0.030
alg straw
hash 0#rienkins1
item osd.0 weight 0.010
item osd.1 weight 0.010
item osd.2 weight 0.010
}
host ceph-node2 {
id -3
weight 0.030
alg straw
hash 0#rjenkins1
item osd.3 weight 0.010
item osd.4 weight 0.010
item osd.5 weight 0.010
}
host ceph-node3 {
id -4
weight 0.030
alg straw
hash 0#rjenkins1
item osd.6 weight 0.010
item osd.7 weight 0.010
item osd.8 weight 0.010
}
root ssd{
id -1
alg straw
hash 0
item ceph-node1 weight 0.03
}
root sata{
id -5
alg straw
hash 0
item ceph-node2 weight 0.03
item ceph-node3 weight 0.03
}
# end buckets

ruleset

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
## rules
rule data {
ruleset 0
type replicated
min_size 1
maxsize 10
step take sata #修改,用sata 代替default
step chooseleaf firstn 0 type host
step emit
}
rule metadata {
ruleset 1
type replicated
min_size 1
maxsize 10
step take sata
step chooseleaf firstn 0 type host
step emit
}
rule rbd {
ruleset 2
type replicated
minsize 1
max_size 10
step take sata
step chooseleaf firstn 0 type host
step emit
}

定义规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
rule sata{
ruleset 3
type replicated
minsize 1
max_size 10
step take sata #
step chooseleaf firstn 0 type host
step emit
}
rule ssd{
ruleset 4
type replicated
minsize 1
max_size 10
step take ssd #
step chooseleaf firstn 0 type host
step emit
}

4.2.3 应用CRUSH map的修改

1
2
crushtool -c crushmap-decompiled -o crushmap-compiled
ceph osd setcrushmap -i crushmap-compiled

一旦将新的CRUSH map注入到Ceph集群,集群将会发生数据调整和数据恢复,并且很快进入 HEALTH_OK 状态

4.2.4 创建池

一旦集群处于健康状态,创建ssd池和sata池

1
2
ceph osd pool create sata 64 64
ceph osd pool create ssd 64 64

为池指定规则

1
2
3
ceph osd pool set sata crush_ruleset 3
ceph osd pool set ssd crush_ruleset 4
ceph osd dump | egrep -i "ssd|sata"

4.2.5 向指定池写入数据

1
2
3
4
5
6
7
8
9
10
11
# 创建数据文件
dd if=/dev/zero of=sata_data bs=1M count=32 conv=fsync
dd if=/dev/zero of=ssd_data bs=1M count=32 conv=fsync

#将文件放入Ceph集群上指定的池中
rados -p ssd put ssd_data_object ssd_data
rados -p ssd put sata_data_objec sata_data

# 在OSD map中检查池中对象的信息
ceph osd map ssd ssd_data_object
ceph osd map sata sata_data_object

4.3 横向扩展/缩容OSD集群

存储系统纵向扩展的设计方法:

  • 向已有设备中添加磁盘,但到达一定程度后,会成为性能、容量以及可管理性方面的瓶颈

存储系统横向扩展的设计方法:

  • 向现有的集群添加节点,包括:磁盘、CPU、内存

image-20231107162139487

Ceph是一个无缝可扩展的存储系统,允许在线添加monitor和OSD节点到现有集群中,同时不造成服务下线

4.3.1 向Ceph中添加OSD节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#查看当前集群osd的详细情况
ceph osd tree

# 在客户端client上制造ceph集群上的工作负载,模拟在线扩容
dd if=/dev/zero of=/mnt/ceph-voll/file1 bs=1M count=10240

# 支持在Ceph集群写入时,对集群osd扩展
ceph-deploy disk zap ceph-node4:sdb ceph-node4:sdc ceph-node4:sdd
ceph-deploy osd create ceph-node4:sdb ceph-node4:sdc ceph-node4:sdd

# 此时可以发现容量在扩充
watch ceph status

ceph osd tree
- osd的up/down状态
- osd的IN/OUT状态,用1,0表示

4.3.2 从Ceph集群中移除并关闭一个OSD

移除OSD

在移除OSD前,需要确保集群有足够的空余空间存放所移除节点上的数据

1
2
3
4
5
6
7
#查看当前集群osd的详细情况
ceph osd tree

# 在客户端client上制造ceph集群上的工作负载,模拟在线缩容
dd if=/dev/zero of=/mnt/ceph-voll/file1 bs=1M count=10240

ceph osd out osd.9

当把集群中的某个OSD标记为out时,属于它的所有PG中的数据都会被迁移至集群,直至集群再次平衡

在再平衡过程中,集群会有一段时间处于不健康状态(性能会下降),但对于客户端的数据访问服务都是正常的

1
2
ceph -s #可以看到集群处于恢复模式,同时开放数服务
ceph -w #可以查看集群的恢复操作

关闭OSD进程

1
2
service ceph stop osd.9
ceph osd tree

一旦osd进程关闭,则OSD的状态是down和out

从CRUSH map中移除OSD

1
ceph osd crush remove osd.9

从CRUSH map中移除OSD后,Ceph集群的状态变为健康状态

1
ceph -s

这时看到的是osd总数是不变的,但IN和UP状态的OSD是正常的,即OSD数量>IN数量,UP数量

从OSD map中移除OSD密钥

1
2
# 移除osd的验证密钥
ceph auth del osd.9

此时,OSD总数与IN,UP状态的OSD数相等

从CRUSH map移除OSD所在节点信息

为保持集群清洁,执行一些清理操作

1
ceph osd crush remove ceph-node4

4.3.3 替换出故障的磁盘设备

首先检查集群状态ceph -s ,若集群中没有出现故障磁盘,则状态是 HEALTH_OK

一旦OSD下线,则Ceph会将该OSD标记为 down,默认等待时间为300s

1
2
3
4
5
6
ceph osd out osd.0 # 手动模拟磁盘故障

磁盘出现故障后,集群状态会变为非健康状态,会执行恢复与再平衡操作
ceph osd crush rm osd.0 #将故障OSD从CRUSH map中移除
ceph osd del osd.0 # 移除OSD的验证密钥
ceph osd rm osd.0 #从集群中移除OSD

用新磁盘替换Ceph节点中出现故障的磁盘

一旦磁盘加入,标识磁盘在操作系统中的设备号

1
2
3
4
5
6
7
8
# 罗列所有磁盘
ceph-deploy disk list ceph-node1

# 一般而言,新磁盘无分区,也可以执行分区清理工作
ceph-deploy disk zap ceph-node1:sdb

# 基于磁盘创建OSD,Ceph会将其添加为osd.0
ceph-deploy --overwrite-conf osd create ceph-node1:sdb

4.6 身份验证和授权

4.6 监控集群

4.6.1 CLI

监控集群

集群健康状态
1
2
3
4
5
6
7
8
9
10
11
12
13
$ ceph -health # 检查集群健康状况
HEALTH WARN 64 pgs degraded; 1408 pgs stuck unclean; recovery 1/5744 objects degraded (0.017%)
- 集群健康状况:
HEALTH_OK 健康状态
HEALTH_WARN 告警状态
- PG数量和PG状态
clean
unclean
- 集群对象情况
表示集群处于 recovery 状态。目前正在处理5744个对象中的一个,整个集群中有0.017%的对象处于degraded状态

$ ceph health detail #可以得到健康状态的细节
返回状态不是active和clea的PG,即unclean ,unconsistent,degrated状态的PG都会输出状态细节
集群事件
1
2
3
4
5
6
7
8
9
$ ceph -w [optionss] #显示集群状态,包括Info(信息)、WRN(警告)、ERR(错误)
实时指令,CTRL+C退出

[options]
--watch-debug:只查看调试事件
--watch-info:只查看信息事件
--watch-sec:只查看安全事件
--watch-warn:只查看警告事件
--watch-error:只查看错误事件
集群利用率
1
2
$ ceph df #输出集群的空间利用率统计信息
集群总容量、可用容量、已用容量和百分比

image-20231108095303503

集群组件状态
1
2
3
4
5
6
7
8
9
10
$ ceph status
$ ceph -s

cluster:表示Ceph唯一的集群ID
health:集群的健康状态
monmap:monitor map的版本、信息、选举信息和mon法定人数
mdsmap:MDS map版本和状态
osdmap:OSD map版本和状态
pgmap:PG map版本,总的PG数,池数和总对象数
同时展示集群利用率信息(集群总容量、可用容量、已用容量和百分比)
检查集群密钥

Ceph工作在一个基于密钥的验证系统上,所有组件之间的交互都经过基于密钥的验证系统

1
$ ceph auth list# 获取所有密钥的列表

集群映射信息

Ceph 客户端和 OSD 需要确认 集群拓扑 。由5个map表示 集群拓扑 ,统称 集群映射

监控mon

Ceph 监控器(Mon)守护进程,维护集群映射的主副本。Ceph MON 集群在监控器守护进程出现故障时确保高可用性

monitor只有达到选举的法定人数才能保证集群功能正常

mon状态
1
2
$ ceph mon stat #获取mon集群的状态
$ ceph mon dump #获取mon集群的map
mon法定人数状态

Ceph集群中应该有超过 $\frac{1}{2}$ 的可用mon

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ ceph quorum_status --format json-pretty

election_epoch 选举版本号
quorum_leader_name leader主机名
monmap{ 集群的monmap
epoch #版本号
fsid #集群ID
集群创建、修改时间
mons:[
{
rank: #为集群中的mon分配的等级
name:
addr:
}
]
}

$ ceph mon dump #导出Ceph monitor信息

image-20240721155625856

集群 fsid、各个监控器的位置、名称、地址和端口,以及映射时间戳

  • epoch:监视器映射的时代编号。
  • fsid:Ceph集群的唯一标识符。
  • last_changed:修改监视器映射的时间。
  • created:创建监视器映射的时间。
  • min_mon_release:与监视器映射兼容的最小Ceph版本。
  • election_strategy:监视器用于选举领导者的策略。Ceph监视器的选举策略有两种:
    • classic:这是默认的选举策略,在此策略下,监视器具有相同的投票权,并根据周期性心跳和消息传递进行通信。如果监视器检测到其他监视器离线,则它们将在一段时间后进入新的领导者选举过程。
    • quorum:该策略要求至少三个监视器在线,并从中选择领导者,而不是所有在线监视器都拥有相同的投票权。采用此策略时,如果没有足够的监视器参与选举,则集群将无法正常工作或处于只读状态,直到更多的监视器加入并恢复其大多数选举能力。
  • 0、1、2:集群中每个监视器的排名和IP地址,以及它们的主机名。
  • dumped:表示已成功转储指定epoch的监视器映射。
监控mgr

ceph mgr dump :显示mgr集群信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
{
"epoch": 53,
"active_gid": 134101,
"active_name": "node02.owpknt",
"active_addrs": {
"addrvec": [
{
"type": "v2",
"addr": "192.168.192.157:6808",
"nonce": 3716212138
},
{
"type": "v1",
"addr": "192.168.192.157:6809",
"nonce": 3716212138
}
]
},
"active_addr": "192.168.192.157:6809/3716212138",
"active_change": "2024-07-21T06:37:22.629953+0000",
"active_mgr_features": 4540138320759226367,
"available": true,
"standbys": [/*候选模块*/
{
"gid": 134102,
"name": "node01.ohhfsw",
"mgr_features": 4540138320759226367,
"available_modules": [ /*可用模块*/
{
"name": "xxx",
"can_run": true,
"error_string": "",
"module_options": {}
},
...
{}
]
}
],
"modules": [/*已启动的模块*/
"cephadm",
"dashboard",
"iostat",
"nfs",
"prometheus",
"restful"
],
"available_modules": [/*未被禁用模块*/
{
"name": "xxx",
"can_run": true,
"error_string": "",
"module_options": {
"option_name": {
"option_info_key": option_info_value、
}
}
},
],
"services": {
"dashboard": "https://192.168.192.157:8443/",
"prometheus": "http://192.168.192.157:9283/"
},
"always_on_modules": {
"octopus": [
xxx
],
,
"pacific": [
xxx
],
"quincy": [
"balancer",
"crash",
"devicehealth",
"orchestrator",
"pg_autoscaler",
"progress",
"rbd_support",
"status",
"telemetry",
"volumes"
]
},
"last_failure_osd_epoch": 354,
"active_clients": [
{
"name": "xxx",
"addrvec": [
{
"type": "v2",
"addr": "192.168.192.157:0",
"nonce": 2310029076
}
]
},
{}
]
}
监控OSD

集群越大,OSD越多,磁盘故障可能性很高

OSD树视图

OSD的树视图用于查看OSD的in、up、out或down等状态时

OSD树视图展示了每个节点的所有OSD以及所在CRUSH map中的位置

1
$ ceph osd tree

展示了Ceph OSD的信息

  • 权重
  • up/down状态
  • in/out状态

输出格式会根据CRUSH map进行规则的格式化

OSD统计
1
$ ceph osd dump #获取Ceph集群和OSD的详细信息

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
epoch 357	# 版本号
fsid b5b8c73c-3364-11ef-9424-cb387dad71a6 #fsid
created 2024-06-26T02:35:14.490179+0000 # 创建OSD映射的时间
modified 2024-07-21T06:37:26.309666+0000 # 修改OSD映射的时间

#flags是有关 OSD映射状态的标志位,用于控制Ceph集群中OSD的行为状态、最大程度地提高性能和可靠性
## sortbitwise:开启了每个对象单独排序,这可以优化存储分配和数据分布。
## recovery_deletes:在恢复过程中删除陈旧的对象,以避免占用空间和影响性能。
## purged_snapdirs:快照目录已从PG日志中删除,以节省空间并提高性能。
## pglog_hardlimit:PG日志达到硬限制时强制转储日志,以保持一致性并避免性能问题。
flags sortbitwise,recovery_deletes,purged_snapdirs,pglog_hardlimit
crush_version 20 # crush版本

# 参数配置
full_ratio 0.95
backfillfull_ratio 0.9
nearfull_ratio 0.85
require_min_compat_client luminous
min_compat_client jewel
require_osd_release quincy
stretch_mode_enabled false

# 池信息:池ID、池名、池类型(复制、擦除)、CRUSH规则集和PG规则
pool 1 '.mgr' replicated size 2 min_size 1 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 350 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr
pool 5 'test' replicated size 2 min_size 1 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 autoscale_mode on last_change 350 lfor 0/0/279 flags hashpspool stripe_width 0
max_osd 2

# osd信息:ID、状态、权重、OSD健康状态、版本区间
osd.0 up in weight 1 up_from 356 up_thru 356 down_at 355 last_clean_interval [141,350) [v2:192.168.192.156:6800/2298987942,v1:192.168.192.156:6801/2298987942] [v2:10.168.192.156:6802/2298987942,v1:10.168.192.156:6803/2298987942] exists,up 46e1cb35-7472-4389-8d01-2d98ba4897e0
osd.1 up in weight 1 up_from 353 up_thru 356 down_at 352 last_clean_interval [143,350) [v2:192.168.192.157:6800/352260118,v1:192.168.192.157:6801/352260118] [v2:10.168.192.157:6802/352260118,v1:10.168.192.157:6803/352260118] exists,up d6d43523-a098-4cea-bb2d-42df8d102461

# 设备信息
blocklist 192.168.192.157:6809/378083828 expires 2024-07-22T06:37:22.629710+0000
blocklist 192.168.192.157:6808/378083828 expires 2024-07-22T06:37:22.629710+0000
blocklist 192.168.192.156:0/2939350335 expires 2024-07-21T12:24:54.305465+0000
blocklist 192.168.192.156:0/3581074465 expires 2024-07-21T16:49:26.573907+0000
blocklist 192.168.192.157:0/328775035 expires 2024-07-22T06:37:22.629710+0000
blocklist 192.168.192.156:6808/865415237 expires 2024-07-21T16:49:26.573907+0000
blocklist 192.168.192.157:0/1362332659 expires 2024-07-22T06:37:22.629710+0000
blocklist 192.168.192.156:0/2647831566 expires 2024-07-21T12:24:54.305465+0000
blocklist 192.168.192.156:0/1889768730 expires 2024-07-21T16:49:26.573907+0000
blocklist 192.168.192.156:6808/3436067180 expires 2024-07-21T12:24:54.305465+0000
blocklist 192.168.192.156:6809/3436067180 expires 2024-07-21T12:24:54.305465+0000
blocklist 192.168.192.156:0/3199323232 expires 2024-07-21T16:49:26.573907+0000
blocklist 192.168.192.156:0/4148433618 expires 2024-07-21T12:24:54.305465+0000
blocklist 192.168.192.156:6809/865415237 expires 2024-07-21T16:49:26.573907+0000
blocklist 192.168.192.156:0/389666931 expires 2024-07-21T12:24:54.305465+0000
blocklist 192.168.192.157:0/2326070148 expires 2024-07-22T06:37:22.629710+0000
blocklist 192.168.192.156:0/4165816795 expires 2024-07-21T16:49:26.573907+0000
blocklist 192.168.192.157:0/4198367927 expires 2024-07-22T06:37:22.629710+0000

OSD map版本

  • OSD ID
  • 状态
  • 权重
  • 每个OSD的健康状态,版本区间等信息

池的细节

  • 池ID
  • 池名
  • 池类型(复制、擦除)
  • CRUSH 规则集和PG
1
$ ceph osd blacklist ls #查看添加到黑名单的客户端
CRUSH map

使用CRUSH map命令行工具比手动查看和修改CRUSH map节省时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ ceph osd tree # 获取当前集群布局

$ ceph osd crush [操作] [被操作组件] [目标组件]

# 在集群中添加新机架
$ ceph osd crush add-bucket rack01 rack
$ ceph osd crush add-bucket rack02 rack
$ ceph osd crush add-bucket rack03 rack

# 移动主机到指定机架下
$ ceph osd crush move ceph-node1 rack=rack01
$ ceph osd crush move ceph-node1 rack=rack02
$ ceph osd crush move ceph-node1 rack=rack03

# 移动机架到默认根下
$ ceph osd crush move rack01 root=default
$ ceph osd crush move rack02 root=default
$ ceph osd crush move rack03 root=default

$ ceph osd crush rule list # 查看CRUSH map规则集

$ ceph osd crush rule dump <crush_rule_name> # 查看CRUSH map规则集的详细信息
OSD 定位指令

当OSD数量多、CRUSH map层级多时,手动的 OSD 定位会很困难,需要借助CRUSH CLI

1
ceph osd find <OSD_ID>
监控PG

OSD 存储PG,PG包含对象

集群整体的健康状态主要取决于PG。只有PG的状态是 active+clean 状态,集群才会保持为 HELATH_OK 状态

PG的状态

分布式存储Ceph之PG状态详解

无故障操作

creating :通常当存储池正在被创建或增加一个存储池的PG数量时会出现这种状态

active :处于active状态的PG,则主PG及其副本中的数据都处于可被客户端正常IO的状态

peering(对齐) :PG的OSD都处在acting集合中。peer操作:由主OSD发起的,存储PG副本的所有OSD,就PG的所有对象和元数据状态一致。完成后,存储PG的所有OSD都彼此确认当前状态,客户端可以读写

splitting(分割中) :PG正在被分割为多个PG。

在一个存储池的PG数增加后呈现

scrubbing(清理中) :PG正在做不一致性校验


PG出错

down(失效) :包含PG必需数据的一个副本失效了,因此PG失效

degraded :PG中部分对象未达到规定副本数,处于degraded状态的PG仍可被客户端IO

  • OSD处于down状态,Ceph将分配到该OSD上的所有PG状态变为degraded状态

    在OSD重新up之后,执行peer操作,使得所有处于degraded状态的PG变为clean

  • 如果OSD持续处于down状态超过300s后,OSD状态变为out

    Ceph将会从副本中恢复所有处于degraded状态的PG保持复制级

  • Ceph认为对象应该存在于某个PG中,但该对象并不可用,此时将该PG状态置为degraded并从其副本中恢复PG

remapped :当PG的acting集合变化时,会触发数据迁移。数据从老的acting集合OSD向新的acting集合OSD转移

  • 在迁移过程中,仍然使用老acting集合中的OSD为客户端提供读写请求
  • 迁移完成,才会启用新acting 集合中的OSD为客户端提供读写请求

inconsistent(不一致) :PG的副本出现了不一致。如:对象大小不正确,recovery后某副本出现了对象丢失

incomplete(不完整) :PG日志缺失一个时间段的数据。当包含PG所需信息的某OSD失效或不可用,会出现这种情况

stable :如果PG acting集合中的主副本OSD未向monitor报告统计结果 或 其他OSD报告主副本OSD状态变为down,则monitor将这些PG处于stable状态。

通常Peering结束前PG处于该状态

repair(修复中) :PG正在被检查,被发现的任何不一致都被尽可能地修复


OSD异常处理

backfilling :新的OSD加入集群时,Ceph通过移动其他OSD上的一些PG到新OSD上保持负载均衡。

  • 在后台平滑地执行backfill,确保集群不会超载
  • backfill完成,OSD可以参与到客户端的IO操作

backfill-wait :PG正在等待回填操作

recovering :当一个OSD处于 down 状态,其PG中的内容会落后与放置在其他OSD上的PG副本。一旦该OSD处于up状态,Ceph会针对这些PG启动恢复操作,使得该PG中的数据与其他PG副本保持一致

relay(重做) :OSD崩后PG正在等待客户端重新发起请求

clean :主OSD和顺位OSD已经彼此确认;所有PG都在正确位置上,未发生偏移;所有都按副本级复制完成

img

监控PG
1
2
3
$ ceph pg stat #获取PG状态

vNNNN: X pgs: Y active+clean; R bytes data, u MB used , F GB/T GB aval
  • vNNNN:PG map版本号
  • X:总PG数
  • Y:当前状态度的PG树
  • R:当前集群处处的裸数据容量
  • U:当前集群已经存储的包含副本的真是数据容量
  • F:剩余容量
  • T:总容量
1
2
3
4
5
6
$ ceph pg dump # 获取PG列表
PG_STAT OBJECTS MISSING_ON_PRIMARY DEGRADED MISPLACED UNFOUND BYTES OMAP_BYTES* OMAP_KEYS* LOG DISK_LOG STATE STATE_STAMP VERSION REPORTED UP UP_PRIMARY ACTING ACTING_PRIMARY LAST_SCRUB SCRUB_STAMP LAST_DEEP_SCRUB DEEP_SCRUB_STAMP SNAPTRIMQ_LEN
4.19 0 0 0 0 0 0 0 0 0 0 active+clean 2023-04-30T05:50:02.431578+0000 0'0 108:12 [7,2,5] 7 [7,2,5] 7 0'0 2023-04-30T05:50:01.330091+0000 0'0 2023-04-30T05:50:01.330091+0000 0
2.1f 0 0 0 0 0 0 0 0 0 0 active+clean 2023-04-30T05:49:47.320452+0000 0'0 108:17 [0,3,8] 0 [0,3,8] 0 0'0 2023-04-30T05:49:46.202749+0000 0'0 2023-04-30T05:49:46.202749+0000 0
3.1e 0 0 0 0 0 0 0 0 0 0 active+clean 2023-04-30T05:49:49.349973+0000 0'0 108:15 [2,6,3] 2 [2,6,3] 2 0'0 2023-04-30T05:49:48.270032+0000 0'0 2023-04-30T05:49:48.270032+0000 0
4.18 0 0 0 0 0 0 0 0 0 0 active+clean 2023-04-30T05:50:02.449439+0000 0'0 108:12 [3,1,6] 3 [3,1,6] 3 0'0 2023-04-30T05:50:01.330091+0000 0'0 2023-04-30T05:50:01.330091+0000 0
  • PG_STAT: PG 的状态,表示 PG 在当前时间点内的活动情况和健康状况。

    第一部分是十六进制的 OSD 编号,第二部分是十六进制的 epoch 号

  • OBJECTS: PG 中对象数量。

  • MISSING_ON_PRIMARY: 在 primary OSD 上缺少的对象数量。

  • DEGRADED: 在副本 OSD 上损坏或不可用的对象数量。

  • MISPLACED: 在非预期 OSD 上的对象数量。

  • UNFOUND: 未找到的对象数量。

  • BYTES: PG 中对象的总字节数。

  • OMAP_BYTES: PG 中对象元数据的总字节数。

  • OMAP_KEYS: PG 中对象元数据键值对的总数。

  • LOG: 最近操作日志的序列号范围。

  • DISK_LOG: 存储在磁盘上的日志序列号范围。

  • STATE: PG 的状态,例如“active+clean”。

  • STATE_STAMP: PG 最后转换到当前状态的时间戳。

  • VERSION: PG 的版本。

  • REPORTED: 汇报 PG 状态的 OSD 的编号。

  • UP: 处于活动状态的 OSD 编号列表。

  • UP_PRIMARY: 作为主 OSD 进行同步的 OSD 编号。

  • ACTING: 负责读写请求的 OSD 编号列表。

  • ACTING_PRIMARY: 正在执行同步操作的 OSD 编号。

  • LAST_SCRUB: 上次 scrub 的时间戳和结果。

  • SCRUB_STAMP: 上次 scrub 的结束时间戳。

  • LAST_DEEP_SCRUB: 上次 deep scrub 的时间戳和结果。

  • SNAPTRIMQ_LEN: PgSnapTrimq 中等待处理的数量。

  • DEEP_SCRUB_STAMP: 上次 deep scrub 的结束时间戳。

1
2
3
$ ceph pg <PG_ID> query #查询一个PG的详细信息

$ ceph pg 2.7d query
1
$ ceph pg dump_stuck <PG状态> # 获取处于stuck 状态的PG列表
监控MDS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ceph mds stat
ACTIVE、INACTIVE、UP、DOWN

$ ceph msd dump
e1 # 当前文件系统的 epoch 号
# 文件系统是否启用了多 MDS 支持并且曾经启用过
enable_multiple, ever_enabled_multiple: 1,1
# 文件系统支持的兼容性特性:compat 表示 CephFS 要求支持的最低版本,而 rocompat 和 incompat 分别表示与只读客户端和不兼容客户端相关的特性。
compat: compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=no anchor table,9=file layout v2,10=snaprealm v2}
# 指定将 legacy 客户端分配给文件系统的 ID,但当前没有 legacy 客户端连接到该文件系统。
legacy client fscid: -1

No filesystems configured
dumped fsmap epoch 1

4.6.2 REST API

Ceph自带REST API,允许用户通过编程的方式对集群进行管理,使其可以运行为一个WSGI应用或独立的服务器,默认监听5000端口

提供了一个类似Ceph命令的通过HTTP访问的接口,以HTTP GET和PUT请求的方式提交,结果以 json、XML、txt的格式返回

1
2
3
4
5
6
7
8
9
10
#1.在Ceph集群中,创建一个用户client.restapi,授予它适当的 mon、osd 和mds权限:
ceph auth get-or-create client.restapi mds 'allow' osd 'allow *' mon'allow*' > /etc/ceph/ceph.client.restapi.keyring

#2. 修改ceph.conf文件
[client.restapi]
log file=/var/log/ceph/ceph.restapi.log
keyring=/etc/ceph/ceph.client.restapi.keyring

#3. 执行以下命令来启动ceph-rest-api,并将它作为一个在后台独立的 Web 服务器来运行
nohup ceph-rest-api > /var/log/ceph-rest-api &> /var/log/cephrest-api-error.log&
  • 也可以不用 nohup来运行 ceph-rest-api,但会抑制后台运行
1
2
3
4
5
#4. ceph-rest-api将会在 0.0.0.0:5000上监听,也可以用curl访问ceph-rest-api来查询集群的健康状态:
curl localhost:5000/api/v0.1/health
#5. 类似地,通过rest-api检查osd和mon的状态
curl localhost:5000/api/v0.1/osd/stat
curl localhost:5000/api/v0.1/mon/stat

image-20231111005247522

ceph-rest-api 支持大多数 Ceph CLI。

1
2
# 查看ceph-rest-api的可用命令
curl localhost:5000/api/v0.1

以HTML形式返回,用Web浏览器访问访问更易读

要将它运行在生产环境中,最好部署多个它的实例,每个实例都是一个封装在 Web 服务器中的 WSGI应用,前端再使用一个负载均衡器。

4.6.3 开源管理控制平台

Kraken

Python,用来统计信息和监控Cepgh集群

  • 集群数据量
  • mon状态
  • OSD状态
  • PG状态
  • 支持多个mon
  • 变更OSD操作
  • 动态CRUSH map配置
  • Ceph身份验证
  • 池操作
  • 块设备管理
  • CPU、内存等系统指标
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#1. 安装karen依赖,如python-pip、screen和Firefox
yum install python-pip screen firefox

#2. 安装开发库
yum install gcc python-deve1 libxm12-devel.x86_64 libxslt-devel.x86_64

#3. 为karen新建目录
mkdir /karen

#4. 从github复制karen存储不哭
git clone /karendash/karendash

#5. 使用Python包管理器安装karen所需的包,如Django、python-cephclient、djangorestframework、markdown、humanize
cd /karendash
pip install -r requirements.txt

#6. 执行api.sh和djanfo.sh,分别调用ceph-rest-api和django python仪表盘
#这些脚本会在独立的screen环境中执行
#CTRL+D分离当前screen会话并将其转移到后台
cp ../krakendash/contrib/*.sh
./api.sh
./django.sh

#7. 检查screen会话
ps -ef | grep -i screen

#8. 浏览器打开 localhost:8000

Ceph-dash工具

用尽可能简单的方法通过RESTful JSON API及Web GUI来提供监控Ceph集群

python wsgi的应用程序,通过librados直接与集群通信

  • 整体集群状态及详细的问题描述
  • 支持多个mon、支持每个mon的状态
  • OSD状态包含处于in、out和不健康的OSD数
  • 可视化存储容量图
  • 实时吞吐量,包括读写速度和每秒操作数
  • 可视化PG状态图
  • 集群恢复状态

在拥有wsgi的Web服务器(Apache、nginx)上部署这个应用程序

Ceph-dash访问Ceph集群是只读的,不需要任何写权限,通过Python的RADOS类来使用cepgh status命令,通过REST API或WebGUI导出输出结果

部署
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Ceph必须安装在有Ceph访问权限的节点上
# 1. 新建目录,从github上复制存储库
mkdir /ceph-dash
git clone /Crapworks/ceph-dash.git

#2. 安装python-pip
yum install python-pip

#3. 安装jinja2
easy_install Jinja2

#4. 启动Ceph-dash GUI
./ceph-dash.py

#5. 访问/localhost:5000

Calamari

4.6.4 日志

默认情况下降日志存储在 /var/log/ceph目录下

[企业级]#13故障定位方法$13.1获取集群状态

-------------本文结束-------------