Iscsi intro

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску

Введенияв iSCSI

Тут собраны заметки - что прочитать, если подзабыл, пояснения терминов и т.п.

scsi over tcp

Одним из протоколов доступа к блочным устройствам является iscsi. Буква 'i' в названии относится Internet
По своей сути это 'scsi over tcp'. Сам протокол SCSI (без буквы 'i') — это весьма сложная конструкция, поскольку он может работать через разные физические среды (например, UWSCSI — параллельная шина, SAS — последовательная — но протокол у них один и тот же).
Этот протокол позволяет делать куда больше, чем просто «подтыкать диски к компьютеру» (как это придумано в SATA),
например, он поддерживает имена устройств, наличие нескольких линков между блочным устройством и потребителем,
поддержку коммутации (ага, SAS-коммутатор, такие даже есть в природе),
подключение нескольких потребителей к одному блочному устройству и т.д.
Другими словами, этот протокол просто просился в качестве основы для сетевого блочного устройства.

Терминология

В мире SCSI приняты следующие термины:

  • target — тот, кто предоставляет блочное устройство. Ближайший аналог из обычного компьютерного мира — сервер.
  • initiator — клиент, тот, кто пользуется блочным устройством. Аналог клиента.

Инициаторами обычно выступают сетевые карты (в их ROM бывает прошит необходимый код) или software-реализации

  • WWID — уникальный идентификатор устройства, его имя. Аналог DNS-имени. Этот же физически вшитый в диск World-Wide ID иногда можно прочитать на наклейке на диске
  • LUN — номер «кусочка» диска, к которому идёт обращение. Ближайший аналог — раздел на жёстком диске.

Дополнительно в iSCSI:

  • IQN (iSCSI Qualified Name) — то есть чистой воды имя, сходное до степени смешения с DNS (с небольшими отличиями). Вот пример IQN: iqn.2011-09.test:name.
  • portal. Portal — это, если грубо говорить, несколько target'ов, которые анонсируются одним сервером. Аналогии с www нет, но если бы веб-сервер можно было попросить перечислить все свои virtualhosts, то это было бы оно. portal указывает список target'ов и доступные IP, по которым можно обращаться (да-да, iscsi поддерживает несколько маршрутов от initiator к target).

Initiator

В качестве инициатора используется (например) open-iscsi.
Итак, самое важное — у него есть режимы работы и состояние.
Если мы дадим команду не в том режиме или не учтём состояние, результат будет крайне обескураживающий.

Режимы работы

  • Поиск target'ов (discovery)
  • Подключение к target'у

Работа с подключенным target'ом

Из этого списка вполне понятен жизненный цикл:

  • сначала найти, потом подключиться
  • потом отключиться
  • потом снова подключиться.

Open-iscsi держит сессию открытой, даже если блочное устройство не используется.
Более того, он держит сессию открытой (до определённых пределов, конечно), даже если сервер ушёл в перезагрузку.
Сессия iscsi — это не то же самое, что открытое TCP-соединение, iscsi может прозрачно переподключаться к target'у.
Отключение/подключение — операции, которыми управляют «снаружи» (либо из другого ПО, либо руками).

Немного о состоянии

После discovery open-iscsi запоминает все найденные target'ы (они хранятся в /etc/iscsi/), другими словами, discovery — операция постоянная, совсем НЕ соответствующая, например, dns resolving). Найденные target можно удалить руками (кстати, частая ошибка — когда у open-iscsi, в результате экспериментов и настройки, пачка найденных target'ов, при попытке логина в которые выползает множество ошибок из-за того, что половина target'ов — старые строчки конфига, которые уже давно не существуют на сервере, но помнятся open-iscsi). Более того, open-iscsi позволяет менять настройки запомненного target'а — и эта «память» влияет на дальнейшую работу с target'ами даже после перезагрузки/перезапуска демона.

Блочное устройство

