Настройка окружения

Ручная установка и настройка 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

  1. Установка пакета:

    apt-get install -y multipath-tools
    
  2. Загрузка модулей ядра:

    modprobe dm-multipath
    modprobe dm-round-robin
    
  3. Создание конфигурационного файла /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"
            }
    }
    
  4. Запуск службы:

    systemctl start multipathd
    
  5. Включение автоматического запуска службы при загрузке операционной системы:

    systemctl enable multipathd
    
  6. Проверяем, объединил ли 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
    
  7. В приведенном выводе команды видим нестандартное имя блочного устройства sanlock (вместо mpathX), доступное в системе как /dev/mapper/sanlock. Это сделано для удобства путем добавления в конфигурационный файл /etc/multipath.conf следующих строк:

    multipaths {
            multipath {
                    wwid                  3600c0ff00028976702fc3c6001000000
                    alias                 sanlock
            }
    }
    

    Подобное переопределение имени дает возможность получить корректный доступ к блочному устройству, так как при последующей загрузке системы стандартное имя /dev/mapper/mpathX может измениться при наличии в системе нескольких сетевых дисков.

Настройка LVM и sanlock

  1. Установка пакетов:

    apt-get install lvm2-lockd sanlock lvm2
    
  2. Запуск службы:

    systemctl restart sanlock
    

Настройка LVM

  1. Изменим в файле /etc/lvm/lvm.conf параметры:

    ...
    filter = [ "a|^/dev/mapper/sanlock$|", "r|.*/|" ]
    …
    use_lvmlockd = 1
    ...
    

    Параметром filter ограничиваем поиск виртуальных логических дисков только на устройстве /dev/mapper/sanlock. Если Вы используете LVM и на других блочных устройствах, то необходимо указать это явно, что позволит не рассматривать LVM внутри логических блочных устройств, с которыми работают виртуальные машины.

    Параметр use_lvmlockd=1 включает взаимодействие со службой lvmlockd.

  2. Изменим в файле /etc/lvm/lvmlocal.conf:

    ...
    host_id = 11
    ...
    

    Данный параметр должен иметь уникальное числовое значение для каждой системы и иметь значение от 1 до 2000. Данное значение используется при создании блокировок.

  3. Перезапускаем службы:

    systemctl restart lvmlockd lvmlocks
    

Настройка LVM и sanlock завершена.

Создание группы логических дисков

Создание группы логических дисков производится однократно на любом из серверов, к которым подключен LUN.

  1. Подготовка блочного устройства:

    pvcreate /dev/mapper/sanlock
    
  2. Создание группы логических дисков:

    vgcreate --shared --lock-type sanlock vol /dev/mapper/mglobal
    

    Таким образом создаем группу дисков vol, имеющую тип shared с использованием блокировок типа sanlock на блочном устройстве /dev/mapper/sanlock.

  3. Перевод группы дисков (VG) в режим работы с блокировками выполняется командой:

    vgchange --lock-start vol
    

Создание окружения для корректного запуска системы

На этом этапе создаем настройки системы для запуска служб в нужной последовательности при загрузке операционной системы, а именно:

  • sanlock;
  • запуск группы логических дисков с поддержкой блокировок;
  • запуск aos-agent;
  • запуск служб OpenStack, использующих группу логических дисков.
  1. Модифицируем запуск aos-agent:

    mkdir -p /etc/systemd/system/aos-agent.service.d
    
  2. Создаем файл /etc/systemd/system/aos-agent.service.d/override.conf:

    [Unit]
    After=start-lvm-lock.service sanlock.service lvmlocks.service
    
    [Service]
    ExecStartPre=/bin/sleep 10
    
  3. Модифицируем запуск nova-compute (для вычислительных узлов облака):

    mkdir -p /etc/systemd/system/nova-compute.service.d
    
  4. Создаем файл /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
    
  5. Модифицируем запуск cinder-volume (на узлах, на которых установлена данная служба):

    mkdir -p /etc/systemd/system/cinder-volume.service.d
    
  6. Создаем файл /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

  1. Создаем файл /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.

  2. Создаем файл службы /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
    
  3. Запускаем службу:

    systemctl start start-lvm-lock.service
    
  4. Включаем автоматический запуск службы при загрузке операционной системы:

    systemctl enable start-lvm-lock.service
    

Создание нового типа дисков Cinder, расположенных на shared LVM

  1. На узле, на котором работает служба cinder-volume, правим файл /etc/cinder/cinder.conf:

    [DEFAULT]
    rpc_response_timeout = 2888
    …
    enabled_backends = sanlock
    default_volume_type = sanlock
    ...
    [sanlock]
    volume_driver = cinder_sharedlvm_driver.driver.SharedLVMDriver
    agent_transport_url = amqp://aos:password@controller:5672/aos
    volume_group = vol
    lvm_type = default
    lvm_mirrors = 0
    target_protocol = iscsi
    target_helper = tgtadm
    volume_backend_name=sanlock
    volume_clear=none
    volume_clear_size=100
    agent_response_timeout = 2888
    
    
    [nova]
    token_auth_url = http://controller:5000
    auth_section = keystone_authtoken
    auth_type = password
    
  2. В параметр enabled_backends добавляем новый backend (в примере он единственный).

  3. Параметр default_volume_type переопределяем по необходимости или в случае, если данный параметр не был определен ранее.

  4. Логин и пароль для RabbitMQ необходимо заменить на используемые значения в вашем облаке. Имя controller сменить на название контроллера Вашего облака.

  5. Создаем тип дисков sanlock:

    cinder type-create sanlock
    
  6. Привязываем к типу sanlock диски, созданные с помощью backend с именем sanlock:

    openstack volume type set sanlock --property volume_backend_name=sanlock
    
  7. Создаем группу согласованного доступа:

    cinder consisgroup-create --name sanlock sanlock
    

Исправление возможных ошибок

Причины, приводящие к ошибкам в процессе работы могут быть разные, но так или иначе они связаны с потерей доступа к разделу блокировок, в результате чего группа логических дисков переходит в режим работы без блокировок, что приводит к неработоспособности служб 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