|
Oepnstack之CEPH系列是根据Ceph Cookbook整理的笔记,分为以下几个部分:
1. 《Ceph简介》
2. 《Ceph集群操作》
3. 《Ceph块设备管理与Openstack配置》
4. 《深入Ceph》
5. 《ceph优化与性能测试》
**注意:此文对应ceph版本为10.1.2**
1
2
3
4
| ~~~bash
#ceph -v
ceph version 10.1.2(4a2a6f72640d6b74a3bbd92798bb913ed380dcd4)
~~~
|
Ceph集群的启动在Ceph集群搭建好了后,可以在某个节点的/etc/ceph/ceph.conf中编辑好集群配置,然后在这个节点来管理启动与停止。Cookbook中写了两种方式,加上我自己一个常用的,算是三种吧~
1、Sysvint的方式:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| ~~~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 <osd|mds|ceph-radosgw>
-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"。
1
2
3
4
5
| ~~~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方式,我们继续采用命令添加方式,操作系统识别到新硬盘后:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| ~~~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扩展之添加monmon节点的添加比较简单,要记住在生产环境中需要保持奇数个monitor节点,保证集群仲裁的中立性。
1
2
3
4
5
6
7
8
9
10
11
| ~~~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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| ~~~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的前提是保证有足够仲裁节点,步骤很简单
1
2
3
4
5
6
7
8
9
10
| ~~~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、发现故障
1
2
3
4
| ~~~bash
硬盘故障,osd盘会报down。
#ceph osd tree
~~~
|
注意:<span style="color:red">当一个osd盘处于down的状态时,集群数据不会立即发生变化,默认情况下,会等待5分钟判断osd是否不再up,从而标记该盘为out,然后开始数据同步。可以根据需要手动设置等待时间。</span>
2、找到出现down的盘,确认已发生故障,可以等待5分钟自动out也可以手动out此osd
1
2
3
| ~~~bash
#ceph osd out osd.5
~~~
|
3、接下来的步骤与上述删除osd相同,crush rm、osd rm等等。删除osd后,观察ceph -s,等待HEALTH_OK,集群数据同步完成。
<br>
4、拔出服务器故障硬盘,插入新硬盘,接下来步骤与添加osd盘相同。
集群维护标志位在我们上述的Ceph集群操作过程,Ceph对外的服务一直都没有中断,但在数据同步的过程不免有性能损失,因此在生产环境中做变更实施时,Ceph提供一些方法来维持当前运行状态,如设置标志位,然后在业务非高峰期取消标志位让其数据同步。
1、标志位设置1
2
3
| ~~~bash
#ceph osd set|unset <flag_name>
~~~
|
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
1
2
3
4
5
6
| ~~~bash
#ceph osd repair:修复特定osd
#ceph pg repair :修复特定PG,谨慎使用
#ceph pg scrub : 清理指定PG
#ceph deep-scrub:指定PG深度清理
~~~
|
|
|
|
|
|
|
|