Второй вопрос, который многих мучает по-началу — куда оно попадает после подключения? open-iscsi создаёт хоть и сетевое, но БЛОЧНОЕ устройство класса SCSI, то есть получает букву в семействе /dev/sd, например, /dev/sdc. Используется первая свободная буква, т.к. для всей остальной системы это блочное устройство — типичный жёсткий диск, ничем не отличающийся от подключенного через usb-sata или просто напрямую к sata.

Это часто вызывает панику «как я могу узнать имя блочного устройства?». Оно выводится в подробном выводе iscsiadm

iscsiadm -m session -P 3

Авторизация

В отличие от SAS/UWSCSI, ISCSI доступно для подключения кому попало. Для защиты от таких, есть логин и пароль (chap), и их передача iscsiadm'у — ещё одна головная боль для начинающих пользователей.
Она может осуществляться двумя путями — изменением свойств уже найденного ранее target'а и прописываем логина/пароля в файле конфигурации open-iscsi.
Причина подобных сложностей — в том, что пароль и процесс логина — это атрибуты не пользователя, а системы.
ISCSI — это дешёвая версия FC-инфраструктуры, и понятие «пользователь» в контексте человека за клавиатурой тут неприменимо.
Если у вас sql-база лежит на блочном устройстве iscsi, то разумеется, вам будет хотеться, чтобы sql-сервер запускался сам, а не после минутки персонального внимания оператора.

Файл конфигурации

Это очень важный файл, потому что помимо логина/пароля он описывает ещё поведение open-iscsi при нахождении ошибок.
Он может отдавать ошибку «назад» не сразу, а с некоторой паузой (например, минут в пять, чего достаточно для перезагрузки сервера с данными).
Так же там контролируется процесс логина (сколько раз пробовать, сколько ждать между попытками) и всякий тонкий тюнинг самого процесса работы.
Заметим, эти параметры довольно важны для работы и вам нужно обязательно понимать, как поведёт ваш iscsi если вынуть сетевой шнурок на 10-20с, например.

Краткий справочник

сначала мы находим нужные нам target, для этого мы должны знать IP/dns-имя инициатора:

получить список target-ов

iscsiadm -m discovery -t st -p 192.168.0.1 -t 
  • st — это команда send targets.


список найденного для логина

iscsiadm -m node 

или подробнее (-P 1)

iscsiadm -m node  -P 1
Target: iqn.2007-11.com.nimblestorage:allerta-801-g4d8d52b8d577d8f3
	Portal: 10.237.25.151:3260,-1
		Iface Name: default

залогиниться, то есть подключиться и создать блочное устройство

iscsiadm -m node -l -T iqn.2011-09.example:data 

вывести список того, к чему подключились

iscsiadm -m session 

Более подробно (в самом конце вывода будет указание на то, какое блочное устройство какому target'у принадлежит)

iscsiadm -m session -P 3

вылогиниться из конкретной

iscsiadm - m session -u -T iqn.2011-09.example:data 

залогиниться во все обнаруженные target'ы

iscsiadm -m node -l

вылогиниться из всех target'ов

iscsiadm -m node -u

удалить target из обнаруженных

iscsiadm -m node --op delete -T iqn.2011-09.example:data

mulitpath

Ещё один вопрос, важный в серьёзных решениях — поддержка нескольких маршрутов к источнику.
Прелесть iscsi — в использовании обычного ip, который может быть обычным образом обработан, как и любой другой трафик
(хотя на практике обычно его не маршрутизируют, а только коммутируют — слишком уж великая там нагрузка).
Так вот, iscsi поддерживает multipath в режиме «не сопротивляться».
Сам по себе open-iscsi не умеет подключаться к нескольким IP одного target'а.
Если его подключить к нескольким IP одного target'а, то это приведёт к появлению нескольких блочных устройств.
Однако, решение есть — это multipathd, который находит диски с одинаковым идентифиатором и обрабатывает их как положено в multipath, с настраиваемыми политиками. Эта статья не про multipath, так что подробно объяснять таинство процесса я не буду, однако, вот некоторые важные моменты:
При использовании multipath следует ставить маленькие таймауты — переключение между сбойными путями должно происходить достаточно быстро