CEPH 经验

当一个磁盘上的数据无法容纳时,就需要考虑 RAID。 小时候,我经常听长辈说:“有一天,RAID将成为过去,对象存储将淹没世界,而你甚至不知道CEPH是什么。”所以独立生活的第一件事正在创建您自己的集群。 实验的目的是熟悉ceph的内部结构,了解其应用范围。 在中型企业中引入 ceph 的合理性如何,而在小型企业中引入 ceph 的合理性如何? 经过几年的运行和几次不可挽回的数据丢失,人们逐渐认识到并非一切都那么简单。 CEPH 的特性对其广泛分布造成了障碍,因此实验陷入了停滞。 以下是对所采取的所有步骤、获得的结果和得出的结论的描述。 如果有了解的人能分享他们的经验并解释一些观点,我将不胜感激。

注:评论者指出了一些假设的严重错误,需要对整篇文章进行修改。

CEPH策略

CEPH 集群组合了任意数量 K 的任意大小的磁盘,并在它们上存储数据,将每个部分(默认为 4 MB)复制给定数量 N 次。

考虑具有两个相同磁盘的最简单情况。 您可以组装一个 RAID 1 或一个 N=2 的集群 - 结果是相同的。 如果有三个磁盘,并且它们的大小不同,那么很容易组装一个 N=2 的集群:一些数据将在磁盘 1 和 2 上,一些数据将在 1 和 3 上,一些数据将在 2 和 3 上,而RAID则不然(你可以收集这样的RAID,但这将是一种变态)。 如果磁盘更多,则可以创建 RAID 5,CEPH 有一个类似物 -erasure_code,这与开发人员的早期概念相矛盾,因此不予考虑。 RAID 5 假设磁盘数量较少,并且所有磁盘都处于良好状态。 如果其中一个发生故障,其余的必须坚持下去,直到更换磁盘并将数据恢复到其中。 CEPH,N>=3,鼓励使用旧磁盘,特别是,如果保留几块好的磁盘来存储一份数据,而将剩余的两到三份存储在大量的旧磁盘上,那么信息会是安全的,因为目前新磁盘还活着 - 没有问题,如果其中一个损坏,那么使用寿命超过五年的三个磁盘(最好来自不同服务器)同时发生故障的可能性极小事件。

副本的分发有一个微妙之处。 默认情况下,假设数据被分为更多(每个磁盘约 100 个)PG 分布组,每个分布组在某些磁盘上都是重复的。 假设K=6,N=2,那么如果任意两个磁盘出现故障,数据肯定会丢失,因为根据概率论,至少有一个PG位于这两个磁盘上。 并且丢失一组会导致池中的所有数据都无法访问。 如果磁盘被分成三对,并且只允许在一对内的磁盘上存储数据,那么这样的分布也能抵抗任何一个磁盘的故障,但如果两个磁盘故障,数据丢失的概率不是100%,但只有 3/15,即使三张光盘都出现故障,也只有 12/20。 因此,数据分布中的熵对容错没有贡献。 另请注意,对于文件服务器来说,可用 RAM 极大地提高了响应速度。 每个节点的内存越多,所有节点的内存越多,速度就越快。 这无疑是集群相对于单台服务器以及内置少量内存的硬件 NAS 的优势。

由此可见,CEPH 是创建数十 TB 可靠存储系统的好方法,并且可以用过时设备的最小投资进行扩展(当然,这里需要成本,但与商业存储系统相比很小)。

集群实施

为了进行实验,我们使用一台退役计算机 Intel DQ57TM + Intel core i3 540 + 16 GB RAM。 我们将四个 2 TB 磁盘组织成 RAID10 之类的东西,测试成功后我们将添加第二个节点和相同数量的磁盘。

