分布式存储ceph运维操作

一、统一节点上ceph.conf文件

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

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

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

二、ceph集群服务管理

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

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

systemctl restart ceph.target

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

#1、重启mgr守护进程
systemctl restart ceph-mgr.target
#2、重启mds守护进程
systemctl restart ceph-mds.target
#3、重启rgw守护进程
systemctl restart ceph-radosgw.target
#4、重启mon守护进程
systemctl restart ceph-mon.target
# 5、重启osd守护进程
登录到osd01节点上,该节点上运行有三个osd daemon进程osd.O、osd.l、osd.2
# 5.1重启所有的osd daemoon
systemctl restart ceph-osd.target
# 5.2挨个重启
systemctl restart ceph-osd@0
systemctl restart ceph-osd@1
systemctl restart ceph-osd@2

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

# 1 mon守护进程
systemctl { start | stop | restart} ceph-mon@{mon_instance}.service 例
systemctl restart ceph-mon@mon01.service
# 2 mgr守护进程
systemctl { start | stop | restart} ceph-mgr@{mgr_instance}.service
#3 osd守护进程
systemctl { start | stop | restart} ceph-osd@{osd_instance}.service
#4 rgw守护进程
systemctl { start | stop | restart} ceph-radosgw@{rgw_instance}.service
#5 mds守护进程
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文件

ceph --admin-daemon /var/run/ceph/$cluster-$type.$id.asok command

常用command如下

help
config get parameter
config set parameter
config show
perf dump
3.1telI子命令

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

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 :表示参数注入,后面必须跟一个参数,也可以跟多个。
例如
#在管理节点运行
ceph tell mon.monOl 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.2daemon子命令

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

ceph daemon {daemon—type}.{id} config set {name}={value}
例。
ssh root@mon01
ceph daemon mon.monOl config set mon allow pool delete false
3.3socket 文件
#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还是可以通信的。

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

四、维护集群常用命令

4.1查看集群健康状况
#检查ceph的状态
ceph -s
ceph status
ceph health
ceph health detail
#实时观察集群健康状态
ceph -w
4.2检查集群的使用情况
=======================命令 1=======================
ceph df #它和Linux上的df相似
#GLOBAL段
展示了数据所占用集群存储空间的概要,详解如下
SIZE:集群的总容量;
AVAIL:集群的空闲空间总量;
RAW USED:已用存储空间总量;
% RAW USED:已用存储空间比率。用此值参照full ratio和near full \ ratio来确保不会用 尽集群空间。详情见存储容量。

#POOLS 段:
展示了存储池列表及各存储池的大致使用率。没有副本、克隆品和快照占用情况。例如,如果你把1MB 的数据存储为对象,理论使用率将是1MB,但考虑到副本数、克隆数、和快照数,实际使用率可能是 2 MB或更多。
NAME:存储池名字;
ID:存储池唯一标识符;
USED:大概数据量,单位为B、KB、MB或GB ;
%USED:各存储池的大概使用率; Objects:各存储池内的大概对象数。
=======================命令 2=======================
ceph osd df #可以详细列出集群每块磁盘的使用情况,包括大小、权重、使用多少空间、使用率等等
4.3mds相关

1、查看mds状态

ceph mds stat
ceph mds dump

2、删除mds节点

ssh root@mon01 systemctl stop ceph-mds.target
ceph mds rm 0 #删除一个不活跃的mds
#启动mds后,则恢复正常

3、 关闭mds集群

ceph mds cluster_down

4、 开启mds集群

ceph mds cluster_up

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

ceph mds set max_file_size 1024000000000

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

#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.4mon相关

1、 查看mon状态

ceph mon stat

2、 查看mon映射信息

ceph mon dump

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

ceph quorum_status --format json-pretty

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

获得一个正在运行的mon map,并保存在l.txt文件中
ceph mon getmap -o 1.txt
monmaptool --print 1.txt
4.5auth 相关

一:认证与授权
Ceph使用cephx协议对客户端进行身份验证,集群中每一个Monitor节点都可以对客户端进行身份验 证,所以不存在单点故障。cephx仅用于Ceph集群中的各组件,而不能用于非Ceph组件。它并不解决 数据传输加密问题,但也可以提高访问控制安全性问题。
二:认证授权流程如下
•1、客户端向Monitor请求创建用户。
•2、Monitor返回用户共享密钥给客户端,并将此用户信息共享给MDS和QSDO
•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

ceph auth list # 简写:ceph auth ls

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

ceph auth get client.admin

3、 只查看用户的key信息

ceph auth print-key client.admin

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

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

