Oepnstack之CEPH系列是根据Ceph Cookbook整理的笔记,分为以下几个部分:

1. 《Ceph简介》

2. 《Ceph集群操作》

3. 《Ceph块设备管理与Openstack配置》

4. 《深入Ceph》

5. 《ceph优化与性能测试》


**注意:此文对应ceph版本为10.1.2**

~~~bash
#ceph -v
ceph version 10.1.2(4a2a6f72640d6b74a3bbd92798bb913ed380dcd4)
~~~

Ceph集群的启动

在Ceph集群搭建好了后,可以在某个节点的/etc/ceph/ceph.conf中编辑好集群配置,然后在这个节点来管理启动与停止。Cookbook中写了两种方式,加上我自己一个常用的,算是三种吧~


1、Sysvint的方式:

~~~bash
将整个集群启动或停止
# /etc/init.d/ceph  -a start|stop
 
启动本节点的monitor进程
# /etc/init.d/ceph start mon
启动所有节点的monitor进程。
# /etc/init.d/ceph -a start mon
类似还有:
# /etc/init.d/ceph  [-a]  start|stop  
-a 代表启动ceph.conf中所有主机
还可以单独启动或停止某一个守护进程的实例:
起停ceph-host1上mon进程
# /etc/init.d/ceph start|stop mon.ceph-host1
起停osd.1的守护进程,如果osd.1不在本机则需要加-a参数,其他同理。
# /etc/init.d/ceph start|stop osd.1
~~~

2、Linux service命令方式:

其实没什么特别的,只是把"/etc/init.d/ceph" 换成了"service ceph",后面的都一样。

3、命令方式:

 我目前在用的,使用"/usr/bin/ceph-mon"、"/usr/bin/ceph-osd"。

~~~bash
 #/usr/bin/ceph-mon -i a|b|c
 #/usr/bin/ceph-osd -i  0|1|2|3....
 #a、b、c对应mon中的id,0、1、2、3对应osd中的id
~~~

 使用命令来启动守护进程,这样做的后果是要在每台机都手动执行,我的方法是写在/etc/rc.local里面,暂时还没研究和前面两种有什么区别,从启动的进程来看,service启动是"/usr/bin/python /usr/sbin/ceph-create-keys --cluster ceph -i a",而命令启动则很简单"/usr/bin/ceph-mon -i a"。

Ceph集群扩展与缩小

传统的向上扩展(Scale-up)采用的是堆加硬盘的方式,到了一定规模的存储容量后,会受到自身的控制器,计算性能无法提升等影响。而ceph采用的横向扩展(Scale-out)方式,会将CPU、内存等其他资源一同加入集群,因此而线性提升性能。

PS:好久没接触传统存储了,但印象中EMC、IBM的高端存储似乎都有横向扩展,线性增加性能的解决方案,也都提出了软件定义存储的概念,这个感觉像是CEPH在吹牛啊。。


1、Ceph扩展之添加osd

书上采用ceph-deploy方式,我们继续采用命令添加方式,操作系统识别到新硬盘后:

~~~bash
创建osd ID,会返回当前已有的osd个数+1
#ceph osd create
10
创建挂载点
#mkdir -p /var/lib/ceph/osd/ceph-10
#格式化新硬盘
# mkfs.xfs /dev/sdg
挂载硬盘
# mount  -o inode64,noatime /dev/sdg /var/lib/ceph/osd/ceph-10
格式化osd
# ceph-osd -i 10 --mkfs 
设置该osd的位置与权重,host对应当前主机
#ceph osd crush add osd.10 root=default rack=unknowrack host=ceph-host10
启动守护进程
# ceph-osd  -i 10
查看状态,可以看到该osd是否加入和数据同步
#ceph osd tree
#ceph -w
~~~

2、Ceph扩展之添加mon

mon节点的添加比较简单,要记住在生产环境中需要保持奇数个monitor节点,保证集群仲裁的中立性。

~~~bash
创建挂载点
#mkdir -p /var/lib/ceph/mon/ceph-d
格式化mon
ceph-mon -i d --mkfs  --fsid   $CLUSTER-ID
cluster-id通过ceph -s查看,其实也是创建第一个mon节点时的uuid
启动守护进程
#ceph-mon -i d
查看状态
#ceph -s
~~~

