背景

恰逢公司的存储服务(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-toolceph- 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的方式不太一样:

  1. Glance

上传下载镜像等时,需要新建一个调用 librbd 的 Client 来连接 Ceph集群。

  1. Cinder

创建删除云盘时,新建一个调用 librbd 的 Client 来连接 Ceph 集群。
挂载卸载云盘时,由Nova调用librbd来实现该操作。

  1. 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

参考文献

ceph doc - change ip

使用 BlueStore 时恢复 Ceph monitor 存储

从不健康的存储集群中移除 Ceph Monitor

Cephadm: Reusing OSDs on reinstalled server

Cephadm: Changing a Monitor’s IP address

Ceph修改mon ip地址

Ceph Network Change

Ceph - How to update the IP address or Port of the Ceph-dashboard

记一次机房搬迁引发的ceph改动

Ceph 集群整体迁移方案

如何更改基于rbd块设备的虚机的monitor ip


hongsong_wu
1 声望0 粉丝

linux&开源&分布式存储