Собственно, и о чем текст?


Как часто наши ожидания расходятся суровой реальностью?

Вот и я, поступая в лучший технический ВУЗ страны на кафедру ИБ, рассчитывал на увлекательное обучение, веселую студенческую жизнь и, конечно, интересную практику. Однако, вместо того, чтобы разгадывать шифры (привет, Алан) и открывать криптексы (добрый вечер, Роберт) мне пришлось настривать облако Nextcloud на нескольких серверах, объединенных в кластер. И это оказалось интересно!

«Ну и что в этом сложного?» — подумали Вы. Действительно, задачка весьма и весьма тривиальная. Однако, когда я искал в Сети информацию по данному вопросу, мне так и не удалось найти туториала, который объединял бы вместе все части настройки. Поэтому, дабы съэкономить время таких же чайников сетевого администрирования, я пишу эту, с Вашего позволения, статью.

Итак, что мы получим в конце — небольшое облако Nextcloud, имеющее в основе мастер-сервер (да, да, конечно нам нужен прокси. И несколько мастер-серверов. А еще скилл. Если Вы ждете всего этого — прошу прощения.), несколько (в данном случае 2) серверов, играющих роль объедененного, отказоустойчивого хранилища, БД.

Миленькое такое облачко, для маленькой такой компании.

Ну, поехали


Начальные условия


Прежде всего, мы должны подготовить оборудование (в моем случае VirtualBox, с созданными в нем тремя машинами).

Мастер — 192.168.0.105
Сервер1 — 192.168.0.108
Сервер2 — 192.168.0.109

1. Операционная система — Ubuntu Server 16.04.
Параметры машин особой роли не играют — для разворачивания нашего небольшого облака достаточно мощности среднего (совсем среднего) компьютера. Завышенные параметры виртуальных машин могут сыграть с Вами злую шутку — когда я показывал практику на университетском компьютере с четырьмя гигабайтами ОП, запуск третьей машины привел к падению компа. Хотя, может в этом виновата очередная кастомная Unix-система, стоявшая на нём?

2. Работающая сеть.
Если Вы, как и я, пользуетесь ВиртуалБокс, то советую в настройках сети указать «Сетевой мост», как тип подключения. Таким образом вы можете пропинговать сервер в коробке и с основной системы, и с других машин.

3. Хороший плейлист (опционально)
По истечении n-ного часа танцев с бубном в поисках оптимального решения (быть может, я еще в процессе) стало совсем невмоготу.

Настройка кластера


Чтобы получить отказоустойчивое хранилище, состоящее из нескольких серверов, нам нужен кластер. Я выбрал Gluster, потому что смог найти отличные маны на русском(!!) языке.

Начнем с установки.

Открываем консоль нашего сервера и вводим следующее:

sudo apt-get install python-software-properties

Затем, подключаемся к репозиторию:

sudo add-apt-repository ppa:gluster/glusterfs-3.8
    sudo apt-get update

И, наконец, устанавливаем:

sudo apt-get install glusterfs-server

Производим те же самые действия на втором (n-ном) сервере.

Совет! (для чайников)
Впервые столкнувшись с настройкой серверов в ВМ я был неприятно удивлен отсутствием общего буфера между гостевой и основной ОС (хотя, это было ожидаемо). Поэтому, для общения с машинами я использовал Путти . Скачиваем, запускаем путти.экзе. Перед использованием не забываем установить на машинах, которым будем обращаться, openssh-server:

sudo apt-get install openssh-server

Думаю, этот же клиент можно использовать и при общении с настоящими машинами. А, может, и лучше есть?

Итак, Gluster установлен. Теперь, создаем подключение. Но прежде, узнаем ip-адреса наших серверов:

ifconfig

Вот теперь создаем, прописывая с первого сервера следующее (прежде, авторизовавшись под root-ом):
gluster peer probe 192.168.0.109

peer probe: success.

Отлично, теперь мы имеем 2 сервера в кластере. Производим эту операцию столько раз, сколько серверов мы хотим объединить в кластере, меняя лишь ip-адрес сервера.

Хранилище, которое мы создаем при помощи Glusterfs, имеет несколько видов хранения контента (подробнее, в ссылке выше). Нас интересует replicated — контент зеркально копируется на все сервера в кластере.

Пока, нам негде хранить данные, поэтому создадим папки на наших серверах:
на первом:

mkdir /mnt/server1

и на втором:

mkdir /mnt/server2

Финальная часть кластера — создаем хранилище:

gluster volume create nextcloud replica 2 transport tcp 192.168.0.108:/mnt/server1 192.168.0.109:/mnt/server2 force

где nextcloud — название нашего хранилища, а 2 — количество серверов в кластере.

Не забываем про словечко force в конце — можно получить ошибку и долго ломать голову, что же не так?

Запускаем:

gluster volume start nextcloud

Работа с кластером почти завершена. Остальное — после установки облака.

Установка Nextcloud


Для этого нам понадобится наш мастер сервер. Заходим под рут правами и наслаждаемся.
Для установки можно использовать эту статью. Доходим до Шаг 5. Останавливаемся.

