Авторские статьи

Прошлое нужно переосмысливать.


Согласитесь, что очень удобно с настроенного сервера, отключив мозги, скопировать пару-тройку строк конфигурационных параметров и быстро получить результат на другом сервере. Но проблемы вы можете получить чуть позже, когда их совсем не ждёте. Я получил один ценный урок, который запомню надолго.

Когда-то давно большинство сетевых настроек админы Debian систем указывали в /etc/network/interfaces. Очень удобно брать готовые свои примеры и, чуток подправив под новые нужды, копипастить на новые сервера. Пришли новые сервера, часть которых расши́рит систему хранения данных Ceph. Решили с коллегами у данных серверов 3 сетевых интерфейса объединить в bond, чтобы довести до 3 Гбит/с входящее соединение. Так-с, где у меня сервак с настроенным bond? Копипаст, правка-рихтовка, проверяем. Работают 3 сетевые карты вместе? Работают. Давайте двигаться дальше.

Развёртываю утилитой ceph-deploy софт на 6 серверах, проверяю собрался ли кластер. Всё отлично! Давайте проверять, как после рестарта серверов, кластер снова выходит на HEALTH_OK. А вот тут и приходит беда откуда не ждали. Не стартовали некоторые демоны Object Storage Daemon (OSD), каждый из которых обслуживает конкретный жёсткий диск.

Конфигурация кластера получилась что-то типа:
server1 - osd.0, osd.1, osd.2, osd.3
server2 - osd.4, osd.5, osd.6, osd.7
server3 - osd.8, osd.9, osd.10, osd.11
...

После рестарта серверов вышло так, что на 6 серверах не стартовали те демоны, чьи числовые ID самые маленькие для этого сервера, то есть не стартовал ceph-osd@0 на server1, ceph-osd@4 на server2 и т.д. Что-то подозрительное совпадение! Мысль заработала так. Ceph-deploy развернул нужное и создал для системы инициализации systemd на каждом сервере кластера стартовые юниты и поручил запускать соответствующие демоны OSD. Systemd запускал демонов OSD через стартовый юнит /lib/systemd/system/ceph-osd@.service, используя его как шаблон и порождая экземпляр юнита-шаблона. Первый стартующий демон запускался слишком рано! Но раньше чего? В системном журнале нашлись строки, которые всё объяснили.

Вы видите неудачный старт osd.18, чей запуск "разбавляет" инициализация bond0.

Jun  5 08:59:29 cn5 ceph[1703]: === osd.18 ===
Jun  5 08:59:31 cn5 kernel: [    8.680641] bond0: link status up for interface enp5s0, enabling it in 0 ms
Jun  5 08:59:32 cn5 kernel: [    9.080607] bond0: link status definitely up for interface enp6s0, 1000 Mbps full duplex
Jun  5 08:59:56 cn5 ceph[1703]: 2017-06-05 08:59:56.613942 7f114c179700  0 -- :/3498339517 >> 172.16.3.41:6789/0 pipe(0x7f113c0052c0 sd=4 :0 s=1 pgs=0 cs=0 l=1 c=0x7f113c0065a0).fault
Jun  5 08:59:59 cn5 ceph[1703]: failed: 'timeout 30 /usr/bin/ceph -c /etc/ceph/ceph.conf --name=osd.18 --keyring=/mnt/d1//keyring osd crush create-or-move -- 18 3.6369 host=cn5 root=default'
Jun  5 08:59:59 cn5 ceph[1703]: === osd.19 ===

Хорошо умничать задним числом, но в этом месте я ушёл не туда. Глянул после чего по мнению разработчиков должен стартовать демон OSD, на примере osd.18 - sudo systemctl show ceph-osd@18 | grep After
В выводе присутствовала цель network-online.target. Это намекало мне на то, что демон стартанёт после инициализации сети, но почему-то этого не происходило. В данном месте пошёл ещё дальше в своей глупости и решил тупо добавить зависимость от bond, создав так называемый сниппет (drop-in snippets). Ничего не получалось и проблема не уходила. В таких случаях лучше взять таймаут и перестать перебирать варианты в надежде вот-вот-сейчас-получится.

Утром меня осенило, что systemd, как система инициализации, поддерживает то старое наследие, что досталось ей, но сеть инициализируется из /etc/network/interfaces словно запуск некой программы и не более того. Нужно сеть инициализировать по-новому, средствами systemd и тогда не будет граблей, которые ты мужественно пройдёшь, отхватив по лбу.

Включаем systemctl enable systemd-networkd и создаём bond уже средствами systemd, создав нужные файлики:

/etc/systemd/network/bond1.netdev

[NetDev]
Name=bond1
Kind=bond

[Bond]
Mode=802.3ad
LACPTransmitRate=fast
MIIMonitorSec=1s
UpDelaySec=2s
DownDelaySec=8s

/etc/systemd/network/bond1.network

[Match]
Name=enp5s0 enp6s0 enp7s0

[Network]
Bond=bond1

/etc/systemd/network/Management.network

[Match]
Name=bond1

[Network]
Address=172.16.3.45/24
Gateway=172.16.3.1

Выводы

Какие выводы сделал для себя? Если так можно делать, то это не означает что так нужно делать! Для любой системы есть генеральная линия партии и ты либо легко плывёшь со всеми, либо мужественно плюёшь против ветра. Можно по-старинке настраивать сеть через /etc/network/interfaces, но иногда можно огрести проблем. Раз в наш мир пришла новая система инициализации, то лучше будет сделать её средствами и получить плюшки, а не граблей по лбу.

Дата последней правки: 2017-06-08 21:23:21

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта