ceph运维操作
一 统一节点上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 | 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 | systemctl restart ceph-osd@0 |
了解:也可以根据进程类型+主机名.service
1 mon 守护进程
1 | systemctl { start | stop | restart} ceph-mon@{mon_instance}.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 | help |
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 | # 在管理节点运行 |
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 | ssh root@mon01 |
3.3 socket文件
1 | # 1、查看帮助 |
如果超过半数的monitor节点挂掉,此时通过网络访问ceph的所有操作都会被阻塞,但monitor的本地socket还是可以通信的。
1 | ceph --admin-daemon /var/run/ceph/ceph-mon.mon03.asok quorum_status |
四 维护集群常用命令
4.1 查看集群健康状况
1 | # 检查ceph的状态 |
4.2 检查集群的使用情况
1 | =======================命令1======================= |
4.3 mds相关
1、查看mds状态
1 | ceph mds stat |
2、删除mds节点
1 | ssh root@mon01 systemctl stop ceph-mds.target |
3、关闭mds集群
1 | ceph mds cluster_down |
4、开启mds集群
1 | ceph mds cluster_up |
5、设置cephfs 文件系统存储方式最大单个文件尺寸
1 | ceph mds set max_file_size 1024000000000 |
6、了解:清除mds文件系统
1 | # 1、强制 mds 状态为 featrue |
4.4 mon相关
1、查看mon状态
1 | ceph mon stat |
2、查看mon映射信息
1 | ceph mon dump |
3、检查Ceph monitor仲裁/选举状态
1 | ceph quorum_status --format json-pretty |
4、查看mon信息包括ip地址
1 | 获得一个正在运行的 mon map,并保存在 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 | 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 | ceph auth get-or-create client.admin mds 'allow *' osd 'allow *' mon 'allow *' > /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 | ceph osd tree查看 |
3、查看osd映射信息
1 | ceph osd dump |
4、查看数据延迟
1 | ceph osd perf |
5、查看CRUSH map
1 | ceph osd crush dump |
6、查看与设置最大 osd daemon 的个数
1 | # 查看 |
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 | ceph osd set nodown |
4.7 pool相关
1、创建存储池
1 | # 语法:ceph osd pool create <pool name> <pg num> <pgp num> [type] |
2、修改存储池的pg数
注意:在更改pool的PG数量时,需同时更改PGP的数量。PGP是为了管理placement而存在的专门的PG,它和PG的数量应该保持一致。如果你增加pool的pg_num,就需要同时增加pgp_num,保持它们大小一致,这样集群才能正常rebalancing。
1 | ceph osd pool set egon_test pg_num 60 |
3、查看存储池
1 | # 查看ceph集群中的pool数量 |
4、重命名
1 | ceph osd pool rename <old name> <new name> |
5、在集群中删除一个 pool,注意删除 poolpool 映射的 image 会直接被删除,线上操作要谨慎
存储池的名字需要重复两次
1 | ceph osd pool delete tom_test tom_test --yes-i-really-really-mean-it |
6、为一个 ceph pool
配置配额、达到配额前集群会告警,达到上限后无法再写入数据
当我们有很多存储池的时候,有些作为公共存储池,这时候就有必要为这些存储池做一些配额,限制可存放的文件数,或者空间大小,以免无限的增大影响到集群的正常运行。 设置配额。
1 | # 查看池配额设置 |
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 | # 修改pool的最大副本数与最小副本数 |
常用的可用配置参数有。
- 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 | ceph osd pool mksnap <pool name> <snap name> |
列出快照。
1 | rados -p <pool name> lssnap |
回滚至存储池快照。
1 | rados -p <pool name> rollback <obj-name> <snap name> # 只能回复某个对象 |
删除存储池快照,以下两条命令都可以删除。
1 | ceph osd pool rmsnap <pool name> <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 | ceph osd pool set <pool name> compression_mode aggressive |
压缩的模式有none、aggressive、passive和force
- 默认none。表示不压缩
- passive表示提示COMPRESSIBLE才压缩
- aggressive表示提示INCOMPRESSIBLE不压缩,其它都压缩
- force表示始终压缩。 压缩参数。
参数:
1 | compression_max_blob_size:压缩对象的最大体积,超过此体积不压缩。默认为0。 |
4.8 PG相关
1、查看pg组映射信息
1 | ceph pg dump # 或 ceph pg ls |
2、查看pg信息的脚本,第一个行为pool的id号
1 | ceph pg dump | awk ' |
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 | ceph pg dump_stuck unclean |
- 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 | rados mkpool test |
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 | # 如果osd daemon正常运行,down的osd会很快自恢复正常,所以需要先关闭守护进程 |
5.2 将坏盘踢出集群
集群中坏掉一块盘后,我们需要将其踢出集群让集群恢复到active+clean状态
1 | ====================方法一===================== |
5.3 把原来坏掉的osd修复后重新加入集群
1 | # 远程连接到osd01节点 |
ps:如果重启失败
1 | 报错: |
六 在物理节点上新增osd daemon
在osd01节点上添加新的osd daemon
1 | # 在osd01节点运行下述命令,把固态盘分/dev/sdi成两个分区,分别用作数据盘/dev/sdh的--block-db和--block-wal |
如果是在其他节点,例如mon03节点上添加osd daemon
!!!切记切记切记切记切记切记要为mon03节点添加一个cluster network!!!
1 | # 在mon03节点运行下述命令,把固态盘分/dev/sdc成两个分区,分别用作数据盘/dev/sdb的--block-db和--block-wal |
ps: 如果报错,磁盘发现gp信息
1 | 那么先清理磁盘 |
注意
1 | 在OSD添加或移除时,Ceph会重平衡PG。数据回填和恢复操作可能会产生大量的后端流量,影响集群性能。为避免性能降低,可对回填/恢复操作进行配置: |
七 osd节点关机维护
你可能需要定期对集群中某个子网进行例行维护,或者要解决某个域内的问题。当你停止OSD时,默认情况下CRUSH机制会对集群自动重平衡,可将集群设为noout状态来关闭自动重平衡:
1 | # 1、关闭自动重平衡 |
八 升级ceph软件版本
1 | 在MON和OSD机器上升级安装指定的ceph版本的软件包 |
九 扩容
如果副本数为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 | 1、使能cephfs可以做快照: |