что такое поддержка активности
Keepalived — это высокопроизводительное серверное решение высокой доступности или горячего резерва.Keepalived можно использовать для предотвращения возникновения единой точки отказа сервера.Сотрудничая с Nginx, можно добиться высокой доступности интерфейсных веб-сервисов. . Хотя nginx очень устойчив к давлению, простои случаются редко, но если вы не выполняете горячее резервное копирование, службы nginx перестанут работать, как только оно зависнет, поэтому горячее резервное копирование необходимо.Конечно, это зависит от ваших реальных потребностей бизнеса.
принцип поддержания активности
keepalived основан на протоколе VRRP, полное название VRRP — протокол избыточности виртуального маршрутизатора (Протокол резервирования виртуальной маршрутизации)
Keepalived основан на протоколе VRRP (полное название VRRP — протокол избыточности виртуального маршрутизатора).Протокол резервирования виртуальной маршрутизации.
Протокол избыточности виртуальной маршрутизации можно рассматривать как протокол для реализации высокой доступности маршрутизаторов, то есть N маршрутизаторов, обеспечивающих одну и ту же функцию, образуют группу маршрутизаторов, в которой есть главный и несколько резервных, а у главного есть VIP, обеспечивающий сервисы во внешний мир (Маршрут по умолчанию других машин в локальной сети, где находится роутер, - vip), мастер будет отправлять многоадресную рассылку, и когда резервная копия не может получить пакет vrrp, считается, что мастер вниз.Приоритет VRRPПриходитьвыберите резервную копию, чтобы быть мастером. Таким образом, можно гарантировать высокую доступность маршрутизатора.
keepalived в основном состоит из трех модулей, а именно ядра, проверки и vrrp. Основной модуль — это ядро keepalived, отвечающее за запуск и обслуживание основного процесса, а также загрузку и анализ файлов глобальной конфигурации. check отвечает за проверку работоспособности, включая различные распространенные методы проверки. Модуль vrrp используется для реализации протокола VRRP.
структура поддержки активности
keepalived имеет только один файл конфигурации
keepalived.conf
. В основном он включает в себя следующие области конфигурации, а именно:global_defs
,vrrp_instance
,а такжеvirtual_server
.
область global_defs
В основном это настройка объекта уведомления и идентификации машины при возникновении сбоя.. С точки зрения непрофессионала, это конфигурация для отправки уведомления по электронной почте после возникновения ситуации.
global_defs {
notification_email { 故障发生时给谁发邮件通知
a@abc.com
b@abc.com
...
}
notification_email_from alert@abc.com 通知邮件从哪个地址发出
smtp_server smtp.abc.com smpt_server 通知邮件的smtp地址。
smtp_connect_timeout 30 连接smtp服务器的超时时间
enable_traps 开启SNMP陷阱
router_id host163 标识本节点的字条串,通常为hostname
}
область vrrp_instance
vrrp_instance используется для определения области VIP и связанных с ней атрибутов, которые предоставляют услуги внешнему миру.
vrrp_instance VI_1 {
state MASTER state 可以是MASTER或BACKUP
interface ens33 本机网卡的名字
virtual_router_id 51 取值在0-255之间,用来区分多个instance的VRRP组播
priority 100 权重
advert_int 1 发VRRP包的时间间隔,即多久进行一次master选举
authentication { 身份认证区
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { 虚拟ip地址
192.168.27.160
}
}
virtual_server
Используется в супербольших LVS, здесь я не использую.
virtual_server 192.168.200.100 443 {
delay_loop 6 延迟轮询时间(单位秒)
lb_algo rr 后端调试算法
lb_kind NAT LVS调度类型
persistence_timeout 50
protocol TCP
real_server 192.168.201.100 443 { 真正提供服务的服务器
weight 1
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc 表示用genhash算出的结果
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
nb_get_retry 3 重试次数
delay_before_retry 3 下次重试的时间延迟
}
}
}
установка поддержки активности
yum install keepalived -y
моделирование окружающей среды
Я подготовил четыре хоста, IP192.168.27.166-169
, создайте службу nginx, а затем используйте 166 и 167 в качестве основной и резервной машин соответственно.
nginx配置
upstream centos_pool{
server s168:80;
server s169:80;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
# root /usr/share/nginx/html;
# index index.html index.htm;
proxy_pass http://centos_pool;
}
Все четыре хоста запускаются с такой конфигурацией, вроде бы 4 службы nginx, чего в данном экземпляре нет, разница в том, что 166 и 167 - службы nginx, 168 и 169 - веб-службы (используем nignx для открытия порта 80 для имитации услуг).
Другими словами, 166 и 167 используются для балансировки нагрузки, а 168 и 169 являются узлами веб-сервисов.
Хостинг на 168 и 169/usr/share/nginx/html/index.html
Вот простой логотип:
Хорошо, спускайтесь и настройте keepalived
配置keepalived
Конфигурация 166 хостов:
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.27.160
}
}
Можно сказать, что это основная конфигурация и самая простая конфигурация.Если вы хотите настроить почтовый сервис, вы можете обратиться к комментариям к вводу модуля выше. То же самое касается конфигурации lvs.
167 конфигурация горячего резерва:
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.27.160
}
}
Видно, что кромеstate MASTER/BACKUP
а такжеpriority 100
Атрибуты разные, все остальное одинаковое и должно быть одинаковым.
Хорошо, теперь запускаем keepalived, по ip route видно, кто является хостом (сетевая карта узла захвата будет привязана к VIP-адресу 192.168.27.160)
тестовое задание
1. Доступ к виртуальному IP:
2. Просмотр хост-маршрутов
3. Сценарное упражнение
После того как все настроено нормально, останавливаю nginx на 166, что будет?
Примет ли 167 виртуальный IP-адрес и выполнит ли задачу горячего резервного копирования двух систем? Ответ — нет, потому что если оглянуться назад, то keepalived не имеет ничего общего с nginx, и эти два сервиса не влияют друг на друга. keepalived фактически отслеживает пульсацию keepalived на мастере. Итак, я также отключил службу поддержки активности.
[root@s166 keepalived]# nginx -s stop
[root@s166 keepalived]# service keepalived stop
Redirecting to /bin/systemctl stop keepalived.service
Затем проверьте IP-маршрут 166
[root@s166 keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:7b:59:07 brd ff:ff:ff:ff:ff:ff
inet 192.168.27.166/24 brd 192.168.27.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::83ee:6998:a0d4:7974/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::2513:4c77:5da7:f031/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::99b3:c79:5377:c3fe/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
Ты видишь ли192.168.27.160
этот виртуальный айпи. Тогда давайте посмотрим, есть ли 167. Если есть, это доказывает, что конфигурация эффективна.
192.168.27.160
Эта ссылка обнаружит, что она работает нормально.
Оптимизация скрипта
Так как keepalived не имеет отношения к nginx, мы можем написать скрипт для мониторинга nginx, если nginx зависнет, то использовать команду для остановки keepalived, которая завершит задачу двухсистемного горячего резервирования.
Создать скриптcheck_nginx.sh
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
echo "restart the nginx server" >> /etc/keepalived/keepalived_error.log
/usr/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
echo "keepalived is closed" >> /etc/keepalived/keepalived_error.log
/usr/bin/ps -ef | grep "keepalived" | grep -v "grep" | cut -c 9-15 | xargs kill -9
echo /usr/bin/ps -ef | grep "keepalived" >> /etc/keepalived/keepalived_error.log
fi
fi
Кстати, не забудьте изменить разрешение на выполнение скрипта. Зачем перенаправлять, потому чтоecho
не печатается на консоли, мы можем отследитьkeepalived_error.log
чтобы определить, выполняется ли сценарий.
Итак, как в этом случае наш скрипт управляет временем? Время сна также необходимо хорошо контролировать, и чем быстрее преобразование, тем лучше при сохранении высокой производительности. Итак, мы загружаем скрипт в конфигурацию keepalived, и каждый раз, когда keepalived проводит выборы, скрипт выполняется.
把脚本添加到keepalived任务中
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.27.160
}
track_script {
chk_nginx # nginx存活状态检测脚本
}
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
}
Точно так же должен быть настроен хост BACKUP.
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.27.160
}
track_script {
chk_nginx
}
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
}
тест после оптимизации
Журнал также обнаружит, что скрипт выполнялся все время.Итак, как протестировать без перезапуска nginx, пусть он сразу закрывает keepalived, а затем включает BACKUP. Я закомментировал эту строку перезапуска скрипта nginx. Затем снова бегите.
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
# echo "restart the nginx server" >> /etc/keepalived/keepalived_error.log
# /usr/sbin/nginx
# sleep 2
# if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
echo "keepalived is closed" >> /etc/keepalived/keepalived_error.log
/usr/bin/ps -ef | grep "keepalived" | grep -v "grep" | cut -c 9-15 | xargs kill -9
echo /usr/bin/ps -ef | grep "keepalived" >> /etc/keepalived/keepalived_error.log
# fi
fi
Это значит, что интеграция скрипта и keepalived проходит без проблем, а комментарии удаляются. Миссия выполнена.
думать
[root@s166 keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:7b:59:07 brd ff:ff:ff:ff:ff:ff
inet 192.168.27.166/24 brd 192.168.27.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.27.160/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::83ee:6998:a0d4:7974/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::2513:4c77:5da7:f031/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::99b3:c79:5377:c3fe/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
[root@s167 keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:d4:26:34 brd ff:ff:ff:ff:ff:ff
inet 192.168.27.167/24 brd 192.168.27.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.27.160/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::99b3:c79:5377:c3fe/64 scope link noprefixroute
valid_lft forever preferred_lft forever
Хотя мы отключили поддержку активности для s166, маршрут ip все равно будет иметь виртуальный ip192.168.27.160
, это может быть сохранено и не полностью прекращено. Но страница ошибок не появилась, когда я его обновил, что доказало, что она не повлияла на нормальную работу сервиса. Не проблема с разделенным мозгом. Я заставляю убить в сценарииkeepalived
Операция заменена более эвфемистическим/usr/sbin/service keepalived stop
, что решило проблему.