Nginx&Keepalived обеспечивает высокую доступность

задняя часть сервер Nginx Балансировка нагрузки

что такое поддержка активности

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Вот простой логотип:

Обратите внимание на изменения в адресной строке. Считайте 168 и 169 обычными веб-сервисами.

Хорошо, спускайтесь и настройте 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. Просмотр хост-маршрутов

166主机

167主机

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, что решило проблему.

расширять:Проблема с разделенным мозгом высокой доступности