在繁忙的项目中与Ceph合作的提示和技巧



在不同的工作负载项目中使用Ceph作为网络存储,我们可能会遇到乍一看似乎并不简单或琐碎的各种任务。例如:

  • 从旧的Ceph到新的数据迁移,部分使用新集群中的先前服务器;
  • Ceph中磁盘空间分配问题的解决方案。

处理此类任务时,我们面临着正确提取OSD而又不丢失数据的需求,这对于大量数据尤其如此。这将在本文中讨论。

下述方法与任何版本的Ceph有关。此外,还将考虑到大量数据可以存储在Ceph中的事实:为了防止数据丢失和其他问题,某些操作将被“拆分”为其他几个操作。

OSD前言


由于正在考虑的三个配方中有两个是专用于OSD(对象存储守护程序)的,因此在进入实际部分之前-简要介绍一下Ceph中的含义以及为什么它如此重要。

首先,应该说整个Ceph集群由许多OSD组成。数量越多,Ceph中的可用数据量就越大。从这里可以轻松了解OSD主要功能:它将Ceph对象数据保存在所有群集节点的文件系统上,并提供对它们的网络访问权限(用于读取,写入和其他请求)。

在同一级别,通过在不同OSD之间复制对象来设置复制参数。在这里您会遇到各种问题,稍后将讨论其解决方案。

案号1。从Ceph集群安全地检索OSD,而不会丢失数据


删除OSD的原因可能是服务器从群集中退出(例如,用另一台服务器替换它),这种情况是我们发生的,从而引起了本文的撰写。因此,操纵的最终目标是提取给定服务器上的所有OSD和货币,以便可以将其停止。

为了方便起见,并消除了在执行命令的过程中会错误指出必需的OSD的情况,我们将设置一个单独的变量,其值将是要删除的OSD的编号。我们将其称为${ID}-在下文中,这样的变量将代替我们使用的OSD号。

在开始工作之前,让我们看一下情况:

root@hv-1 ~ # ceph osd tree
ID CLASS WEIGHT  TYPE NAME      STATUS REWEIGHT PRI-AFF
-1       0.46857 root default
-3       0.15619      host hv-1
-5       0.15619      host hv-2
 1   ssd 0.15619      osd.1     up     1.00000  1.00000
-7       0.15619      host hv-3
 2   ssd 0.15619      osd.2     up     1.00000  1.00000

要开始删除OSD,您需要reweight在其上平稳执行到零。因此,我们通过与其他OSD平衡来减少OSD中的数据量。为此,执行以下命令:

ceph osd reweight osd.${ID} 0.98
ceph osd reweight osd.${ID} 0.88
ceph osd reweight osd.${ID} 0.78

...以此类推为零。

更新:这篇文章的评论用norebalance+ 讲述了该方法backfill。该解决方案是正确的,但是首先您需要查看这种情况,因为norebalance我们在不希望任何OSD引起网络负载时使用它。osd_max_backfill在需要限制重新平衡速度的情况下使用。结果,重新平衡将变慢并且导致较少的网络负载。为了避免丢失数据,

必须进行平稳的平衡。如果OSD包含大量数据,则尤其如此。为了确保在执行命令后reweight一切都成功,您可以执行它,也可以ceph -s在单独的终端窗口中运行ceph -w为了实时观察变化。

OSD为“空”时,可以开始标准操作以将其删除。为此,将所需的OSD置于状态down

ceph osd down osd.${ID}

从群集中“拉出” OSD:

ceph osd out osd.${ID}

停止OSD服务并在FS中卸载其分区:

systemctl stop ceph-osd@${ID}
umount /var/lib/ceph/osd/ceph-${ID}

CRUSH映射中删除OSD

ceph osd crush remove osd.${ID}

删除OSD用户:

ceph auth del osd.${ID}

最后,删除OSD本身:

ceph osd rm osd.${ID}

注意:如果您使用的是Ceph Luminous或更高版本,则删除OSD的上述步骤可以简化为两个命令:

ceph osd out osd.${ID}
ceph osd purge osd.${ID}

