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

LVM图

全手动启动一个OSD的步骤

添加 OSD

参考

http://blog.163.com/digoal@126/blog/static/163877040201411141846487/

  1. 为每个osd daemon生成osd uuid

[root@ceph02 osd]# uuidgen

24358ac7-9ce6-4274-be66-1b15c8f73d0c
  1. 从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
  1. 从mon节点获取集群配置文件 (配置文件中务必包含mon节点的信息)

如 :


mon initial members = mon1, mon2, mon3

mon host = 172.17.0.2, 172.17.0.3, 172.17.0.4
  1. 创建OSD daemon

例如 :


ceph osd create 24358ac7-9ce6-4274-be66-1b15c8f73d0c

8

# 该命令返回osd id.
  1. 为每个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
  1. 初始化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
  1. 注册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
  1. 添加bucket, 例如将新增的Ceph Node添加到CRUSH map(一个主机只需要添加一次).

ceph osd crush add-bucket {hostname} host

例如 :


ceph osd crush add-bucket osd1 host
  1. 添加ceph node到default root.

ceph osd crush move osd1 root=default
  1. 添加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
  1. 如果要使用sysv来管理服务, 务必在/var/lib/ceph/osd/{clustername}-{osd id}目录下添加两个空文件

例如


touch /var/lib/ceph/osd/ceph-1/sysvinit
  1. 启动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

results matching ""

    No results matching ""