Добавление новых узлов в 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:

[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.
После внесения изменений в файл настройки, как обычно, перестартуем сервис:

systemctl restart systemd-timesyncd

Rsync

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

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

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

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

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

chown -R swift:swift /srv/node/

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

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

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

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

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

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

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

./push-ring

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

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

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

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

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

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

Приложения

create-osds

#!/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

#!/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 - дистрибуция кольца

#!/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