背景
恰逢公司的存储服务(Ceph\&Curve)要迁移到新的机房,因此对Ceph的集群迁移进行了一些学习与整理,从ceph的集群迁移中学习一些经验,防止踩坑。
Ceph的迁移可以分为离线迁移以及在线迁移(业务不中断),这里会分别进行介绍。
离线迁移[服务器搬迁]
ceph mon节点迁移
有时可能需要将ceph存储整机移动到不同的网络、数据中心的不同部分或完全不同的数据中心,甚至于新机房和老机房的网络都不是互通的,那么就需要使用离线迁移了。
离线迁移主要涉及到的就是mon节点的改变。
解决方案是为集群中的所有mon生成具有新IP地址的新 monmap,并将新映射注入每个单独的mon
- 获取集群当前monmap(搬迁前进行)
获取集群monmap这里又分为三种情况:Ceph mon能够形成仲裁;Ceph mon不能形成仲裁待至少有一个存活;所有的Ceph mon都已经损坏了。
如果剩余的 Ceph mon能够形成仲裁(多数存活),请使用 ceph mon getmap 命令获取 Ceph monitor map:
ceph mon getmap -o /tmp/monmap
如果此时ceph的mon已经不能够形成仲裁了(多数mon挂了),那么在健康的正确的mon机器上通过如下步骤获取monmap
// 停止您要复制 Ceph monitor map 的 Ceph 监控器
[root@mon ~]# systemctl stop ceph-mon@<host-name>
// 获得ceph monmap
[root@mon ~]# ceph-mon -i ID --extract-monmap /tmp/monmap
如果很不走运,所有的mon都损坏了,那么还有没有什么办法获取到集群的monmap,以至于恢复整个集群呢?
当然,也是有的,可以借助ceph-monstore-tool
和 ceph- objectstore-tool
这两个实用程序,通过 OSD 节点上存储的信息来恢复它,具体详情请参考: 使用 BlueStore 时恢复 Ceph monitor 存储
- 删除临时monmap中的老的mon
# monmaptool --rm node1 --rm node2 --rm node3 /tmp/monmap
monmaptool: monmap file /tmp/monmap
monmaptool: removing node1
monmaptool: removing node2
monmaptool: removing node3
monmaptool: writing epoch 1 to /tmp/monmap (0 monitors)
- 向临时monmap中添加新的mon
# monmaptool --add node1 192.168.244.44 --add node2 192.168.244.45 --add node3 192.168.244.46 /tmp/monmap
monmaptool: monmap file /tmp/monmap
monmaptool: writing epoch 1 to /tmp/monmap (3 monitors)
- 停止所有mon服务并注入monmap
首先要先确保新的mon已经在新的服务器上安装起来了,然后stop掉mon进程,每个mon新节点都要执行
ceph-mon -i {mon-id} --inject-monmap /tmp/monmap
- 更新所有服务(mon,mds,client,mgr,osd等)的ceph.conf
这里需要注意的是如果新ip的网段也有变化的话,那么除了要更新ceph.conf文件中mon\_host信息,还要更新public network/cluster network的网段信息
同步的话可以通过ceph-deploy命令
ceph-deploy --overwrite-conf config push node{1..3}
关于上层服务
使用ceph底层存储的服务可能有虚拟机,k8s集群,如果ceph存储搬迁机房了,还需要服务之前的老的客户端,那么他们也需要做相应的变更
- ceph文件系统直接挂载+rbd挂载
直接把新的ceph.conf同步到client节点就可以
- k8s集群
对于Kubenetes集群,更新rook-ceph-mon-endpoints配置映射
kubectl -n rook-ceph create configmap rook-ceph-mon-endpoints \
--from-literal=data="mon.ceph-mon=172.25.65.17:6789" \
--from-literal=mapping="{}" \
--from-literal=maxMonId="2"
- openstack
Openstack 的三个组件: Nova/Cinder/Glance 均已经对接到了Ceph集群中,也就是说虚机系统盘,云硬盘,镜像都保存在Ceph中。而这三个客户端调用Ceph的方式不太一样:
- Glance
上传下载镜像等时,需要新建一个调用 librbd 的 Client 来连接 Ceph集群。
- Cinder
创建删除云盘时,新建一个调用 librbd 的 Client 来连接 Ceph 集群。
挂载卸载云盘时,由Nova调用librbd来实现该操作。
- Nova
虚机(qemu-kvm进程)相当于一个始终在调用librbd的Client,并且进程始终都在。
当虚机挂载一个云硬盘时,Nova 会将挂载这个云盘时所连接的MON IP 写入到数据库中,而在修改完MON的IP后,新的MON IP不会被更新到数据库中,而虚机启动时会加载 XML 文件,这个文件由数据库对应字段生成,由于没有更新 MON IP,所以 qemu-kvm 进程在启动时,会尝试向旧的MON IP发起连接请求,当然,旧MON已经删除,导致连接不上而卡住,最终致使虚机进程启动了,但是虚机状态始终不能更新为 RUNNING。
我们只能手动修改数据库中记录的IP地址来确保虚机重启后能够连接上新的MON,需要注意的是,仅仅修改虚机XML文件是无法生效的,因为会被数据库内的字段覆盖而连上旧MON:
### 具体字段为:
mysql =>
nova => block_device_mapping => connection_info
*************************** 23. row ***************************
created_at: 2018-03-19 08:50:59
updated_at: 2018-03-26 06:32:06
deleted_at: 2018-03-26 09:20:02
id: 29
device_name: /dev/vdb
delete_on_termination: 0
snapshot_id: NULL
volume_id: 39c76d96-0f95-490c-b7db-b3da6d17331b
volume_size: NULL
no_device: NULL
connection_info: {"driver_volume_type": "rbd", "serial": "39c76d96-0f95-490c-b7db-b3da6d17331b", "data": {"secret_type": "ceph", "name": "volumes/volume-39c76d96-0f95-490c-b7db-b3da6d17331b", "secret_uuid": "0668cc5e-7145-4b27-8c83-6c28e1353e83", "qos_specs": null, "hosts": ["192.168.100.110", "192.168.100.111", "192.168.100.112"], "auth_enabled": true, "access_mode": "rw", "auth_username": "cinder", "ports": ["6789", "6789", "6789"]}}
instance_uuid: 4f52191f-9645-448f-977b-80ca515387f7
deleted: 29
source_type: volume
destination_type: volume
guest_format: NULL
device_type: disk
disk_bus: virtio
boot_index: NULL
image_id: NULL
Glance & Cinder & Nova 服务重启
另外,无需重启 Glance 服务。需要重启 所有计算节点的 nova-compute 和 控制节点的 Cinder 服务,否则会导致虚机无法创建等问题。
在线迁移
在线迁移的话就是不停服的情况下切换存储集群,这其中有2个必要条件就是两个机房的机房需要网络互通,并且网段要基本一致(当然也可以放宽掩码范围)。
mon的迁移
由于网络是互通的,所以可以通过以下步骤进行迁移:
- 先添加加3个新mon
- 更新ceph.conf并同步到相关服务
当前集群已经有6个mon,先确保集群已经health\_ok,再进行后续操作。
把ceph.conf中的3个老mon换成新的mon,并把ceph.conf同步到相关服务(同上一节)。
- 删除老的mon
一定要在删除老的mon之前进行ceph.conf的修改以及同步,要不然删除了老的mon以后,由于老的服务联系的都是老mon,所以会导致服务失效
数据的迁移
存储数据的在线迁移可以通过迁移逻辑池来完成,步骤如下:
- 新的服务器上创建好osd以及rule\_set(new\_rule\_set)
- 更改逻辑pool的rule\_set为上述步骤创建的new\_rule\_set
sudo ceph osd pool set poolname crush_rule new_rule_set
一些要点
- Ceph配置文件ceph.conf除了要修改ip,还要检查对应的网段是否有变化,如有,也需要变更
- 若是服务器搬迁,节点hosts文件需要修改,ip变了hosts文件的内容也要改变;并且禁用所有ceph相关进程的开机启动
- 部署前要确认为新机房服务器的网络(时延,带宽,防火墙),ntp时钟以及硬盘等是否正常
- osd\_crush\_update\_on\_start一定要配置成false
- 在线迁移时需要在删除新mon之前更新并同步ceph.conf
参考文献
使用 BlueStore 时恢复 Ceph monitor 存储
Cephadm: Reusing OSDs on reinstalled server
Cephadm: Changing a Monitor’s IP address
Ceph - How to update the IP address or Port of the Ceph-dashboard
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。