CEPH经验

当一个磁盘上的数据量超出其容量时,就该考虑RAID了。小时候,我经常听到长辈们的话:“一天的RAID成为过去,对象存储将遍布世界,而您甚至不知道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假定您的磁盘数量很少,并且它们都处于良好状态。如果一个磁盘出现故障,其余磁盘必须保留直到更换磁盘并将数据恢复到该磁盘。对于N> = 3,CEPH鼓励使用旧磁盘,特别是,如果您保留几个良好的磁盘来存储数据的一个副本,并将剩余的两个或三个副本存储在大量的旧磁盘上,则该信息将是安全的,因为只要新磁盘处于活动状态,就不会出现问题,并且如果其中一个磁盘坏了,则同时发生故障三个使用寿命超过五年的磁盘(最好是来自不同服务器的磁盘),这种情况极不可能发生。



分发副本有些微妙。默认情况下,假定将数据划分为较大数量的PG分发组(每个磁盘约100个),每个分发组在某些磁盘上重复。假设K = 6,N = 2,则如果有两个磁盘发生故障,则可以保证数据会丢失,因为根据概率论,这两个磁盘上将至少有一个PG。丢失一组将导致无法访问池中的所有数据。如果将磁盘分为三对,并且只允许将数据存储在一对对中的磁盘上,则此分布还可以抵抗任何一个磁盘的故障,但是如果两个磁盘发生故障,则数据丢失的可能性不是100%,而是只有3/15,甚至在发生故障的情况下三个磁盘-仅12/20。因此,数据分发中的熵不会提高容错能力。另请注意对于文件服务器,可用RAM显着提高了响应速度。每个节点中的内存越多,所有节点中的内存越多,速度将越快。无疑,这是群集相对于单个服务器以及硬件NAS的优势,其中内置了非常少量的内存。



因此,CEPH是一种用最少的投资从陈旧的设备中创建一个具有可扩展性的可靠的存储系统的方法,该存储系统可扩展数十TB(当然,这将需要成本,但与商用存储系统相比要小)。



集群实施



为了进行实验,让我们使用一台退役的英特尔DQ57TM +英特尔酷睿i3 540计算机+ 16 GB RAM。我们将在一种RAID10中组织四个2 TB磁盘,在成功测试之后,我们将添加第二个节点和相同数量的磁盘。



安装Linux。该发行版需要自定义和稳定性。 Debian和Suse符合要求。 Suse的安装程序更灵活,可以禁用任何软件包。不幸的是,我无法弄清楚哪些可以扔掉而不损坏系统。我们通过debootstrap buster安装Debian。 min-base选项将安装缺少驱动程序的非工作系统。与完整版本相比,大小上的差异不会太大。由于工作是在物理机上进行的,因此我想像在虚拟机上一样制作快照。 LVM或btrfs(xfs或zfs-差异不大)均提供此选项。快照不是LVM的重点。我们放了btrfs。引导程序位于MBR中。阻塞具有FAT分区的50 MB磁盘没有任何意义,当您可以将其推入分区表的1 MB区域并为系统分配所有空间时。在700 MB的磁盘上使用。 SUSE基本安装有多少-似乎不记得大约1.1或1.4 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-osd会出于(已经可以理解的)原因尝试安装lvm2。对此没有迫切需要。如果您在安装软件包时遇到问题,可以通过删除ceph-osd的/ var / lib / dpkg / status中的依赖项来拒绝它。



    撰写本文时使用了较不人道的补丁:
    cat << EOF >> /var/lib/dpkg/status
    Package: lvm2
    Status: install ok installed
    Priority: important
    Section: admin
    Installed-Size: 0
    Maintainer: Debian Adduser Developers <adduser@packages.debian.org>
    Architecture: all
    Multi-Arch: foreign
    Version: 113.118
    Description: No-install
    EOF
    




集群概述



ceph-osd-负责在磁盘上存储数据。对于每个磁盘,启动一个网络服务,该网络服务接收并执行读取或写入对象的请求。本文将bluestore存储作为最低级别进行讨论。将在服务目录中创建描述群集ID,存储,其类型等的服务文件以及所需的阻止文件-这些文件不会更改。如果文件是物理文件,则osd将在其中创建文件系统并累积数据。如果文件是链接,则数据将在链接指向的设备中。除了主设备外,还可以另外指示block.db-元数据(RocksDB)和block.wal-日志(RocksDB预写日志)。如果未指定其他设备,则元数据和日志将存储在主设备中。跟踪RocksDB的可用空间的可用性非常重要,否则OSD将无法启动!