3、Ceph缩小之移除osd

在移除osd前,先ceph -s确认集群状态正常,以及移除后空间是否足够。

移除osd步骤为:


- 将osd盘out,当osd盘为out状态时,该osd盘会停止提供服务,并将所存数据转移到其他盘。

- 将osd盘down

- 将osd盘从crush中rm

- 将osd盘密钥del

- 将osd从osd tree中rm

~~~bash
将osd.10移除集群,使用ceph -w查看数据转移,观察osdmap,up数量不变,in个数-1
#ceph osd  out osd.10
停止osd.10守护进程,使用ceph osd tree确认状态
#service stop osd.10
或者
#ps -ef |grep osd,查找进程然后kill
从crush map中删除,使用ceph -s查看osdmap,up和in的数量-1
#ceph osd crush remove osd.10
删除验证密钥
# ceph auth del osd.10
删除osd盘,使用ceph -s查看osdmap数量-1
ceph osd rm osd.10
如果该主机上osd都被清楚,也可以在crush map中移除主机信息,同上crush移除命令
ceph osd crush remove ceph-host10
~~~

4、Ceph缩小之移除mon

移除mon的前提是保证有足够仲裁节点,步骤很简单

~~~bash
停止Monitor守护进程
#ps -ef |grep mon
# kill -9 $PID
删除对应目录,或是备份移走
#rm -rf /var/lib/ceph/mon/mon-d
检查仲裁状态,检查monitor状态
# ceph quorum_status --format json-pretty
# ceph mon stat
~~~

Ceph集群故障维护

Ceph集群的维护分为两个部分,OSD故障处理,设置集群状态标志位

OSD故障磁盘处理

场景:当ceph集群中某块硬盘出现故障时,修要进行替换与修复。

1、发现故障

~~~bash
硬盘故障,osd盘会报down。
#ceph osd tree
~~~

注意:当一个osd盘处于down的状态时,集群数据不会立即发生变化,默认情况下,会等待5分钟判断osd是否不再up,从而标记该盘为out,然后开始数据同步。可以根据需要手动设置等待时间。

2、找到出现down的盘,确认已发生故障,可以等待5分钟自动out也可以手动out此osd

~~~bash
#ceph osd out osd.5
~~~

3、接下来的步骤与上述删除osd相同,crush rm、osd rm等等。删除osd后,观察ceph -s,等待HEALTH_OK,集群数据同步完成。


4、拔出服务器故障硬盘,插入新硬盘,接下来步骤与添加osd盘相同。


集群维护标志位

在我们上述的Ceph集群操作过程,Ceph对外的服务一直都没有中断,但在数据同步的过程不免有性能损失,因此在生产环境中做变更实施时,Ceph提供一些方法来维持当前运行状态,如设置标志位,然后在业务非高峰期取消标志位让其数据同步。

1、标志位设置

~~~bash
#ceph osd set|unset 
~~~

ceph提供的标志位列表:


  • noout:无论当前osd状态如何,ceph集群不会将任何osd标记为out

  • nodown:无论当前osd状态如何,ceph集群不会将任何osd标记为down

  • noup:ceph集群不会将任何已经DOWN的osd标记为UP状态

  • noin:ceph集群不允许新的osd加入集群,在一次添加多个osd而不想让其自动加入集群非常游泳

  • norecover: ceph集群不做集群恢复(cluster recovery)

  • nobackfill:ceph集群不做数据回填(backfilling)

  • norebalance:ceph集群不做集群再平衡(cluster rebalancing)

  • noscrub :ceph集群不做osd清理(scrubbing)

  • nodeep-scrub:ceph集群不做osd深度清理(deep-scrubbing)

  • notieragent:禁用缓存分层代理(cache pool tiering agent)


除了以上标志位,还有ceph命令来修复osd和pg

~~~bash
#ceph osd repair:修复特定osd
#ceph pg repair :修复特定PG,谨慎使用
#ceph pg scrub : 清理指定PG
#ceph deep-scrub:指定PG深度清理
~~~