安装Linux。 发行版需要可定制且稳定。 Debian 和 Suse 符合要求。 Suse 有一个更灵活的安装程序,允许您禁用任何软件包; 不幸的是,我不明白哪些可以在不损坏系统的情况下被扔掉。 通过 debootstrap buster 安装 Debian。 min-base 选项安装缺少驱动程序的非工作系统。 与完整版相比,尺寸差异并没有大到令人烦恼。 由于工作是在物理机上完成的,因此我想拍摄快照,就像在虚拟机上一样。 无论是LVM还是btrfs(或者xfs,或者zfs——差别不是很大)都提供了这样的机会。 快照不是 LVM 的强项。 安装 btrfs。 引导加载程序位于 MBR 中。 当您可以将 50 MB 磁盘推入 1 MB 分区表区域并为系统分配所有空间时,用 FAT 分区堵塞 700 MB 磁盘是没有意义的。 磁盘上占用了 1.1 MB 空间。 SUSE 的基本安装有多少——我不记得了,好像是 1.4 或 XNUMX GB 左右。

安装 CEPH。 我们忽略 debian 存储库中的版本 12,并直接从站点 15.2.3 进行连接。 我们按照“手动安装 CEPH”部分的说明进行操作,但注意以下事项:

  • 在连接存储库之前,必须安装 gnupg wget ca-certificates
  • 连接存储库后、安装集群之前,省略软件包安装: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • 在安装CEPH时,由于未知原因,它会尝试安装lvm2。 原则上来说并不算可惜,但是安装失败,所以CEPH也不会安装。

    该补丁帮助:

    cat << EOF >> /var/lib/dpkg/status
    Package: lvm2
    Status: install ok installed
    Priority: important
    Section: admin
    Installed-Size: 0
    Maintainer: Debian Adduser Developers <[email protected]>
    Architecture: all
    Multi-Arch: foreign
    Version: 113.118
    Description: No-install
    EOF
    

集群概览

ceph-osd - 负责在磁盘上存储数据。 对于每个磁盘,都会启动一个网络服务,该服务接受并执行读取或写入对象的请求。 在磁盘上创建两个分区。 其中之一包含有关集群、磁盘号和集群键的信息。 此 1KB 信息在添加磁盘时创建一次,并且从未注意到再次更改。 第二个分区没有文件系统,存储CEPH二进制数据。 以前版本中的自动安装会创建一个 100MB 的 xfs 分区用于存储服务信息。 我将磁盘转换为 MBR 并只分配了 16MB - 该服务没有抱怨。 我认为,没有问题,xfs 可以替换为 ext。 该分区安装在 /var/lib/... 中,服务读取有关 OSD 的信息,并找到存储二进制数据的块设备的链接。 理论上,你可以立即将辅助的放在/var/lib/...中,并将整个磁盘分配给数据。 通过 ceph-deploy 创建 OSD 时,会自动创建一条规则来在 /var/lib/… 中挂载分区,并分配 ceph 用户读取所需块设备的权限。 如果是手动安装,则需要您自己执行此操作,文档中没有说明这一点。 还建议指定 osd 内存目标参数,以便有足够的物理内存。

Ceph-MDS。 从底层来看,CEPH 是对象存储。 块存储能力归结为将每个 4MB 块保存为一个对象。 文件存储的工作原理相同。 创建两个池:一个用于元数据,另一个用于数据。 它们被组合成一个文件系统。 此时,会创建某种记录,因此,如果删除文件系统,但保存两个池,则将无法恢复它。 有一个以块形式提取文件的程序,我没有测试过。 ceph-mds服务负责访问文件系统。 每个文件系统都需要一个单独的服务实例。 有一个“索引”选项,允许您在一个文件系统中创建多个文件系统的外观 - 也未经测试。

