Ceph维护经验总结

2017年08月15日 • 陈苗


其它存储

SAN 块存储 NAS 文件存储

服务重启命令

systemctl restart ceph-mon@ceph01
systemctl restart ceph-osd@0
systemctl restart ceph-radosgw@rgw.ceph01
systemctl restart ceph-mds@ceph01

# s3默认单人100个bucket
# bucketname全局唯一,不分用户
# bucket下面不能创bucket,只能object
# 是个简单的key-value存储
# 可以針對未完成上傳的檔案設定 lifecycle policy,如此可以減少費用的支出,讓超過期限未完成上傳的檔案自動失效
# 即使 bucket 的權限被設定為 public readable,也不代表後續上傳到此 bucket 的 object 也是 public readable,權限是分開管理的
# Files can be from 0 Bytes ~ 5 TB
# 同一個 bucket 內不會重複(但不同的 bucket 可能會有同樣的 key)

bucket操作

radosgw-admin 命令需要在网关服务器运行

列出所有bucket

radosgw-admin bucket list

删除bucket

radosgw-admin bucket rm --bucket=registry --purge-objects

输出bucket详细信息

radosgw-admin bucket stats

查看对象数目

查看某个bucket具体信息

radosgw-admin bucket stats --bucket=my-new-bucket

将桶链接给用户

radosgw-admin metadata get bucket:dev-chenmiao-b1
radosgw-admin bucket link --uid=testuser --bucket=dev-chenmiao-b1 --bucket-id=xxx

注意: 一个桶只能连接给一个用户。连接给一个用户了,上个用户会自动取消链接

取消连接

radosgw-admin bucket unlink --uid=testuser --bucket=dev-chenmiao-b1

用户操作

创建s3用户

radosgw-admin user create --uid="testuser" --display-name="First User"

列出所有用户

radosgw-admin metadata list user

查看用户详细信息

radosgw-admin user info --uid=testuser

里面包括了access_key、secret_key

修改用户display-name

radosgw-admin user modify --uid=johndoe --display-name="John E. Doe"

s3用户增加access-key、secret-key

radosgw-admin key create --uid=testuser --key-type=s3 --access-key A6CG8CRJ6ZR4C4LM1G96 --secret-key vkbZvV2eH7kBTCJcEbxrDZnArmTsgzCOc6RvCbX2

s3用户删除key

radosgw-admin key rm --uid=testuser --access-key TIDVINT5TUF17DO533HD


查看存储池

ceph df

查看host osd对应关系

ceph osd tree

查看文件实际保存位置,使用存储池名、文件key

# ceph osd map rbd hellokey
osdmap e195 pool 'rbd' (0) object 'hello.txt' -> pg 0.d92fd82b (0.2b) -> up ([4,7,0], p4) acting ([4,7,0], p4)

表示文件保存在PG0.2b内,这个PG位于osd.4,osd.7,osd.0中。有3个osd是因为副本数为3。在3个osd的current下找到0.2b_head目录。

/var/lib/ceph/osd/ceph-4/current/0.2b_head

可以进入里面直接读取key开头的东西

cat xxx_head_xxx

将文件存入集群

rados -p rbd put hellokey hello.txt

读取文件

rados -p rbd get hellokey hello.txt

通知ceph扫描PG

ceph pg scrub 0.44

修复pg

ceph pg repair 0.44

查看pg当前状态

ceph pg dump_stuck

active+undersized+degraded
degraded降级,undersized小于副本数。一般出现在osd挂掉

undersized+degraded+peered
peered搜索。存活的副本数小于osd_pool_default_min_size设置的值,文件不可读取,操作会被卡住
手动设置为1即可消除此状态ceph osd pool set rbd min_size 1

remapped+backfilling
remapped重映射,backfilling数据回填。在OSD挂掉5min(default 300s)之后,这个OSD会被标记为out状态。remapped仅创建目录

inconsistent、recover
pg状态不一致。发生在某个目录数据丢失,或某个副本数据没更新

pg数量设置

osd < 5 128
5 < osd < 10 512 10 < osd < 50 1024 50 < osd 自己算

(100 * 9) / 3 = 300 向上取最大的2的幂次。即512

100 * osd_num / replication_num

设置数量

ceph osd pool set {pool-name} pg_num {pg_num} ceph osd pool set {pool-name} pgp_num {pg_num}

注意:pg数目只能增,不能减

查询数量

ceph osd pool get {pool-name} pg_num

查看pg分布情况,第二列为对象数

ceph pg dump pgs grep ^1 awk ‘{print $1,$2,$15}’

查看pg分布

ceph osd df tree

ceph osd df tree | grep 'osd\.'

ceph osd df


其它一些操作,用到再说

暂停用户
radosgw-admin user suspend --uid=johndoe
停用一个用户后,它的子用户也会一起被停用

重新启用用户
radosgw-admin user enable --uid=johndoe

删除子用户
radosgw-admin subuser rm --subuser=johndoe:swift

