keepalived (баллансировщик)

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

keepalived — реа­ли­за­ции про­то­ко­ла VRRP (Virtual Router Redundancy Protocol) для Linux. Демон keepalived сле­дит за рабо­то­спо­соб­но­стью машин и в слу­чае обна­ру­же­ния сбоя — исклю­ча­ет сбой­ный сер­вер из спис­ка актив­ных сер­ве­ров, деле­ги­руя его адре­са дру­го­му серверу.

VRRP - про­то­кол резер­ви­ро­ва­ния вир­ту­аль­ных марш­ру­ти­за­то­ров, пред­на­зна­чен для повы­ше­ния отка­зо­устой­чи­во­сти сер­ви­сов по сети или орга­ни­за­ции балан­си­ров­ки нагруз­ки меж­ду узла­ми. Отка­зо­устой­чи­вость дости­га­ет­ся объ­еди­не­ни­ем несколь­ких узлов один вир­ту­аль­ным адре­сом, кото­рый пере­на­зна­ча­ет­ся сле­ду­ю­ще­му узлу, при отка­зе основ­но­го узла.

1.Установка Keepalived

Уста­нав­ли­ва­ем keepalived на тех сер­ве­рах меж­ду кото­ры­ми дол­жен пере­клю­чать­ся наш вир­ту­аль­ный IP адрес:
yum install keepalived
добав­ля­ем в автозагрузку
chkconfig keepalived on

Вклю­ча­ем марш­ру­ти­за­цию паке­тов на обо­их балансерах

nano /etc/sysctl.conf

net.ipv4.ip_forward=1

sysctl -p

2.Настройка конфигурационного файлов MasterБалансера

 

Настрой­ка кон­фи­гу­ра­ци­он­но­го фай­ла Master-балан­се­ра

Созда­ём бэкап конфига:
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.c bakup
редак­ти­ру­ем его:

nano /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
notification_email {
mid@test.t
}
notification_email_from Andrey@test.t
smtp_server localhost
smtp_connect_timeout 30
! Имен­ное обо­зна­че­ние дан­но­го сервера
router_id centos1
}

! Ука­зы­ва­ем VRRP istance (экзем­пляр). Напри­мер даем ему имя VI_1
vrrp_instance VI_1 {
!Ста­тус сер­ве­ра в VRRP instance. Может быть MASTER или BACKUP
state MASTER

!State master или backup озна­ча­ет режим в кото­ром запус­ка­ет­ся демон keepalived
!Ука­зы­ва­ем интер­фейс к кото­ро­му будет при­вя­зан VRRP instance
interface eth0
!Ука­зы­ва­ем про­из­воль­но зна­че­ние в интер­ва­ле от 1 до 255, для того что­бы одна­знач­но опре­де­лить instance сре­ди других,
!кото­рые могут быть запу­ще­ны на хосте. Дол­жен быть оди­на­ков на всех хостах в instance.
virtual_router_id 51
! При­о­ри­тет хоста. Тот хост, кото­рый име­ет боль­ший при­о­ри­тет,  будет являть­ся MASTER. По-умол­ча­нию зна­че­ние рав­но 100.
priority 100
! Ука­зы­ва­ем вре­мя в секун­дах меж­ду VRRP запро­са­ми меж­ду хоста­ми в instance. ! По-умол­ча­нию 1 секунда.
advert_int 4
!Метод аутен­ти­фи­ка­ции. AH - ipsec Authentication Header PASS - пароль в откры­том виде.  AH более без­опа­сен и реко­мен­ду­ет­ся исполь­зо­вать его,
!но в неко­то­рых реа­ли­за­ци­ях keepalived AH метод может не рабо­тать, тогда необ­хо­ди­мо исполь­зо­вать PASS.
authentication {
auth_type PASS
auth_pass 1111
}

! Указ­ва­ем общий вир­ту­аль­ный ip-адрес для чле­нов VRRP instance. Можем ука­зать како­му интер­фей­су он будет назна­чен, а так же с
! помо­щью дирек­ти­вы "label" ука­зать для него описание.

virtual_ipaddress {
192.168.1.158 dev eth0 label eth0:vip
}
}

 

