Trải nghiệm với CEPH

Khi có nhiều dữ liệu hơn mức có thể chứa trên một đĩa, đã đến lúc nghĩ đến RAID. Khi còn nhỏ, tôi thường nghe người lớn nói: “Một ngày nào đó RAID sẽ trở thành quá khứ, kho lưu trữ đối tượng sẽ tràn ngập thế giới và bạn thậm chí còn không biết CEPH là gì”, đó là điều đầu tiên trong cuộc sống tự lập của tôi. là tạo ra cụm của riêng tôi. Mục đích của thí nghiệm là làm quen với cấu trúc bên trong của ceph và hiểu phạm vi ứng dụng của nó. Việc triển khai ceph trong các doanh nghiệp vừa và nhỏ có hợp lý không? Sau vài năm hoạt động và một vài lần mất dữ liệu không thể khắc phục được, người ta nhận ra sự phức tạp rằng không phải mọi thứ đều đơn giản như vậy. Những đặc thù của CEPH đặt ra những rào cản cho việc áp dụng rộng rãi nó và vì chúng, các thử nghiệm đã đi vào ngõ cụt. Dưới đây là mô tả tất cả các bước đã thực hiện, kết quả thu được và kết luận rút ra. Nếu những người hiểu biết chia sẻ kinh nghiệm của họ và giải thích một số điểm, tôi sẽ rất biết ơn.

Lưu ý: Người bình luận đã xác định được những sai sót nghiêm trọng trong một số giả định cần phải sửa lại toàn bộ bài viết.

Chiến lược CEPH

Cụm CEPH kết hợp số K đĩa tùy ý có kích thước tùy ý và lưu trữ dữ liệu trên chúng, sao chép mỗi phần (4 MB theo mặc định) một số N lần cho trước.

Hãy xem xét trường hợp đơn giản nhất với hai đĩa giống hệt nhau. Từ chúng, bạn có thể tập hợp RAID 1 hoặc một cụm có N=2 - kết quả sẽ giống nhau. Nếu có ba đĩa và chúng có kích thước khác nhau thì dễ dàng tập hợp một cụm với N=2: một số dữ liệu sẽ nằm trên đĩa 1 và 2, một số sẽ nằm trên đĩa 1 và 3, và một số sẽ nằm ở vào ngày 2 và 3, trong khi RAID thì không (bạn có thể tập hợp một RAID như vậy, nhưng nó sẽ là một sự sai lầm). Nếu có nhiều đĩa hơn nữa thì có thể tạo RAID 5; CEPH có một mã tương tự - erasure_code, mâu thuẫn với các khái niệm ban đầu của các nhà phát triển và do đó không được xem xét. RAID 5 giả định có một số lượng nhỏ ổ đĩa, tất cả đều ở tình trạng tốt. Nếu một cái bị lỗi, những cái còn lại phải cầm cự cho đến khi đĩa được thay thế và dữ liệu được khôi phục vào đó. CEPH, với N>=3, khuyến khích sử dụng các đĩa cũ, đặc biệt, nếu bạn giữ nhiều đĩa tốt để lưu một bản sao dữ liệu và lưu trữ hai hoặc ba bản sao còn lại trên một số lượng lớn các đĩa cũ thì thông tin sẽ bị mất. sẽ an toàn, vì hiện tại các đĩa mới vẫn còn hoạt động - không có vấn đề gì và nếu một trong số chúng bị hỏng, thì việc ba đĩa có tuổi thọ sử dụng hơn XNUMX năm bị lỗi đồng thời là điều cực kỳ khó xảy ra. sự kiện.

Có một sự tinh tế trong việc phân phối các bản sao. Theo mặc định, giả định rằng dữ liệu được chia thành nhiều nhóm phân phối PG hơn (~100 trên mỗi đĩa), mỗi nhóm được sao chép trên một số đĩa. Giả sử K=6, N=2, thì nếu bất kỳ hai đĩa nào bị lỗi, dữ liệu chắc chắn sẽ bị mất, vì theo lý thuyết xác suất, sẽ có ít nhất một PG nằm trên hai đĩa này. Và việc mất một nhóm sẽ khiến tất cả dữ liệu trong nhóm không có sẵn. Nếu các đĩa được chia thành ba cặp và dữ liệu chỉ được phép lưu trữ trên các đĩa trong một cặp thì việc phân phối như vậy cũng có khả năng chống lại sự hỏng hóc của bất kỳ một đĩa nào, nhưng nếu hai đĩa bị lỗi thì xác suất mất dữ liệu là không. 100%, nhưng chỉ 3/15, và ngay cả trong trường hợp hỏng ba đĩa - chỉ 12/20. Do đó, entropy trong phân phối dữ liệu không góp phần vào khả năng chịu lỗi. Cũng lưu ý rằng đối với máy chủ tệp, RAM trống sẽ tăng đáng kể tốc độ phản hồi. Càng nhiều bộ nhớ trong mỗi nút và càng nhiều bộ nhớ trong tất cả các nút thì tốc độ càng nhanh. Đây chắc chắn là một lợi thế của cụm so với một máy chủ duy nhất và thậm chí còn hơn thế nữa là NAS phần cứng, nơi tích hợp một lượng bộ nhớ rất nhỏ.

Theo đó, CEPH là một cách tốt để tạo ra một hệ thống lưu trữ dữ liệu đáng tin cậy cho hàng chục TB với khả năng mở rộng quy mô với mức đầu tư tối thiểu từ các thiết bị lỗi thời (ở đây tất nhiên sẽ cần chi phí nhưng nhỏ so với các hệ thống lưu trữ thương mại).

Triển khai cụm

Để thử nghiệm, hãy lấy một máy tính đã ngừng hoạt động Intel DQ57TM + Intel core i3 540 + 16 GB RAM. Chúng tôi sẽ sắp xếp bốn đĩa 2 TB thành một thứ giống như RAID10, sau khi thử nghiệm thành công, chúng tôi sẽ thêm nút thứ hai và cùng số lượng đĩa.

Cài đặt Linux. Việc phân phối đòi hỏi khả năng tùy biến và ổn định. Debian và Suse đáp ứng yêu cầu. Suse có trình cài đặt linh hoạt hơn cho phép bạn tắt bất kỳ gói nào; Thật không may, tôi không thể tìm ra cái nào có thể vứt đi mà không làm hỏng hệ thống. Cài đặt Debian bằng debootstrap buster. Tùy chọn cơ sở tối thiểu cài đặt một hệ thống bị hỏng thiếu trình điều khiển. Sự khác biệt về kích thước so với phiên bản đầy đủ không quá lớn đến mức phải bận tâm. Vì công việc được thực hiện trên máy vật lý nên tôi muốn chụp ảnh nhanh, giống như trên máy ảo. Tùy chọn này được cung cấp bởi LVM hoặc btrfs (hoặc xfs hoặc zfs - sự khác biệt không lớn). Ảnh chụp nhanh LVM không phải là điểm mạnh. Cài đặt btrfs. Và bootloader nằm trong MBR. Chẳng ích gì khi làm lộn xộn một đĩa 50 MB với phân vùng FAT khi bạn có thể đẩy nó vào vùng bảng phân vùng 1 MB và phân bổ toàn bộ dung lượng cho hệ thống. Đã chiếm 700 MB trên đĩa. Tôi không nhớ cài đặt SUSE cơ bản có bao nhiêu, tôi nghĩ là khoảng 1.1 hoặc 1.4 GB.

Cài đặt CEPH. Chúng tôi bỏ qua phiên bản 12 trong kho debian và kết nối trực tiếp từ trang 15.2.3. Chúng ta làm theo hướng dẫn trong phần “Cài đặt CEPH thủ công” với những lưu ý sau:

  • Trước khi kết nối kho lưu trữ, bạn phải cài đặt gnupg wget ca-certificates
  • Sau khi kết nối kho lưu trữ, nhưng trước khi cài đặt cụm, các gói cài đặt bị bỏ qua: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • Khi cài đặt CEPH, không rõ lý do, nó sẽ cố gắng cài đặt lvm2. Về nguyên tắc thì không đáng tiếc nhưng việc cài đặt không thành công nên CEPH cũng sẽ không cài đặt.

    Bản vá này đã giúp:

    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
    

Tổng quan về cụm

