OSD full/nearfull 的解决办法
1.问题
[root@ceph01 ~]# ceph -s
cluster 035701dd-27e3-4d4c-a6dc-e43bdb8a2264
health HEALTH_ERR
1 full osd(s)
4 near full osd(s)
monmap e3: 3 mons at {ceph01=192.168.0.64:6789/0,ceph02=192.168.0.65:6789/0,ceph03=192.168.0.66:6789/0}
election epoch 52, quorum 0,1,2 ceph01,ceph02,ceph03
osdmap e896: 6 osds: 6 up, 6 in
flags full
pgmap v182294: 272 pgs, 11 pools, 12319 MB data, 45787 objects
56216 MB used, 5163 MB / 61380 MB avail
272 active+clean
2.解决
2.0.根本之道
集群满了,说明空间不够用,因此添加OSD才是最终的出路,但是一旦集群有OSD达到full的级别,及时添加OSD,集群也不会进行数据平衡操作,因此先要能让集群动起来在根据实际情况选择添加OSD还是删除数据。
2.1.调整OSD的full比例
执行下面的命令调整OSD的full和nearfull的比例:
ceph tell osd.* injectargs '--mon-osd-full-ratio 98'
ceph tell osd.* injectargs '--mon-osd-full-ratio 0.98'
上面两个是最容易想到的,但是实际上调整这两个后并不能很好的解决我的这个问题,这个时候及时选择删除rbd以腾出空间依然弹出错误如下:
root@console:~/cluster# rbd rm volume-b0d3175b-7e74-4f71-aae5-39a53eda11ad
2016-04-08 08:56:27.911165 7f4cee0da7c0 0 client.104114.objecter FULL, paused modify 0x1cc3a60 tid 2
在回看我的场景,基本是所有的OSD的数据都满了,也就是说整个集群(包括pg和OSD)都是full的状态,因此还需要设置一个pg的full比例:
ceph pg set_full_ratio 0.98
此时再次执行删除rbd操作就会开始工作了,删除可能会比较慢
PS:不推荐的删除方式,先解挂所有rbd,再删除所有rbd,最后直接删除OSD数据目录下current目录下的所有文件。即使是这样,由于我的集群整个满了,删除都消耗了十几分钟。
3.扩展
对于只有部分OSD用量满的情况跟前面的处理方式有很大不同。当然,让集群能够动起来是最开始要做的事 ,这里的情况跟前面第二节介绍的方法还是要所有区别,尤其是对于线上环境,因为一旦调整这个全局的比例,可能整个集群的数据都会动起来,可能会有更多的数据迁移。因此另一种解决方法是临时调整、单个调整。但是,但是,但是,最最重要也是最先要解决的就是找到为什么只有少数OSD空间用量会满。
3.1.数据分布不均匀的原因
3.1.1.crushmap问题
出现这种问题的原因可能是你手动修改过crushmap,将某些OSD划到了单独的组;或者是数据分布规则设定有误等。这种情况就只能自己到处crushmap分析一下了。不好举例,有问题的欢迎沟通。
3.1.2.pg数设置不合理
这个是目前我遇到的最主要的一种坑。ceph的数据存储结构应该都很容易查到。就是 file->object->pg->OSD->physics disk 。因此,一旦这里的pg数设置过小,pg到OSD的映射不均匀就会造成OSD上分配到的数据不均匀。这种额解决方法就是重新调整 pg_num 和 pgp_num 。有关调整这部分的工作和注意事项等见我的另一篇博文:调整pg数量的步骤
有一个python程序可以看各个pool在各个OSD上的pg分布,由此可以判断一下pg是否分布均匀。进而使用上面的方法调整该pool的pg_num和pgp_num。
3.2.调整OSD的weight
对于只是少数OSD容量满的情况下,不管是上一小节中的调整crushmap还是pg_num的方法解决,最首先也还是需要集群能够进行正常读写操作,因此可以设置单个OSD的full和nearfull比例,也可以使用调整weight的方法。
关于一个OSD的weght,一共有两种:
一种就是在crush自动设置的weight,这个值是根据OSD所在硬盘空间大小算出来的,1T的硬盘可用空间,这个值为1.
另一种就是人为添加的用以表示数据分布权重值的 reweight,这个值介于0-1之间,越小表示分布权重越低。
两种weoght都可以在命令
```ceph osd ree
中看到,如下:
```bash
root@node1:~# ceph osd tree
id weight type name up/down reweight
-1 13.65 root default
-2 2.73 host node1
0 2.73 osd.0 up 1
-3 2.73 host node2
1 2.73 osd.1 up 1
-4 2.73 host node3
2 2.73 osd.2 up 1
-5 2.73 host node4
3 2.73 osd.3 up 1
-6 2.73 host node5
4 2.73 osd.4 up 1
从上面的额输出来看,第二列的weight就是crush根据硬盘可用容量计算出来的,最后一列的reweight就是这个OSD的数据分布权重。这里我们应对某一个OSD满的另一种方法就是调整reweight,以降低数据在该OSD上的分布,调整的效果可以看看这个博文,此文ceph中国论坛有翻译稿
ceph提供有自动调节reweight的工具:
ceph osd reweight-by-utilization
实战
Error when:
ceph-deploy osd activate ceph03:/srv/ceph/osd3
[ceph03][ERROR ] RuntimeError: command returned non-zero exit status: 1
[ceph_deploy][ERROR ] RuntimeError: Failed to execute command: ceph-disk -v activate --mark-init sysvinit --mount /srv/ceph/osd3
3、准备两个块设备(可以是硬盘也可以是LVM卷),这里我们使用LVM
3.1 sudo apt-get -y install lvm2 gdisk
sudo apt-get install xfsprogs
dd if=/dev/zero of=ceph-volumes.img bs=1M count=8192 oflag=direct
sgdisk -g --clear ceph-volumes.img
sudo vgcreate ceph-volumes $(sudo losetup --show -f ceph-volumes.img) //创建VG
sudo lvcreate -L2G -nceph0 ceph-volumes //创建逻辑卷
sudo lvcreate -L2G -nceph1 ceph-volumes
sudo mkfs.xfs -f /dev/ceph-volumes/ceph0 //格式化新创建的卷
sudo mkfs.xfs -f /dev/ceph-volumes/ceph1
mkdir -p /srv/ceph/{osd0,osd1,mon0,mds0}
sudo mount /dev/ceph-volumes/ceph0 /srv/ceph/osd0 //挂载文件
sudo mount /dev/ceph-volumes/ceph1 /srv/ceph/osd1
###其它操作
[root@Gong-Computer ~]# lvextend -L +1G /dev/ceph-volumes/ceph0 ---扩展逻辑卷大小
Extending logical volume lvol0 to 3.00 GiB
Logical volume lvol0 successfully resized
[root@Gong-Computer ~]# resize2fs -f /dev/mylvmvg/lvol0 ---调整文件系统的大小
##显示:vgdisplay pvdisplay vgscan
#
#
删除逻辑卷的处理按照相反的操作进行。
[root@Gong-Computer ~]# umount /mnt/nfs/
[root@Gong-Computer ~]# lvremove /dev/mylvmvg/lvol0 --删除逻辑卷
Can't remove open logical volume "lvol0"
[root@Gong-Computer ~]# lvremove /dev/mylvmvg/lvol0
Do you really want to remove active logical volume lvol0? [y/n]: y
Logical volume "lvol0" successfully removed
[root@Gong-Computer ~]# pvremove /dev/sdf --删除pv
Labels on physical volume "/dev/sdf" successfully wiped
全手动启动一个OSD的步骤
添加 OSD
参考
http://blog.163.com/digoal@126/blog/static/163877040201411141846487/
- 为每个osd daemon生成osd uuid
[root@ceph02 osd]# uuidgen
24358ac7-9ce6-4274-be66-1b15c8f73d0c
- 从mon节点获取KEY, 拷贝到osd节点的/etc/ceph目录下.
[root@mon2 ~]# cd /etc/ceph/
[root@mon2 ceph]# ll
total 12
-rw------- 1 root root 63 Dec 9 15:47 ceph.client.admin.keyring
-rw-r--r-- 1 root root 529 Dec 9 15:46 ceph.conf
- 从mon节点获取集群配置文件 (配置文件中务必包含mon节点的信息)
如 :
mon initial members = mon1, mon2, mon3
mon host = 172.17.0.2, 172.17.0.3, 172.17.0.4
- 创建OSD daemon
例如 :
ceph osd create 24358ac7-9ce6-4274-be66-1b15c8f73d0c
8
# 该命令返回osd id.
- 为每个OSD daemon创建OSD数据目录和journal所在目录. (建议分开物理块设备存储)
数据目录软链接指向 /var/lib/ceph/osd/{clustername}-{id}
journal软链接指向 /var/lib/ceph/osd/{clustername}-{id}/journal
如不做以上软链接, 不能使用/etc/init.d/ceph来管理osd服务, 那么就需要手工启动ceph-osd了.
ln -s /srv/ceph/osd3 /var/lib/ceph/osd/ceph-8
- 初始化osd 数据目录
ceph-osd -i {osd-num} --mkfs --mkkey --osd-uuid [{uuid}] --cluster {cluster_name}
例如
[root@ceph02 ceph-8]# ceph-osd -i 8 --mkfs --mkkey --osd-uuid 24358ac7-9ce6-4274-be66-1b15c8f73d0c --cluster ceph --osd-data=/srv/ceph/osd3
2016-07-15 14:16:43.189050 7f91d2664880 -1 journal FileJournal::_open: disabling aio for non-block journal. Use journal_force_aio to force use of aio anyway
2016-07-15 14:16:45.296973 7f91d2664880 -1 journal FileJournal::_open: disabling aio for non-block journal. Use journal_force_aio to force use of aio anyway
2016-07-15 14:16:45.297956 7f91d2664880 -1 filestore(/srv/ceph/osd3) could not find 23c2fcde/osd_superblock/0//-1 in index: (2) No such file or directory
2016-07-15 14:16:50.095979 7f91d2664880 -1 created object store /srv/ceph/osd3 journal /var/lib/ceph/osd/ceph-8/journal for osd.8 fsid 035701dd-27e3-4d4c-a6dc-e43bdb8a2264
2016-07-15 14:16:50.096087 7f91d2664880 -1 auth: error reading file: /srv/ceph/osd3/keyring: can't open /srv/ceph/osd3/keyring: (2) No such file or directory
2016-07-15 14:16:50.096461 7f91d2664880 -1 created new key in keyring /srv/ceph/osd3/keyring
ceph-osd -i 1 --mkfs --mkjournal --mkkey --osd-uuid 854777b2-c188-4509-9df4-02f57bd17e12 --cluster ceph --osd-data=/data01/ceph/osd/ceph-1 --osd-journal=/data01/ceph/osd/ceph-1/journal
- 注册OSD认证key
ceph auth add osd.{osd-num} osd 'allow *' mon 'allow profile osd' -i /var/lib/ceph/osd/ceph-{osd-num}/keyring
例如
# ceph auth add osd.1 osd 'allow *' mon 'allow profile osd' -i /data01/ceph/osd/ceph-1/keyring
added key for osd.1
- 添加bucket, 例如将新增的Ceph Node添加到CRUSH map(一个主机只需要添加一次).
ceph osd crush add-bucket {hostname} host
例如 :
ceph osd crush add-bucket osd1 host
- 添加ceph node到default root.
ceph osd crush move osd1 root=default
- 添加osd daemon到对应主机的bucket. 同样是修改crush map. (如果一台主机有多个osd daemon, 每个osd daemon都要添加到对应的bucket)
ceph osd crush add osd.{osd_num}|{id-or-name} {weight} [{bucket-type}={bucket-name} ...]
例如
ceph osd crush add osd.1 1.0 host=osd1
- 如果要使用sysv来管理服务, 务必在/var/lib/ceph/osd/{clustername}-{osd id}目录下添加两个空文件
例如
touch /var/lib/ceph/osd/ceph-1/sysvinit
- 启动osd daemon
例如 :
使用sysv启动
service ceph start osd.1
或手工启动
/usr/bin/ceph-osd -i 1 --pid-file /var/run/ceph/osd.1.pid -c /etc/ceph/ceph.conf --cluster ceph --osd-data=/data01/ceph/osd/ceph
这种方式支持指定数据目录, journal文件.
[root@osd2 ~]# ceph-osd -h
--conf/-c FILE read configuration from the given configuration file
--id/-i ID set ID portion of my name
--name/-n TYPE.ID set name
--cluster NAME set cluster name (default: ceph)
--version show version and quit
-d run in foreground, log to stderr.
-f run in foreground, log to usual location.
--debug_ms N set message debug level (e.g. 1)
2014-12-09 17:08:50.233420 7ff77aff6880 -1 usage: ceph-osd -i osdid [--osd-data=path] [--osd-journal=path] [--mkfs] [--mkjournal] [--convert-filestore]
2014-12-09 17:08:50.233423 7ff77aff6880 -1 --debug_osd N set debug level (e.g. 10)
``: http://blog.chinaunix.net/attachment/201509/8/20937170_1441719385a18B.png