3.Настройка конфигурационного файла Backup-балансера

Отли­чия лишь в том, что мы изме­ня­ем state уста­нав­ли­вая BACKUP и пони­жа­ем при­о­ри­тет до 90priority 90 кон­фиг ниже:

[spoiler]

cat /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {
notification_email {
mid@test.t
}
notification_email_from Andrey@test.t
smtp_server localhost
smtp_connect_timeout 30
! Имен­ное обо­зна­че­ние дан­но­го сервера
router_id centos1
}! Ука­зы­ва­ем VRRP istance (экзем­пляр). Напри­мер даем ему имя VI_1
vrrp_instance VI_1 {
!Ста­тус сер­ве­ра в VRRP instance. Может быть MASTER или BACKUP
state BACKUP
!Ука­зы­ва­ем интер­фейс к кото­ро­му будет при­вя­зан VRRP instance
interface eth0
!Ука­зы­ва­ем про­из­воль­но зна­че­ние в интер­ва­ле от 1 до 255,
!для того что­бы одна­знач­но опре­де­лить instance сре­ди других,
!кото­рые могут быть запу­ще­ны на хосте.
!Дол­жен быть оди­на­ков на всех хостах в instance.
virtual_router_id 51
! При­о­ри­тет хоста. Тот хост, кото­рый име­ет боль­ший приоритет,
! будет являть­ся MASTER. По-умол­ча­нию зна­че­ние рав­но 100.
priority 90
! Ука­зы­ва­ем вре­мя в секун­дах меж­ду VRRP запро­са­ми меж­ду хоста­ми в instance.
! По-умол­ча­нию 1 секунда.
advert_int 4
!Метод аутен­ти­фи­ка­ции. AH - ipsec Authentication Header
! PASS - пароль в откры­том виде.
! AH более без­опа­сен и реко­мен­ду­ет­ся исполь­зо­вать его,
!но в неко­то­рых реа­ли­за­ци­ях keepalived AH метод может не работать,
!тогда необ­хо­ди­мо исполь­зо­вать PASS.
authentication {
auth_type PASS
auth_pass 1111
}! Указ­ва­ем общий вир­ту­аль­ный ip-адрес для чле­нов VRRP instance.
! Можем ука­зать како­му интер­фей­су он будет назна­чен, а так же с
! помо­щью дирек­ти­вы "label" ука­зать для него описание.virtual_ipaddress {
192.168.1.158 dev eth0 label eth0:vip
}
}

[/spoiler]

далее стар­ту­ем keepalived:
[root@centos ~]# /etc/init.d/keepalived restart
Stopping keepalived: [ OK ]
Starting keepalived: [ OK ]

4.Проверка

и про­ве­ря­ем на масте­ре:

