一 统一节点上ceph.conf文件

如果是在admin节点修改的ceph.conf,想推送到所有其他节点,则需要执行下述命令

1
ceph-deploy --overwrite-conf config push mon01 mon02 mon03 osd01 osd02 osd03

修改完毕配置文件后需要重启服务生效,请看下一小节

二 ceph集群服务管理

!!!下述操作均需要在具体运行服务的那个节点上运行,而不是admin节点!!!

2.1 方式一

在各具体节点执行下行命令,重启节点上的所有ceph守护进程

1
systemctl restart ceph.target

2.2 方式二

在各具体节点执行下行命令,按类型重启相应的守护进程

1、重启 mgr 守护进程
1
2
systemctl restart ceph-mgr.target

2、重启 mds 守护进程
1
systemctl restart ceph-mds.target
3、重启 rgw 守护进程
1
systemctl restart ceph-radosgw.target
4、重启 mon 守护进程
1
systemctl restart ceph-mon.target
5、重启 osd 守护进程

登录到osd01节点上,该节点上运行有三个osd daemon进程osd.0、osd.l、osd.2

5.1 重启所有的osd daemoon
1
systemctl restart ceph-osd.target 
5.2 挨个重启
1
2
3
systemctl restart ceph-osd@0
systemctl restart ceph-osd@1
systemctl restart ceph-osd@2

了解:也可以根据进程类型+主机名.service

1 mon 守护进程
1
2
3
systemctl { start | stop | restart} ceph-mon@{mon_instance}.service

systemctl restart ceph-mon@mon01.service
2 mgr 守护进程
1
systemctl { start | stop | restart} ceph-mgr@{mgr_instance}.service
3 osd 守护进程
1
systemctl { start | stop | restart} ceph-osd@{osd_instance}.service
4 rgw 守护进程
1
systemctl { start | stop | restart} ceph-radosgw@{rgw_instance}.service
5 mds 守护进程
1
systemctl { start | stop | restart} ceph-mds@{mds_instance}.service

三 服务平滑重启

有时候需要更改服务的配置,但不想重启服务,或者是临时修改,此时我们就可以通过admin sockets直接与守护进程交互。如查看和修改守护进程的配置参数。
守护进程的socket文件一般是/var/run/ceph/$cluster-$type.$id.asok
基于admin sockets的操作:

  • 方式一:tell子命令
  • 方式二:daemon子命令
    ceph daemon $type.$id command
  • 方式三:通过socket文件
1
ceph --admin-daemon /var/run/ceph/$cluster-$type.$id.asok command

常用command如下

1
2
3
4
5
6
7
8
9
help

config get parameter

config set parameter

config show

perf dump

3.1 tell子命令

命令使用格式如下,在管理节点执行即可

1
ceph tell {daemon-type}.{daemon id or *} injectargs --{name}={value} [--{name}={value}]
  • daemon-type:为要操作的对象类型如osd、mon等。
  • daemon id:该对象的名称,osd通常为0、1等,mon为ceph -s显示的名称,这里可以输入*表示全部。
  • injectargs:表示参数注入,后面必须跟一个参数,也可以跟多个。

例如

1
2
3
# 在管理节点运行
ceph tell mon.mon01 injectargs --mon_allow_pool_delete=true
ceph tell mon.* injectargs --mon_allow_pool_delete=true

mon_allow_pool_delete此选项的值默认为false,表示不允许删除pool,只有此选项打开后方可删除,记得改回去!!! 这里使用mon.ceph-monitor-1表示只对ceph-monitor-1设置,可以使用*

3.2 daemon子命令

命令格式如下,需要登录到守护进程所在的那台主机上执行

1
ceph daemon {daemon-type}.{id} config set {name}={value} 

例。

1
2
ssh root@mon01
ceph daemon mon.mon01 config set mon_allow_pool_delete false

3.3 socket文件

1
2
3
4
5
6
7
8
9
# 1、查看帮助

ceph --admin-daemon /var/run/ceph/ceph-mds.mon01.asok help

# 2、查看配置项
ceph --admin-daemon /var/run/ceph/ceph-mds.mon01.asok config get mon_allow_pool_delete

# 3、设置
ceph --admin-daemon /var/run/ceph/ceph-mds.mon01.asok config set mon_allow_pool_delete true

如果超过半数的monitor节点挂掉,此时通过网络访问ceph的所有操作都会被阻塞,但monitor的本地socket还是可以通信的。

