3. УСТАНОВКА И НАСТРОЙКА PACEMAKER

Thank you for reading this post, don't forget to subscribe!

В дан­ной ста­тье опи­са­на началь­ная уста­нов­ка и настрой­ка паке­та Pacemaker на сер­вер под управ­ле­ни­ем CentOS7

Зада­ча: настро­ить Pacemaker на авто­ма­ти­че­ское пере­клю­че­ние Master\Slave

Дано:

node1 CentOS7

node2 CentOS7

Реше­ние:

Уста­нов­ка
Уста­нав­ли­ва­ем паке­ты на каж­дую из нод буду­ще­го кластера.

yum -y install resource-agents pacemaker pcs fence-agents-all psmisc policycoreutils-python corosync

Задать пароль на поль­зо­ва­те­ля, под кото­рым будет рабо­тать сер­вис и выпол­нять­ся синхронизация

passwd hacluster

Запу­стим служ­бу и доба­вим в автозагрузку

systemctl enable pcsd
systemctl enable corosync
systemctl enable pacemaker

Настрой­ка
Доба­вим име­на хостов в файл /etc/hosts

100.201.203.51 node1
100.201.203.52 node2

Запуск
Откры­ва­ем порты

firewall-cmd --permanent --add-service=high-availability
firewall-cmd --add-service=high-availability

Дан­ную про­це­ду­ру выпол­ня­ем на каж­дом из серверов.

Пер­вым делом, необ­хо­ди­мо авто­ри­зо­вать­ся на сер­ве­рах сле­ду­ю­щей командой

#pcs cluster auth node1 node2 -u hacluster

Password:
node2: Authorized
node1: Authorized

Созда­ем кластер

pcs cluster setup --force --name CLUSETR node1 node2
Destroying cluster on nodes: node1, node2…
node1: Stopping Cluster (pacemaker)…
node2: Stopping Cluster (pacemaker)…
node2: Successfully destroyed cluster
node1: Successfully destroyed cluster

Sending 'pacemaker_remote authkey' to 'node1', 'node2'
node1: successful distribution of the file 'pacemaker_remote authkey'
node2: successful distribution of the file 'pacemaker_remote authkey'
Sending cluster config files to the nodes…
node1: Succeeded
node2: Succeeded

Synchronizing pcsd certificates on nodes node1, node2…
node2: Success
node1: Success
Restarting pcsd on the nodes in order to reload the certificates…
node2: Success
node1: Success

Раз­ре­ша­ем авто­за­пуск и запус­ка­ем создан­ный кла­стер pcs cluster enable —all и pcs cluster start —all:

pcs cluster enable --all
node1: Cluster Enabled
node2: Cluster Enabled
pcs cluster start --all
node1: Starting Cluster (corosync)…
node2: Starting Cluster (corosync)…
node2: Starting Cluster (pacemaker)…
node1: Starting Cluster (pacemaker)…

При исполь­зо­ва­нии 2-х нод (как в дан­ном при­ме­ре) отклю­ча­ем stonith (нужен для «доби­ва­ния» сер­ве­ров, кото­рые не смог­ли пол­но­стью завер­шить рабо­чие про­цес­сы) и кво­рум. STONITH (Shoot The Other Node In The Head) или Shoot явля­ет­ся допол­ни­тель­ной защи­той Pacemaker. При выпол­не­нии коман­ды pcs status вы уви­ди­те пре­ду­пре­жде­ние в выход­ных дан­ных о том, что ника­кие устрой­ства STONITH не настро­е­ны, и STONITH не отклю­чен. Если вы исполь­зу­е­те дан­ное реше­ние в про­дак­шене, то луч­ше вклю­чить STONITH. Так как даная систе­ма будет рабо­тать в DMZ, мы отклю­ча­ем STONITH. Нали­чие кво­ру­ма озна­ча­ет, что в кла­сте­ре долж­но быть не менее 3-х узлов. При­чем, необя­за­тель­но все три узла долж­ны быть с СУБД, доста­точ­но на двух узлах иметь Мастер и Репли­ку, а тре­тий узел высту­па­ет в роли «голо­су­ю­ще­го».
Нали­чие устройств фен­син­га на узлах с СУБД. При воз­ник­но­ве­нии сбоя устрой­ства «фен­син­га» изо­ли­ру­ют сбой­нув­ший узел – посы­ла­ют коман­ду на выклю­че­ние пита­ния или пере­за­груз­ку (poweroff или hard-reset). Выпол­ня­ем на обо­их нодах

pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore

Если полу­ча­ем ошибку

Error: unable to get cib
Error: unable to get cib

То ско­рее все­го не запу­ще­ны сер­ви­сы pcs cluster enable —all и pcs cluster start —all или не уста­нов­лен пакет fence-agents-all

Что такое кво­рум? Гово­рят, что кла­стер име­ет кво­рум при доста­точ­ном коли­че­стве «живых» узлов кла­сте­ра. Доста­точ­ность коли­че­ства «живых» узлов опре­де­ля­ет­ся по фор­му­ле ниже

n > N/2

где n – коли­че­ство живых узлов, N – общее коли­че­ство узлов в кластере.

Как вид­но из про­стой фор­му­лы, кла­стер с кво­ру­мом – это когда коли­че­ство «живых» узлов, боль­ше поло­ви­ны обще­го коли­че­ства узлов в кла­сте­ре. Как вы, навер­ное, пони­ма­е­те, в кла­сте­ре, состо­я­щем из двух узлов, при сбое на одном из 2-х узлов не будет кво­ру­ма. По умол­ча­нию, если нет кво­ру­ма, Pacemaker оста­нав­ли­ва­ет ресур­сы. Что­бы это­го избе­жать, нуж­но при настрой­ке Pacemaker ука­зать ему, что­бы нали­чие или отсут­ствие кво­ру­ма не учи­ты­ва­лось. Дела­ет­ся это с помо­щью опции no-quorum-policy=ignore.

Рас­смот­рим самый рас­про­стра­нен­ный вари­ант исполь­зо­ва­ния Pacemaker. Он заклю­ча­ет­ся в исполь­зо­ва­нии вир­ту­аль­но­го IP-адре­са, кото­рый будет назна­чать­ся актив­но­му узлу кластера.
Для это­го созда­ем ресурс командой:

pcs resource create CLUSTER_IP ocf:heartbeat:IPaddr2 ip=100.201.203.50 cidr_netmask=24 op monitor interval=60s

,где CLUSTER_IP — назва­ние ресур­са (может быть любым);

ip=100.201.203.50 — вир­ту­аль­ный IP, кото­рый будет назна­чен кластеру;

cidr_netmask=24 — пре­фикс сети (соот­вет­ству­ет мас­ке 255.255.255.0);

op monitor interval=60s — кри­ти­че­ское вре­мя про­стоя, кото­рое будет озна­чать недо­ступ­ность узла

Виды сбо­ев
Сбой по пита­нию на теку­щем масте­ре или на реплике
Сбой пита­ния, когда про­па­да­ет пита­ние и сер­вер выклю­ча­ет­ся. Это может быть как Мастер, так и одна из Реплик.

Сбой про­цес­са
Сбой основ­но­го про­цес­са – систе­ма может завер­шить ава­рий­но про­цесс postgres по раз­ным при­чи­нам, напри­мер, нехват­ка памя­ти, либо недо­ста­точ­ное коли­че­ство фай­ло­вых дескрип­то­ров, либо пре­вы­ше­но мак­си­маль­ное чис­ло откры­тых файлов.

Поте­ря сете­вой связ­но­сти меж­ду каким-либо из узлов и осталь­ны­ми узлами
Это сете­вая недо­ступ­ность како­го-либо узла. Напри­мер, её при­чи­ной может быть выход из строя сете­вой кар­ты, либо пор­та коммутатора.

Сбой про­цес­са Pacemaker/Corosync

Сбой про­цес­са Corosync/pacemaker

Рабо­та в команд­ной стро­ке PCS
Посмот­реть параметры
pcs property list

Посмот­реть состо­я­ние кластера
pcs status

Отклю­чить все ресур­сы кластера
pcs cluster disable --all

