环境:Ceph版本J版,操作系统CentOS7.4
查看集群健康状况
[root@ceph-client ~]# ceph health
HEALTH_OK
查看集群状态
[root@ceph-client ~]# ceph -s
cluster 9c424511-ade9-45e3-be88-24d72232dd7a
health HEALTH_OK
monmap e1: 3 mons at {ceph-node01=11.10.37.85:6789/0,ceph-node02=11.10.37.86:6789/0,ceph-node03=11.10.37.87:6789/0}
election epoch 6, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03
osdmap e53: 6 osds: 6 up, 6 in
flags sortbitwise,require_jewel_osds
pgmap v287192: 576 pgs, 5 pools, 104 MB data, 46 objects
482 MB used, 599 GB / 599 GB avail
576 active+clean
查看存储空间使用情况
[root@ceph-client ~]# ceph df
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
599G 599G 482M 0.08
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
rbd 0 0 0 284G 0
cinder-volumes 1 61534k 0.02 284G 28
nova-vms 2 32768k 0.01 284G 11
glance-images 3 12976k 0 284G 7
cinder-backups 4 0 0 284G 0
查看 mon map
[root@ceph-client ~]# ceph mon stat
e1: 3 mons at {ceph-node01=11.10.37.85:6789/0,ceph-node02=11.10.37.86:6789/0,ceph-node03=11.10.37.87:6789/0}, election epoch 6, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03
或者:
[root@ceph-client ~]# ceph mon dump
dumped monmap epoch 1
epoch 1
fsid 9c424511-ade9-45e3-be88-24d72232dd7a
last_changed 2017-12-27 22:14:53.298144
created 2017-12-27 22:14:53.298144
0: 11.10.37.85:6789/0 mon.ceph-node01
1: 11.10.37.86:6789/0 mon.ceph-node02
2: 11.10.37.87:6789/0 mon.ceph-node03
查看 mon 的法定人数状态
ceph quorum_status -f json-pretty
Ceph 会返回法定人数状态,例如,包含 3 个监视器的 Ceph 集群可能返回下面
的内容:
[root@ceph-client ~]# ceph quorum_status -f json-pretty
{
"election_epoch": 6,
"quorum": [
0,
1,
2
],
"quorum_names": [
"ceph-node01",
"ceph-node02",
"ceph-node03"
],
"quorum_leader_name": "ceph-node01",
"monmap": {
"epoch": 1,
"fsid": "9c424511-ade9-45e3-be88-24d72232dd7a",
"modified": "2017-12-27 22:14:53.298144",
"created": "2017-12-27 22:14:53.298144",
"mons": [
{
"rank": 0,
"name": "ceph-node01",
"addr": "11.10.37.85:6789\/0"
},
{
"rank": 1,
"name": "ceph-node02",
"addr": "11.10.37.86:6789\/0"
},
{
"rank": 2,
"name": "ceph-node03",
"addr": "11.10.37.87:6789\/0"
}
]
}
}
列出存储池
[root@ceph-client ~]# ceph osd lspools
0 rbd,1 cinder-volumes,2 nova-vms,3 glance-images,4 cinder-backups,
创建存储池
ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated] [crush-ruleset-name] [expected-num-objects]
ceph osd pool create {pool-name} {pg-num} {pgp-num} erasure [erasure-code-profile] [crush-ruleset-name] [expected_num_objects]
各参数含义如下:
● {pool-name}
:存储池名称,必须唯一。
● {pg_num}
: 存储池的 PG 数目。
● {pgp_num}
: 存储池的 PGP 数目,此值应该和 PG 数目相等。
● {replicated|erasure}
:存储池类型,可以是副本池(保存多份对象副本,以便从丢失的 OSD 恢复)或纠删池(获得类似 RAID5 的功能)。多副本存储池需更多原始存储空间,但已实现所有 Ceph 操作;纠删存储池所需原始存储空间较少,但目前仅实现了部分 Ceph 操作。
● [crush-ruleset-name]
:此存储池所用的 CRUSH 规则集名字。指定的规则集必须存在。对于多副本( replicated )存储池来说,其默认规则集由 osd pool default crush replicated ruleset 配置决定,此规则集必须存在。 对于用 erasure-code 编码的纠删码( erasure )存储池来说,不同的 {pool-name}
所使用的默认( default )纠删码配置是不同的,如果它不存在的话,会显式地创建它。
● [erasure-code-profile=profile]
:仅用于纠删存储池。指定纠删码配置文件,此配置必须已由 osd erasure-code-profile set 定义。
● [expected-num-objects]
:为这个存储池预估的对象数。设置此值(要同时把 filestore merge threshold 设置为负数)后,在创建存储池时就会拆分PG 文件夹,以免运行时拆分文件夹导致延时增大。
设置存储池配额
存储池配额可设置最大字节数、和/或每个存储池最大对象数。
ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]
例如:
ceph osd pool set-quota data max_objects 10000
要取消配额,设置为 0 即可。
查看存储池统计信息
rados df
给存储池做快照
ceph osd pool mksnap {pool-name} {snap-name}
删除存储池的快照
ceph osd pool rmsnap {pool-name} {snap-name}
获取存储池选项值
ceph osd pool get {pool-name} {key}
调整存储池选项值
ceph osd pool set {pool-name} {key} {value}
常用选项介绍:
size
:设置存储池中的对象副本数,详情参见设置对象副本数。仅适用于副本存储池。
min_size
:设置 I/O 需要的最小副本数,详情参见设置对象副本数。仅适用于副本存储池。
pg_num
:计算数据分布时的有效 PG 数。只能大于当前 PG 数。
pgp_num
:计算数据分布时使用的有效 PGP 数量。小于等于存储池的 PG数。
设置对象副本数
ceph osd pool set {poolname} size {num-replicas}
例如:
ceph osd pool set cinder-volumes size 3
你可以在每个存储池上执行这个命令。注意,一个处于降级模式的对象,其副本数小于 pool size ,但仍可接受 I/O 请求。为保证 I/O 正常,可用 min_size 选项为其设置个最低副本数。例如:
ceph osd pool set cinder-volumes size min_size 2
这确保 cinder-volumes 存储池里任何副本数小于 min_size 的对象都不会收到 I/O 了。
获取对象副本数
ceph osd dump | grep 'replicated size'
Ceph 会列出存储池,且高亮 replicated size 属性。
检查 OSD 状态
[root@ceph-client ~]# ceph osd stat
osdmap e53: 6 osds: 6 up, 6 in
flags sortbitwise,require_jewel_osds
或者
ceph osd dump
也可以根据 OSD 在 CRUSH MAP 里的位置来查看
ceph osd tree
Ceph 会打印 CRUSH 树,包括 host 的名称、它上面的 OSD 例程、状态及权重:
[root@ceph-client ~]# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.58557 root default
-2 0.19519 host ceph-node01
0 0.09760 osd.0 up 1.00000 1.00000
1 0.09760 osd.1 up 1.00000 1.00000
-3 0.19519 host ceph-node02
2 0.09760 osd.2 up 1.00000 1.00000
3 0.09760 osd.3 up 1.00000 1.00000
-4 0.19519 host ceph-node03
4 0.09760 osd.4 up 1.00000 1.00000
5 0.09760 osd.5 up 1.00000 1.00000
查看所有 PG 状态
[root@ceph-client ~]# ceph pg stat
v470724: 576 pgs: 576 active+clean; 104 MB data, 485 MB used, 599 GB / 599 GB avail
PG ID 由存储池号(不是存储池名字)后面跟一个点( . )再加一个 16 进制数字的num 。
完整的 PG ID 格式如下:
{pool-num}.{pg-num}
典型例子:
1.d8
获取 PG 列表
ceph pg dump
你也可以让它输出到 JSON 格式,并保存到文件
ceph pg dump -o {filename} --format=json
查看指定 PG 的 Acting Set 或 Up Set 中包含的 OSD
ceph pg map {pg-id}
命令的输出会告诉你 osdmap 版本( eNNN )、PG ID( {pg-id}
)、Up Set 内
的 OSD ( up[]
)、和 Acting Set 内的 OSD ( acting[]
)
[root@ceph-client ~]# ceph pg map 1.d8
osdmap e58 pg 1.d8 (1.d8) -> up [2,4] acting [2,4]
要查询某个 PG,用下列命令:
ceph pg {pg-id} query
[root@ceph-client ~]# ceph pg 1.d8 query
{
"state": "active+clean",
"snap_trimq": "[]",
"epoch": 58,
"up": [
2,
4
],
"acting": [
2,
4
],
"actingbackfill": [
"2",
"4"
],
"info": {
"pgid": "1.d8",
"last_update": "0'0",
"last_complete": "0'0",
"log_tail": "0'0",
......
在存储池 rbd 中创建一个image
[root@ceph-client ~]# rbd create rbd/test_image --size 512 --image-format 2
查看创建出的image
[root@ceph-client ~]# rbd ls rbd
test_image
查看image详细信息
[root@ceph-client ~]# rbd info rbd/test_image
rbd image 'test_image':
size 512 MB in 128 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.1ab382ae8944a
format: 2
features: layering
flags:
为image创建快照
[root@ceph-client ~]# rbd snap create rbd/test_image@test_image_snap
查看快照
[root@ceph-client ~]# rbd snap list rbd/test_image
SNAPID NAME SIZE
4 test_image_snap 512 MB
或者
[root@ceph-client ~]# rbd ls rbd -l
NAME SIZE PARENT FMT PROT LOCK
test_image 512M 2
test_image@test_image_snap 512M 2
查看快照详细信息
[root@ceph-client ~]# rbd info rbd/test_image@test_image_snap
rbd image 'test_image':
size 512 MB in 128 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.1ab382ae8944a
format: 2
features: layering
flags:
protected: False
克隆
在克隆前,快照必须处于被保护的状态
[root@ceph-client ~]# rbd snap protect rbd/test_image@test_image_snap
[root@ceph-client ~]# rbd info rbd/test_image@test_image_snap
rbd image 'test_image':
size 512 MB in 128 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.1ab382ae8944a
format: 2
features: layering
flags:
protected: True
克隆快照成一个新的image
[root@ceph-client ~]# rbd clone rbd/test_image@test_image_snap rbd/test_image2
新的image依赖父image
[root@ceph-client ~]# rbd ls rbd -l
NAME SIZE PARENT FMT PROT LOCK
test_image 512M 2
test_image@test_image_snap 512M 2 yes
test_image2 512M rbd/test_image@test_image_snap 2
查看快照的孩子
[root@ceph-client ~]# rbd children rbd/test_image@test_image_snap
rbd/test_image2
把分层的image变成扁平的没有层级的image
[root@ceph-client ~]# rbd flatten rbd/test_image2
Image flatten: 100% complete...done.
再次查看rbd/test_image2已经没有父了,即断开了依赖关系
[root@ceph-client ~]# rbd ls rbd -l
NAME SIZE PARENT FMT PROT LOCK
test_image 512M 2
test_image@test_image_snap 512M 2 yes
test_image2 512M 2
导出
[root@ceph-client ~]# rbd export rbd/test_image /tmp/test_image_export
Exporting image: 100% complete...done.
[root@ceph-client ~]# ls /tmp/test_image_export
/tmp/test_image_export
导入
[root@ceph-client ~]# rbd import /tmp/test_image_export rbd/test_image3 --image-format 2
Importing image: 100% complete...done.
[root@ceph-client ~]# rbd ls rbd -l
NAME SIZE PARENT FMT PROT LOCK
test_image 512M 2
test_image@test_image_snap 512M 2 yes
test_image2 512M 2
test_image3 512M 2
删除image
[root@ceph-client ~]# rbd rm rbd/test_image3
Removing image: 100% complete...done.
查看ceph集群中的pool
[root@ceph-client ~]# rados lspools
rbd
cinder-volumes
nova-vms
glance-images
cinder-backups
查看ceph集群中的pool和每个pool容量及利用情况
[root@ceph-client ~]# rados df
pool name KB objects clones degraded unfound rd rd KB wr wr KB
cinder-backups 0 0 0 0 0 0 0 0 0
cinder-volumes 61535 28 5 0 0 884751 624915 678 62335
glance-images 12977 7 0 0 0 485 39303 48 25957
nova-vms 32769 11 0 0 0 2041 39871 702 66486
rbd 0 0 0 0 0 0 0 0 0
total used 494332 46
total avail 628337828
total space 628832160
列出所有用户
ceph auth list
[root@ceph-client ~]# ceph auth list
installed auth entries:
osd.0
key: AQDarENapJjVLxAAAla0ZqKL5tqevhVXJTEv5g==
caps: [mon] allow profile osd
caps: [osd] allow *
......
client.admin
key: AQDqqkNaJu2sHxAA42E4ITCyZys9P7Fq4amruQ==
caps: [mds] allow *
caps: [mon] allow *
caps: [osd] allow *
......
client.cinder
key: AQCjhFRaOSXzIRAAhV1SV8FoWjDPgTj5l6HO6Q==
caps: [mon] allow r
caps: [osd] allow class-read object_prefix rbd_children, allow rwx pool=cinder-volumes, allow rwx pool=nova-vms ,allow rx pool=glance-images
......
注意 TYPE.ID 这种用户表示方法,比如 osd.0 表示用户类型是 osd 且其 ID是 0 , client.admin表示用户类型是 client 且其 ID 是 admin (即默认的 client.admin 用户)。另外,每个用户条目都有一个 key:
对,一个或多个 caps: 条目。
获取某个用户信息
ceph auth get {TYPE.ID}
ceph auth get client.admin
[root@ceph-client ~]# ceph auth get client.cinder
exported keyring for client.cinder
[client.cinder]
key = AQCjhFRaOSXzIRAAhV1SV8FoWjDPgTj5l6HO6Q==
caps mon = "allow r"
caps osd = "allow class-read object_prefix rbd_children, allow rwx pool=cinder-volumes, allow rwx pool=nova-vms ,allow rx pool=glance-images"
增加用户
增加一个用户就是创建一个用户名(即 TYPE.ID )、一个密钥和任何包含在创建命令中的能力。有以下几种方式可以新增一个用户:
● ceph auth add
:此命令是最权威的新增用户方式。它回新建一个用户,产生一个 key ,并赋予用户任何给定的能力。
● ceph auth get-or-create
:这种方式通常是最便捷的一种,因为它的返回值是包含用户名(在方括号内)和密钥的格式。如果用户已经存在,该命令会返回密钥文件格式的用户名和密钥信息。可以使用 -o {filename} 选项把输入保存到一个文件中。
● ceph auth get-or-create-key
:该命令可以很方便地创建用户,但是只会返回用户的密钥。对于某些只需要密钥的用户(如 libvirt )来说是很有用的。如果用户已经存在,该命令仅仅返回用户的密钥。可以使用 -o {filename}
选项把输入保存到一个文件中。
比如下面命令:
ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=cinder-volumes, allow rwx pool=nova-vms ,allow rx pool=glance-images'
删除用户
ceph auth del {TYPE}.{ID}
其中, {TYPE}
是 client , osd , mon 或 mds 的其中一种。 {ID}
是用户的名字或守护进程的 ID 。
参考文档:
Ceph运维手册 https://github.com/lihaijing/ceph-handbook
Ceph分布式存储实战