1
ceph --admin-daemon /var/run/ceph/ceph-mon.mon03.asok quorum_status

四 维护集群常用命令

4.1 查看集群健康状况

1
2
3
4
5
6
7
8
9
# 检查ceph的状态
ceph -s
ceph status
ceph health
ceph health detail


# 实时观察集群健康状态
ceph -w

4.2 检查集群的使用情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
=======================命令1=======================
ceph df # 它和 Linux 上的 df 相似

# GLOBAL段
展示了数据所占用集群存储空间的概要,详解如下
SIZE: 集群的总容量;
AVAIL: 集群的空闲空间总量;
RAW USED: 已用存储空间总量;
% RAW USED: 已用存储空间比率。用此值参照 full ratio 和 near full \ ratio 来确保不会用尽集群空间。 详情见存储容量。

# POOLS 段:
展示了存储池列表及各存储池的大致使用率。没有副本、克隆品和快照占用情况。例如,如果你 把 1MB 的数据存储为对象,理论使用率将是 1MB ,但考虑到副本数、克隆数、和快照数,实际使用率可能是 2MB 或更多。
NAME: 存储池名字;
ID: 存储池唯一标识符;
USED: 大概数据量,单位为 B、KB、MB 或 GB ;
%USED: 各存储池的大概使用率;
Objects: 各存储池内的大概对象数。

=======================命令2=======================
ceph osd df # 可以详细列出集群每块磁盘的使用情况,包括大小、权重、使用多少空间、使用率等等

4.3 mds相关

1、查看mds状态

1
2
ceph mds stat
ceph mds dump

2、删除mds节点

1
2
3
4
ssh root@mon01 systemctl stop ceph-mds.target
ceph mds rm 0 # 删除一个不活跃的mds

# 启动mds后,则恢复正常

3、关闭mds集群

1
ceph mds cluster_down

4、开启mds集群

1
2
ceph mds cluster_up

5、设置cephfs 文件系统存储方式最大单个文件尺寸

1
2
ceph mds set max_file_size 1024000000000

6、了解:清除mds文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1、强制 mds 状态为 featrue
ceph mds fail 0

# 2、删除 mds 文件系统
ceph fs rm cephfs --yes-i-really-mean-it

# 3、删除数据池
ceph osd pool delete cephfs_data cephfs_data --yes-i-really-really-mean-it

# 4、删除元数据池
ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it

# 5、然后再删除 mds key,残留文件等

# 6、最后删除不活跃的mds
ceph mds rm 0

4.4 mon相关

1、查看mon状态

1
2
ceph mon stat

2、查看mon映射信息

1
ceph mon dump

3、检查Ceph monitor仲裁/选举状态

1
ceph quorum_status --format json-pretty

4、查看mon信息包括ip地址

1
2
3
获得一个正在运行的 mon map,并保存在 1.txt 文件中 
ceph mon getmap -o 1.txt
monmaptool --print 1.txt

4.5 auth相关

一:认证与授权

Ceph使用cephx协议对客户端进行身份验证,集群中每一个Monitor节点都可以对客户端进行身份验证,所以不存在单点故障。cephx仅用于Ceph集群中的各组件,而不能用于非Ceph组件。它并不解决数据传输加密问题,但也可以提高访问控制安全性问题。

二:认证授权流程如下
  • 1、客户端向Monitor请求创建用户。

  • 2、Monitor返回用户共享密钥给客户端,并将此用户信息共享给MDS和OSD。

  • 3、客户端使用此共享密钥向Monitor进行认证。

  • 4、Monitor返回一个session key给客户端,并且此session key与对应客户端密钥进行加密。此session key过一段时间后就会失效,需要重新请求。

  • 5、客户端对此session key进行解密,如果密钥不匹配无法解密,这时候认证失败。

  • 6、如果认证成功,客户端向服务器申请访问的令牌。

  • 7、服务端返回令牌给客户端。

  • 8、这时候客户端就可以拿着令牌访问到MDS和OSD,并进行数据的交互。因为MDS和Monitor之间有共享此用户的信息,所以当客户端拿到令牌后就可以直接访问。

    三:相关概念
    1、用户
  • 用户通常指定个人或某个应用

  • 个人就是指定实际的人,比如管理员

  • 而应用就是指客户端或Ceph集群中的某个组件,通过用户可以控制谁可以如何访问Ceph集群中的哪块数据。

  • Ceph支持多种类型的用户,个人与某应用都属于client类型。还有mds、osd、mgr一些专用类型。

    2、用户标识
  • 用户标识由“TYPE.ID”组成,通常ID也代表用户名,如client.admin、osd.1等。

