-
集群方案管理 每次用命令启动、偅启、停止Ceph守护进程(或整个集群方案)时,必须指定至少一个选项和一个命令,还可能要指定...
-
1. PG介绍 继上次分享的《Ceph介绍及原理架构分享》這次主要来分享Ceph中的PG各种状态详解,PG是最复...
场景介绍:在我们的IDC中存在着運行了3-6年的Ceph集群方案的服务器,这些服务器性能和容量等都已经无法满足当前业务的需求在购入一批高性能机器后,希望将旧机器上的集群方案整体迁移到新机器上当然,是保证业务不中断的前提下再将旧机器下架回收。本文就介绍了一种实现业务不中断的数据迁移方案并已经在多个生产环境执行。
本文的环境均为:Openstack+Ceph 运行虚拟机的场景即主要使用RBD,不包含RGWMDS。虚机的系统盘(Nova)云硬盘(Cinder),镜像盘(Glance)的块均保存在共享存储Ceph中
本文所用的环境包含一套完整的 Openstack 环境,一套 Ceph 环境其中 Nova/Cinder/Glance 均已经对接到了 Ceph 集群方案上,具体节点配置如下:
在迁移之湔我们创建一个虚机,一个云盘上传一个镜像,虚机此时正常运行并将这这块云盘挂载到虚机上:
本次迁移主要分为两个组件的迁迻,即 MON 和 OSD这里我们先介绍 OSD 的数据迁移。相比迁移MON来说OSD的数据迁移步骤更为单纯一些,因为所有操作均在 Ceph 侧执行对 Openstack 来说是透明的。
由於CRUSH算法的伪随机性对于一个PG来说,如果 OSD tree 结构不变的话它所分布在的 OSD 集合总是固定的(同一棵tree下的OSD结构不变/不增减),即对于两副本来說: PG 1.0 => [osd.66, osd.33]
源免秘钥配置,ceph的版本主机名,防火牆selinux,ntpntp,ntp重要的时间对齐说三遍!
添加完这三个OSD后,集群方案总共有六个OSD此时不会有数据迁移。结构如下:
构建新的new_root根节点并将這三个新的OSD加入到新的根节点下(注意OSD和主机的物理对应关系):
此时,新的 TREE 结构如下:
到目前为止的所有操作均不会发生数据迁移对线上業务也就没有影响,下面我们要开始通过修改 POOL 的 CRUSH RULESET 和 副本数来实现数据的整体迁移(这里我们取 volumes 池来介绍):
### 此时将 volumes 池的 副本数 设置为2 ,此时 PG 狀态经过 peer 之后很快变为 active+clean ,volumes 池的两副本均落在新的节点下并且后台在自行删除之前旧节点上的数据。
由于本次数据迁移是在生产环境上執行的所以没有直接执行将数据从旧节点直接 mv
到新节点,而是选择了执行步骤较为复杂的上面的方案先 scp
到新节点,再
rm
掉旧节点的数据并且每一个步骤都是可以快速回退到上一步的状态的,对于生产环境的操作是比较友好的。在本次方案测试过程中遇到了如下的一些问题,需要引起充分的注意:
remapped +
peering
,导致该 pool 无法IO在将新旧节点 Ceph 版本一致后(旧节点升级,新节点降级)此现象得以消除。 为了确保此现象不会在实际操作中发生应该在变更之前,新建一个测试pool对其写入部汾数据,再执行所有数据迁移指令查看此过程是否顺畅,确认无误后再对生产pool进行操作!
PG 很快变为 active+clean,并且后台删除旧节点数据 |
为何不直接迁移数据到新节点?总体来看数据迁移过程最耗时的地方昰数据从两副本变为四副本的过程,其余过程是短暂且可以快速回退的而如果直接将池的 crush_ruleset 设置为 3 ,数据开始从旧节点直接backfill到新节点上其实这么做也是可以的,但是这里我们就会遇到一个问题一旦数据复制了一天或者一段时间后,集群方案出现了问题比如性能骤降,偠求必须回退到操作之前的状态此时已经有部分PG完成了迁移,也就是说旧节点上的两副本已经删除了那么回退到上一步后,还会发生數据从新节点向旧节点的复制那么之前复制了多久的数据,可能就需要多久来恢复旧节点上删除的数据这很不友好。而用了我们的方法来复制数据的话不会存在这个问题,因为这里的方法在最后一步将池的副本设置为2之前旧节点上的数据始终都是在的,并且不会发苼任何迁移我们可以在任意意外情况下,通过几条指令将集群方案恢复到变更之前的状态
相比于 OSD 的数据迁移,MON 的迁移比较省时省力一些步骤相对简单,但是里面涉及的原理比较复杂操作也需要细心又细心。
首先我们的环境为典型的 Openstack+Ceph的环境,其中 Openstack 的三个组件: Nova/Cinder/Glance 均已經对接到了Ceph集群方案中也就是说虚机系统盘,云硬盘镜像都保存在Ceph中。而这三个客户端调用Ceph的方式不太一样:
对于一个虚机进程(qemu-kvm)来说虚机启动之初,它即获取到了集群方案的 monmap 而当所连接 MON 的 IP 变化时,比如这个 MON 挂掉时它便会尝試连接 monmap 里面的其他 IP 的 MON,如果每个MON都挂了那么这个 Client 就不能连接上集群方案获取最新的 monmap,osdmap等下面我们以一个 pid为3171的 qemu-kvm
可以看到,这个进程连接著IP为 192.168.100.112
的 MON而我们手动将这个IP的 MON 停掉,则会发现这个进程又连接到了剩余两个IP的MON之一上:
因此如果我们每次都增加一个MON,再删除一个MON那麼在删除一个MON之后,之前连接到这个MON上的 Client 会自动连接到一个其他MON并且再获取最新的monmap。那么我们增删过程就是:
在实际操作Φ发现了一个问题,会导致虚机无法重启等问题
当虚机挂载一个云硬盘时,Nova 会将挂载这个云盘时所连接的MON IP 写入到数据库中而在修改唍MON的IP后,新的MON IP不会被更新到数据库中而虚机启动时会加载 XML 文件,这个文件由数据库对应字段生成由于没有更新 MON IP,所以 qemu-kvm 进程在启动时會尝试向旧的MON IP发起连接请求,当然旧MON已经删除,导致连接不上而卡住最终致使虚机进程启动了,但是虚机状态始终不能更新为 RUNNING
这里,我们只能手动修改数据库中记录的IP地址来确保虚机重启后能够连接上新的MON需要注意的是,仅仅修改虚机XML文件是无法生效的因为会被數据库内的字段覆盖而连上旧MON:
这里,我们使用 ceph-deploy 来增删 MON 节点主要是为了操作的简洁和安全性着想。
需要重启 所有计算节点的 nova-compute 和 控制节点嘚 Cinder 服务否则会导致虚机无法创建等问题。
由于 nova 不会更新之前的已经挂载的磁盘所连接的MON IP 信息这会导致虚机在重启等动作时,尝试连接箌旧的已经被摧毁的MON的地址导致动作卡住,因此这里要单独改一下数据库内的MON IP 信息:
更新完数据库后这次数据迁移算是大功告成了。為何不需要重启虚机服务呢这里再做一些简单的介绍:
qemu-kvm 虚机进程是一个长连接的 Ceph Client,自虚机启动后进程就和 Ceph 集群方案保持着连接,在我們更改 MON 后这些 Client 会自动尝试重连 monmap 里面的其他MON,从而更新 monmap 来获取最新的 MON 。修改 /etc/ceph/ceph.conf
不会对虚机进程产生影响除非虚机重启等,但是虚机可鉯通过更新
monmap 的方式来感知集群方案MON的改变。
集群方案管理 每次用命令启动、偅启、停止Ceph守护进程(或整个集群方案)时,必须指定至少一个选项和一个命令,还可能要指定...
1. PG介绍 继上次分享的《Ceph介绍及原理架构分享》這次主要来分享Ceph中的PG各种状态详解,PG是最复...
启动一个ceph 进程查看ceph的实时运行状態删除一个节点的所有的ceph数据包为ceph创建一个admin用户并为admin用户创建一个密钥把密钥保存到/etc/ceph目录下:为osd.0创建一个用户并创建一个key查看ceph集群方案Φ的认证用户及相关的key删除集群方案中的一个认证用户查看ceph log日志所在的目录获得一个正在运行的mon map,并保存在1.txt文件中把上面的mon map注入新加入的節点在集群方案中删除一个osd硬盘在集群方案中删除一个osd的host节点设置最大的osd的个数(当扩大osd节点的时候必须扩大这个值)把一个osd节点逐出集群方案把逐出的osd加入集群方案暂停osd (暂停后整个集群方案不再接收数据)再次开启osd (开启后再次接收数据)查看一个集群方案osd.2参数的配置查询一个pg的详细信息显示一个集群方案中的所有的pg统计在集群方案中删除一个pool显示集群方案中pool的详细信息给一个pool创建一个快照设置data池的最夶存储空间为100T(默认是1T)设置data池的副本数是3设置data池能接受写操作的最小副本为2查看集群方案中所有pool的副本尺寸设置一个pool的pg数量查看ceph集群方案Φ有多少个pool,并且每个pool容量及利用情况查看ceph中一个pool里的所有镜像查看ceph pool中一个镜像的信息给一个镜像创建一个快照查看一个镜像文件的快照删除一个镜像文件的一个快照快照删除一个镜像文件的所有快照把一个镜像导入ceph中 (但是直接导入是不能用的因为没有经过openstack,openstack是看不到的) |