在执行上述步骤之后,如果执行了该命令ceph osd tree,则应该看到执行工作的服务器不再具有执行了上述操作的OSD:

root@hv-1 ~ # ceph osd tree
ID CLASS WEIGHT  TYPE NAME     STATUS REWEIGHT PRI-AFF
-1       0.46857      root default
-3       0.15619      host hv-1
-5       0.15619      host hv-2
-7       0.15619      host hv-3
 2   ssd 0.15619      osd.2    up     1.00000  1.00000

在此过程中,我们注意到Ceph集群的状态将进入HEALTH_WARN,并且OSD的数量和可用磁盘空间的数量也会减少。

接下来,将描述如果您要完全停止服务器,并因此将其从Ceph中删除,将需要执行的步骤。在这种情况下,请务必记住,在关闭服务器之前,必须提取该服务器上的所有OSD

如果此服务器上没有剩余的OSD,则在卸下它们后,需要通过hv-2运行以下命令将服务器从OSD卡中排除

ceph osd crush rm hv-2

我们通过在另一台服务器(即本例中的on 上运行以下命令,将其mon从服务器中删除hv-2hv-1

ceph-deploy mon destroy hv-2

之后,您可以停止服务器并继续执行后续操作(重新部署服务器等)。

案号2。已经创建的Ceph集群中的磁盘空间分配


第二个故事以有关PG(布置组的序言开始PG在Ceph中的主要作用主要是Ceph对象的聚集以及OSD中的进一步复制。 Ceph文档相应部分中,可以找到用于计算所需PG数量的公式在同一地方,还通过具体示例分析了此问题。

因此:Ceph操作过程中的常见问题之一是Ceph中的池之间OSD和PG的数量不平衡。通常,正确选择PG的值是群集可靠运行的关键,然后我们将考虑相反情况下可能发生的情况。

选择适量的PG的困难在于两点:

  1. PG, , , chunk'.
  2. , , PG, .

实际上,会遇到一个更严重的问题:其中一个OSD中发生数据溢出。原因是Ceph在计算可用数据量(您可以MAX AVAILceph df每个池的命令输出中分别找到它)时,依赖于OSD中的可用数据量。如果至少一个OSD中没有足够的空间,则在所有OSD之间正确分配数据之前,无法写入更多数据。

值得澄清的是,这些问题在Ceph集群的配置阶段已基本解决。您可以使用的一种工具是Ceph PGCalc。借助它,可以直观地计算出必需的PG量。但是,您可以在Ceph集群已经存在的情况下使用它配置不正确。在此需要说明的是,作为更正工作的一部分,您很可能需要减少PG的数量,并且该功能在较旧的Ceph版本中不可用(仅从Nautilus版本出现)。

因此,让我们想象一下下图:HEALTH_WARN由于OSD之一中位置的结束,群集的状态。一个错误将证明这一点HEALTH_WARN: 1 near full osd。下面是克服这种情况的算法。

首先,您需要在OSD的其余部分之间分发可用数据。在第一种情况下,当我们“排干”结时,我们已经执行了类似的操作-现在唯一的区别是需要稍微减小reweight。例如,在0.95之前:

ceph osd reweight osd.${ID} 0.95

这样可以释放OSD中的磁盘空间,并修复ceph运行状况中的错误。但是,正如已经提到的,此问题主要是由于初始阶段的Ceph设置不正确而引起的:重新配置非常重要,这样将来就不会出现。

在我们的特定情况下,一切都取决于:

  • replication_count在其中一个游泳池中太重要
  • 一个池中的PG过多,而另一个池中的PG太小。

我们将使用已经提到的计算器。它清楚地显示了需要输入的内容,原则上没有什么复杂的。设置了必要的参数后,我们得到以下建议:

:如果您从头开始配置Ceph集群,计算器的另一个有用功能是生成命令,这些命令将使用表中列出的参数从头开始创建池。

最后一栏“ 建议的PG计数”可帮助您进行导航。在我们的例子中,第二个也是有用的,其中指示了复制参数,因为我们决定更改复制因子。

因此,首先您需要更改复制设置-首先值得这样做,因为通过减少乘法器,我们可以释放磁盘空间。在执行命令期间,您会注意到可用磁盘空间的值将增加:

ceph osd pool $pool_name set $replication_size

它的建成后-我们改变参数的值pg_num,并pgp_num如下:

ceph osd pool set $pool_name pg_num $pg_number
ceph osd pool set $pool_name pgp_num $pg_number

重要提示:我们必须依次更改每个池中PG的数量,并且不要更改其他池中的PG的值,直到警告``降级的数据冗余''``n数量的pgs降级''警告消失为止

您还可以根据ceph health detail命令的结论来验证一切是否成功ceph -s

案号3。虚拟机从LVM迁移到Ceph RBD


在项目使用安装在租用裸机服务器上的虚拟机的情况下,经常会出现容错存储的问题。并且非常希望此存储中有足够的空间...另一个常见情况:服务器上有一台带有本地存储的虚拟机,您需要扩展磁盘,但无处可扩,因为服务器上没有剩余的可用磁盘空间。

该问题可以通过不同的方式解决-例如,通过迁移到另一台服务器(如果有)或向该服务器添加新磁盘。但是并非总是可以做到这一点,因此从LVM到Ceph的迁移可以很好地解决此问题。通过选择此选项,由于不需要将本地存储从一个虚拟机管理程序迁移到另一个虚拟机管理程序,因此我们还简化了服务器之间的进一步迁移过程。唯一的问题是您必须在工作期间停止VM。

按照下面给出的配方,该博客中的一篇文章被采用了,其指示已在实践中进行了测试。顺便说一下,这里也描述了无阻碍迁移方法。但是,在我们的情况下,根本不需要它,因此我们没有对其进行检查。如果这对您的项目至关重要,我们很乐意在评论中了解结果。

让我们开始实践。在该示例中,我们使用virsh,因此使用libvirt。首先,确保将数据迁移到的Ceph池已连接到libvirt:

virsh pool-dumpxml $ceph_pool

池描述应包含带有授权数据的Ceph连接数据。

下一步是将LVM映像转换为Ceph RBD。运行时主要取决于图像的大小:

qemu-img convert -p -O rbd /dev/main/$vm_image_name rbd:$ceph_pool/$vm_image_name

转换后,将保留LVM映像,如果您无法将VM迁移到RBD并必须回滚更改,这将很有用。另外-为了能够快速回滚更改,我们将备份虚拟机的配置文件:

virsh dumpxml $vm_name > $vm_name.xml
cp $vm_name.xml $vm_name_backup.xml

...,然后编辑原稿(vm_name.xml)。查找一个带有磁盘描述的块(以一行开头,以<disk type='file' device='disk'>结束</disk>),并将其转换为以下形式:

<disk type='network' device='disk'>
<driver name='qemu'/>
<auth username='libvirt'>
  <secret type='ceph' uuid='sec-ret-uu-id'/>
 </auth>
<source protocol='rbd' name='$ceph_pool/$vm_image_name>
  <host name='10.0.0.1' port='6789'/>
  <host name='10.0.0.2' port='6789'/>
</source>
<target dev='vda' bus='virtio'/> 
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>

让我们看一些细节:

  1. 该协议source指示Ceph RBD中的存储地址(这是指示在第一阶段确定的Ceph池和RBD映像名称的地址)。
  2. 该块secret指示类型ceph,以及用于连接到它的秘密的UUID。可以通过命令找到它的uuid virsh secret-list
  3. 在块host中,指示了监视器的地址Ceph。

编辑配置文件并完成LVM到RBD的转换后,您可以应用修改后的配置文件并启动虚拟机:

virsh define $vm_name.xml
virsh start $vm_name

现在该验证虚拟机是否正确启动了:例如,您可以通过SSH或通过连接来找到它virsh

如果虚拟机运行正常,并且没有发现其他问题,则可以删除不再使用的LVM映像:

lvremove main/$vm_image_name

结论


我们在实践中遇到了所有描述的案例-我们希望这些说明将有助于其他管理员解决类似的问题。如果您有来自Ceph操作经验的评论或其他类似故事,我们将很高兴在评论中看到它们!

聚苯乙烯


另请参阅我们的博客:


All Articles