ceph-mon - 该服务保存集群的映射。 它包括所有OSD的信息,OSD中的PG分配算法,最重要的是,所有对象的信息(这个机制的细节我不太清楚:有一个/var/lib/ceph/mon/…/ store.db 目录中,它包含一个 26MB 的大文件,在 105K 对象的集群中,每个对象略多于 256 字节 - 我认为监视器保留了所有对象和其中 PG 的列表他们说谎)。 损坏此目录会导致集群中的所有数据丢失。 从这里可以得出结论,CRUSH 显示了如何根据 OSD 定位 PG,以及如何根据 PG 定位对象 - 它们集中存储在数据库内,无论开发人员如何避免这个词。 因此,首先,我们无法以 RO 模式将系统安装在闪存驱动器上,因为数据库会不断写入,因此需要额外的磁盘(几乎不超过 1 GB),其次,需要有实时复制这个基地。 如果有多个监视器,则会自动提供容错功能,但在我们的示例中只有一台监视器,最多两台。 有一个基于 OSD 数据恢复显示器的理论过程,我由于各种原因使用了 XNUMX 次,并且 XNUMX 次都没有错误消息,也没有数据。 不幸的是,这个机制不起作用。 要么我们操作一个微型OSD分区并组装一个RAID来存储数据库,这可能会对性能产生非常糟糕的影响,要么我们分配至少两个可靠的物理介质,最好是USB,这样端口就不会被占用。

rados-gw - 使用 S3 协议等导出对象存储。 创建了很多池,目前还不清楚为什么。 没有真正实验过。

ceph-mgr - 安装此服务会启动多个模块。 其中之一是非禁用自动缩放。 它努力保持正确的 PG/OSD 数量。 如果您想手动控制比率,可以禁用每个池的缩放,但在这种情况下,模块会因除以 0 而下降,并且集群状态会变为 ERROR。 该模块是用 python 编写的,如果注释掉其中必要的行,则会导致其关闭。 懒得记细节了。

使用的来源清单:

CEPH安装
从完全监视器故障中恢复

脚本清单:

通过debootstrap安装系统

blkdev=sdb1
mkfs.btrfs -f /dev/$blkdev
mount /dev/$blkdev /mnt
cd /mnt
for i in {@,@var,@home}; do btrfs subvolume create $i; done
mkdir snapshot @/{var,home}
for i in {var,home}; do mount -o bind @${i} @/$i; done
debootstrap buster @ http://deb.debian.org/debian; echo $?
for i in {dev,proc,sys}; do mount -o bind /$i @/$i; done
cp /etc/bash.bashrc @/etc/

chroot /mnt/@ /bin/bash
echo rbd1 > /etc/hostname
passwd
uuid=`blkid | grep $blkdev | cut -d """ -f 2`
cat << EOF > /etc/fstab
UUID=$uuid / btrfs noatime,nodiratime,subvol=@ 0 1
UUID=$uuid /var btrfs noatime,nodiratime,subvol=@var 0 2
UUID=$uuid /home btrfs noatime,nodiratime,subvol=@home 0 2
EOF
cat << EOF >> /var/lib/dpkg/status
Package: lvm2
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 0
Maintainer: Debian Adduser Developers <[email protected]>
Architecture: all
Multi-Arch: foreign
Version: 113.118
Description: No-install

Package: sudo
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 0
Maintainer: Debian Adduser Developers <[email protected]>
Architecture: all
Multi-Arch: foreign
Version: 113.118
Description: No-install
EOF

exit
grub-install --boot-directory=@/boot/ /dev/$blkdev
init 6

apt -yq install --no-install-recommends linux-image-amd64 bash-completion ed btrfs-progs grub-pc iproute2 ssh  smartmontools ntfs-3g net-tools man
exit
grub-install --boot-directory=@/boot/ /dev/$blkdev
init 6

创建集群

apt -yq install --no-install-recommends gnupg wget ca-certificates
echo 'deb https://download.ceph.com/debian-octopus/ buster main' >> /etc/apt/sources.list
wget -q -O- 'https://download.ceph.com/keys/release.asc' | apt-key add -
apt update
apt -yq install --no-install-recommends ceph-common ceph-mon

echo 192.168.11.11 rbd1 >> /etc/hosts
uuid=`cat /proc/sys/kernel/random/uuid`
cat << EOF > /etc/ceph/ceph.conf
[global]
fsid = $uuid
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
mon allow pool delete = true
mon host = 192.168.11.11
mon initial members = rbd1
mon max pg per osd = 385
osd crush update on start = false
#osd memory target = 2147483648
osd memory target = 1610612736
osd scrub chunk min = 1
osd scrub chunk max = 2
osd scrub sleep = .2
osd pool default pg autoscale mode = off
osd pool default size = 1
osd pool default min size = 1
osd pool default pg num = 1
osd pool default pgp num = 1
[mon]
mgr initial modules = dashboard
EOF