3、使能caps
  • 使能表示用户可以行使的能力,通俗点也可以理解为用户所拥有的权限。 对于不同的对象所能使用的权限也不一样,大致如下所示。
  • Monitor权限有:r、w、x和allow、profile、cap。
  • OSD权限有:r、w、x、class-read、class-wirte和profile osd。
  • 另外OSD还可以指定单个存储池或者名称空间,如果不指定存储池,默认为整个存储池。
  • MDS权限有:allow或者留空。

关于各权限的意义:

  • allow:对mds表示rw的意思,其它的表示“允许”。
  • r:读取。
  • w:写入。
  • x:同时拥有读取和写入,相当于可以调用类方法,并且可以在monitor上面执行auth操作。
  • class-read:可以读取类方法,x的子集。
  • class-wirte:可以调用类方法,x的子集。
  • *:这个比较特殊,代表指定对象的所有权限。
  • profile:类似于Linux下sudo,比如profile osd表示授予用户以某个osd身份连接到其它OSD或者Monitor的权限。
  • profile bootstrap-osd表示授予用户引导OSD的权限,关于此处可查阅更多资料。
四 命令

1、查看 ceph 集群中的认证用户及相关的 key

1
ceph auth list  # 简写:ceph auth ls

2、查看某一用户详细信息

1
ceph auth get client.admin

3、只查看用户的key信息

1
ceph auth print-key client.admin

4、创建用户,用户标识为client.test。指定该用户对mon有r的权限,对osd有rw的权限,osd没有指定存储池,所以是对所有存储池都有rw的权限。在创建用户的时候还会自动创建用户的密钥。

1
2
ceph auth add client.test mon "allow r" osd "allow rw" 

5、修改用户权限

1
ceph auth caps client.test mon "allow r" osd "allow rw pool=kvm"

6、删除用户,用户名为osd.0

1
ceph auth del osd.0

7、keyring秘钥环文件
keyring文件是一个包含密码,key,证书等内容的一个集合。一个keyring文件可以包含多个用户的信息,也就是可以将多个用户信息存储到一个keyring文件。

keyring自动加载顺序

当访问Ceph集群时候默认会从以下四个地方加载keyring文件。

  • /etc/ceph/cluster-name.user-name.keyring:通过这种类型的文件用来保存单个用户信息,文件名格式固定:集群名.用户标识.keyring。如ceph.client.admin.keyring。这个代表ceph这个集群,这里的ceph是集群名,而client.admin为admin用户的标识。
  • /etc/ceph/cluster.keyring:通用来保存多个用户的keyring信息。
  • /etc/ceph/keyring:也用来保存多个用户的keyring信息。
  • /etc/ceph/keyring.bin:二进制keyring文件,也用来保存多个用户的keyring信息。

8、创建一个名为client.admin 的用户,设置好用户对mds、osd、mon的权限,然后把密钥导出到文件中

1
2
3
4
ceph auth get-or-create client.admin mds 'allow *' osd 'allow *' mon 'allow *' > /etc/ceph/ceph.client.admin.keyring1

# 或者
ceph auth get-or-create client.admin mds 'allow *' osd 'allow *' mon 'allow *' -o /etc/ceph/ceph.client.admin.keyring1

9、创建一个名为osd.0 的用户,设置好用户对mon、osd的权限,然后把密钥导出到文件中

1
ceph auth get-or-create osd.0 mon 'allow profile osd' osd 'allow *' -o /var/lib/ceph/osd/ceph-0/keyring

10、创建一个名为mds.nc3 的用户,设置好用户对mon、osd、mds的权限,然后把密钥导出到文件中

1
ceph auth get-or-create mds.nc3 mon 'allow rwx' osd 'allow *' mds 'allow *' -o /var/lib/ceph/mds/ceph-cs1/keyring

4.6 osd相关

1、查看osd状态

1
ceph osd stat

2、查看osd树

1
2
ceph osd tree查看
ceph osd ls-tree rack1 # 查看osd tree中rack1下的osd编号

3、查看osd映射信息

1
ceph osd dump

4、查看数据延迟

1
ceph osd perf

5、查看CRUSH map

1
ceph osd crush dump

6、查看与设置最大 osd daemon 的个数

1
2
3
4
5
6
7
# 查看
[root@admin ~]# ceph osd getmaxosd
max_osd = 12 in epoch 379


