From 1d93f229e03ae4e5a4fd069eb2d0d00911257a13 Mon Sep 17 00:00:00 2001 From: Alexey Kostin Date: Fri, 23 Nov 2018 15:52:10 +0300 Subject: [PATCH 1/3] Ceph + iscsi --- ...w-tcmu-runner-rw_bs64k_d32_bw.-2Dtrend.png | Bin 0 -> 21340 bytes _static/compare-rw_bs64k_d32_bw.-2Dtrend.png | Bin 0 -> 41731 bytes ceph-choice.rst | 2 - cephiscsi.rst | 153 ++++++++++++++++++ index.rst | 1 + 5 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 _static/compare-old-new-tcmu-runner-rw_bs64k_d32_bw.-2Dtrend.png create mode 100644 _static/compare-rw_bs64k_d32_bw.-2Dtrend.png create mode 100644 cephiscsi.rst diff --git a/_static/compare-old-new-tcmu-runner-rw_bs64k_d32_bw.-2Dtrend.png b/_static/compare-old-new-tcmu-runner-rw_bs64k_d32_bw.-2Dtrend.png new file mode 100644 index 0000000000000000000000000000000000000000..709c8f2390bc81fea951862e786d6aa3c17ed5bb GIT binary patch literal 21340 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

W6^6IjjfwB{oGV%G1n7b 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�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 d`ri-gIU`_. +Установка тривиальна и хорошо описана в `официальной документации ceph `_, +так и в документации `Red Hat Ceph Storage 3+ `_. +В документации так же описано как настраивать инициаторы, и этих правил следует придерживаться, +т.к. у текущей реализации `есть свои ограничения `_. + +Из приятных бонусов этого решения: + +* Централизованое управление через утилиту gwcli +* Простой деплой самого приложения +* Интегрированность в ceph (в частности в выводе `ceph -s` можно увидеть `tcmu-runner: 3 daemons active` ) +* Поддержка `SCSI-3 PR `_, которая может понадобится, + например, для серверов на базе ОС Windows для кворумных дисков или общих ресурсов для БД или кластеризиции. +* Отказоустойчивость из коробки, т.к. вы анонсируете портальную группу, и ваш клиент может переключиться + по failover на другой портал. + +Минусы этого решения: + +* Не будет бонусов в виде отказоустойчивости, если инициатор не умеет с этим работать +* В основе продукта лежит tcmu-runner, который **значительно** медленнее работает чем вариант + "замаппить rbd и отдать его как диск", т.к. последний вариант близок по скорости к варианту отдать rbd нативно через librbd, + в то время, как вариант с tcmu-runner'ом медленнее в ~2 раза + +Особенности этого решения: + +Приведу здесь несколько графиков, снятых с помощью fio на кластере среднего пошиба из ВМ. +Диски подключались к ВМ нативно через qemu, через iscsi (в двух вариациях), через nfs + +Профиль +ioengine=libaio +direct=1 +buffered=0 +time_based=1 +size=20g +wait_for_previous +filename=/root/tests/bigfile +iodepth=32 +rw=randwrite +bs=4m + +* Разница между tcmu-runner версий 1.3.0 и версии 1.3.X с одним из последних патчей который повышает производительность, + который бэкпортировали себе в продукт RHCEPH компания RedHat + +.. image:: _static/compare-old-new-tcmu-runner-rw_bs64k_d32_bw.-2Dtrend.png + +| + +* Разница между различными бэкендами + +.. image:: _static/compare-rw_bs64k_d32_bw.-2Dtrend.png + +| + +Из этих графиков видно что: + +#. TCMU-runner значительно медленее варианта с raw iscsi + +#. Работа по решению проблем со скоростью ведется, и стоит ожидать что в следующих версиях + скорость будет выше + + +Raw rbd + iscsi +=============== + +Второй вариант заключается в том что нужно замаппить rbd на систему предполагаемого таргета +и анонсировать как блочное устройство. + +Плюсы этого решения: + +* Скорость близка к нативному rbd +* Нет надобности ставить дополнительное ПО + +Минусы этого решения: + +* Так как не все rbd features реализованы в модуле rbd в ядре (далее krbd), необходимо отключать все + features rbd выше layering (далее выдержка из master ветки ядра) + +:: + + /* Feature bits */ + #define RBD_FEATURE_LAYERING (1ULL<<0) + #define RBD_FEATURE_STRIPINGV2 (1ULL<<1) + #define RBD_FEATURE_EXCLUSIVE_LOCK (1ULL<<2) + #define RBD_FEATURE_DATA_POOL (1ULL<<7) + #define RBD_FEATURE_OPERATIONS (1ULL<<8) + +* Т.к. используется krbd, существует вполне реальная опасность, что некорректно работающий инициатор может `положить` + не только iscsi, но и кластер ceph. У автора этой заметки были случаи когда windows initiator мешал модуль lio, а + вместе с ним падал и ceph, т.к. появлялось много blocked requests, связанных с sub ops'ами. + +* Если нужна отказоустойчивость, придётся делать её самому. + +Плюсы этого решения: + +* Относительная простота + +* Скорость работы + +При работе с krbd следует максимально обезопасить кластер, для этого нужно обновлять ПО на инициаторе (например кумулятивные +апдейты windows), и обновлять версию ядра на кластере с iscsi таргетами, т.к. модули LIO и RBD находятся в ядре, +более новые ядра ведут себя стабильнее даже когда начинаются проблемы с подсистемой iscsi (LIO), это уже не так пагубно влияет +на кластер ceph. Желательно использовать 4.14+. + +У автора данной заметки windows initiator с определенным набором апдейтов с mtu 9000 на сетевом адаптере выводил из строя +кластер ceph, и при этом же с mtu 1500 такой проблемы не наблюдалось. + +Если нужен SCSI-3 PR, то оптимальным вариантом будет сделать "плавающий" +таргет. Самый простой вариант сделать virtual ip (далее vip), настроить таргеты на прослушивание этого vip, и сделать +миграцию адреса через pacemaker, keepalived, etc. + +В этом случае будет работать Persistant Reservation, т.к. PR эмулируется LIO локально на таргете. +Но все запросы будут приходить на один сервер + +Если не требуется поддержка PR, то можно сделать несколько разных порталов с идентичными таргетами (c одинаковыми wwn), и настраивать +failover на инициаторах (например через multipath). В некоторых решениях, используется кластерный lvm (clvmd или lvmlockd). + + +Резюмируя вышесказанное +======================= + +Выводы: + +#. Самый простой отказоустойчивый спобоб использовать iscsi и ceph - использовать ceph-iscsi. Все остальные способы + потребуют инженерной смекалки и осторожности. + +#. Всегда предварительно нужно тестировать работу на конкретном оборудовании + +#. Даже, казалось бы, такая мелочь, как MTU на стороне инициатора может вызвать отказ в обслуживании в нашем СХД + +#. Очень желательно ставить обновления, на системы, что на Linux (обновление системы и ядра), что Windows, ставить + последние прошивки и драйвера для сетевых устройств. + +#. В ядро rhel постоянно бэкпортируют части кода из нового ядра, но в некоторых случаях новые ядра ведут себя стабильнее. + А т.к. модули Lio и модуль rbd находятся в ядре, и в них регулярно вносят изменения, то это напрямую влияет на + возможности и стабильность кластера. В официальной документации рекомендованы lts ядра версий 4.9 или 4.14. Если + используется ceph-iscsi, то ядра 4.16+/ядра из rhel 7.5+, т.к. для его работы нужны специфичные патчи в ядро. + +#. Если бы мы использовали tcmu-runner, который не использует krbd, а использует librbd, скорее всего проблемы с + инициатором не затрагивали бы наш кластер ceph + + + + diff --git a/index.rst b/index.rst index 47b13c1..9766a09 100644 --- a/index.rst +++ b/index.rst @@ -14,6 +14,7 @@ bench bluestore cephfs + cephiscsi cpu_and_mem disks how-it-works From 8e4b7746e61fd8f2afda28a9fbfd2848e03e1197 Mon Sep 17 00:00:00 2001 From: Alexey Kostin Date: Wed, 28 Nov 2018 19:37:26 +0300 Subject: [PATCH 2/3] Ceph + iscsi --- about.rst | 1 + cephiscsi.rst | 161 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 110 insertions(+), 52 deletions(-) diff --git a/about.rst b/about.rst index 487cd51..18bb813 100644 --- a/about.rst +++ b/about.rst @@ -22,3 +22,4 @@ http://ceph-docs.readthedocs.io * Maksim Shchuplov * Vitaliy Filippov * Коренберг Марк +* Алексей Костин diff --git a/cephiscsi.rst b/cephiscsi.rst index 979c360..d9f3db5 100644 --- a/cephiscsi.rst +++ b/cephiscsi.rst @@ -2,75 +2,130 @@ Ceph + iscsi ************ +В случае использования в роли СХД кластер Ceph, а в роли клиента сервера с ОС на базе Linux, использование iscsi +не выглядит целесообразным, т.к. можно использовать rbd нативно, но если +клиентом выступает сервер с Vmware или Windows, других вариантов использовать блочное устройство на клиенте, +кроме как отдать rbd по iSCSI, на данный момент нет. + +В дальнейшем речь пойдет об организации доступа на клиентах к rbd по протоколу iSCSI. + +Терминология +============ +Терминология iSCSI во многом основывается на терминологии, использующейся в SCSI: + +* initiator — тот, кто устанавливает соединение с целью(target). Чаще всего это узел (в общем случае) осуществляет ввод/вывод на блочные устройства. +* target — экспортируемый объект. В зависимости от контекста цель(target) называют или целиком экспортирующий узел, или только экспортируемый объект. Сам объект может делиться на lun’ы. +* Портал — группа целей(targets), которые анонсируются вместе. Чаще всего один узел хранения — один портал. +* IQN — полное имя участника взаимодействия. На практике существует iqn у инициатора и у цели(target). +* endpoint — уточнённое имя ресурса, чаще всего включает в себя iqn, номер LUN’а и указание на конкретный метод доступа к нему (например, номер соединения, LUN и IP-адрес, с которого следует получать доступ к устройству). +* LUN (Logical Unit Number) — номер объекта внутри цели(target). Ближайшим аналогом является раздел диска или отдельный том. +* LIO - Linux-IO (LIO) Target является открытой имплементацией SCSI таргета которая включена в стандартное ядро Linux. +* kRBD - модуль rbd в ядре Linux +* ALUA - Asymmetric Logical Unit Access, протокол внутри спецификаций SCSI-2 и SCSI-3, позволяющий правильно + организовывать доступ к данным, доступным по различным путям с различными характеристиками доступа. + Для его использования, понимать ALUA должны все участники, как система хранения, так и OS хоста. +* MTU - maximum transmission unit, означает максимальный размер полезного блока данных одного пакета + (англ. payload), который может быть передан протоколом без фрагментации. + + Ceph-iscsi ========== -Первый и основной способ это использование ceph-iscsi. Продукт этот на данный момент зрелый, поддерживается компанией -redhat и, с недавних пор, suse. +Первый, и основной способ, это использование ceph-iscsi. Продукт этот на данный момент зрелый, поддерживается +компанией RedHat и, с недавних пор, SUSE. -Пакеты можно взять на `официальном репозитории `_. -Установка тривиальна и хорошо описана в `официальной документации ceph `_, -так и в документации `Red Hat Ceph Storage 3+ `_. +Пакеты можно взять на официальном репозитории https://download.ceph.com/ceph-iscsi/ . +Установка тривиальна и хорошо описана в официальной документации Ceph http://docs.ceph.com/docs/master/rbd/iscsi-overview/ , +так и в документации Red Hat Ceph Storage 3+ https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/3/html/block_device_guide/using_an_iscsi_gateway . В документации так же описано как настраивать инициаторы, и этих правил следует придерживаться, -т.к. у текущей реализации `есть свои ограничения `_. +т.к. у текущей реализации есть свои ограничения https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/3.0/pdf/release_notes/Red_Hat_Ceph_Storage-3.0-Release_Notes-en-US.pdf , например: + +:: + + Having more than one path from an initiator to an iSCSI gateway is not supported + In the iSCSI gateway, tcmu-runner might return the same inquiry and Asymmetric logical + unit access (ALUA) info for all iSCSI sessions to a target port group. + This can cause the initiator or multipath layer to use the incorrect port info to reference + the internal structures for paths and devices, which can result in failures, failover and failback failing, + or incorrect multipath and SCSI log or tool output. Therefore, having more than one iSCSI session + from an initiator to an iSCSI gateway is not supported. (BZ#1502740) + +Стоит отметить что ограничения описанные в документации связаны с особенностью реализации tcmu-runner'а и +касаются версии 1.3, возможно, с развитием проекта ограничения частично +будут ослаблены. Актуальный changelog можно узнать на странице проекта на github https://github.com/open-iscsi/tcmu-runner/releases Из приятных бонусов этого решения: * Централизованое управление через утилиту gwcli -* Простой деплой самого приложения -* Интегрированность в ceph (в частности в выводе `ceph -s` можно увидеть `tcmu-runner: 3 daemons active` ) -* Поддержка `SCSI-3 PR `_, которая может понадобится, - например, для серверов на базе ОС Windows для кворумных дисков или общих ресурсов для БД или кластеризиции. -* Отказоустойчивость из коробки, т.к. вы анонсируете портальную группу, и ваш клиент может переключиться - по failover на другой портал. +* Простой деплой самого приложения (описана установка вручную и через ansible) +* Интегрированность в Ceph (в частности, в выводе `ceph -s` можно увидеть `tcmu-runner: 3 daemons active` ) +* Поддержка SCSI-3 persistent reservations (так же известный как SCSI-3 PR или SCSI-3 PGR) + http://www.gonzoleeman.net/scsi-3-pgr-tutorial-v1.0 , которая может понадобиться, + например, для серверов на базе ОС Windows для кворумных дисков или общих ресурсов для БД или кластеризиции, т.к. в этом + случае обязательно наличие устройства поддерживающего persistant reservation (если используется блочное устройство, а не samba). + + SCSI-3 PR обеспечивает доступ для нескольких узлов к устройству и одновременно блокирует доступ для других узлов. + SCSI-3 PR использует концепцию регистрации и резервирования. Каждая система регистрирует свой «ключ» на устройстве + поддерживающим SCSI-3 (например, эксклюзивное чтение). https://www.systutorials.com/docs/linux/man/8-sg_persist/ + +* Отказоустойчивость из коробки, т.к. вы анонсируете портальную группу, нет нужды синхронизировать конфигурацию на серверах, + настраивать каждый из порталов и настраивать взаимосвязь, и ваш клиент может переключиться по failover на другой портал. +* Нет необходимости (tcmu-runner 1.3+) маппить rbd, в связи с этим нет ограничений на включенные features rbd. Минусы этого решения: -* Не будет бонусов в виде отказоустойчивости, если инициатор не умеет с этим работать +* Не будет бонусов в виде отказоустойчивости, если инициатор не умеет с этим работать (нужна поддержика ALUA и multipath) * В основе продукта лежит tcmu-runner, который **значительно** медленнее работает чем вариант "замаппить rbd и отдать его как диск", т.к. последний вариант близок по скорости к варианту отдать rbd нативно через librbd, в то время, как вариант с tcmu-runner'ом медленнее в ~2 раза Особенности этого решения: -Приведу здесь несколько графиков, снятых с помощью fio на кластере среднего пошиба из ВМ. -Диски подключались к ВМ нативно через qemu, через iscsi (в двух вариациях), через nfs - -Профиль -ioengine=libaio -direct=1 -buffered=0 -time_based=1 -size=20g -wait_for_previous -filename=/root/tests/bigfile -iodepth=32 -rw=randwrite -bs=4m +Приведу здесь несколько графиков, снятых с помощью fio на достаточно слабом кластере. Тесты производились из ВМ +в которую одним из методов подключались диски (librbd, nfs-ganesha, ceph-iscsi, kRBD + LIO) + +Профиль: + +:: + + [global] + ioengine=libaio + direct=1 + buffered=0 + time_based=1 + size=20g + wait_for_previous + filename=/root/tests/bigfile + + [rw_bs64k_d32] + iodepth=32 + rw=randwrite + bs=4m * Разница между tcmu-runner версий 1.3.0 и версии 1.3.X с одним из последних патчей который повышает производительность, который бэкпортировали себе в продукт RHCEPH компания RedHat -.. image:: _static/compare-old-new-tcmu-runner-rw_bs64k_d32_bw.-2Dtrend.png + .. image:: _static/compare-old-new-tcmu-runner-rw_bs64k_d32_bw.-2Dtrend.png | -* Разница между различными бэкендами +* Разница между различными бэкендами (raw iscsi в данном графике подразумевает kRBD + LIO, т.е. + без ceph-iscsi и tcmu-runner) -.. image:: _static/compare-rw_bs64k_d32_bw.-2Dtrend.png + .. image:: _static/compare-rw_bs64k_d32_bw.-2Dtrend.png | Из этих графиков видно что: -#. TCMU-runner значительно медленее варианта с raw iscsi +#. TCMU-runner значительно медленее варианта с kRBD + LIO #. Работа по решению проблем со скоростью ведется, и стоит ожидать что в следующих версиях скорость будет выше -Raw rbd + iscsi -=============== +kRBD + LIO +========== Второй вариант заключается в том что нужно замаппить rbd на систему предполагаемого таргета и анонсировать как блочное устройство. @@ -82,8 +137,9 @@ Raw rbd + iscsi Минусы этого решения: -* Так как не все rbd features реализованы в модуле rbd в ядре (далее krbd), необходимо отключать все - features rbd выше layering (далее выдержка из master ветки ядра) +* Так как не все rbd features реализованы в модуле rbd в ядре (далее kRBD), необходимо отключать все + features rbd выше layering (далее выдержка из master ветки ядра, что конкретно реализовано у Вас нужно смотреть в исходниках + ядра Вашего дистрибутива) :: @@ -94,11 +150,12 @@ Raw rbd + iscsi #define RBD_FEATURE_DATA_POOL (1ULL<<7) #define RBD_FEATURE_OPERATIONS (1ULL<<8) -* Т.к. используется krbd, существует вполне реальная опасность, что некорректно работающий инициатор может `положить` - не только iscsi, но и кластер ceph. У автора этой заметки были случаи когда windows initiator мешал модуль lio, а - вместе с ним падал и ceph, т.к. появлялось много blocked requests, связанных с sub ops'ами. +* Т.к. используется kRBD, существует вполне реальная опасность, что некорректно работающий инициатор может `положить` + не только iSCSI, но и кластер Ceph. Были случаи, когда Windows initiator "вешал" модуль LIO, а + вместе с ним падал и Ceph, т.к. появлялось много blocked requests, связанных с sub ops'ами. -* Если нужна отказоустойчивость, придётся делать её самому. +* Если нужна отказоустойчивость непосредственно iSCSI gateway, придётся делать её самому. +* Больше слоев абстракций между Ceph'ом и инициатором Плюсы этого решения: @@ -106,13 +163,13 @@ Raw rbd + iscsi * Скорость работы -При работе с krbd следует максимально обезопасить кластер, для этого нужно обновлять ПО на инициаторе (например кумулятивные -апдейты windows), и обновлять версию ядра на кластере с iscsi таргетами, т.к. модули LIO и RBD находятся в ядре, -более новые ядра ведут себя стабильнее даже когда начинаются проблемы с подсистемой iscsi (LIO), это уже не так пагубно влияет -на кластер ceph. Желательно использовать 4.14+. +При работе с kRBD следует максимально обезопасить кластер, для этого нужно обновлять ПО на инициаторе (например кумулятивные +апдейты windows), и обновлять версию ядра на кластере с iSCSI таргетами, т.к. модули LIO и RBD находятся в ядре, +более новые ядра ведут себя стабильнее даже когда начинаются проблемы с подсистемой iSCSI (LIO), это уже не так пагубно влияет +на кластер Ceph. Желательно использовать 4.14+. -У автора данной заметки windows initiator с определенным набором апдейтов с mtu 9000 на сетевом адаптере выводил из строя -кластер ceph, и при этом же с mtu 1500 такой проблемы не наблюдалось. +У автора данной заметки windows initiator с определенным набором апдейтов с MTU 9000 на сетевом адаптере выводил из строя +кластер Ceph, и при этом же с MTU 1500 такой проблемы не наблюдалось. Если нужен SCSI-3 PR, то оптимальным вариантом будет сделать "плавающий" таргет. Самый простой вариант сделать virtual ip (далее vip), настроить таргеты на прослушивание этого vip, и сделать @@ -122,7 +179,7 @@ Raw rbd + iscsi Но все запросы будут приходить на один сервер Если не требуется поддержка PR, то можно сделать несколько разных порталов с идентичными таргетами (c одинаковыми wwn), и настраивать -failover на инициаторах (например через multipath). В некоторых решениях, используется кластерный lvm (clvmd или lvmlockd). +failover на инициаторах (например, через multipath). В некоторых решениях, используется кластерный lvm (clvmd или lvmlockd). Резюмируя вышесказанное @@ -130,12 +187,14 @@ failover на инициаторах (например через multipath). В Выводы: -#. Самый простой отказоустойчивый спобоб использовать iscsi и ceph - использовать ceph-iscsi. Все остальные способы +#. Самый простой отказоустойчивый способ использовать iSCSI и Ceph - использовать ceph-iscsi. Все остальные способы потребуют инженерной смекалки и осторожности. -#. Всегда предварительно нужно тестировать работу на конкретном оборудовании - -#. Даже, казалось бы, такая мелочь, как MTU на стороне инициатора может вызвать отказ в обслуживании в нашем СХД +#. Всегда предварительно нужно тестировать работу на конкретном оборудовании. + Упомянутая проблема с MTU на других моделях серверов при идентичной версии ПО не воспроизводилась, + т.е. могут встретиться неожиданные аппаратно-программные проблемы (не обязательно таких же проблем, как описаны выше). + В большей степени это касается случая с kRBD, т.к. в этом случае задействованы kRBD и block layer ядра, и, скорее всего + установки с tcmu-runner (в т.ч. ceph-iscsi) не будут подверженны подобным проблемам затрагивающим Ceph. #. Очень желательно ставить обновления, на системы, что на Linux (обновление системы и ядра), что Windows, ставить последние прошивки и драйвера для сетевых устройств. @@ -145,8 +204,6 @@ failover на инициаторах (например через multipath). В возможности и стабильность кластера. В официальной документации рекомендованы lts ядра версий 4.9 или 4.14. Если используется ceph-iscsi, то ядра 4.16+/ядра из rhel 7.5+, т.к. для его работы нужны специфичные патчи в ядро. -#. Если бы мы использовали tcmu-runner, который не использует krbd, а использует librbd, скорее всего проблемы с - инициатором не затрагивали бы наш кластер ceph From 06b2e4858ce8195a1d3886eb843b0274b18635a6 Mon Sep 17 00:00:00 2001 From: Alexey Kostin Date: Wed, 28 Nov 2018 19:42:14 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cephiscsi.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cephiscsi.rst b/cephiscsi.rst index d9f3db5..c15d01e 100644 --- a/cephiscsi.rst +++ b/cephiscsi.rst @@ -54,7 +54,7 @@ Ceph-iscsi касаются версии 1.3, возможно, с развитием проекта ограничения частично будут ослаблены. Актуальный changelog можно узнать на странице проекта на github https://github.com/open-iscsi/tcmu-runner/releases -Из приятных бонусов этого решения: +Из приятных бонусов этого решения, по сравнению с вариантом kRBD + LIO: * Централизованое управление через утилиту gwcli * Простой деплой самого приложения (описана установка вручную и через ansible)