Добавление новых узлов в 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
После внесения изменений в файл настройки, как обычно, перестартуем сервис:
Rsync
Промежуточно файлы колец хранятся в транзитных каталогах /opt/swift/ring на каждом из узлов.
Чтобы это заработало, добавим в конец файла /etc/rsyncd.conf дополнительную секцию.
Подготовка пулов хранения
Данная операция автоматизирована, т.к. на серверах хранения мы обычно имеем по 36 дисков одинакового размера (~16 Тб).
Чтобы создать пулы хранения необходимо запустить программу create-osds.
Программа выведет все типоразмеры найденных дисков. Необходимо ввести числовое значения размера дисков, котрые мы отдаем под пулы и подтвердить начало процесса.
Внимание!!! Тщательно проверьте имена устройств, текущего сервера и размер дисков, прежде чем запустить процесс разметки - всю информация на выбранных дисках будет удалена!
Не забываем поправить права на каталоги с пулами хранения:
Создание новых файлов колец
Формирование нового кольца всегда производим на узле swft-az01-0001 в каталоге /root.
Для начала создаем новый каталог с очередной версией кольца: /root/ring_version_5 и копируем туда все файлы из предыдущей версии кольца:
После этого запускаем синхронизацию по всем узлам swift:
Применение новых колец и контроль
Далее, необходимо поочередно зайти на каждый узел swift storage (индексы 0003, 0004, 0005) и произвести применение новых колец:
После этого, необходимо поочередно зайти на каждый узел swift proxy (индексы 0001, 0002) и произвести применение новых колец:Мониторинг процесса осуществляем после каждого шага с помощью команды:
Необходимо внимательно проверять все сообщения.Приложения
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