# 设置最大的 osd daemon的个数(当扩大 osd daemon的时候必须扩大这个值)
ceph osd setmaxosd 2048

7、设置 osd 的权重

1
ceph osd reweight 3 0.5  # 把osd.3的权重改为0.5

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

1
ceph osd pause  # 暂停的是所有的osd

9、再次开启 osd (开启后再次接收数据)

1
ceph osd unpause

10、设置标志 flags ,不允许关闭 osd、解决网络不稳定,osd 状态不断切换的问题

1
2
3
ceph osd set nodown
取消设置
ceph osd unset nodown

4.7 pool相关

1、创建存储池

1
2
3
4
5
6
7
8
# 语法:ceph osd pool create <pool name> <pg num> <pgp num> [type]
pool name:存储池名称,必须唯一。
pg num:存储池中的pg数量。
pgp num:用于归置的pg数量,默认与pg数量相等。
type:指定存储池的类型,有replicated和erasure, 默认为replicated。

# 例: 创建一个副本池
ceph osd pool create egon_test 32 32 # 生路type,默认为replicated

2、修改存储池的pg数

注意:在更改pool的PG数量时,需同时更改PGP的数量。PGP是为了管理placement而存在的专门的PG,它和PG的数量应该保持一致。如果你增加pool的pg_num,就需要同时增加pgp_num,保持它们大小一致,这样集群才能正常rebalancing。

1
2
ceph osd pool set egon_test pg_num 60  
ceph osd pool set egon_test pgp_num 60

3、查看存储池

1
2
3
4
5
6
7
8
9
# 查看ceph集群中的pool数量
ceph osd lspools

# 查看名字与详情
ceph osd pool ls
ceph osd pool ls detail

# 查看状态
ceph osd pool stats

4、重命名

1
ceph osd pool rename <old name> <new name>

5、在集群中删除一个 pool,注意删除 poolpool 映射的 image 会直接被删除,线上操作要谨慎
存储池的名字需要重复两次

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
ceph osd pool delete tom_test tom_test --yes-i-really-really-mean-it

# 删除时会报错:
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool

这是由于没有配置mon节点的 mon_allow_pool_delete 字段所致,解决办法就是到mon节点进行相应的设置。
解决方案:

# =============方案1==================
ceph tell mon.* injectargs --mon_allow_pool_delete=true
ceph osd pool delete tom_test tom_test --yes-i-really-really-mean-it
删除完成后最好把mon_allow_pool_delete改回去,降低误删的风险

# =============方案2==================
如果是测试环境,想随意删除存储池,可以在配置文件中全局开启删除存储池的功能
# 1、编辑配置文件: vi /etc/ceph/ceph.conf
在配置文件中添加如下内容:
[mon]
mon allow pool delete = true

# 2、推送配置文件
ceph-deploy --overwrite-conf config push mon01 mon02 mon03 osd01 osd02 osd03

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

# 4、重新执行删除pool命令即可

6、为一个 ceph pool

配置配额、达到配额前集群会告警,达到上限后无法再写入数据
当我们有很多存储池的时候,有些作为公共存储池,这时候就有必要为这些存储池做一些配额,限制可存放的文件数,或者空间大小,以免无限的增大影响到集群的正常运行。 设置配额。

1
2
3
4
5
6
7
8
9
10
11
12
# 查看池配额设置
ceph osd pool get-quota {pool_name}

# 对对象个数进行配额
ceph osd pool set-quota {pool_name} max_objects {number}

# 对磁盘大小进行配额
ceph osd pool set-quota {pool_name} max_bytes {number}


# 例:
ceph osd pool set-quota egon_test max_bytes 1000000000

7、配置参数
对于存储池的配置参数可以通过下面命令获取。

1
ceph osd pool get <pool name> [key name]

1
ceph osd pool get <pool name> size 

如果不跟个key名称,会输出所有参数,但有个报错。

1
ceph osd pool set <pool name> <key> <value> 

1
2
3
# 修改pool的最大副本数与最小副本数
ceph osd pool set egon_test min_size 1
ceph osd pool set egon_test size 2

