Сервер:Построение двух-серверной отказоустойчивой системы - NEW
Yura (обсуждение | вклад) |
Yura (обсуждение | вклад) |
||
(не показаны 17 промежуточных версий 1 участника) | |||
Строка 1: | Строка 1: | ||
== Описание общей схемы == | == Описание общей схемы == | ||
− | Система состоит трёх основных элементов: шлюза и двух серверов. На шлюзе нужные порты пробрасываются на один из серверов - он является в схеме главным. В случае его отказа, второй сервер дает команду шлюзу перебросить порты на него и становится главным. Когда поднимается первый сервер, то он, видя, что роль главного у него забрали, становится второстепенным (можно указать ему насильно забирать роль главного на себя при помощи опции в конфиге - '''WATCHDOG_ROUTER_MASTER | + | Система состоит трёх основных элементов: шлюза и двух серверов. На шлюзе нужные порты пробрасываются на один из серверов - он является в схеме главным. В случае его отказа, второй сервер дает команду шлюзу перебросить порты на него и становится главным. Когда поднимается первый сервер, то он, видя, что роль главного у него забрали, становится второстепенным (можно указать ему насильно забирать роль главного на себя при помощи опции в конфиге - '''WATCHDOG_ROUTER_MASTER'''=true). Потоки данных ходят так: от прибора к шлюзу, затем в главный сервер и там дублируются на второстепенный. Благодаря этому на обоих серверах поддерживаются актуальные версии БД. |
− | === Настройка | + | === Настройка === |
Пример настройки на серверах под управлением '''Linux'''. Для '''Windows''' систем настройка будет похожая. Основное отличие - передача команды шлюзу для переброса портов. | Пример настройки на серверах под управлением '''Linux'''. Для '''Windows''' систем настройка будет похожая. Основное отличие - передача команды шлюзу для переброса портов. | ||
+ | |||
+ | Настраиваем оба сервера по статье: [[Сервер:Установка на Ubuntu Server 14.04.1]] | ||
+ | |||
+ | === Создание SSH-ключей для отправки команд шлюзу без паролей === | ||
+ | На обоих серверах (вместо '''user''' пишем логин текущего пользователя): | ||
+ | |||
+ | sudo ssh-keygen -t rsa | ||
+ | sudo cp -r /root/.ssh ~ | ||
+ | sudo chown -R user:user ~ | ||
+ | sudo chmod 600 ~/.ssh/* | ||
+ | ssh-copy-id -p 38 root@<тут IP-адрес шлюза> | ||
+ | sudo bash | ||
+ | ssh -p '38' 'root@<и тут IP-адрес шлюза>' | ||
+ | |||
+ | Это позволит отправлять любый команды с серверов на шлюз. Пример команды: | ||
+ | ssh -p 38 root@<тут IP-адрес шлюза> '<тут любая команда, которая должна выполняться на шлюзе>' | ||
+ | ssh -p 38 root@192.168.0.1 'date' | ||
+ | |||
+ | Если видите дату, то все хорошо. | ||
+ | Это нужно для того, чтобы давать команды шлюзу переключать проброс портов с одного сервера на другой. | ||
+ | |||
+ | === Настройка зеркалирования === | ||
+ | |||
+ | Стартуем на обоих серверах службу '''locarus-server''' и идем в веб-админку. | ||
+ | Настройки -> Обмен данными | ||
+ | |||
+ | |||
+ | * Включаем '''MIRROR_ENABLE''' | ||
+ | * В строке '''MIRROR''' пишем IP-адрес соседнего сервера. | ||
+ | * '''MIRROR_MODE''' -> ALERT | ||
+ | * '''MIRROR_DEPTH''' -> Указываем нужное кол-во дней | ||
+ | |||
+ | Дополнительно на первом сервере, если необходимо, устанавливаем переменную в конфиге - '''WATCHDOG_ROUTER_MASTER'''=true | ||
+ | |||
+ | На каждом сервере прописываем команду для роутера в переменную '''WATCHDOG_ROUTER_URL'''. | ||
+ | |||
+ | Пример: | ||
+ | WATCHDOG_ROUTER_URL=ssh -p 38 root@192.168.0.1 '/etc/firewall-crash' | ||
+ | |||
+ | Логика работы такая: когда сервер стартует, то он смотрит на опцию '''WATCHDOG_ROUTER_MASTER''', если она включена, то он дает команду, которая записана в '''WATCHDOG_ROUTER_URL'''. Если отключена, то грузится в штатном режиме. | ||
+ | |||
+ | Во время работы, если второй сервер видит, что первый недоступен, то он становится главным (этот момент обозначается в логе '''locarus-server.log''' строкой со словом '''MASTER''') и дает команду которая у него хранится в '''WATCHDOG_ROUTER_URL''' роутеру для переключения данных на себя. | ||
+ | |||
+ | Как только первый начинает работать, то он при загрузке проверяет у себя опцию '''WATCHDOG_ROUTER_MASTER''' | ||
+ | * если она включена, то он дает команду роутеру, которая у него хранится в '''WATCHDOG_ROUTER_URL''' на мереключение потока данных на него и становится главным | ||
+ | * если она выключена, то он никаких команд роутеру не дает и просто становится подчиненным. Это будет видно в логе '''locarus-server.log''' (строка со словом '''SLAVE'''). | ||
+ | |||
+ | == Принудительное зеркалирование == | ||
+ | |||
+ | Начиная с версии 3.1.207.1907 появилась возможность принудительно провести полное зеркалирование данных с одного сервера на другой. Для этого необходимо провести настройку серверов как для простого зеркалирования. | ||
+ | Зеркалирование выполняется командой: | ||
+ | |||
+ | http://xxx.xxx.xxx.xxx:8091/do.remirror?from=2015-03-15T00:00:00.000Z&to=2015-03-17T00:00:00.000Z&host=yyy.yyy.yyy.yyy:1333 | ||
+ | |||
+ | |||
+ | где | ||
+ | |||
+ | xxx.xxx.xxx.xxx - IP адрес главного сервера, | ||
+ | yyy.yyy.yyy.yyy - IP адрес ведомого сервера, | ||
+ | from=2015-03-15T00:00:00.000Z - дата, с которой начинать чтение данных из БД | ||
+ | to=2015-03-17T00:00:00.000Z - дата, до которой читать из БД | ||
+ | |||
+ | |||
+ | Можно задать принудительное зеркалирование за определённую дату всех приборов конкретного клиента. Для этого в запрос надо добавить еще один параметр - cid=<номер клиента>. Номер клиента можно узнать в общем списке всех клиентов в вэб-мониторе Локарус-сервера. | ||
+ | |||
+ | Пример запроса: | ||
+ | |||
+ | http://xxx.xxx.xxx.xxx:8091/do.remirror?from=2015-03-15T00:00:00.000Z&to=2015-03-17T00:00:00.000Z&host=yyy.yyy.yyy.yyy:1333&cid=35 | ||
+ | |||
+ | Процесс можно наблюдать в лог файлах mirror. И в веб-мониторе главного сервера. Там появиться надпись о том, что происходит зеркалирование и сколько приборов осталось обработать. | ||
+ | |||
+ | |||
+ | Также в конфиг сервера добавлены дополнительные ключи для более тонкой настройки: | ||
+ | * Ключ SERVER_SENDER_TRIES - количество попыток отсылки данных при сбоях связи для Mirror и Remirror. По умолчанию 128 | ||
+ | * Ключ SERVER_SENDER_THREADS_LIMIT - ограничение на количество одновременно работающих тредов передачи данных для Mirror и Remirror. По умолчанию 32 | ||
+ | |||
+ | == Locarus Informer == | ||
+ | В такой схеме ЛИ надо настраивать на работу с внешним IP-адресом шлюза. Тогда при отказе одного из Локарус-серверов, клиенты смогут получать треки со второго. Т.О. для них тоже будет реализована отказоустойчивая схема. | ||
+ | |||
+ | --[[Участник:Yura|Юра]] 13:17, 22 октября 2014 (YEKT) |
Текущая версия на 12:18, 22 апреля 2015
Содержание |
Описание общей схемы
Система состоит трёх основных элементов: шлюза и двух серверов. На шлюзе нужные порты пробрасываются на один из серверов - он является в схеме главным. В случае его отказа, второй сервер дает команду шлюзу перебросить порты на него и становится главным. Когда поднимается первый сервер, то он, видя, что роль главного у него забрали, становится второстепенным (можно указать ему насильно забирать роль главного на себя при помощи опции в конфиге - WATCHDOG_ROUTER_MASTER=true). Потоки данных ходят так: от прибора к шлюзу, затем в главный сервер и там дублируются на второстепенный. Благодаря этому на обоих серверах поддерживаются актуальные версии БД.
Настройка
Пример настройки на серверах под управлением Linux. Для Windows систем настройка будет похожая. Основное отличие - передача команды шлюзу для переброса портов.
Настраиваем оба сервера по статье: Сервер:Установка на Ubuntu Server 14.04.1
Создание SSH-ключей для отправки команд шлюзу без паролей
На обоих серверах (вместо user пишем логин текущего пользователя):
sudo ssh-keygen -t rsa sudo cp -r /root/.ssh ~ sudo chown -R user:user ~ sudo chmod 600 ~/.ssh/* ssh-copy-id -p 38 root@<тут IP-адрес шлюза> sudo bash ssh -p '38' 'root@<и тут IP-адрес шлюза>'
Это позволит отправлять любый команды с серверов на шлюз. Пример команды:
ssh -p 38 root@<тут IP-адрес шлюза> '<тут любая команда, которая должна выполняться на шлюзе>' ssh -p 38 root@192.168.0.1 'date'
Если видите дату, то все хорошо. Это нужно для того, чтобы давать команды шлюзу переключать проброс портов с одного сервера на другой.
Настройка зеркалирования
Стартуем на обоих серверах службу locarus-server и идем в веб-админку. Настройки -> Обмен данными
- Включаем MIRROR_ENABLE
- В строке MIRROR пишем IP-адрес соседнего сервера.
- MIRROR_MODE -> ALERT
- MIRROR_DEPTH -> Указываем нужное кол-во дней
Дополнительно на первом сервере, если необходимо, устанавливаем переменную в конфиге - WATCHDOG_ROUTER_MASTER=true
На каждом сервере прописываем команду для роутера в переменную WATCHDOG_ROUTER_URL.
Пример:
WATCHDOG_ROUTER_URL=ssh -p 38 root@192.168.0.1 '/etc/firewall-crash'
Логика работы такая: когда сервер стартует, то он смотрит на опцию WATCHDOG_ROUTER_MASTER, если она включена, то он дает команду, которая записана в WATCHDOG_ROUTER_URL. Если отключена, то грузится в штатном режиме.
Во время работы, если второй сервер видит, что первый недоступен, то он становится главным (этот момент обозначается в логе locarus-server.log строкой со словом MASTER) и дает команду которая у него хранится в WATCHDOG_ROUTER_URL роутеру для переключения данных на себя.
Как только первый начинает работать, то он при загрузке проверяет у себя опцию WATCHDOG_ROUTER_MASTER
- если она включена, то он дает команду роутеру, которая у него хранится в WATCHDOG_ROUTER_URL на мереключение потока данных на него и становится главным
- если она выключена, то он никаких команд роутеру не дает и просто становится подчиненным. Это будет видно в логе locarus-server.log (строка со словом SLAVE).
Принудительное зеркалирование
Начиная с версии 3.1.207.1907 появилась возможность принудительно провести полное зеркалирование данных с одного сервера на другой. Для этого необходимо провести настройку серверов как для простого зеркалирования. Зеркалирование выполняется командой:
http://xxx.xxx.xxx.xxx:8091/do.remirror?from=2015-03-15T00:00:00.000Z&to=2015-03-17T00:00:00.000Z&host=yyy.yyy.yyy.yyy:1333
где
xxx.xxx.xxx.xxx - IP адрес главного сервера, yyy.yyy.yyy.yyy - IP адрес ведомого сервера, from=2015-03-15T00:00:00.000Z - дата, с которой начинать чтение данных из БД to=2015-03-17T00:00:00.000Z - дата, до которой читать из БД
Можно задать принудительное зеркалирование за определённую дату всех приборов конкретного клиента. Для этого в запрос надо добавить еще один параметр - cid=<номер клиента>. Номер клиента можно узнать в общем списке всех клиентов в вэб-мониторе Локарус-сервера.
Пример запроса:
http://xxx.xxx.xxx.xxx:8091/do.remirror?from=2015-03-15T00:00:00.000Z&to=2015-03-17T00:00:00.000Z&host=yyy.yyy.yyy.yyy:1333&cid=35
Процесс можно наблюдать в лог файлах mirror. И в веб-мониторе главного сервера. Там появиться надпись о том, что происходит зеркалирование и сколько приборов осталось обработать.
Также в конфиг сервера добавлены дополнительные ключи для более тонкой настройки:
- Ключ SERVER_SENDER_TRIES - количество попыток отсылки данных при сбоях связи для Mirror и Remirror. По умолчанию 128
- Ключ SERVER_SENDER_THREADS_LIMIT - ограничение на количество одновременно работающих тредов передачи данных для Mirror и Remirror. По умолчанию 32
Locarus Informer
В такой схеме ЛИ надо настраивать на работу с внешним IP-адресом шлюза. Тогда при отказе одного из Локарус-серверов, клиенты смогут получать треки со второго. Т.О. для них тоже будет реализована отказоустойчивая схема.
--Юра 13:17, 22 октября 2014 (YEKT)