Добавление новых узлов в Swift

В данной инструкции описан порядок добавления новых узлов хранения в продуктовую систему. На момент производства работ кластер состоял из четырех узлов прокси и шести узлов хранения, которые равномерно распределены по ЦОДам в трех зонах. При таком варианте архитектуры, для равномерного распеределения кластера, необходимо добавлять узлы не поштучно, а по три сервера - по одному на каждую зону доступности (в нашем случае - на каждый ЦОД). Процедура начальной установки и настройки ОС в данной статье не рассматривается. Предполагается, что мы уже имеем в наличии три настроенных сервера. Список серверов, котрые будем добавлять:

Имя сервера IP-адрес
swft-az01-0005 100.111.248.55
swft-az02-0005 100.111.249.55
swft-az03-0005 100.111.250.55

Работы по добавлению новых серверов в кластер swift можно разбить на следующие этапы: - настройка демона systemd-timesyncd для синхронизации времени;
- настройка демона rsync для распространения файла колец (ring);
- разбивка дисков, создание пулов хранения zfs;
- резервное копирование текущего состояния колец;
- генерирование и распространение по всем узлам новых файлов колец;
- поочередный рестарт всех узлов хранения и прокси-серверов с контролем.
Далее подробнее рассмотрим каждый из этих этапов.

Служба времени

Чтобы кластер хранения корректно работал, очень важно обеспечить максимально точное время на всех узлах в рамках кластера. Для этого, мы используем максимально близко расположенные внутренние NTP-серверы Openstack, которые размещены на контроллерах - по одному на каждую зону доступности ЗД (az01..az03). Настройку сервиса производим в файле /etc/systemd/timesyncd.conf:

Copy
[Time] NTP=100.111.250.3 FallbackNTP=100.111.248.3 100.111.249.3 #FallbackNTP=91.207.59.196 193.232.148.72 91.207.58.162 RootDistanceMaxSec=5 PollIntervalMinSec=32 PollIntervalMaxSec=2048
В этом примере представлен вариант для AZ03.
После внесения изменений в файл настройки, как обычно, перестартуем сервис:

Copy
systemctl restart systemd-timesyncd

Rsync

Промежуточно файлы колец хранятся в транзитных каталогах /opt/swift/ring на каждом из узлов.
Чтобы это заработало, добавим в конец файла /etc/rsyncd.conf дополнительную секцию.

Copy
.... [ring] max connections = 2 path = /opt/swift read only = False lock file = /var/lock/ring.lock
И, соответстенно, перезапустим сервис rsyncd:
Copy
systemctl restart rsyncd

Подготовка пулов хранения

Данная операция автоматизирована, т.к. на серверах хранения мы обычно имеем по 36 дисков одинакового размера (~16 Тб). Чтобы создать пулы хранения необходимо запустить программу create-osds.
Программа выведет все типоразмеры найденных дисков. Необходимо ввести числовое значения размера дисков, котрые мы отдаем под пулы и подтвердить начало процесса.
Внимание!!! Тщательно проверьте имена устройств, текущего сервера и размер дисков, прежде чем запустить процесс разметки - всю информация на выбранных дисках будет удалена!

Не забываем поправить права на каталоги с пулами хранения:

Copy
chown -R swift:swift /srv/node/

Создание новых файлов колец

Формирование нового кольца всегда производим на узле swft-az01-0001 в каталоге /root.
Для начала создаем новый каталог с очередной версией кольца: /root/ring_version_5 и копируем туда все файлы из предыдущей версии кольца:

