使用 CEPH 的經驗

當數據超過一個磁盤的容量時,就該考慮 RAID 了。 小時候經常聽長輩說:“總有一天RAID會成為過去,對象存儲會氾濫成災,而你連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 分區表區域並為系統分配所有空間時,用 FAT 分區阻塞 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 時,由於未知原因,它會嘗試安裝 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 顯示了 PG 如何根據 OSD 定位,以及對像如何根據 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的新信息,這將允許您在指定條件下操作它,嘗試編寫自己的存儲作為高級培訓.

來源: www.habr.com

添加評論