Скачиваем архив с облаком:

cd ~
wget --no-check-certificate https://download.nextcloud.com/server/releases/nextcloud-11.0.0.tar.bz2
sudo tar -C /var/www -xvjf ~/nextcloud-11.0.0.tar.bz2 
rm ~/nextcloud-11.0.0.tar.bz2

Создаем пару папок:

sudo mkdir /var/www/nextcloud/data
sudo mkdir /var/www/nextcloud/assets


Самый ответственный момент. Вспоминаем про наш кластер и подключаем его к мастер серверу:
mount.glusterfs 192.168.0.108:/nextcloud /var/www/nextcloud/data/

Теперь все файлы, попадающие в наше облако будут скопированы на все сервера.
Завершаем установку, следуя советам из статьи.

Что в итоге?


Ну и что же у нас получилось? А получилось небольшое облако, которое отказоустойчиво к падению серверов, которые хранят данные — попробуйте специально уронить один из них — мастер немного подумает и снова все будет работать. Когда упавший сервер восстановится, данные на нем автоматически обновятся.

Конечно, узким местом является мастер-сервер. Наличие нескольких мастеров, работающих с одной БД, под управлением, например, Galera и прокси-сервера, отвечающего за распределение трафика между ними, в разы повысило бы отказоустойчивость системы (хотя, врядли сейчас её можно таковой назвать). Может быть в следующей статье?

Если Вы дочитали до этого момента вы герой — спасибо огромное за внимание.
Для приятного сообщества — приятно писать.

Комментарии (8)


  1. aremdae
    17.10.2017 17:35

    Что кластерного в вашей инсталляции кроме ФС? Вы выбрали кластерную ФС исключительно по причине наличия русской документации? У вас есть два адреса: 108 и 109. Вы подключаете клиента железно к 108. Когда 108 падает, скажем, на 2 часа, что происходит с клиентом? Если для установки можно использовать «ту» статью, то зачем эта? Ну и так далее…

    И вообще не слишком вежливо рекомендовать публике хабра, что бывает удобно установить ssh сервер. Даже при хорошем и подробном описании эта статья, вероятно, больше подошла бы для гиктаймса.


    1. redfs
      17.10.2017 18:48

      Что кластерного в вашей инсталляции кроме ФС?
      Да и с ФС у автора есть тонкое место. С кворумом то проблемы. Из документации (англ.):
      If we use the replica 2 volume, it is not possible to prevent split-brain without losing availability.

      Ну и там же хороший раздел «Client quorum in replica 2 volumes»

      В общем с отказоустойчивостью как-то не очень получилось.


    1. lexore
      17.10.2017 19:13

      Клиент будет подключаться к "мастеру" — веб серверу на 192.168.0.105.
      От серверов1,2 только расшаренная фс.


      несколько (в данном случае 2) серверов, играющих роль объедененного, отказоустойчивого хранилища, БД.

      Кстати, хранилище и БД у nextcloud — разные вещи.
      На glusterfs хранятся только файлы, а БД — отдельная штука.
      Хотя что-то мне подсказывает, что вы указали использвать sqlite при установке)
      Тогда БД будет лежать вместе со всеми файлами в glusterfs, да.
      Но лучше под owncloud/nextcloud использовать mysql.


      1. aremdae
        17.10.2017 20:00

        Клиент с точки зрения ФС как раз и есть этот самый мастер. Я вот к чему: вы сделали маунтпойнт какой-нибудь на этом мастере с указанием реального адреса. А завтра этот адрес стал недоступен. И что дальше? Случится магия и мастер сам выяснит адрес второй ноды?


        1. lexore
          17.10.2017 20:02

          Действительно, фигня получится.


  1. brestows
    17.10.2017 19:44

    NextCloud прекрасно (может и загнул с «прекрасно», но все же) кластеризируется штатными средствами, а тут про это ни слова. А в чем суть практики Вашей была?


  1. Angrynik
    17.10.2017 19:44

    Есть несколько нерешенных моментов:
    1. Как указал первый комментатор — нет механизма контролирующего падения входной ноды (т.е. сервера, на который идут запросы).
    2. Вы не указали, где храните БД. Тоже на первом сервере? Что делать, если упадет именно БД.
    3. Вы не прописали статические ip для виртуалок. Или просто опустили этот момент. Итого — после окончания lease time Ваши виртуалки берут новые ip по dhcp и консистентность кластерной FS нарушена.

    Это ошибки, бросающиеся в глаза навскидку.


    1. cagami
      17.10.2017 23:07

      >3. Вы не прописали статические ip для виртуалок. Или просто опустили этот момент. Итого — >после окончания lease time Ваши виртуалки берут новые ip по dhcp и консистентность >кластерной FS нарушена.
      если только dhcp сервер ребутнулся или нода ушла в down на долгое время протухания лизы
      при штатной работе им будет всегда будет выдаваться тот же ip
      пруф
      www.ietf.org/rfc/rfc2131.txt
      page 27