[root@centos ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:F5:22:AE
inet addr:192.168.1.155 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fef5:22ae/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16849 errors:0 dropped:0 overruns:0 frame:0
TX packets:7659 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10278730 (9.8 MiB) TX bytes:1882756 (1.7 MiB)

eth0:vip Link encap:Ethernet HWaddr 08:00:27:F5:22:AE
inet addr:192.168.1.158 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:54 errors:0 dropped:0 overruns:0 frame:0
TX packets:54 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6657 (6.5 KiB) TX bytes:6657 (6.5 KiB)

 

на backup:

[root@centos ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:B2:29:FF
inet addr:192.168.1.156 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:feb2:29ff/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:13921 errors:0 dropped:0 overruns:0 frame:0
TX packets:3917 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:8278515 (7.8 MiB) TX bytes:1426756 (1.3 MiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:130 errors:0 dropped:0 overruns:0 frame:0
TX packets:130 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:21943 (21.4 KiB) TX bytes:21943 (21.4 KiB)

 

кла­дём сете­вой интер­фейс на мастере:
[root@centos ~]# ifdown eth0

про­ве­ря­ем бэкап:

[root@centos ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:B2:29:FF
inet addr:192.168.1.156 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:feb2:29ff/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:14006 errors:0 dropped:0 overruns:0 frame:0
TX packets:3935 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:8289143 (7.9 MiB) TX bytes:1430076 (1.3 MiB)

eth0:vip Link encap:Ethernet HWaddr 08:00:27:B2:29:FF
inet addr:192.168.1.158 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:130 errors:0 dropped:0 overruns:0 frame:0
TX packets:130 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:21943 (21.4 KiB) TX bytes:21943 (21.4 KiB)

 

как видим, всё ОК вир­ту­аль­ный ip 192.168.1.158 успеш­но переназначается

 

------ ---------------- ------------------------------

Обновим версию keepalived.

Захо­дим на офи­ци­аль­ный сайт и кача­ем послед­нюю версию:
http://www.keepalived.org/download.html
wget http://www.keepalived.org/software/keepalived-2.0.7.tar.gz

рас­па­ко­вы­ва­ем:
[root@centos opt]# tar -xvf keepalived-2.0.7.tar.gz

cd keepalived-2.0.7

соби­ра­ем:
[root@centos keepalived-2.0.7]# ./configure
если воз­ник­нет ошибка:
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files. !!!
то ста­вим недо­ста­ю­щий пакет:
[root@centos keepalived-2.0.7]# yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel

[root@centos keepalived-2.0.7]# make

на CENTOS 6 может воз­ник­нут сле­ду­ю­щая ошибка:

[spoiler]
process.c:41: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘realtime_priority_set’
process.c:49: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘priority_set’
process.c: In function ‘set_process_priority’:
process.c:79: error: ‘priority_set’ undeclared (first use in this function)
process.c:79: error: (Each undeclared identifier is reported only once
process.c:79: error: for each function it appears in.)
process.c:79: error: ‘true’ undeclared (first use in this function)
process.c: In function ‘reset_process_priority’:
process.c:91: error: ‘priority_set’ undeclared (first use in this function)
process.c:91: error: ‘false’ undeclared (first use in this function)
process.c: In function ‘reset_process_priorities’:
process.c:141: error: ‘realtime_priority_set’ undeclared (first use in this function)
process.c:150: error: ‘false’ undeclared (first use in this function)
process.c:164: error: ‘priority_set’ undeclared (first use in this function)
make[2]: *** [process.o] Error 1
make[2]: Leaving directory `/opt/keepalived-2.0.7/keepalived/core'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/opt/keepalived-2.0.7/keepalived'
make: *** [all-recursive] Error 1
[/spoiler]
Для её исправ­ле­ния откры­ва­ем файл:
vim keepalived/core/process.c
и добав­ля­ем
#include <stdbool.h>
вме­сте с решёткой #
после чего делаем:
[root@centos keepalived-2.0.7]# make
[root@centos keepalived-2.0.7]# make install

про­ве­ря­ем теку­щую версию:
[root@centos ~]# keepalived -v
Keepalived v1.2.13 (03/19,2015)

меня­ем бинар­ни­ки ста­рые на новый собран­ный, для нача­ла переименуем/usr/sbin/keepalived /usr/local/sbin/keepalived
mv  /usr/sbin/keepalived  /usr/sbin/keepalived.bkp

mv /usr/local/sbin/keepalived /usr/local/sbin/keepalived.bkp

cp /opt/keepalived-2.0.7/bin/keepalived /usr/sbin/keepalived
cp /opt/keepalived-2.0.7/bin/keepalived /usr/local/sbin/keepalived

 

Про­ве­ря­ем, как видим, всё ок:

[root@centos ~]# keepalived -v
Keepalived v2.0.7 (08/23,2018)

Copyright© 2001-2018 Alexandre Cassen, <acassen@gmail.com>

Built with kernel headers for Linux 2.6.32
Running on Linux 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016

configure options:

Config options: LVS VRRP VRRP_AUTH OLD_CHKSUM_COMPAT FIB_ROUTING

System options: PIPE2 SIGNALFD INOTIFY_INIT1 VSYSLOG NET_LINUX_IF_H_COLLISION LIBIPTC_LINUX_NET_IF_H_COLLISION VRRP_VMAC SOCK_NONBLOCK SOCK_CLOEXEC GLOB_BRACE SO_MARK SCHED_RT SCHED_RESET_ON_FORK

 

Что­бы рабо­тал новый бинар­ник нуж­но пере­за­пу­стить сервис.