ceph-osd - chịu trách nhiệm lưu trữ dữ liệu trên đĩa. Đối với mỗi đĩa, một dịch vụ mạng được khởi chạy để chấp nhận và thực hiện các yêu cầu đọc hoặc ghi vào các đối tượng. Hai phân vùng được tạo trên đĩa. Một trong số chúng chứa thông tin về cụm, số đĩa và khóa của cụm. Thông tin 1KB này được tạo một lần khi thêm đĩa và chưa bao giờ được thông báo thay đổi. Phân vùng thứ hai không có hệ thống tập tin và lưu trữ dữ liệu nhị phân CEPH. Cài đặt tự động trong các phiên bản trước đã tạo phân vùng xfs 100 MB cho thông tin dịch vụ. Tôi đã chuyển đổi đĩa sang MBR và chỉ phân bổ 16MB - dịch vụ không phàn nàn. Tôi nghĩ xfs có thể được thay thế bằng ext mà không gặp vấn đề gì. Phân vùng này được gắn vào /var/lib/…, nơi dịch vụ đọc thông tin về OSD và cũng tìm thấy tham chiếu đến thiết bị khối nơi lưu trữ dữ liệu nhị phân. Về mặt lý thuyết, bạn có thể đặt ngay các tệp phụ trợ vào /var/lib/… và phân bổ toàn bộ đĩa cho dữ liệu. Khi tạo OSD thông qua ceph-deploy, một quy tắc sẽ tự động được tạo để gắn phân vùng vào /var/lib/… và người dùng ceph cũng được gán quyền đọc thiết bị khối mong muốn. Nếu bạn cài đặt thủ công, bạn phải tự mình thực hiện việc này; tài liệu không nói điều này. Cũng nên chỉ định tham số đích bộ nhớ osd để có đủ bộ nhớ vật lý.

ceph-mds. Ở mức độ thấp, CEPH là bộ lưu trữ đối tượng. Khả năng lưu trữ khối tập trung vào việc lưu trữ mỗi khối 4 MB dưới dạng đối tượng. Việc lưu trữ tập tin hoạt động theo nguyên tắc tương tự. Hai nhóm được tạo: một nhóm dành cho siêu dữ liệu, nhóm kia dành cho dữ liệu. Chúng được kết hợp thành một hệ thống tập tin. Tại thời điểm này, một số loại bản ghi được tạo, vì vậy nếu bạn xóa hệ thống tệp nhưng giữ lại cả hai nhóm, bạn sẽ không thể khôi phục nó. Có quy trình giải nén file theo khối, mình chưa test. Dịch vụ ceph-mds chịu trách nhiệm truy cập vào hệ thống tập tin. Mỗi hệ thống tập tin yêu cầu một phiên bản dịch vụ riêng biệt. Có một tùy chọn "chỉ mục", cho phép bạn tạo giao diện của một số hệ thống tệp trong một - cũng chưa được thử nghiệm.

Ceph-mon - Dịch vụ này lưu trữ bản đồ của cụm. Nó bao gồm thông tin về tất cả các OSD, một thuật toán phân phối PG trong OSD và quan trọng nhất là thông tin về tất cả các đối tượng (tôi không rõ chi tiết về cơ chế này: có một thư mục /var/lib/ceph/mon/…/ store.db, nó chứa một tệp lớn có dung lượng 26MB và trong một cụm gồm 105K đối tượng, hóa ra là hơn 256 byte cho mỗi đối tượng một chút - Tôi nghĩ rằng màn hình lưu trữ danh sách tất cả các đối tượng và PG trong đó chúng được định vị). Thư mục này bị hư hỏng dẫn đến mất tất cả dữ liệu trong cụm. Do đó, kết luận được rút ra là CRUSH hiển thị cách các PG được định vị trên OSD và cách các đối tượng được định vị trên PG - chúng được lưu trữ tập trung bên trong cơ sở dữ liệu, bất kể các nhà phát triển có tránh từ này đến mức nào. Do đó, thứ nhất, chúng tôi không thể cài đặt hệ thống trên ổ flash ở chế độ RO, vì cơ sở dữ liệu liên tục được ghi lại nên cần có thêm đĩa cho những thứ này (hầu như không quá 1 GB), thứ hai, cần phải có một sao chép trong thời gian thực cơ sở này. Nếu có một số màn hình thì khả năng chịu lỗi sẽ tự động được đảm bảo, nhưng trong trường hợp của chúng tôi chỉ có một màn hình, tối đa là hai màn hình. Có một quy trình lý thuyết để khôi phục màn hình dựa trên dữ liệu OSD, tôi đã sử dụng nó ba lần vì nhiều lý do khác nhau và ba lần không có thông báo lỗi cũng như không có dữ liệu. Thật không may, cơ chế này không hoạt động. Hoặc chúng tôi vận hành một phân vùng thu nhỏ trên OSD và tập hợp RAID để lưu trữ cơ sở dữ liệu, điều này chắc chắn sẽ ảnh hưởng rất xấu đến hiệu suất hoặc chúng tôi phân bổ ít nhất hai phương tiện vật lý đáng tin cậy, tốt nhất là USB, để không chiếm cổng.