常用的可用配置参数有。

  • size:存储池中的对象副本数
  • min_size:提供服务所需要的最小副本数,如果定义size为3,min_size也为3,坏掉一个OSD,如果pool池中有副本在此块OSD上面,那么此pool将不提供服务,如果将min_size定义为2,那么还可以提供服务,如果提供为1,表示只要有一块副本都提供服务。
  • pg_num:定义PG的数量
  • pgp_num:定义归置时使用的PG数量
  • crush_ruleset:设置crush算法规则
  • nodelete:控制是否可删除,默认可以
  • nopgchange:控制是否可更改存储池的pg num和pgp num
  • nosizechange:控制是否可以更改存储池的大小
  • noscrub和nodeep-scrub:控制是否整理或深层整理存储池,可临时解决高I/O问题
  • scrub_min_interval:集群负载较低时整理存储池的最小时间间隔
  • scrub_max_interval:整理存储池的最大时间间隔

8、快照
创建存储池快照需要大量的存储空间,取决于存储池的大小。 创建快照,以下两条命令都可以 。

1
2
3
ceph osd pool mksnap <pool name> <snap name>
rados -p <pool name> mksnap <snap name>

列出快照。

1
rados -p <pool name> lssnap 

回滚至存储池快照。

1
rados -p <pool name> rollback <obj-name> <snap name>  # 只能回复某个对象

删除存储池快照,以下两条命令都可以删除。

1
2
ceph osd pool rmsnap <pool name> <snap name> 
rados -p <pool name> rmsnap <snap name>

提示
Pool池的快照,相对来说是有局限性的,没办法直接恢复快照里边全部object对象文件,只能一个个来恢复,保存点密码文件应该还是可以的。这样的设计效果,猜测有可能是因为如果pool池直接整体恢复,会导致整个ceph集群数据混乱,毕竟集群中数据是分布式存放的!

pool存储池快照功能了解即可,感兴趣详见《附录5:》

9、压缩
如果使用bulestore存储引擎,默认提供数据压缩,以节约磁盘空间。 启用压缩。

1
ceph osd pool set <pool name> compression_algorithm snappy

snappy:压缩使用的算法,还有有none、zlib、lz4、zstd和snappy等算法。默认为sanppy。zstd压缩比好,但消耗CPU,lz4和snappy对CPU占用较低,不建议使用zlib。

1
2
3
4
ceph osd pool set <pool name> compression_mode aggressive

# 例如
ceph osd pool set egon_test compression_mode aggressive

压缩的模式有none、aggressive、passive和force

  • 默认none。表示不压缩
  • passive表示提示COMPRESSIBLE才压缩
  • aggressive表示提示INCOMPRESSIBLE不压缩,其它都压缩
  • force表示始终压缩。 压缩参数。

参数:

1
2
3
4
5
6
7
8
9
10
11
compression_max_blob_size:压缩对象的最大体积,超过此体积不压缩。默认为0。
compression_min_blob_size:压缩对象的最小体积,小于此体积不压缩。默认为0。 全局压缩选项,这些可以配置到ceph.conf配置文件,作用于所有存储池。
bluestore_compression_algorithm
bluestore_compression_mode
bluestore_compression_required_ratio
bluestore_compression_min_blob_size
bluestore_compression_max_blob_size
bluestore_compression_min_blob_size_ssd
bluestore_compression_max_blob_size_ssd
bluestore_compression_min_blob_size_hdd
bluestore_compression_max_blob_size_hdd

4.8 PG相关

1、查看pg组映射信息

1
2
ceph pg dump  # 或 ceph pg ls

2、查看pg信息的脚本,第一个行为pool的id号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ceph pg dump | awk '
BEGIN { IGNORECASE = 1 }
/^PG_STAT/ { col=1; while($col!="UP") {col++}; col++ }
/^[0-9a-f]+\.[0-9a-f]+/ { match($0,/^[0-9a-f]+/); pool=substr($0, RSTART, RLENGTH); poollist[pool]=0;
up=$col; i=0; RSTART=0; RLENGTH=0; delete osds; while(match(up,/[0-9]+/)>0) { osds[++i]=substr(up,RSTART,RLENGTH); up = substr(up, RSTART+RLENGTH) }
for(i in osds) {array[osds[i],pool]++; osdlist[osds[i]];}
}
END {
printf("\n");
printf("pool :\t"); for (i in poollist) printf("%s\t",i); printf("| SUM \n");
for (i in poollist) printf("--------"); printf("----------------\n");
for (i in osdlist) { printf("osd.%i\t", i); sum=0;
for (j in poollist) { printf("%i\t", array[i,j]); sum+=array[i,j]; sumpool[j]+=array[i,j] }; printf("| %i\n",sum) }
for (i in poollist) printf("--------"); printf("----------------\n");
printf("SUM :\t"); for (i in poollist) printf("%s\t",sumpool[i]); printf("|\n");
}'