Copy
mkdir /root/ring_version_5 cp -rpv /root/ring_version_4/* /root/ring_version_5/
Далее, переходим в этот каталог и запускаем утилиту swift_ring_grow (см.приложение):

Copy
cd /root/ring_version_5 ./swift-ring-grow 100.111.248.55 100.111.249.55 100.111.250.55
По окончанию работы скрипта в текущем каталоге будут сформированы новые версии файлов колец:

Copy
account.builder account.ring.gz container.builder container.ring.gz object.builder object.ring.gz
Файлы *.ring.gz надо скопировать в каталог распространения:

Copy
cp *.ring.gz /opt/swift/ring/ chown -R swift:swift /opt/swift/ring

После этого запускаем синхронизацию по всем узлам swift:

Copy
./push-ring

Применение новых колец и контроль

Далее, необходимо поочередно зайти на каждый узел swift storage (индексы 0003, 0004, 0005) и произвести применение новых колец:

Copy
ssh swft-az01-0003 cp -pv /opt/swift/ring/* /opt/swift/etc/ /usr/local/bin/restart_swift_all
После этого, необходимо поочередно зайти на каждый узел swift proxy (индексы 0001, 0002) и произвести применение новых колец:

Copy
ssh swft-az01-0001 cp -pv /opt/swift/ring/* /opt/swift/etc/ systemctl restart swift-proxy

Мониторинг процесса осуществляем после каждого шага с помощью команды:

Copy
swift-recon -all --human-readable
Необходимо внимательно проверять все сообщения.

Приложения

create-osds

Copy
#!/bin/bash apt install gdisk -y mkdir -p /srv/node sizes=($(lsblk -n -o SIZE | tr ' ' '\n' | sort -u | tr '\n' ' ')) echo "Были найдены диски следующих типо-размеров: " for size in ${sizes[@]}; do count=$( lsblk -n -o SIZE | grep $size | wc -l ) printf " %-8s %-2d шт.\n" $size $count done read -p "Выберите типоразмер диска {M,G,T}: " disk_size while true; do read -p "Вы хотите диски выбранно типормазмера ${disk_size} использовать в качестве OSD?[Yy]/[Nn] " result case $result in [Yy]* ) echo "инициализация"; break;; [Nn]* ) exit;; * ) echo "Пожалусйста, ответьте Y или N";; esac done echo $disk_size echo '' echo '' wwns=($(lsblk -n -o WWN,SIZE | grep $disk_size | cut -d " " -f 1)) for wwn in ${wwns[@]}; do wipefs -a /dev/disk/by-id/wwn-$wwn sgdisk --zap-all /dev/disk/by-id/wwn-$wwn done number=1 for wwn in ${wwns[@]}; do disk=/dev/disk/by-id/wwn-$wwn dev="00"$number dev=${dev: -2} osd="osd"$dev zpool create -m "/srv/node/${osd}" $osd $disk -f number=$((number +1)) done zpool list

swift_ring_grow

Copy
#!/bin/bash if [ $# != 3 ]; then echo "Не заданы три ip-адреса новых узлов хранения swift!" echo "Например: "$0 " 100.111.248.55 100.111.249.55 100.111.250.55" else NODES=($1 $2 $3) ZONES=(1 2 3) echo "build account ring for new nodes" for j in ${!NODES[@]}; do for i in {01..36}; do osd=osd${i} node=${NODES[$j]} zone=${ZONES[$j]} /opt/swift/bin/swift-ring-builder account.builder add --region 1 --zone ${zone} --ip ${node} --port 6202 --device ${osd} --weight 100 done done echo '' /opt/swift/bin/swift-ring-builder account.builder /opt/swift/bin/swift-ring-builder account.builder rebalance echo '' echo "build container ring for new nodes" for j in ${!NODES[@]}; do for i in {01..36}; do osd=osd${i} node=${NODES[$j]} zone=${ZONES[$j]} /opt/swift/bin/swift-ring-builder container.builder add --region 1 --zone ${zone} --ip ${node} --port 6201 --device ${osd} --weight 100 done done echo '' /opt/swift/bin/swift-ring-builder container.builder /opt/swift/bin/swift-ring-builder container.builder rebalance echo '' echo "build object ring for new nodes "$NODES for j in ${!NODES[@]}; do for i in {01..36}; do osd=osd${i} node=${NODES[$j]} zone=${ZONES[$j]} /opt/swift/bin/swift-ring-builder object.builder add --region 1 --zone ${zone} --ip ${node} --port 6200 --device ${osd} --weight 100 done done echo '' /opt/swift/bin/swift-ring-builder object.builder /opt/swift/bin/swift-ring-builder object.builder rebalance echo '' fi

push_ring - дистрибуция кольца

Copy
#!/bin/bash NODES=(100.111.248.51 100.111.248.52 100.111.248.53 100.111.248.54 100.111.248.55 100.111.249.51 100.111.249.53 100.111.249.54 100.111.249.55 100.111.250.52 100.111.250.53 100.111.250.54 100.111.250.55) for n in ${NODES[@]} do rsync -avh --progress /opt/swift/ring swift@${n}::ring done
Опубликовано: 20.01.2024