Настройка окружения¶
- Ручная установка и настройка Sanlock в облаке OpenStack
- Подключение LUN
- Получение доступных таргетов
- Подключение таргета
- Установка multipath
- Настройка LVM и sanlock
- Создание группы логических дисков
- Создание окружения для корректного запуска системы
- Создание службы, запускающей группу(ы) логических дисков start-lvm-lock.service
- Исправление возможных ошибок
Ручная установка и настройка Sanlock в облаке OpenStack¶
В настоящий момент OpenStack Cinder позволяет подключать блочные устройства iscsi
, при этом на каждое такое устройство создается отдельный LUN
и подключение со стороны iscsi-инициатора.
LVM
и sanlock
предоставляют альтернативное решение, при котором однократно созданный LUN подключается ко всем вычислительным узлам, и блочное устройство для виртуальной машины выделяется путем создания логического тома в указанном LUN
, и, благодаря блокировкам sanlock
, блочное устройство подключается к конкретной виртуальной машине или (при множественном подключении) машинам.
Подключение LUN¶
На этом этапе необходим выделенный LUN на сетевом хранилище. Для авторизации предоставим доступ к выделенному LUN по имени инициатора. Имя инициатора для каждого сервера должно быть уникальным, оно хранится в файле /etc/iscsi/initiatorname.iscsi
, и по умолчанию содержит случайную комбинацию символов.
Если каталога /etc/iscsi
не существует, то необходима установка пакета open-iscsi
:
apt-get update
apt-get install open-iscsi -y
Передайте имена всех инициаторов системному администратору или внесите их в настройки выделенного LUN самостоятельно.
Получение доступных таргетов¶
Следующим действием получаем доступные таргеты с сетевого хранилища:
iscsiadm -m discovery -t sendtargets -p <san_ip>:<port>
Где:
<san_ip>
- имя или ip-адрес сетевого хранилища;
<port>
- TCP порт подключения к сетевому хранилищу (по умолчанию 3260, в этом случае его указание не обязательно).
Данная команда предоставит список доступных таргетов для инициатора, прописанного на данном сервере. В случае если у сетевого хранилища нескольких адресов, то необходимо получить список доступных таргетов с каждого адреса.
Подключение таргета¶
Подключение таргета осуществляется командой:
iscsiadm -m node --targetname <target_name> -p <san_ip>:<port> --login
Где:
<target_name>
- имя таргета, полученного на предыдущем этапе;
<san_ip>:<port>
- имя и порт сетевого хранилища.
Имена таргетов для одного и того же LUN
для разных адресов хранилища могут как совпадать, так и различаться. В любом случае необходимо подключить LUN
по имени того таргета, который доступен на данном имени сетевого хранилища.
Выполнение команды повторить для каждого имени или адреса сетевого хранилища и таргета, предоставленного для этого имени хранилища.
В результате выполнения у вас в системе должны появиться один или несколько новых блочных устройств с именами формата /dev/sdX
.
Установка multipath¶
Установка пакета:
apt-get install -y multipath-tools
Загрузка модулей ядра:
modprobe dm-multipath modprobe dm-round-robin
Создание конфигурационного файла
/etc/multipath.conf
:defaults { polling_interval 10 path_selector "round-robin 0" path_grouping_policy failover prio const path_checker readsector0 rr_min_io 100 max_fds 8192 rr_weight priorities failback immediate no_path_retry 10 user_friendly_names yes find_multipaths no verbosity 2 } blacklist { devnode \"^(ram|nvme|drbd|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*\" devnode \"^hd[a-z]\" devnode \"^vd[a-z]\" devnode \"^rbd*\" } devices { device { vendor "IET" product "VIRTUAL-DISK" } }
Запуск службы:
systemctl start multipathd
Включение автоматического запуска службы при загрузке операционной системы:
systemctl enable multipathd
Проверяем, объединил ли
multipath
доступ к сетевым дискам:multipath -ll sanlock (3600c0ff00028976702fc3c6001000000) dm-0 HP,MSA 2040 SAN size=279G features='1 queue_if_no_path' hwhandler='1 alua' wp=rw |-+- policy='round-robin 0' prio=50 status=active | `- 7:0:0:1 sdf 8:80 active ready running `-+- policy='round-robin 0' prio=10 status=enabled `- 6:0:0:1 sdd 8:48 active ready running
В приведенном выводе команды видим нестандартное имя блочного устройства
sanlock
(вместоmpathX
), доступное в системе как/dev/mapper/sanlock
. Это сделано для удобства путем добавления в конфигурационный файл/etc/multipath.conf
следующих строк:multipaths { multipath { wwid 3600c0ff00028976702fc3c6001000000 alias sanlock } }
Подобное переопределение имени дает возможность получить корректный доступ к блочному устройству, так как при последующей загрузке системы стандартное имя
/dev/mapper/mpathX
может измениться при наличии в системе нескольких сетевых дисков.
Настройка LVM и sanlock¶
Установка пакетов:
apt-get install lvm2-lockd sanlock lvm2
Запуск службы:
systemctl restart sanlock
Настройка LVM¶
Изменим в файле
/etc/lvm/lvm.conf
параметры:... filter = [ "a|^/dev/mapper/sanlock$|", "r|.*/|" ] … use_lvmlockd = 1 ...
Параметром
filter
ограничиваем поиск виртуальных логических дисков только на устройстве/dev/mapper/sanlock
. Если Вы используетеLVM
и на других блочных устройствах, то необходимо указать это явно, что позволит не рассматриватьLVM
внутри логических блочных устройств, с которыми работают виртуальные машины.Параметр
use_lvmlockd=1
включает взаимодействие со службойlvmlockd
.Изменим в файле
/etc/lvm/lvmlocal.conf
:... host_id = 11 ...
Данный параметр должен иметь уникальное числовое значение для каждой системы и иметь значение от 1 до 2000. Данное значение используется при создании блокировок.
Перезапускаем службы:
systemctl restart lvmlockd lvmlocks
Настройка LVM
и sanlock
завершена.
Создание группы логических дисков¶
Создание группы логических дисков производится однократно на любом из серверов, к которым подключен LUN.
Подготовка блочного устройства:
pvcreate /dev/mapper/sanlock
Создание группы логических дисков:
vgcreate --shared --lock-type sanlock vol /dev/mapper/mglobal
Таким образом создаем группу дисков
vol
, имеющую типshared
с использованием блокировок типаsanlock
на блочном устройстве/dev/mapper/sanlock
.Перевод группы дисков (VG) в режим работы с блокировками выполняется командой:
vgchange --lock-start vol
Создание окружения для корректного запуска системы¶
На этом этапе создаем настройки системы для запуска служб в нужной последовательности при загрузке операционной системы, а именно:
- sanlock;
- запуск группы логических дисков с поддержкой блокировок;
- запуск aos-agent;
- запуск служб OpenStack, использующих группу логических дисков.
Модифицируем запуск
aos-agent
:mkdir -p /etc/systemd/system/aos-agent.service.d
Создаем файл
/etc/systemd/system/aos-agent.service.d/override.conf
:[Unit] After=start-lvm-lock.service sanlock.service lvmlocks.service [Service] ExecStartPre=/bin/sleep 10
Модифицируем запуск
nova-compute
(для вычислительных узлов облака):mkdir -p /etc/systemd/system/nova-compute.service.d
Создаем файл
/etc/systemd/system/nova-compute.service.d/override.conf
:[Unit] After=neutron-openvswitch-agent.service start-lvm-lock.service aos-agent.service [Service] ExecStartPre=/bin/sleep 60
Модифицируем запуск
cinder-volume
(на узлах, на которых установлена данная служба):mkdir -p /etc/systemd/system/cinder-volume.service.d
Создаем файл
/etc/systemd/system/cinder-volume.service.d/override.conf
:[Unit] After=neutron-openvswitch-agent.service start-lvm-lock.service aos-agent.service [Service] ExecStartPre=/bin/sleep 60
Создание службы, запускающей группу(ы) логических дисков start-lvm-lock.service¶
Создаем файл /usr/local/bin/lvm-lock.sh:
#!/bin/bash count=$(vgs -a | grep " vol " | wc -l) while [ "$count" -eq "0" ]; do sleep 5 count=$(vgs -a | grep " vol " | wc -l) done pv_vol=$(pvs -o UUID,NAME,vg_name | grep " vol " | awk '{print $2;}' | sed "s/\n//g") for pv in $pv_vol do while ! [ -e $pv ] do sleep 5 done done vgchange --lock-start vol # chmod +x /usr/local/bin/lvm-lock.sh
Данный исполняемый файл ожидает появления в системе блочных устройств, на которых расположена группа логических дисков, затем меняет режим работы группы логических дисков на работу в режиме блокировок.
Если в системе находится несколько
shared VG
, то нужно продублировать код для каждойVG
с заменойvol
на имя другойVG
.Создаем файл службы
/etc/systemd/system/start-lvm-lock.service
:[Unit] After=lvmlockd.service lvmlocks.service sanlock.service iscsi.service iscsid.service [Service] Type=oneshot ExecStart=/usr/local/bin/lvm-lock.sh [Install] WantedBy=multi-user.target
Запускаем службу:
systemctl start start-lvm-lock.service
Включаем автоматический запуск службы при загрузке операционной системы:
systemctl enable start-lvm-lock.service
Исправление возможных ошибок¶
Причины, приводящие к ошибкам в процессе работы могут быть разные, но так или иначе они связаны с потерей доступа к разделу блокировок, в результате чего группа логических дисков переходит в режим работы без блокировок, что приводит к неработоспособности служб OpenStack.
Для предотвращения возникающих ошибок рекомендуется посмотреть настройки iscsi-соединений, а именно таймаутов, чтобы служба LVM
не получала ошибок со стороны сети о недоступности блочных устройств при кратковременных сбоях в локальной сети.
Если появилась ошибка, то необходимо произвести восстановление режима работы блокировок.
В случае, если на вычислительном узле нет используемых в данный момент логических дисков для восстановления работы группы дисков в режиме блокировок, необходимо выполнить команду:
vgchange --lock-start vol
где vol
- название группы логических дисков.
Но наличие активных блокировок не даст выполнить данную команду успешно.
Диагностируем наличие активных блокировок:
sanlock client status
daemon b83efaba-0b75-4b30-9b61-9d78195468c3.cn-193980.
p -1 helper
p -1 listener
p 1010 lvmlockd
p -1 status
s lvm_sanlock:212:/dev/mapper/vol-lvmlock:0
r lvm_sanlock:i2gjby-VEc6-APGD-x9if-ldk2-oxxI-XOwExz:/dev/mapper/vol-lvmlock:77594624:4 p 1010
r lvm_sanlock:PDHtUW-8i1O-ECi4-cxmj-pSAF-hZs2-MVqmcF:/dev/mapper/vol-lvmlock:70254592:2 p 1010
В данном случае в системе используются 2 логических диска, информация о которых хранится в разделе /dev/mapper/vol-lvmlock
.
Для деактивации блокировок необходимо отключить использование дисков.
Получаем список запущенных виртуальных машин:
virsh list
Id Name State
-----------------------------------
2 instance-00000005 running
4 instance-00000007 running
6 instance-0000000d running
Определяем список доступных логических томов:
lvs -a
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
[lvmlock] vol -wi-ao---- 256,00m
volume-0d6c493f-697f-48d5-a2dd-8d7aa2c5542c vol -wi-ao---- 60,00g
volume-697bd726-e4ae-4c6f-8180-f7dee51421cf vol -wi------- 60,00g
volume-fe496e6c-0926-4f81-8439-753f42822019 vol -wi-ao---- 30,00g
Определяем, какие из виртуальных машин используют логические тома:
virsh dumpxml instance-00000005
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source dev='/dev/vol/volume-fe496e6c-0926-4f81-8439-753f42822019'/>
<backingStore/>
<target dev='vda' bus='virtio'/>
<serial>fe496e6c-0926-4f81-8439-753f42822019</serial>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>
Если в конфигурации указан логический том из shared
группы, то данная виртуальная машина должна быть выключена. Имя используемого логического тома необходимо сохранить, в дальнейшем он понадобится для восстановления работы виртуальной машины.
Выключаем виртуальную машину:
virsh destroy instance-00000005
После выключения всех виртуальных машин необходимо снять блокировки с дисков и деактивировать их:
lvchange -aln /dev/vol/volume-fe496e6c-0926-4f81-8439-753f42822019
Имя диска для данной команды получено ранее по результатам диагностики.
Данную команду необходимо выполнить для всех дисков, активированных в системе.
После деактивации всех логических дисков необходимо перезагрузить службы блокировок и включить использование блокировок для группы:
systemctl restart sanlock lvmlockd
vgchange --lock-start vol
Перед возобновлением работы виртуальных машин необходимо восстановить деактивированные блокировки:
lvchange -aey /dev/vol/volume-fe496e6c-0926-4f81-8439-753f42822019
Некоторые логические тома могут быть использованы одновременно на нескольких виртуальных машинах, такие диски необходимо восстанавливать неэксклюзивно:
lvchange -asy /dev/vol/volume-fe496e6c-0926-4f81-8439-753f42822019
После восстановления всех блокировок можно запустить остановленные виртуальные машины:
virsh start instance-00000005
Повторить данную операцию для каждой ранее остановленной машины.
В конце рекомендуется перезагрузить nova-compute
:
systemctl restart nova-compute