3、查看pg状态

1
ceph pg stat

4、查看一个pg的map

1
ceph pg map 1.7b

5、查询一个pg的详细信息

1
ceph pg 1.7b query

6、清理一个pg组

1
ceph pg scrub 1.7b

7、查看pg中stuck(卡住)的状态

1
2
3
ceph pg dump_stuck unclean
ceph pg dump_stuck inactive
ceph pg dump_stuck stale
  • Unclean (不干净)
    归置组含有复制数未达到期望数量的对象,它们应该在恢复中。
  • Inactive (不活跃) 归置组不能处理读写,因为它们在等待一个有最新数据的 OSD 复活且进入集群。
  • Stale (不新鲜)
    归置组处于未知状态,即存储它们的 OSD 有段时间没向监视器报告了(由 mon_osd_report_timeout 配置)。 阀值定义的是,归置组被认为卡住前等待的最小时间(默认 300 秒)

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

1
ceph pg dump --format plain  # 可用格式有 plain (默认)和 json 。

9、查看某个 PG 内分布的数据状态,具体状态可以使用选项过滤输出

1
ceph pg ls 17 clean  # 17为pg的编号

10、查询 osd 包含 pg 的信息,过滤输出 pg 的状态信息

1
ceph pg ls-by-osd osd.5

11、查询 pool 包含 pg 的信息,过滤输出 pg 的状态信息

1
ceph pg ls-by-pool egon_test

12、查询某个 osd 状态为 primary pg ,可以根据需要过滤状态

1
ceph pg ls-by-primary osd.3 clean

13、恢复一个丢失的pg
如果集群丢了一个或多个对象,而且必须放弃搜索这些数据,你就要把未找到的对象标记为丢失( lost )。 如果所有可能的位置都查询过了,而仍找不到这些对象,你也许得放弃它们了。这可能是罕见的失败组合导致的, 集群在写入完成前,未能得知写入是否已执行。
当前只支持 revert 选项,它使得回滚到对象的前一个版本(如果它是新对象)或完全忽略它。要把 unfound 对象 标记为 lost ,执行命令:

1
ceph pg {pg-id} mark_unfound_lost revert|delete

4.9 rados命令相关

rados 是和 Ceph 的对象存储集群(RADOS),Ceph 的分布式文件系统的一部分进行交互是一种实用工具。
1、看 ceph 集群中有多少个 pool (只是查看 pool)

1
rados lspools  # 同 ceph osd pool ls 输出结果一致

2、显示整个系统和被池毁掉的使用率统计,包括磁盘使用(字节)和对象计数

1
rados df

3、创建一个 pool

1
2
3
rados mkpool test

ceph osd pool set test crush_rule egon_rule # 修改crush_rule为egon_rule

4、创建一个对象

1
rados create test-object -p test  # 创建时卡住了,看看新建的存储池的crush_rule是否正确

5、上传一个对象

1
rados -p test put xxx /tmp/egon.txt 

6、查看 ceph pool 中的 ceph object (这里的 object 是以块形式存储的)

1
rados ls -p test

7、删除一个对象

1
rados rm test-object -p test

8 、删除存储池以及它包含的所有数据

1
rados rmpool test test --yes-i-really-really-mean-it

9、为存储池创建快照

1
rados -p test mksnap testsnap

10、列出给定池的快照

1
rados -p test lssnap

11、删除快照

1
rados -p test rmsnap testsnap

12、使用 rados 进行性能测试!!!!!!!!!!!!!!!!!!!

1
rados bench 600 write rand -t 100 -b 4K -p egon_test

选项解释:

  • 测试时间 :600
  • 支持测试类型:write/read ,加 rand 就是随机,不加就是顺序
  • 并发数( -t 选项):100
  • pool 的名字是:egon_test

五 osd相关之osd故障模拟与恢复

5.1 模拟盘坏掉

如果ceph集群有上千个osd daemon,每天坏个2-3块盘太正常了,我们可以模拟down 掉一个 osd 硬盘

1
2
3
# 如果osd daemon正常运行,down的osd会很快自恢复正常,所以需要先关闭守护进程
ssh root@osd01 systemctl stop ceph-osd@0
ceph osd down 0

5.2 将坏盘踢出集群
集群中坏掉一块盘后,我们需要将其踢出集群让集群恢复到active+clean状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
====================方法一=====================
# 1、关闭守护进程
ssh root@osd01 systemctl stop ceph-osd@0 # 一定要到具体的节点上关闭

