Согласитесь, что очень удобно с настроенного сервера, отключив мозги, скопировать пару-тройку строк конфигурационных параметров и быстро получить результат на другом сервере. Но проблемы вы можете получить чуть позже, когда их совсем не ждёте. Я получил один ценный урок, который запомню надолго.
Когда-то давно большинство сетевых настроек админы 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