Вооб­ще для Pacemaker ресурс — это скрипт, напи­сан­ный на любом язы­ке. Обыч­но эти скрип­ты пишут­ся на bash, но ничто не меша­ет писать их на Perl, Python, C или даже на PHP. Скрипт управ­ля­ет сер­ви­са­ми в опе­ра­ци­он­ной систе­ме. Глав­ное тре­бо­ва­ние к скрип­там — уметь выпол­нять 3 дей­ствия: start, stop, monitor и делить­ся неко­то­рой метаинформацией.
Ресур­сы име­ют мно­же­ство атри­бу­тов, кото­рые хра­нят­ся в кон­фи­гу­ра­ци­он­ном XML-фай­ле Pacemaker’а. Наи­бо­лее инте­рес­ные из них: priority, resource-stickiness, migration-threshold, failure-timeout, multiple-active.
Рас­смот­рим их более подробно.

Атри­бут priority — при­о­ри­тет ресур­са, кото­рый учи­ты­ва­ет­ся, если узел исчер­пал лимит по коли­че­ству актив­ных ресур­сов (по умол­ча­нию 0). Если узлы кла­сте­ра не оди­на­ко­вы по про­из­во­ди­тель­но­сти или доступ­но­сти, то мож­но уве­ли­чить при­о­ри­тет одно­го из узлов, что­бы он был актив­ным все­гда, когда работает.

Атри­бут resource-stickiness — лип­кость ресур­са (по умол­ча­нию 0). Лип­кость (stickiness) ука­зы­ва­ет на то, насколь­ко ресурс «хочет» оста­вать­ся там, где он есть сей­час. Напри­мер, после сбоя узла его ресур­сы пере­хо­дят на дру­гие узлы (точ­нее — стар­ту­ют на дру­гих узлах), а после вос­ста­нов­ле­ния рабо­то­спо­соб­но­сти сбой­но­го узла, ресур­сы могут вер­нуть­ся к нему или не вер­нуть­ся, и это пове­де­ние как раз и опи­сы­ва­ет­ся пара­мет­ром липкость.

Дру­ги­ми сло­ва­ми, лип­кость пока­зы­ва­ет, насколь­ко жела­тель­но или не жела­тель­но, что­бы ресурс вер­нул­ся на вос­ста­нов­лен­ный после сбоя узел.

Посколь­ку по умол­ча­нию лип­кость всех ресур­сов 0, то Pacemaker сам рас­по­ла­га­ет ресур­сы на узлах «опти­маль­но» на свое усмотрение.

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

Так­же Pacemaker поз­во­ля­ет зада­вать раз­ную лип­кость ресур­са в зави­си­мо­сти от вре­ме­ни суток и дня неде­ли, что поз­во­ля­ет, напри­мер, обес­пе­чить пере­ход ресур­са на исход­ный узел в нера­бо­чее время.

Атри­бут migration-threshold — сколь­ко отка­зов долж­но про­изой­ти, что­бы Pacemaker решил, что узел непри­го­ден для дан­но­го ресур­са и пере­нёс (мигри­ро­вал) его на дру­гой узел. По умол­ча­нию так­же этот пара­метр равен 0, т. е. при любом коли­че­стве отка­зов авто­ма­ти­че­ско­го пере­но­са ресур­сов не будет происходить.

Но, с точ­ки зре­ния отка­зо­устой­чи­во­сти, пра­виль­но выста­вить этот пара­метр в 1, что­бы при пер­вом же сбое Pacemaker пере­ме­щал ресурс на дру­гой узел.

Атри­бут failure-timeout — коли­че­ство секунд после сбоя, до исте­че­ния кото­рых Pacemaker счи­та­ет, что отка­за не про­изо­шло, и не пред­при­ни­ма­ет ниче­го, в част­но­сти, не пере­ме­ща­ет ресур­сы. По умол­ча­нию, равен 0.

Атри­бут multiple-active – дает ука­за­ние Pacemaker, что делать с ресур­сом, если он ока­зал­ся запу­щен более чем на одном узле. Может при­ни­мать сле­ду­ю­щие значения:
block — уста­но­вить опцию unmanaged, то есть деактивировать
stop_only — оста­но­вить на всех узлах
stop_start — оста­но­вить на всех узлах и запу­стить толь­ко на одном (зна­че­ние по-умолчанию).

По умол­ча­нию, кла­стер не сле­дит после запус­ка, жив ли ресурс. Что­бы вклю­чить отсле­жи­ва­ние ресур­са, нуж­но при созда­нии ресур­са доба­вить опе­ра­цию monitor, тогда кла­стер будет сле­дить за состо­я­ни­ем ресур­са. Пара­метр interval этой опе­ра­ции – интер­вал, с каким делать проверку.