# 2、down掉osd
ceph osd down 0

# 3、将osd.0移出集群,集群会自动同步数据
ceph osd out osd.0

# 4、将osd.0移除crushmap
ceph osd crush remove osd.0

# 5、删除守护进程对应的账户信息
ceph auth rm osd.0

# 6、删掉osd.0
ceph osd rm osd.0

====================方法二=====================
ssh root@osd02 systemctl stop ceph-osd@3 # 一定要到具体的节点上关闭
ceph osd out osd.3
ceph osd purge osd.3 --yes-i-really-mean-it # 综合这一步,就可以完成操作
# 删除配置文件中针对该osd的配置
5.3 把原来坏掉的osd修复后重新加入集群
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 远程连接到osd01节点
ssh root@osd01

# 切换到工作目录下
cd /etc/ceph

# 创建osd,无需指定名,会按序号自动生成
ceph osd create

# 创建账户,切记账号与文件夹对应!!!
ceph-authtool --create-keyring /etc/ceph/ceph.osd.0.keyring --gen-key -n osd.0 --cap mon 'allow profile osd' --cap mgr 'allow profile osd' --cap osd 'allow *'

# 导入新的账户秘钥,切记账号与文件夹对应!!!
ceph auth import -i /etc/ceph/ceph.osd.0.keyring
ceph auth get-or-create osd.0 -o /var/lib/ceph/osd/ceph-0/keyring

# 加入集群
ceph osd crush add osd.0 0.01900 host=osd01
ceph osd in osd.0

# 重启osd守护进程
systemctl restart ceph-osd@0

ps:如果重启失败

1
2
3
4
5
6
7
8
9
报错:
Job for ceph-osd@3.service failed because start of the service was attempted too often. See "systemctl status ceph-osd@3.service" and "journalctl -xe" for details.
To force a start use "systemctl reset-failed ceph-osd@3.service" followed by "systemctl start ceph-osd@3.service" again.

# 先运行
systemctl reset-failed ceph-osd@3.service systemctl start ceph-osd@3.service

# 再重新开启
systemctl start ceph-osd@3

六 在物理节点上新增osd daemon

在osd01节点上添加新的osd daemon

1
2
3
4
5
6
7
8
9
10
11
# 在osd01节点运行下述命令,把固态盘分/dev/sdi成两个分区,分别用作数据盘/dev/sdh的--block-db和--block-wal
parted -s /dev/sdi mklabel gpt
parted -s /dev/sdi mkpart primary 0% 50%
parted -s /dev/sdi mkpart primary 51% 100%

# 在管理节点运行
cd /etc/ceph
ceph-deploy --overwrite-conf osd create osd01 --data /dev/sdh --block-db /dev/sdi1 --block-wal /dev/sdi2

# 在管理节点运行,注意,如果crush map的设置不对,那么集群会出现unknown状态
ceph osd crush add osd.9 0.01900 host=osd01

如果是在其他节点,例如mon03节点上添加osd daemon
!!!切记切记切记切记切记切记要为mon03节点添加一个cluster network!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 在mon03节点运行下述命令,把固态盘分/dev/sdc成两个分区,分别用作数据盘/dev/sdb的--block-db和--block-wal
parted -s /dev/sdc mklabel gpt
parted -s /dev/sdc mkpart primary 0% 50%
parted -s /dev/sdc mkpart primary 51% 100%


# 在管理节点运行
cd /etc/ceph
ceph-deploy --overwrite-conf osd create mon03 --data /dev/sdb --block-db /dev/sdc1 --block-wal /dev/sdc2

# 在管理节点运行
ceph osd crush add-bucket mon03 host
ceph osd crush add osd.10 0.01900 host=mon03
ceph osd crush move mon03 rack=rack1
ceph osd in osd.10

ps: 如果报错,磁盘发现gp信息

1
2
3
4
那么先清理磁盘
ceph-disk zap /dev/sdb # dd if=/dev/zero of=/dev/sdb bs=512 count=1
ceph-disk zap /dev/sdc
然后重新执行上述步骤

注意

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
在OSD添加或移除时,Ceph会重平衡PG。数据回填和恢复操作可能会产生大量的后端流量,影响集群性能。为避免性能降低,可对回填/恢复操作进行配置:

osd_recovery_op_priority # 值为1-63,默认为10,相对于客户端操作,恢复操作的优先级,默认客户端操作的优先级为63,参数为osd_client_op_priority