5、 修改用户权限

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

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

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的权限,然后把密钥导出到文 件中

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的权限,然后把密钥导出到文件中

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的权限,然后把密钥导出到文件中

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状态

ceph osd stat

2、查看osd树

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

3、查看osd映射信息

ceph osd dump

4、 查看数据延迟

ceph osd perf

5、 查看 CRUSH map

ceph osd crush dump

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

#查看
[root@admin ~]# ceph osd getmaxosd
max_osd = 12 in epoch 379
#设置最大的osd daemon的个数(当扩大osd daemon的时候必须扩大这个值)
ceph osd setmaxosd 2048

7、 设置osd的权重

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

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

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

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

ceph osd unpause

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

ceph osd set nodown
取消设置
ceph osd unset nodown

4.7 pool 相关
1、创建存储池

# 语法: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。

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

3、 查看存储池

#查看ceph集群中的pool数量
ceph osd lspools
#查看名字与详情
ceph osd pool ls
ceph osd pool ls detail
#查看状态
ceph osd pool stats

4、 重命名

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

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

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
册U除完成后最好把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、重新执行删除p ool命令即可

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

#查看池配额设置
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、 配置参数
对于存储池的配置参数可以通过下面命令获取。

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

ceph osd pool get <pool name> size

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

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

#修改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、快照
创建存储池快照需要大量的存储空间,取决于存储池的大小。创建快照,以下两条命令都可以。

ceph osd pool mksnap <pool name> <snap name>
rados -p <pool name> mksnap <snap name>

列出快照。

rados -p <pool name> lssnap

回滚至存储池快照。

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

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

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

提示

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

poo I存储池快照功能了解即可,感兴趣详见《附录5:》
9、压缩
如果使用bulestore存储引擎,默认提供数据压缩,以节约磁盘空间。启用压缩。

ceph osd pool set <pool name> compression_algorithm snappy

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

ceph osd pool set <pool name> compression_mode aggressive
#例如
ceph osd pool set egon_test compression_mode aggressive

压缩的模式有none、aggressive、passive和force
•默认none。表示不压缩
•passive表示提示COMPRESS IB LE才压缩
•aggressive表示提示INCOMPRESS IB LE不压缩,其它都压缩
•force表示始终压缩。压缩参数。

参数:
compression_max_blob_size :压缩对象的最大体积,超过此体积不压缩。默认为0。 compression_min_blob_size :压缩对象的最小体积,小于此体积不压缩。默认为0。全局压缩选 项,这些可以配置到ce ph.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组映射信息

ceph pg dump # 或 ceph pg Is

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

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状态

ceph pg stat

4、 查看一个pg的map

ceph pg map 1.7b

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

ceph pg 1.7b query

6、 清理一个pg组

ceph pg scrub 1.7b

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

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统计

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

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

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

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

ceph pg ls-by-osd osd.5

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

ceph pg ls-by-pool egon_test

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

ceph pg ls-by-primary osd.3 clean

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

ceph pg {pg-id} mark_unfound_lost revert|delete

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

rados Ispools # 同 ceph osd pool Is 输出结果一致

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

rados df

3、 创建一个pool

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

4、 创建一个对象

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

5、 上传一个对象

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

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

rados ls -p test

7、 删除一个对象

rados rm test-object -p test

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

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

9、 为存储池创建快照

rados -p test mksnap testsnap

10、列出给定池的快照

rados -p test lssnap

11、删除快照

rados -p test rmsnap testsnap

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

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硬 盘

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

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

====================方法一=====================
#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修复后重新加入集群

#远程连接到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:如果重启失败

报错:
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

在osdOI节点上添加新的osd daemon

#在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!!!

#在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/sdcl --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信息

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

注意

在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、关闭自动重平衡
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.在MON和OSD机器上升级安装指定的ceph版本的软件包
2.逐个重启MON进程
3.设置noout避免在异常情况下触发集群数据重新平衡

ceph osd set noout

4.逐个重启OSD进程

ceph osd down {osd-number} # 提前 mark down, 减少 slow request systemctl restart ceph-osd@{osd-number} #用 systemctl 重启 OSD 进程

5.恢复noout设置

ceph osd unset noout

九、扩容

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

十、Ceph monitor故障恢复

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

十一、Cephfs快照

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

1、	使能cephfs可以做快照:
ceph fs set ceph allow_new_snaps 1
2、	在要做快照的目录下执行:
mkdir .snap/{snapname}
3、	查看快照中的内容:
ls .snap/{snapname}
4、	恢复:
cp -R .snap/{snapname}/* ./
Logo

更多推荐