Едно от най-важните неща при големи конфигурации е надеждността при отпадане на някоя услуга и възможността вашето приложение да не спира работата си, когато това се случи. Доста често един голям проект е разделен на сървъри с различни роли. Например, имате уеб сайт, който се обслужва от два MySQL сървъра, разположени на две отделни машини. Да приемем, че те са в режим MASTER/SLAVE. В конфигурационния файл на вашето приложение за връзка с базата данни е описан IP адреса на първата MySQL машина, която е MASTER. Ако тя отпадне, вашият сайт ще спре да се отваря, дори и втората машина (SLAVE сървъра) да е все още активна. Примерът, който ще разгледаме, не е тясно обвързан с MySQL или който и да е друг софтуер, макар че pacemaker поддържа подобни failover функции. По-скоро ще видим варианта, в който при отпадане на сървър 1, зададеният от pacemaker IP адрес се вдига автоматично на сървър 2, което би осигурило непрекъсваемост на ролята, която тези сървъри изпълняват заедно. По този начин за връзка с приложение X, ще е нужно да опишете само един IP адрес, а pacemaker ще се погрижи за това на кой сървър то трябва да бъде вдигнато.
В тази статия ще разгледаме инсталацията и конфигурацията на IP failover в CentOS 7. Примерите ни ще бъдат с private IP адреси, за да се доближим максимално до deployment в една production среда, като за целта ще използваме две машини.
1. Инсталация и конфигурация на pcs
Първо е нужно да се логнете през ssh в двете ви машини.
ssh root@server1
ssh root@server2
Изпълнете следната команда и на двете машини, с която ще инсталирате pacemaker и останалите нужни пакети към него:
yum update
yum install pacemaker pcs
След като са инсталирани pacemaker и pcs, е нужно да ги пуснете и настроите да тръгват след рестарт на машината. Това е много важно, защото ако не се стартират автоматично след рестарт на машината, този сетъп се обезмисля.
Изпълнете следната команда и на двете машини:
service pcsd start
systemctl enable pcsd.service
При инсталацията на pacemaker и pcs, в линукса ви автоматично е добавен потребител с име hacluster. Той се използва за комуникация и оторизация на двете машини в pcs cluster-a ви. Нужно е да му зададете парола, защото ще го използвате при инициализиране на вашия cluster.
Изпълнете тази команда и на двете машини и задайте парола, която ще се използва за комуникация между двете pcs инстанции:
passwd hacluster
Със следващата команда ще спрете firewalld процеса в CentOS 7, защото не ви е нужен в този сетъп. Не изпълнявайте тази команда, ако имате или ще имате firewall правила на някоя от тези две машини. В този сетъп, тези машини имат само private IP адреси и сме сметнали, че няма нужда от firewalld или iptables.
service firewalld stop && service iptables stop
Следващата стъпка е да опишете някакви хостнейми на тези машини в /etc/hosts файла. Това се прави, за да можете да ги добавите безпроблемно в cluster-a и да се ориентирате по-лесно при проверка на статуса на cluster-a. Тук ние ще ги кръстим db1 и db2. Както споменахме по-рано, тези машини имат private IP адреси. Ние ще опишем в /etc/hosts файла, че db1 сочи към IP 10.66.66.167 , а db2 към 10.66.66.168.
И на двете машини, /etc/hosts файлът трябва да изглежда така:
vim /etc/hosts
10.66.66.167 db1
10.66.66.168 db2
Вече машините могат да се виждат една с друга по хостове db1 и db2. Следва да ги добавите в pcs клъстера. Изпълнете следната команда само на първият сървър, db1:
pcs cluster auth db1 db2
При искане на потребител, въведете hacluster и паролата, която въведохте по-рано.
Username: hacluster
Password:
db1: Authorized
db2: Authorized
След като и двата ви сървъра са автентикирани пред pcs, е време да създадете вашия cluster. Със следващата команда ще го създадете и ще опишете, че добавяте и двата сървъра в него. Ние ще го кръстим deltacluster. Вие може да го кръстите, както решите. Напомняме, че вече няма нужда тази команда да се изпълнява и на двата сървъра. Изпълнете я само от първия.
pcs cluster setup --name deltacluster db1 db2
Очакваният output е:
Destroying cluster on nodes: db1, db2...
db2: Stopping Cluster (pacemaker)...
db1: Stopping Cluster (pacemaker)...
db1: Successfully destroyed cluster
db2: Successfully destroyed cluster
Sending 'pacemaker_remote authkey' to 'db1', 'db2'
db1: successful distribution of the file 'pacemaker_remote authkey'
db2: successful distribution of the file 'pacemaker_remote authkey'
Sending cluster config files to the nodes...
db1: Succeeded
db2: Succeeded
Synchronizing pcsd certificates on nodes db1, db2...
db1: Success
db2: Success
Restarting pcsd on the nodes in order to reload the certificates...
db1: Success
db2: Success
След като сте създали своя cluster, е време да го стартирате със следната команда:
pcs cluster start –all
db2: Starting Cluster...
db1: Starting Cluster…
Пуснете и другите два сървиса да се стартират автоматично след рестарт. Изпълнете тези команди и на двата сървъра:
systemctl enable corosync.service
systemctl enable pacemaker.service
Сега е време да проверите статуса на вашия pcs cluster. Това можете да сторите със следната команда:
pcs status
Cluster name: deltacluster
WARNING: no stonith devices and stonith-enabled is not false
Stack: corosync
Current DC: db2 (version 1.1.16-12.el7_4.8-94ff4df) - partition with quorum
Last updated: Mon Apr 30 14:13:56 2018
Last change: Mon Apr 30 14:12:20 2018 by hacluster via crmd on db2
2 nodes configured
0 resources configured
Online: [ db1 db2 ]
No resources
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled
Виждаме, че и двата сървъра са Online. Това показва, че до момента сетъпа е успешен.
2. Конфигуриране на cluster-a
Следващата стъпка е добавянето на роля в този cluster. Опишете, че искате да вдига един и същи IP адрес на двете машини, като обаче винаги ще е активен само на една от тях. С приоритет ще бъде машината db1. IP адресът, който ще вдига pcs-a, ще бъде също от мрежа 10.66.66.0/24. Ние избираме адреса 10.66.66.140.
Първата команда, която ще изпълните ще предотврати ситуация, в която и двата нода си мислят, че те са активния и този IP адрес наистина да бъде активен и на двата сървъра. Това не е нужно във вашия cluster, защото той е само от два нода. Както споменахме, логиката на този cluster е IP адреса да е активен САМО на единия от тях.
pcs property set stonith-enabled=false
Втората команда, която ще изпълните, ще игнорира проверката за кворум. Кворумът представлява определен брой сървъри, които pcs очаква да бъдат online, за да работи целия cluster. Тъй като в текущия сетъп има cluster само от два сървъра, ако единият отпадне, това ще бъде 50% отпадане на cluster-a, в следствие на което целия cluster ще спре да работи. Ние ще спрем тази проверка, защото тя ще наруши логиката и работата на целия setup от два сървъра.
property set no-quorum-policy=ignore
Сега е време да се пристъпи към момента, в който добавяте IP адреса, който ще бъде failover-ван от pcs. Изпълнете следната команда:
pcs resource create Cluster_Delta ocf:heartbeat:IPaddr2 ip=10.66.66.140 cidr_netmask=24 nic=eth0 op monitor interval=10s
Важно е да се обърне внимание на реда nic=eth0. Ако вашият интерфейс, на който е вдигната въпросната private мрежа (в този пример 10.66.66.0/24) е друг, подменете името. Ако е на eth0, ще го вдигне като alias.
Какво правят тези директиви?
ip=10.66.66.140 – описва IP адрес, който искате да се вдигне от pcs. Това ще е IP адресът, който ще се failover-ва.
cidr_netmask=24 – описва маска. В случая имаме цяла 24-ка.
nic=eth0 – мрежовият интерфейс, на който ще се вдигне този IP адрес.
След като сте изпълнили тази команда, може да сложите приоритет на сървъра db1.
pcs constraint location Cluster_Delta prefers db1=INFINITY
Може да проверите текущия статус на cluster-a ви със следната команда:
pcs status
Cluster name: deltacluster
Stack: corosync
Current DC: db2 (version 1.1.16-12.el7_4.8-94ff4df) - partition with quorum
Last updated: Mon Apr 30 14:41:44 2018
Last change: Mon Apr 30 14:35:48 2018 by root via cibadmin on db1
2 nodes configured
1 resource configured
Online: [ db1 db2 ]
Full list of resources:
Cluster_Delta (ocf::heartbeat:IPaddr2): Started db1
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled
Виждаме, че IP адреса е вдигнат на db1.
Не може да видите вдигнатия IP адрес на db1 с ifconfig. Нужно е да изпълните:
ip a
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:16:3e:f8:1e:57 brd ff:ff:ff:ff:ff:ff
inet 10.66.66.167/24 brd 10.66.66.255 scope global eth1
valid_lft forever preferred_lft forever
inet 10.66.66.140/24 brd 10.66.66.255 scope global secondary eth1
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fef8:1e57/64 scope link
valid_lft forever preferred_lft forever
Виждате желаният от вас вдигнат IP адрес 10.66.66.140. Може да опитате да го ping-нете от db2, където не е вдигнат към момента.
[root@pcs2 ~]# ping -c 2 10.66.66.140
PING 10.66.66.140 (10.66.66.140) 56(84) bytes of data.
64 bytes from 10.66.66.140: icmp_seq=1 ttl=64 time=0.263 ms
64 bytes from 10.66.66.140: icmp_seq=2 ttl=64 time=0.316 ms
--- 10.66.66.140 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.263/0.289/0.316/0.031 ms
Това означава, че вашият setup е успешен. Ако искате да тествате как реално се държи pcs, спрете машината db1 или по накакъв начин спрете възможността да я вижда db2. В случая, ние ще я reboot-нем и ще видим какво ще стане на db2, когато db1 е рестартирано.
[root@pcs1 ~]# reboot
Моментът, в който reboot-нахме машината db1, ведната IP адреса 10.66.66.140 изгря на машината db2.
[root@pcs2 ~]# pcs status
Cluster name: deltacluster
Stack: corosync
Current DC: db2 (version 1.1.16-12.el7_4.8-94ff4df) - partition with quorum
Last updated: Mon Apr 30 14:52:50 2018
Last change: Mon Apr 30 14:35:48 2018 by root via cibadmin on db1
2 nodes configured
1 resource configured
Online: [ db2 ]
OFFLINE: [ db1 ]
Full list of resources:
Cluster_Delta (ocf::heartbeat:IPaddr2): Started db2
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled
Виждаме, че е Started db2. Също така, ще видим и че IP адреса 10.66.66.140 е вдигнат.
[root@pcs2 ~]# ip a
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:16:3e:45:7d:61 brd ff:ff:ff:ff:ff:ff
inet 10.66.66.168/24 brd 10.66.66.255 scope global eth1
valid_lft forever preferred_lft forever
inet 10.66.66.140/24 brd 10.66.66.255 scope global secondary eth1
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fe45:7d61/64 scope link
valid_lft forever preferred_lft forever
Преминаването на IP адреса е било мигновенно и вашият pacemaker cluster работи успешно. Можете да експериментирате с всякакви варианти и setup-и, както и да разгледате всички опции на pacemaker. Това е една добра практика, която би могла да се използва в production без проблеми, стига да знаете как да я съчетаете с вашите application-и.
Успешен failover!