osd_recovery_max_active # 每个osd一次处理的活跃恢复请求数量,默认为15,增大此值可加速恢复,但会增加集群负载

osd_recovery_threads # 用于数据恢复时的线程数,默认为1

osd_max_backfills # 单个osd的最大回填操作数,默认为10

osd_backfill_scan_min # 回填操作时最小扫描对象数量,默认为64

osd_backfill_scan_max # 回填操作的最大扫描对象数量,默认为512

osd_backfill_full_ratio # osd的占满率达到多少时,拒绝接受回填请求,默认为0.85

osd_backfill_retry_interval # 回填重试的时间间隔

七 osd节点关机维护

你可能需要定期对集群中某个子网进行例行维护,或者要解决某个域内的问题。当你停止OSD时,默认情况下CRUSH机制会对集群自动重平衡,可将集群设为noout状态来关闭自动重平衡:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1、关闭自动重平衡
ceph osd set noout

# 2、关闭节点上的osd进程
ceph osd down 编号 # 分别把该节点上的osd设置为down状态
systemctl stop ceph-osd.target # stop该节点上的所有osd进程

# 3、关闭节点
shutdown -h now

# 4、开始维护
当你对失败域中OSD维护时,其中的PG将会变为degraded状态。

# 5、维护完成启动守护进程
systemctl start ceph-osd.target

# 6、最后务必记得取消集群的noout状态
ceph osd unset noout

八 升级ceph软件版本

1
2
3
4
5
6
7
8
9
在MON和OSD机器上升级安装指定的ceph版本的软件包
逐个重启MON进程
设置noout 避免在异常情况下触发集群数据重新平衡
ceph osd set noout
逐个重启OSD进程
ceph osd down {osd-number} #提前mark down, 减少slow request
systemctl restart ceph-osd@{osd-number} #用systemctl重启OSD进程
恢复noout 设置
ceph osd unset noout

九 扩容

如果副本数为2,PB级的集群的容量超过50%,就要考虑扩容了。 假如OSD主机的磁盘容量为48TB(12*4TB),则需要backfill的数据为24TB(48TB 50%) ,假设网卡为10Gb,则新加一个OSD时,集群大约需要19200s(24TB/(10Gb/8)) 约3小时完成backfill,而backfill后台数据填充将会涉及大量的IO读和网络传输,必将影响生产业务运行。 如果集群容量到80%再扩容会导致更长的backfill时间,近8个小时。

OSD对应的磁盘利用率如果超过50%,也需要尽快扩容。

在业务闲时扩容

十 Ceph monitor故障恢复

1 问题

一般来说,在实际运行中,ceph monitor的个数是2n+1(n>=0)个,在线上至少3个,只要正常的节点数>=n+1,ceph的paxos算法能保证系统的正常运行。所以,对于3个节点,同时只能挂掉一个。一般来说,同时挂掉2个节点的概率比较小,但是万一挂掉2个呢?
如果ceph的monitor节点超过半数挂掉,paxos算法就无法正常进行仲裁(quorum),此时,ceph集群会阻塞对集群的操作,直到超过半数的monitor节点恢复。

If there are not enough monitors to form a quorum, the ceph command will block trying to reach the cluster. In this situation, you need to get enough ceph-mon daemons running to form a quorum before doing anything else with the cluster.

所以,

(1)如果挂掉的2个节点至少有一个可以恢复,也就是monitor的元数据还是OK的,那么只需要重启ceph-mon进程即可。所以,对于monitor,最好运行在RAID的机器上。这样,即使机器出现故障,恢复也比较容易。

(2)如果挂掉的2个节点的元数据都损坏了呢?出现这种情况,说明人品不行,2台机器的RAID磁盘同时损坏,这得多背?肯定是管理员嫌工资太低,把机器砸了。如何恢复呢?

详见:https://www.cnblogs.com/linhaifeng/articles/14761126.html

十一 Cephfs快照

Cephfs的快照功能在官网都很少提及,因为即使开发了很多年,但是由于cephfs的复杂性,功能一直没能达到稳定,这里,只是介绍一下这个功能,怎么使用,并且建议不要在生产中使用,因为搞不好是会丢数据的

1
2
3
4
5
6
7
8
9
10
11
12
1、使能cephfs可以做快照:
ceph fs set ceph allow_new_snaps 1

2.在要做快照的目录下执行:
mkdir .snap/{snapname}

3、查看快照中的内容:
ls .snap/{snapname}

4、恢复:

cp -R .snap/{snapname}/* ./