09 Osd扩容与换盘
如果是新的OSD节点,则需要对新机器进行初始化配置,例如防火墙配置,ssh免密登录…
ceph-deploy osd create --data /dev/sdb osd-server-1
以上操作与集群创建时增加OSD的方法是一致的。
随着集群资源的不断增长,Ceph集群的空间可能会存在不够用的情况,因此需要对集群进行扩容,扩容通常包含两种:横向扩容和纵向扩容。横向扩容即增加台机器,纵向扩容即在单个节点上添加更多的OSD存储,以满足数据增长的需求,添加OSD的时候由于集群的状态(cluster map)已发生了改变,因此会涉及到数据的重分布(rebalancing),即 pool 的PGs数量是固定的,需要将PGs数平均的分摊到多个OSD节点上。

当OSD数量变更时,Monitor会更新osd map(cluster map),此时会自动触发pg的rebalancing,如果pg中含有大量的数据,此时会有较大的负载压力。建议增减OSD时,选择业务低峰期操作。此外,增减OSD时,建议不要一次性增减多个OSD,而是每次增减一个。
当在做rebalance的时候,每个osd都会按照osd_max_backfills指定数量的线程来同步,如果该数值比较大,同步会比较快,但是会影响部分性能;
另外数据同步时,是走的cluster_network,而客户端连接是用的public_network,生产环境建议这两个网络用万兆网络,较少网络传输的影响;
同样,为了避免业务繁忙时候rebalance带来的性能影响,可以对rebalance进行关闭;当业务比较小的时候,再打开。
此外,如果正在进行rebalance操作对业务产生影响,也可以使用该方式暂停rebalance。
#设置标志位(flag)
ceph osd set norebalance
ceph osd set nobackfill
#ceph osd set noout
#ceph osd set norecover
#ceph osd set noscrub
#ceph osd set nodeepscrub
#可以使用ceph -s查看cluster.health上面2个flag的状态。
#取消norebalance和nobackfill
ceph osd unset norebalance
ceph osd unset nobackfill
#ceph osd unset noout
#ceph osd unset norecover
#ceph osd unset noscrub
#ceph osd unset nodeepscrub
对于换盘,我们采用分步操作的方式进行更换件。
第一步:删除换盘的OSD
第二步:添加新的OSD
如何判断磁盘出现坏道?
此时的磁盘性能会比较差,可以使用如下命令进行延迟查看:
ceps osd perf
需要将其从群集中删除,以便Ceph可以开始重新平衡并将其数据复制到其他OSD。
ceph osd out {osd-num}
一旦将OSD从群集中out后,Ceph将开始重新平衡群集,将该OSD中的pg迁移到其他的OSD中。可以使用ceph -w命令观察此过程。
ceph -w #可以观察到集群的状态变化:active+clean(迁移前) --> active(迁移中) --> active+clean(迁移完)
将OSD从群集中out后,它可能仍在running(up状态)。也就是说,OSD处于up+out状态。从配置中删除OSD之前,必须先停止它。一旦OSD进程停止后,OSD会处于down+out状态。
ssh {osd-host}
sudo systemctl stop ceph-osd@{osd-num}
包含如下几个步骤:
从CRUSH map(cluster map)中删除OSD:
ceph osd crush remove {name}删除其身份验证密钥:
ceph auth del osd.{osd-num}从OSD map中删除OSD:
ceph osd rm {osd-num}以上3个步骤可以通过
ceph osd purge {id} --yes-i-really-mean-it一次完成。从ceph.conf文件中删除该OSD相关的session,并同步到其他节点
除了保证对象的多个副本之外,Ceph还通过检查pg来确保数据完整性。 Ceph清理类似于对象存储层上的fsck。对于每个放置组,Ceph都会生成所有对象的目录,并比较每个主要对象及其副本,以确保没有丢失或不匹配的对象。轻擦洗(每天)检查对象的大小和属性。深度清理(每周一次)读取数据并使用校验和以确保数据完整性。
scrub操作分为轻度scrub和deep-scrub。
scrub操作可以在多个层级上进行。比如osd、pg等。
除了默认的自动进行scrub操作外,我们也可以手动进行。
示例:对pg进行scrub
# 通过ceph pg dump获取pg的id
# 进行轻度scrub
[cephadm@node-1 ceph-cluster]$ ceph pg scrub 2.3f
instructing pg 2.3f on osd.1 to scrub
# 进行deep-scrub
[cephadm@node-1 ceph-cluster]$ ceph pg deep-scrub 2.3f
instructing pg 2.3f on osd.1 to deep-scrub
示例:对odd进行scrub
# 进行轻度scrub
[cephadm@node-1 ceph-cluster]$ ceph osd scrub osd.0
instructed osd(s) 0 to scrub
# 进行deep-scrub
[cephadm@node-1 ceph-cluster]$ ceph osd deep-scrub osd.0
instructed osd(s) 0 to deep-scrub