删除用户
radosgw-admin user rm --uid=johndoe

展示用量信息
radosgw-admin usage show --uid=johndoe --start-date=2012-03-01 --end-date=2012-04-01

修改对象网关端口

# vi /etc/ceph/ceph.conf
[client.rgw.client-node]
rgw_frontends = "civetweb port=22222"

rgw输出debug日志

vi /etc/ceph/ceph.conf
[global]
debug rgw = 20

pg数量确定的计算公式

Total PGs = ((Total_number_of_OSD * 100) / max_replication_count) / pool_count

9*100/3/1

良好的工程实践建议(掉坑后的教训): 预先规划Pool的规模,设置PG数量;一旦设置之后就不再变更;后续需要扩容就以 Pool 为维度为扩容,通过新增Pool来实现(Pool通过 crushmap实现故障域隔离);

对象寻址

对象到PG的映射

pg_ id = hash( object_ id ) % pg_num

PG到osd列表映射

CRUSH(PG_ID) = OSD


ceph重建pool减小pg

以重新创建.rgw.root为例

ceph osd pool create .rgw.root.new 16 16

ceph osd dump|grep pool

rados cppool .rgw.root .rgw.root.new
ceph osd pool rename .rgw.root .rgw.root.old
ceph osd pool rename .rgw.root.new .rgw.root

使用rados导入导出

rados export --create testpool tmp_dir
rados import tmp_dir newpool

测试ceph的快照功能

# 写入一个文件
rados -p $poolname put $key $filepath

# 查看这个文件
rados -p $poolname ls

# 创建pool的快照
rados mksnap $snapname -p $poolname

# 查看pool的快照
rados lssnap -p $poolname

# 删除文件
rados -p $poolname rm $key

# 从快照里回滚文件
rados rollback -p $poolname $key $snapname

# 确认结果
rados -p $poolname ls

删除pool

ceph osd pool delete test-pool test-pool --yes-i-really-really-mean-it

重命名pool

ceph osd pool rename test-pool test-pool-new

设置pool

ceph osd pool set {pool-name} {key} {value}

查看pool内的对象

rados -p test-pool ls

将文件写入到pool

rados put objectkey /tmp/hello.txt -p xxxpool


ceph操作用户

创建admin账号

radosgw-admin user create --uid admin --display-name admin

"keys": [
	{
		"user": "admin",
		"access_key": "SANXG4YSL4ZBWSFH0N7E",
		"secret_key": "tVivvvslq5Ucw44f5UsNWkBwO0ktUAaSNtC7Db4Q"
	}
],

赋予user usage bucket读写权限

radosgw-admin caps add --uid=admin --caps="users=read,write;usage=read,write;buckets=read,write"

"caps": [
	{
		"type": "buckets",
		"perm": "*"
	},
	{
		"type": "usage",
		"perm": "*"
	},
	{
		"type": "users",
		"perm": "*"
	}
],

ceph升级避免rebalance
ceph osd set noout
ceph osd unset noout


删除osd

id=4
ceph osd out ${id}
ceph osd crush remove osd.${id}
ceph auth del osd.${id}
ceph osd down ${id}
ceph osd rm ${id}

调整crushmap,特别单机部署时,虚拟host使之不warn

# vi /etc/ceph/ceph.conf
[global]
osd_crush_update_on_start=false
crushmap导入导出

ceph osd getcrushmap -o {compiled-crushmap-filename}
crushtool -d {compiled-crushmap-filename} -o {decompiled-crushmap-filename}
crushtool -c {decompiled-crush-map-filename} -o {compiled-crush-map-filename}
ceph osd setcrushmap -i {compiled-crushmap-filename}
编辑模板,增加host

# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1
tunable chooseleaf_vary_r 1
tunable straw_calc_version 1

# devices
device 0 osd.0
device 1 osd.1

# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 region
type 10 root

# buckets
host sda {
        id -2           # do not change unnecessarily
        # weight 2.381
        alg straw
        hash 0  # rjenkins1
        item osd.0 weight 0.382
}
host sdc {
        id -3
        alg straw
        hash 0
        item osd.1 weight 1.999
}
root default {
        id -1           # do not change unnecessarily
        # weight 2.381
        alg straw
        hash 0  # rjenkins1
        item sda weight 0.382
        item sdc weight 1.999
}

# rules
rule replicated_ruleset {
        ruleset 0
        type replicated
        min_size 1
        max_size 10
        step take default
        step chooseleaf firstn 0 type host
        step emit
}

# end crush map

crushmap说明

http://docs.ceph.org.cn/rados/operations/crush-map/?highlight=crush


安装ceph推荐内核至少升级到3.18,因为内核3.18以后对krdb添加了一个重要特性: discard,这个特性可以根据块内文件的删除同步改变块的真实大小,从而节省磁盘空间

yum install ceph-common 就能使用rbd


ceph块存储相关

https://www.ibm.com/developerworks/cn/opensource/os-cn-ceph-rbd-docker-storage/index.html

go-ceph