您的位置:首页 > 其它

Ceph高级工具介绍之ceph-kvstore-tool的使用

2016-07-19 11:09 776 查看
0 简介

Ceph是一个复杂的分布式存储系统,有很多组件组成,不光学习成本比较高,而且运维难度也是相当的大。但近几年,它却很受大家的欢迎,越来越多的互联网企业开始采用ceph来构建自己的存储。这是为什么呢?我想源自于它优秀的设计、规范的项目管理以及活跃的社区。Ceph本身提供了很多工具(之所以称它们为高级工具,是因为要使用它们必须对Ceph有较为深入的理解),它们在处理Ceph故障时,非常有用,接下来的几篇文件主要介绍它们。

大家都知道Ceph的很多数据比如PG log、Monitor的数据都存在kvstore里(leveldb或者RocksDB中),Ceph也提供了查看kvstore里数据的工具,它就是ceph-kvstore-tool。

1 安装ceph-kvstore-tool工具

如果你是从官网释放的rpm包安装的Ceph,那么ceph-kvstore-tool默认是没有安装的,它包含在ceph-test这个rpm中,你可以通过以下方法安装。

# yum install ceph-test
然后确认ceph-kvstore-tool正确被安装上了,

# which ceph-kvstore-tool
/usr/bin/ceph-kvstore-tool


2 ceph-kvstore-tool命令使用介绍

以下介绍基于Ceph 10.2.2版本,

[root@ceph01 ~]# ceph --version
ceph version 10.2.2 (45107e21c568dd033c2f0a3107dec8f0b0e58374)


学习一个命令最好的办法就是看它的manpage,不过很尴尬,这个工具没有提供manpage

[root@ceph01 ~]# man ceph-kvstore-tool
No manual entry for ceph-kvstore-tool
那还是老套路,看看-h或者--help有没有什么信息
[root@ceph01 ~]# ceph-kvstore-tool -h
Usage: ceph-kvstore-tool <leveldb|rocksdb|...> <store path> command [args...]

Commands:
list [prefix]
list-crc [prefix]
exists <prefix> [key]
get <prefix> <key> [out <file>]
crc <prefix> <key>
get-size [<prefix> <key>]
set <prefix> <key> [ver <N>|in <file>]
store-copy <path> [num-keys-per-tx]
store-crc <path>
描述的比较简单,但是基本上告诉你了这个命令的用法。从它的子命令来看,基本都会涉及两个词'prefix'和'key',这两个是什么含义呢,貌似只有知道了它们,才能更好的使用这个命令。再仔细观察,发现有些命令是不需要prefix,比如list命令 prefix就是可选项。我们先执行一下看看输出吧。

[root@ceph01 ~]# ceph-kvstore-tool leveldb /var/lib/ceph/mon/ceph-ceph01/store.db/ list
2016-07-19 10:29:48.188121 7f4cb30cf040  1 leveldb: Recovering log #14359
2016-07-19 10:29:48.232871 7f4cb30cf040  1 leveldb: Delete type=0 #14359

2016-07-19 10:29:48.232948 7f4cb30cf040  1 leveldb: Delete type=3 #14358

auth:501
auth:502
auth:503
auth:504
auth:505
auth:506
auth:507
auth:508
auth:509
auth:510
auth:511
auth:512
auth:513
...


我们知道leveldb是一个kvstore也就是kv的数据库,monitor的数据目录中实际上包含了多个表。list命令能够列出当前数据库中包含的所有的表项信息,而表项的名字都是以'auth' :'501'的格式存在。其中auth就是‘prefix',也就是kv数据库中的某张表,而':'后面的部分'501'就是这个表中某条记录的key信息。知道了这个以后,我们看看Monitor的数据目录下都存储了哪些表。

[root@ceph01 ~]# ceph-kvstore-tool leveldb /var/lib/ceph/mon/ceph-ceph01/store.db/ list |awk -F ':' '{print $1}'|uniq
2016-07-19 10:12:22.278491 7faba460f040  1 leveldb: Recovering log #14345
2016-07-19 10:12:22.305658 7faba460f040  1 leveldb: Delete type=0 #14345

2016-07-19 10:12:22.305745 7faba460f040  1 leveldb: Delete type=3 #14344

auth
logm
mdsmap
monitor
monitor_store
monmap
osd_metadata
osdmap
paxos
pgmap
pgmap_meta
pgmap_osd
pgmap_pg

从中我们发现了比较熟悉的各种map,mdsmap、monmap、osdmap、pgmap、auth等。而如上所讲,其中每一张表都有很多表项组成,接下来我们使用ceph-kvstore-tool来查看一下monmap这个表中某个表项中的数据。

[root@ceph01 ~]# ceph-kvstore-tool leveldb /var/lib/ceph/mon/ceph-ceph01/store.db/ list|grep monmap|head -10
2016-07-19 10:53:48.264480 7ff95e170040 1 leveldb: Recovering log #14378
2016-07-19 10:53:48.265488 7ff95e170040 1 leveldb: Level-0 table #14416: started
2016-07-19 10:53:48.286166 7ff95e170040 1 leveldb: Level-0 table #14416: 43990 bytes OK
2016-07-19 10:53:48.315682 7ff95e170040 1 leveldb: Delete type=3 #14377

2016-07-19 10:53:48.315799 7ff95e170040 1 leveldb: Delete type=0 #14378

mon_sync:latest_monmap
monmap:1
monmap:first_committed
monmap:last_committed从中,可以看出monmap目前有三个表项,看看monmap:1这项包含什么数据
[root@ceph01 ~]# ceph-kvstore-tool leveldb /var/lib/ceph/mon/ceph-ceph01/store.db/ get monmap 1 out monmap.1.txt
2016-07-19 10:54:27.946186 7f6628f34040 1 leveldb: Recovering log #14419
2016-07-19 10:54:28.035087 7f6628f34040 1 leveldb: Delete type=0 #14419

2016-07-19 10:54:28.035205 7f6628f34040 1 leveldb: Delete type=3 #14418

(monmap, 1)
[root@ceph01 ~]# file monmap.1.txt
monmap.1.txt: DBase 3 data file (1316683776 records)

导出来的这个文件是一个DBase文件,是编译过的,需要使用工具来解析它。我们知道Ceph中很多数据都是经过序列化(encode)之后持久化的(这里有篇文章有相关的介绍https://www.ustack.com/blog/cephxuliehua/),所以要解析这些数据需要将它们反序列化(decode),Ceph提供了一个反序列化的工具ceph-dencode,关于ceph-dencoder的使用会在之后介绍。

[root@ceph01 ~]# ceph-dencoder import monmap.1.txt type MonMap decode dump_json
{
"epoch": 1,
"fsid": "7b4eb697-fd53-4bd8-9b7a-ca1b37110623",
"modified": "2016-06-26 00:07:24.222662",
"created": "2016-06-26 00:07:24.222662",
"mons": [
{
"rank": 0,
"name": "ceph01",
"addr": "192.168.0.23:6789\/0"
},
{
"rank": 1,
"name": "ceph02",
"addr": "192.168.0.24:6789\/0"
},
{
"rank": 2,
"name": "ceph03",
"addr": "192.168.0.25:6789\/0"
}
]
}
同样,可以使用以上方法查看osdmap各个表项的数据。

[root@ceph01 ~]# ceph-kvstore-tool leveldb /var/lib/ceph/mon/ceph-ceph01/store.db/ get osdmap full_10 out osdmap-full_10.txt
[root@ceph01 ~]# ceph-dencoder import osdmap-full_10.txt type OSDMap decode dump_json
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息