rados-gw - xuất lưu trữ đối tượng thông qua giao thức S3 và tương tự. Tạo nhiều pool, không rõ tại sao. Tôi không thử nghiệm nhiều.

ceph-mgr - Khi cài đặt dịch vụ này, một số mô-đun sẽ được khởi chạy. Một trong số đó là autoscale không thể tắt được. Nó cố gắng duy trì lượng PG/OSD chính xác. Nếu muốn kiểm soát tỷ lệ theo cách thủ công, bạn có thể tắt tỷ lệ cho từng nhóm, nhưng trong trường hợp này, mô-đun gặp sự cố khi chia cho 0 và trạng thái cụm trở thành LỖI. Mô-đun này được viết bằng Python và nếu bạn nhận xét dòng cần thiết trong đó, điều này sẽ dẫn đến việc nó bị vô hiệu hóa. Quá lười để nhớ chi tiết.

Danh sách các nguồn được sử dụng:

Lắp đặt CEPH
Phục hồi từ lỗi màn hình hoàn toàn

Danh sách kịch bản:

Cài đặt hệ thống thông qua 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

Tạo một cụm

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

Thêm OSD (một phần)

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

Tóm tắt thông tin

Ưu điểm tiếp thị chính của CEPH là CRUSH - một thuật toán tính toán vị trí của dữ liệu. Màn hình phân phối thuật toán này cho máy khách, sau đó máy khách trực tiếp yêu cầu nút mong muốn và OSD mong muốn. CRUSH đảm bảo không có sự tập trung. Đó là một tập tin nhỏ mà bạn thậm chí có thể in ra và treo lên tường. Thực tiễn đã chỉ ra rằng CRUSH không phải là một bản đồ đầy đủ. Nếu bạn phá hủy và tạo lại màn hình, giữ lại tất cả OSD và CRUSH, thì điều này là không đủ để khôi phục cụm. Từ đó có thể kết luận rằng mỗi màn hình lưu trữ một số siêu dữ liệu về toàn bộ cụm. Lượng nhỏ siêu dữ liệu này không áp đặt các hạn chế về kích thước của cụm nhưng yêu cầu đảm bảo an toàn cho chúng, điều này giúp loại bỏ việc tiết kiệm ổ đĩa bằng cách cài đặt hệ thống trên ổ đĩa flash và loại trừ các cụm có ít hơn ba nút. Chính sách tích cực của nhà phát triển liên quan đến các tính năng tùy chọn. Khác xa với chủ nghĩa tối giản. Tài liệu ở mức độ “cảm ơn vì những gì chúng tôi có, nhưng nó rất rất ít ỏi”. Khả năng tương tác với các dịch vụ ở mức độ thấp được cung cấp, nhưng tài liệu đề cập đến chủ đề này quá hời hợt, vì vậy nhiều khả năng là không hơn là có. Thực tế không có cơ hội khôi phục dữ liệu từ tình huống khẩn cấp.

Các tùy chọn cho hành động tiếp theo: từ bỏ CEPH và sử dụng btrfs đa đĩa tầm thường (hoặc xfs, zfs), tìm hiểu thông tin mới về CEPH, điều này sẽ cho phép bạn vận hành nó trong các điều kiện đã chỉ định, hãy thử ghi bộ lưu trữ của riêng bạn dưới dạng nâng cao đào tạo.

Nguồn: www.habr.com

Thêm một lời nhận xét