Heim > Artikel > Backend-Entwicklung > Nginx Keepalived implementiert den HA-Master-Slave-Modus
Laden Sie offiziell die neueste Version herunter:
keepalived-1.2.17.tar.gz
tar - zxvf keepalived-1.2.17.tar.gz Entpacken
cd keepalived-1.2.17
Tools im Voraus installieren
Dann:
./configure
make && make install
cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
chmod + x /etc/init.d/keepalived
chkconfig --add keepalived
chkconfig keepalived on
mkdir /etc/keepalived
# Ändern Sie die Konfigurationsdatei, um den
cp / darin zu ändern Verzeichnis usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
ln -s /usr/local/sbin/keepalived /usr/sbin/
2. Informationen zur Installation von Nginx finden Sie in der Dokumentation zur Nginx-Installation (Nginx entspricht mehreren Tomcats)
Hinweis: Nginx muss jeweils auf zwei Computern installiert werden. Gleichzeitig muss der Servername in der Konfigurationsdatei mit der IP des entsprechenden Computers übereinstimmen, nicht mit der gleichen, damit nach dem Absturz eines Computers der andere abstürzt Maschine lokalisiert werden kann. Die Maschine, die dem Upstream entspricht.
Starten Sie Nginx separat, verwenden Sie unterschiedliche Zugriffsmethoden und testen Sie, ob die beiden Nginx-Dienste normal sind.
3. Keepalived konfigurieren (Master-Slave-Modus verwenden) In diesem Fall müssen Sie nur die IP des virtuellen Hosts ändern, und Keepalived greift automatisch auf die IP des lokalen Computers zu.
vi
Datei bearbeiten (Haupt):
! Konfigurationsdatei für keepalived
global_defs {
router_id nginx_master
}
#Monitoring service.NGINX mysql, etc.
vrrp_script chk_nginx {
script "/usr/local/nginx/check_nginx.sh"
Intervall 2
Gewicht 2
}
vrrp_instance VI_1 {
State MASTER
Schnittstelle eth0
virtual_router_id 51
Priorität 101
advert_int 1
Authentifizierung {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.254
}
track_script {
chk_nginx #Erkennen Sie das oben konfigurierte
}
}
--
vi
Datei bearbeiten (von):
! Konfigurationsdatei für keepalived
global_defs {
router_id nginx_backup
}
#Monitoring service.NGINX mysql, etc.
vrrp_script chk_nginx {
script "/usr/ local/nginx /check_nginx.sh"
Intervall 2
Gewicht 2
}
vrrp_instance VI_1 {
Status BACKUP
Schnittstelle eth0
virtuelle_router_id 51
Priorität 99
ad vert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.254
}
track_script {
chk_nginx #Detection script oben konfiguriert 🎜> }
}
Skript/usr/local/nginx/ check_nginx. sh“ Inhalt: Denken Sie daran, die Ausführungsberechtigungen zu ändern
#!/bin/bashif [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" = = "" ]
then
/usr/local/nginx/sbin/nginx
sleep 5
if [ "$(ps -ef | grep "nginx: Master Process"| grep -v grep )" = = "" ]
dann
killall keepalived
fi
fi
4. Starten und testen:
Starten Sie zuerst Nginx auf den beiden Maschinen,
Zweitens starten Sie Keepalived auf den beiden Maschinen
Dienst-Keepalived starten (stoppen)
Verwenden Sie zu diesem Zeitpunkt den Befehl ip addr, um die virtuelle IP-Bindung anzuzeigen und Sie können sehen, dass der Master es hat, der Slave jedoch nicht. Schalten Sie das Keepalived des Hosts aus, und Sie können sehen, dass der VIP an den Slave gebunden ist
Verwenden Sie wget, um von anderen Maschinen aus darauf zuzugreifen:
wget http://192.168.1.254/recommend/api/recommend/p2l ?userid=20003829
Überprüfen Sie, ob darauf zugegriffen werden kann, fahren Sie dann Nginx auf dem lokalen Computer herunter und verwenden Sie weiterhin wget, um zu prüfen, ob darauf zugegriffen werden kann. Wenn darauf zugegriffen werden kann, ist die HA-Konfiguration erfolgreich .
5. Beschreibung der Keepalive-Parameter (nur als Referenz)
! Configuration File for keepalived global_defs { notification_email { admin@lvtao.net #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的<span>sendmail</span>服务 } notification_email_from admin@lvtao.net #设置邮件的发送地址 smtp_server 127.0.0.1 #设置smtp server地址 smtp_connect_timeout 30 #设置连接smtp server的超时时间 router_id LVS_DEVEL #表示运行keepalived服务器的一个标识。发邮件时显示在邮件主题的信息 } vrrp_instance VI_1 { state MASTER #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器 interface eth0 #指定HA监测网络的接口 virtual_router_id 51 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的 priority 100 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级 advert_int 1 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 authentication { #设置验证类型和密码 auth_type PASS #设置验证类型,主要有PASS和AH两种 auth_pass 1111 #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信 } virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个 10.0.0.148 } } virtual_server 10.0.0.148 80 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开 delay_loop 6 #设置运行情况检查时间,单位是秒 lb_algo rr #设置负载调度算法,这里设置为rr,即轮询算法 lb_kind DR #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选 persistence_timeout 50 #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。 #有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。 #需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作, #那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制 protocol TCP #指定转发协议类型,有TCP和UDP两种 real_server 10.0.0.137 80 { #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开 weight 3 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器 #分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源 TCP_CHECK { #realserver的状态检测设置部分,单位是秒 connect_timeout 10 #表示3秒无响应超时 nb_get_retry 3 #表示重试次数 delay_before_retry 3 #表示重试间隔 connect_port 80 } } real_server 10.0.0.139 80 { weight 3 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
Um die Zuverlässigkeit des Dienstes sicherzustellen, haben wir außerdem Führen Sie auf jedem Knoten ein Shell-Skript aus, um zu überprüfen, ob der lokale Dienst normal ist. Sobald eine Dienstanomalie festgestellt wird, wird das lokale Keepalived gestoppt, sodass die virtuelle IP automatisch auf den Sicherungscomputer übertragen wird alle 3 Sekunden erkannt. Wenn die Verbindung dreimal nicht erkannt wird, wird die Keepalived-Instanz gestoppt. Wenn der lokale Dienst normal ist, Keepalived jedoch nicht gestartet wird (nach der Fehlerwiederherstellung), wird gleichzeitig Keepalived gestartet, um eine Fehlerwiederherstellung zu erreichen.
Inhalt der Datei check_service.sh
#!/bin/bash
pidfile=/var/lock/subsys/`basename $0`.pid
if [ -f $pidfile ] && [ -e /proc/`cat $pidfile` ] ; then
exit 1
fi
trap "rm -fr $ pidfile ; Exit 0" 1 2 3 15
echo $$ > $pidfile
maxfails=3
fails=0
success=0
while [ 1 ]
do
/usr/bin/wget --timeout=3 --tries=1 http://127.0.0.1/ -q -O /dev/null
if [ $? -ne 0 ] ; then
let fails=$[$fails+1]
success=0
else
fails=0
let success=$[$success+1]
fi
if [ $fails -ge $maxfails ] ; dann
SUCCESS = 0
#Check Keepalived läuft? Versuchen Sie es zu stoppen
Dienst Keepalived 🎜>
wenn [ $? -eq 0 ] ; then
logger -is „Lokaler Dienst schlägt $maxfails mal fehl ... versuche, den Keepalived-Logger zu stoppen.“
fi
fi
wenn [ $success -gt $maxfails ] ; dann
#check keepalived wird gestoppt ? versuchen Sie es zu starten
Dienst-Keepalived-Status |. grep gestoppt
if [ $? -eq 0 ] ; then
logger -is „service changes normal, try to start keepalived .“
service keepalived start
fi
success=0
fi
sleep 3
done
Dieses Skript sollte ausgeführt werden Bitte fügen Sie dieses Skript zur Cron-Task hinzu (dieses Programm verfügt über einen Einzelinstanz-Laufmechanismus). Der Zweck des Hinzufügens der geplanten Task besteht darin, zu verhindern, dass die Erkennungsfunktion fehlschlägt, nachdem das Skript versehentlich unterbrochen wurde erreicht:
Wenn der lokale Dienst dreimal hintereinander keine Erkennung durchführt, versuchen Sie, den Keepalived-Dienst zu stoppen (falls Keepalived ausgeführt wird).
Wenn der lokale Dienst eine Verbindung zum lokalen Dienst herstellt und die Erkennung erfolgreich durchführt dreimal, aber keepalived startet nicht, starten Sie es
Wichtige Ausführungspunkte wurden im Systemprotokoll (/var/log/messages) aufgezeichnet
Führen Sie crontab -e aus und fügen Sie Folgendes hinzu Inhalt:
*/1 * * * * /root/check_service.shStoppen Sie den lokalen Keepalived-Dienst. Nach einer Weile wird der Keepalived-Dienst automatisch gestartet (dies liegt daran, dass der lokale Dienst Erkennung ist normal)
Starten Sie dann Nginx wird auch normal gestartet und die richtige virtuelle IP ist gebunden