При воз­ник­но­ве­нии отка­за на основ­ном узле, Pacemaker «пере­ме­ща­ет» ресур­сы на дру­гой узел (на самом деле, Pacemaker оста­нав­ли­ва­ет ресур­сы на сбой­нув­шем узле и запус­ка­ет ресур­сы на дру­гом). Про­цесс «пере­ме­ще­ния» ресур­сов на дру­гой узел про­ис­хо­дит быст­ро и неза­мет­но для конеч­но­го клиента.

Ресур­сы мож­но объ­еди­нять в груп­пы — спис­ки ресур­сов, кото­рые долж­ны запус­кать­ся в опре­де­лен­ном поряд­ке, оста­нав­ли­вать­ся в обрат­ном поряд­ке и испол­нять­ся на одном узле.Все ресур­сы груп­пы запус­ка­ют­ся на одном узле и запус­ка­ют­ся после­до­ва­тель­но, соглас­но поряд­ку в груп­пе. Но нуж­но учи­ты­вать, что при сбое одно­го из ресур­сов груп­пы, вся груп­па пере­ме­стит­ся на дру­гой узел.

При выклю­че­нии како­го-либо ресур­са груп­пы, все после­ду­ю­щие ресур­сы груп­пы тоже выклю­чат­ся. Напри­мер, ресурс PostgreSQL, име­ю­щий тип pgsql, и ресурс Virtual-IP, име­ю­щий тип IPaddr2, могут быть объ­еди­не­ны в группу.

Оста­но­вить все ноды
pcs cluster stop --all

Посмот­реть состо­я­ние ресурсов
pcs status resources

Изме­нить актив­ную ноду
pcs resource move CLUSTER_IP zs-node1

Уда­ле­ние ноды
pcs cluster node remove node_name

Очист­ка счет­чи­ков сбоев
pcs resource cleanup

При­мер созда­ния ресур­са PostgreSQL типа pgsql в кла­сте­ре из трех узлов pgsql01, pgsql02, pgsql03
pcs resource create PostgreSQL pgsql pgctl="/usr/pgsql-9.6/bin/pg_ctl"
\psql="/usr/pgsql-9.6/bin/psql" pgdata="/var/lib/pgsql/9.6/data/"
\rep_mode="sync" node_list=" pgsql01 pgsql02 pgsql03" restore_command="cp /var/lib/pgsql/9.6/pg_archive/%f %p"
\primary_conninfo_opt="keepalives_idle=60 keepalives_interval=5 keepalives_count=5" master_ip="10.3.3.3" restart_on_promote='false'

Рабо­та в команд­ном интер­пре­та­то­ре CRM
Дан­ная ути­ли­та име­ет соб­ствен­ный SHELL, в кото­ром доволь­но удоб­но рабо­тать. Из настро­ек дан­но­го интер­пре­та­то­ра мож­но отме­тить назна­че­ние редак­то­ра, в кото­ром вы при­вык­ли рабо­тать, напри­мер nano или mcedit.

crm options editor vim
crm opti edi mcedit
crm conf edit

Посмот­реть конфигурацию
crm configure show

Сохра­не­ние конфигурации
crm configure save _BACKUP_PATH_

Вос­ста­нов­ле­ние конфигурации
crm configure load replace _BACKUP_PATH

Допол­не­ния
Адми­ни­стри­ро­ва­ние через WEB
Каж­дая из нод слу­ша­ет порт 2224, кото­рая поз­во­ля­ет под­клю­чить­ся и посмот­реть, а так же изме­нить конфигурацию

Напри­мер https://100.201.203.54:2224

Так же досту­пен и IP кластера.

Уста­нов­ка CRM
[kost@node1 ~]# crm-bash:
crm: command not found

По умол­ча­нию для CentOS7 отсут­ству­ет пакет CRM, кото­рый поз­во­ля­ет выпол­нять настрой­ку из соб­ствен­но­го SHELL. Дан­ный пакет успеш­но мож­но про­ин­стал­ли­ро­вать из сто­рон­не­го репозитория
cd /etc/yum.repos.d/
wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/network:ha-clustering:Stable.repo
yum install crmsh

После чего мож­но вос­поль­зо­вать­ся дан­ной командой