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深度清理 ~~~