概述
在使用Ceph的CephFS时,每个client都会建立与MDS的连接,以获取CephFS的元数据信息。如果有多个Active的MDS,则一个client可能会与多个MDS都建立连接。
Ceph提供了client/session
子命令来查询和管理这些连接,在这些子命令中,有一个命令来处理当CephFS的client有问题时,如何手动来断开这些client的连接,比如执行命令:# ceph tell mds.2 client evict
,则会把与mds rank 2 连接的所有clients都断开。
那么执行client evict
的影响是什么?是否可以恢复呢?本文将重点介绍一下这些。
命令格式
参考:http://docs.ceph.com/docs/master/cephfs/eviction/
测试环境:Ceph Mimic 13.2.1
1. 查看所有client/session
可以通过命令 client/session ls
查看与ms rank [id] 建立connection的所有clients;
1 | # ceph tell mds.0 client ls |
比较重要的信息有:
- id:client唯一id
- num_caps:client获取的caps
- inst:client端的ip和端口链接信息
- ceph_version:client端的ceph-fuse版本,若使用kernel client,则为kernel_version
- hostname:client端的主机名
- mount_point:client在主机上对应的mount point
- pid:client端ceph-fuse进程的pid
2. evict指定client
可以通过指定id来evict特定的client链接;
若有多个Active MDS,单个MDS Rank的evict也会传播到别的Active MDS
1 | # ceph tell mds.0 client evict id=25085 |
evict client后,在对应的host上检查client的mountpoint已经不能访问:
1 | root@mimic3:/mnt/cephfuse# ls |
3. 查看ceph osd的blacklist
evict client后,会把client加入到osd blacklist中(后续有代码分析);
1 | root@mimic1:~# ceph osd blacklist ls |
加入到osd blacklist后,防止evict client的in-flight数据写下去,影响数据一致性;有效时间为1个小时;
4. 尝试恢复evict client
把ceph osd blacklist里与刚evict client相关的记录删除;
1 | root@mimic1:~# ceph osd blacklist rm 192.168.0.26:0/265326503 |
在对应的host上检查client是否正常?发现client变得正常了!!
1 | root@mimic3:~# cd /mnt/cephfuse |
而测试 Ceph Luminous 12.2.7 版本时,evcit client后无法立刻恢复,等一段时间后恢复!!
( “mds_session_autoclose”: “300.000000”,)
1 | root@luminous2:~# ceph osd blacklist rm 192.168.213.25:0/1534097905 |
等待一段时间(300s)后,session变得正常!
1 | root@luminous2:/mnt/cephfuse# ls |
测试cephfs kernel client的evcit,client无法恢复!!
1 | root@mimic3:~# cd /mnt/cephfs |
5. evict所有的client
若在evict命令后不指定具体的client id,则会把与该MDS Rank链接的所有client evict掉;
若有多个Active MDS,单个MDS Rank的evict也会传播到别的Active MDS
1 | # ceph tell mds.0 client evict |
这个命令慎用,也一定不要误用,影响比较大!!!
6. session kill命令
session子命令里还有一个kill命令,它比evict命令更彻底;
1 | root@mimic1:~# ceph tell mds.0 session kill 104704 |
删除 osd blacklist entry:
1 | root@mimic1:~# ceph osd blacklist rm 192.168.0.26:0/1613295381 |
之后client链接没有再恢复!!!
1 | root@mimic3:~# cd /mnt/cephfuse |
session kill后,这个session无法再恢复!!!也要慎用!!!
代码分析
基于Ceph Mimic 13.2.1代码;
执行client evict的代码如下,可以看出里面会添加osd blacklist:
1 | bool MDSRank::evict_client(int64_t session_id, |
调用该函数的地方有:
1 | Cscope tag: evict_client |
1、handle_asok_command:命令行处理client evict
2、evict_clients:批量evict clients
3、find_idle_sessions:对于stale状态的session,执行evict client
4、reconnect_tick:mds恢复后等待client reconnect,45s超时后evict clients
相关参数
于mds session相关的配置参数有:
1 | # ceph daemon mgr.luminous2 config show | grep mds_session_ |
还有一些client相关的:
1 | "client_reconnect_stale": "false", |
evict client后的处理
从上面的实践可以看出,evcit client后,client会被添加到osd blacklist里,超时时间为1小时;在这个时间段内,client是不能访问CephFS的;
但是通过命令:ceph osd blacklist rm <entry>
删除osd的blacklist后,client端立刻就能继续访问CephFS,一切都跟之前正常时候一样!
方法1:rm blacklist
1 | root@mimic1:~# ceph tell mds.0 client evict id=25085 |
然后在client host重新访问以下挂载点目录后,session变为正常
1 | root@mimic1:~# ceph tell mds.0 client ls |
方法2:wait 1小时
默认evict client后,添加osd blacklist的超时时间为1小时,考察1小时过后,session可以变为正常:
1 | root@mimic1:~# ceph osd blacklist ls |
然后在client host重新访问以下挂载点目录后,session变为正常
1 | root@mimic3:~# cd /mnt/cephfuse/ |
查看mds的sessions:
1 | root@mimic1:~# ceph tell mds.0 session ls |