ceph-authtool --create-keyring ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
ceph-authtool --create-keyring ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
cp ceph.client.admin.keyring /etc/ceph/
ceph-authtool --create-keyring bootstrap-osd.ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' --cap mgr 'allow r'
cp bootstrap-osd.ceph.keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
ceph-authtool ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
ceph-authtool ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
monmaptool --create --add rbd1 192.168.11.11 --fsid $uuid monmap
rm -R /var/lib/ceph/mon/ceph-rbd1/*
ceph-mon --mkfs -i rbd1 --monmap monmap --keyring ceph.mon.keyring
chown ceph:ceph -R /var/lib/ceph
systemctl enable ceph-mon@rbd1
systemctl start ceph-mon@rbd1
ceph mon enable-msgr2
ceph status

# dashboard

apt -yq install --no-install-recommends ceph-mgr ceph-mgr-dashboard python3-distutils python3-yaml
mkdir /var/lib/ceph/mgr/ceph-rbd1
ceph auth get-or-create mgr.rbd1 mon 'allow profile mgr' osd 'allow *' mds 'allow *' > /var/lib/ceph/mgr/ceph-rbd1/keyring
systemctl enable ceph-mgr@rbd1
systemctl start ceph-mgr@rbd1
ceph config set mgr mgr/dashboard/ssl false
ceph config set mgr mgr/dashboard/server_port 7000
ceph dashboard ac-user-create root 1111115 administrator
systemctl stop ceph-mgr@rbd1
systemctl start ceph-mgr@rbd1

添加OSD(部分)

apt install ceph-osd

osdnum=`ceph osd create`
mkdir -p /var/lib/ceph/osd/ceph-$osdnum
mkfs -t xfs /dev/sda1
mount -t xfs /dev/sda1 /var/lib/ceph/osd/ceph-$osdnum
cd /var/lib/ceph/osd/ceph-$osdnum
ceph auth get-or-create osd.0 mon 'profile osd' mgr 'profile osd' osd 'allow *' > /var/lib/ceph/osd/ceph-$osdnum/keyring
ln -s /dev/disk/by-partuuid/d8cc3da6-02  block
ceph-osd -i $osdnum --mkfs
#chown ceph:ceph /dev/sd?2
chown ceph:ceph -R /var/lib/ceph
systemctl enable ceph-osd@$osdnum
systemctl start ceph-osd@$osdnum

总结

CEPH 的主要营销优势是 CRUSH,一种计算数据位置的算法。 监视器将此算法传播给客户端,之后客户端直接请求所需的节点和所需的 OSD。 CRUSH 不提供集中化。 这是一个小文件,您甚至可以打印并挂在墙上。 实践表明,CRUSH 并不是一张详尽的图。 销毁并重新创建监视器同时保留所有 OSD 和 CRUSH 不足以恢复集群。 由此得出结论,每个监视器都存储有关整个集群的一些元数据。 这些元数据的数量微不足道,不会对集群的大小产生限制,但它需要它们的安全性,这消除了由于将系统安装在闪存驱动器上而节省的磁盘空间,并且排除了少于三个节点的集群。 关于可选功能的积极的开发人员政策。 远离极简主义。 该级别的文档:“感谢您提供的内容,但非常非常少。” 提供了与低级别服务交互的能力,但文档在这个主题上太肤浅了,所以更有可能没有而不是有。 几乎没有机会从紧急情况下恢复数据。

进一步行动的选项:放弃CEPH并使用平庸的多磁盘btrfs(或xfs,zfs),了解有关CEPH的新信息,这将允许您在指定的条件下操作它,尝试编写自己的存储作为高级培训。

来源: habr.com

添加评论