在较早版本中标准创建osd的过程中,磁盘分为两个分区:第一个分区是100 MB xfs,安装在/ var / lib / ...中,并包含服务信息,第二个分区用于主存储。新版本使用lvm。

从理论上讲,您不能挂载微型分区,而是将文件放在/ var / lib / ...中,在所有节点上复制它们,并为数据分配整个磁盘,而无需创建GPT或LVM标头。手动添加OSD时,需要确保ceph用户具有对数据块设备的写访问权,并且如果您决定将服务数据目录放置在/ var / lib ...中,则会自动将其安装在该目录中。还建议指定osd memory target参数,以便有足够的物理内存。



ceph-mds。在较低级别,CEPH是对象存储。块存储减少为将每个4MB块存储为一个对象。文件存储按相同原理工作。创建两个池:一个用于元数据,另一个用于数据。它们被组合成一个文件系统。此时,将创建某种记录,因此,如果删除文件系统,但同时保存两个池,则将无法还原它。有一个按块提取文件的过程,未经测试。 ceph-mds服务负责访问文件系统。每个文件系统都需要一个单独的服务实例。有一个“等级”选项,它允许您在一个未经测试的系统中创建多个文件系统的外观。



ceph-mon-此服务存储群集映射。它包含有关所有OSD的信息,OSD中的PG分配算法,以及最重要的是有关所有对象的信息(此机制的详细信息对我而言尚不明确:目录中有/var/lib/ceph/mon/.../store.db有一个大文件-26MB,在105,000个对象的群集中,每个对象获得的字节数略多于256个字节-我认为监视器存储所有对象和它们所在的PG的列表。损坏此目录会导致群集中所有数据丢失。因此,得出的结论是CRUSH显示了PG在OSD上的位置以及对象在PG上的位置(在数据库中)(结论是不正确的,确切地包含了它,需要澄清)。结果,首先,由于数据库不断被写入,因此我们无法以RO模式将系统安装在USB闪存驱动器上,该数据需要一个额外的磁盘(几乎不超过1 GB),其次,您需要实时获得此数据库的副本。如果有多个监视器,则由于它们而提供了容错能力,但是如果有一个监视器,最多有两个监视器,则必须确保数据保护。有一种理论上的过程可用于基于OSD数据还原监视器,但事实证明该监视器已在对象级别还原,此刻文件系统无法还原。到目前为止,您不能依赖此机制。在对象级别还原文件时,当前尚未还原文件系统。到目前为止,您不能依赖此机制。此刻,它原来是在对象级别还原的,此刻文件系统无法还原。到目前为止,您不能依赖此机制。



rados-gw-通过S3等导出对象存储。创建许多池,尚不清楚原因。没有太多实验。



ceph-mgr-安装此服务时,将启动几个模块。其中之一是不可断开的自动缩放。它努力维护正确数量的PG / OSD。如果要手动管理比率,则可以禁止扩展每个池,但是在这种情况下,模块将除以0掉线,并且群集状态变为ERROR。该模块是用python编写的,如果您注释掉其中的必要行,则会导致其禁用。细节懒得回想。



参考:



安装CEPH

从完全的监视器故障中恢复

Ceph中有关BlueStore的文章ceph

体系结构的描述。贤者A.威尔



脚本清单:



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 <adduser@packages.debian.org>
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 <adduser@packages.debian.org>
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的同时销毁并重新创建监视器,不足以还原群集。由此得出的结论是,每个监视器都存储有关整个群集的一些元数据。这些元数据的数量微不足道,并没有对群集大小施加任何限制,但需要确保其安全性,这可以通过将系统安装在USB闪存驱动器上来消除磁盘经济性,并排除少于三个节点的群集。关于可选功能的积极的开发者政策。远离极简主义。该级别的文档:“对于我们所拥有的-已经非常感谢,但是非常非常稀缺。”提供了与服务进行低级别交互的功能,但是文档在此主题上过于肤浅,因此很可能是。在紧急情况下,几乎没有机会恢复数据(由于社区的解释,这种机会仍然存在)。在紧急情况下,几乎没有机会恢复数据(由于社区的解释,这种机会仍然存在)。在紧急情况下,几乎没有机会恢复数据(由于社区的解释,这种机会仍然存在)。



进一步操作的选项:放弃CEPH并使用普通的多磁盘btrfs(或xfs,zfs),查找有关CEPH的新信息,以便在这些情况下使用它,并尝试编写自己的存储库作为进一步的培训。



All Articles