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]
! 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
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]
[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 может возникнут следующая ошибка:
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
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
Чтобы работал новый бинарник нужно перезапустить сервис.