Настройте высокую доступность с помощью Corosync и Pacemaker
Все приемы и методы, используемые для повышения доступности системы или службы и повышения отказоустойчивости, называются High Availability, в качестве примера неисправности можно упомянуть: аппаратное резервирование, кластеризацию, репликацию данных на горячем физическом уровне (RAID 1 и RAID). 5) либо в программном обеспечении (Снимки, DRBD), либо в кризисных сценариях (деградированный режим, аварийный план). В крупной компании это может привести к занятию ответственной должности с полной занятостью. В этой статье вы увидите картинку реализации одной из сторон этой проблемы: активный/пассивный кластер, обеспечивающий доступность службы приложений.
Что касается GNU/Linux, то в этой статье были протестированы два ПО, способных управлять инфраструктурой кластера:
- Heartbeat, у которого есть свои доказательства, но оно ограничено: нет кластера из более чем двух нод, нет управления ресурсами и правил переключения с одного узла на другой.
- Corosync и Pacemaker: это выбор дистрибутива Red Hat, который будет описан далее в этой статье.
Мы установили репрезентативную модель, состоящую из двух виртуальных машин Debian Wheezy с 4 сетевыми интерфейсами, на которых работает служба Apache, доступ к которой осуществляется по IP-адресу, управляемому кластером.
На следующем рисунке представлена сетевая диаграмма:
Интерфейсы eth0 и eth1 являются частью агрегации логических каналов и помогают кластеру проверять состояние других узлов. Они составляют частную сеть с другими узлами сети 10.20.13.0/255.255.255.252. Интерфейсы eth2 и eth3 являются частью другой логической агрегации, они предоставляют услуги снаружи в сети 192.168.1.0/24.
Логическое агрегирование (также называемое связыванием) обеспечивает дополнительную избыточность. Если сетевой адаптер eth0 перегорит, трафик все равно будет проходить через eth1. Его можно настроить в активном/пассивном режиме или в режиме балансировки нагрузки.
Вот конфигурация интерфейсов на машине vm-node1 в «/etc/network/interfaces/»:
auto bond0
iface bond0 inet static
address 10.20.13.1
netmask 255.255.255.252
bond_mode active-backup
bond_miimon 100
bond_downdelay 200
bond_updelay 200
slaves eth0 eth1
auto bond1
iface bond1 inet static
address 192.168.1.61
netmask 255.255.255.0
gateway 192.168.1.1
bond_mode active-backup
bond_miimon 100
bond_downdelay 200
bond_updelay 200
slaves eth2 eth3
И конфигурация бондинга в «/etc/modprobe.d/bonding»:
alias bond0 bonding
alias bond1 bonding
Конфигурация сети машины vm-node2 симметрична: Bond0 в 10.20.13.2 и Bond1 в 192.168.1.62. Когда конфигурация сети настроена, мы можем справиться с кластером. Сначала вам необходимо установить Corosync и Pacemaker в Debian. Для этого выполните следующие действия:
apt-get install corosyncpacemaker
Затем настройте Corosync. Он управляет инфраструктурой кластера, то есть состоянием узлов и их функционированием в группе. Для этого нам необходимо сгенерировать ключ для аутентификации, который будет использоваться всеми узлами кластера. Утилита corosync-keygen для генерации этого ключа из псевдослучайных нажатий клавиш, который затем необходимо защитить и скопировать на другие узлы.
generation of the key from vm-node1
corosync-keygen
mvauthkey/etc/corosync/authkey
chownroot:root/etc/corosync/authkey
chmod400/etc/corosync/authkey
copy of the key to vm-node2
scp/etc/corosync/[email :/etc/corosync/authkey
Corosync предлагает концепцию колец соединений для обеспечения связи между узлами. В рамках модели мы определили два кольца: кольцо0 — кольцо связи по умолчанию, использующее частную сеть, и кольцо 1 — резервное кольцо, которое проходит через коммутаторы с остальным трафиком. Corosync позволяет определять кольца с точки зрения IP/сетевой маски, а не определять IP-адреса. Это важно, поскольку один и тот же файл конфигурации можно развернуть на всех узлах, ничего не меняя.
totem {
version:2
#How long before declaring a token lost(ms)
token:3000
#How many token retransmits before forming a new configuration
token_retransmits_before_loss_const:10
#How long to wait for joining messages in the membership protocol(ms)
join:60
#How long to wait for consensus to be achieved before starting a new round of membership configuration(ms) consensus:3600
#Turn off the virtual synchrony filter
vsftype:none
#Number of messages that may be sent by one processor on receipt of the token
max_messages:20
#Limit generated nodeids to 31-bits(positive signed integers)
clear_node_high_bit:yes
#Disable encryption
secauth:off
#How many threads to use for encryption/decryption
threads:0
#Optionally assign a fixed nodeid(integer)
#nodeid:1234
#This specifies the mode of redundant ring,which may be none,active,or passive.
rrp_mode:passive
interface {
ringnumber:0
bindnetaddr:10.20.13.0
mcastaddr:226.94.1.1
mcastport:5405
}
interface {
ringnumber:1
bindnetaddr:192.168.1.0
mcastaddr:226.94.1.1
mcastport:5407
}
}
amf {
mode:disabled
}
service {
#Load the Pacemaker Cluster Resource Manager
ver: 0
name: pacemaker
}
aisexec {
user: root
group: root
}
logging {
fileline:off
to_stderr:yes
to_logfile:no
to_syslog:yes
syslog_facility:daemon
debug:off
timestamp:on
logger_subsys {
subsys:AMF
debug:off
tags:enter|leave|trace1|trace2|trace3|trace4|trace6
}
}
На данный момент инфраструктура кластера существует, но она не управляет никакими ресурсами. Это роль кардиостимулятора.
Он имеет следующие эксплуатационные ограничения:
- ресурсы (служба Apache и IP-адрес кластера), работающие на сервере vm-node1 в обычном случае.
- Служба Apache и IP-адрес кластера должны работать на одном сервере, если наша служба недоступна.
- Если служба Apache выходит из строя на основном сервере, она переключается на вторичный сервер.
- если основной сервер подключен через интернет-шлюз, он переключается на вторичный сервер.
Кардиостимулятор предоставляет некоторые утилиты в текстовом режиме для взаимодействия.
- CRM для управления всеми аспектами конфигурации.
- crm_mon отображает состояние кластера.
Сначала мы определяем глобальную конфигурацию. Погашен СТОНИТ (Выстрел в другой узел в голове) и кворум. STONITH — это возможность уничтожить другой узел, если он больше не соответствует инфраструктуре кластера. И кворум, он не работает на кластере в пределах 3-х узлов.
property stonith-enabled=false
property no-quorum-policy=ignore
Теперь мы можем определить наш первый ресурс: IP-адрес кластера, прикрепленный к активному узлу.
primitive vip ocf:heartbeat:IPaddr2 params ip=192.168.1.60 cidr_netmask=24nic="bond1"op monitor interval="10s"
Затем ресурс Apache, критически важный сервис, который мы хотим предоставить в этой модели:
primitive httpd ocf:heartbeat:apache params configfile="/etc/apache2/apache2.conf"statusurl="http://localhost/server-status"op start timeout="60s"op stop timeout="60s"op monitor timeout="20s"
Запуск и остановка Apache теперь управляются кластером. Итак, нам теперь предстоит убрать автоматический запуск службы:
update-rc.d-fremoveapache2
Вы заметите, что это выходит за рамки определения ресурса Apache. Атрибут Pacemaker STATUSURL позволяет использовать страницу состояния Apache для определения качалки. Поэтому не забудьте настроить этот URL в Apache:
<Location/server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
Когда мы построили этап настройки crm_mon, возможно, на определенных ресурсах возникли некоторые ошибки, поскольку он не работал. Имеется счетчик отказов, который уведомляет нас в случае предупреждения. мы можем сбросить этот таймер для ресурса http с помощью следующей команды:
crm resource clean up httpd
На этом этапе у нас есть адрес кластера и HTTP-ресурс, но не обязательно на одном узле. vip-ресурс переключится, если узел будет удален. Ресурс httpd переключится, если узел будет удален или служба Apache активируется (мониторинг по URL-адресу/статусу сервера).
Давайте пойдем дальше и заставим оба ресурса работать на одном узле:
colocation httpd-with-vip inf : httpd vip
И нам бы хотелось, чтобы это было и в обычном случае, когда ресурсы работают на vm-node1, нашем основном узле:
location preferred-node vip 100 : vm-node1
Наконец, мы добавляем условие масштабирования. Если узел не достигает шлюза через Интернет, мы хотим переместить ресурсы на другой узел. Для этого мы определяем ресурс с типом ping, который работает на всех узлах (с помощью концепции клонированного ресурса). Затем добавляется правило отпуска для переключения, если активный узел не видит мост.
primitive ping-gateway ocf:pacemaker:ping params host_list="192.168.1.1"multiplier="1000"op monitor interval="10s"
clone cloned-ping-gateway ping-gateway
location vip-needs-gateway vip rule-inf:not_defined pingd or pingd lte 0
Это наша операционная модель. и мы надеемся, что поможем вам это сделать.