keepalived原理及nginx+keepalived


一、keepalived高可用簡介
keepalived是一個類似與layer3、4和7交換機制的軟件,keepalived軟件有兩種功能,分別是監控檢查、VRRP(虛擬路由器冗余協議)
keepalived的作用是檢測Web服務器的狀態,比如有一台Web服務器、MySQL服務器宕機或工作出現故障,keepalived檢測到后,會將故障的Web服務器或者MySQL服務器從系統中剔除,當服務器工作正常后keepalived自動將服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的值是修復故障的Web和MySQL服務器。layer3、4、7工作在TCP/IP協議棧的IP層、傳輸層、應用層,實現原理為:

layer3:keepalived使用layer3的方式工作時,keepalived會定期向服務器群中的服務器發送一個ICMP數據包,如果發現某台服務的IP地址無法ping通,keepalived便報告這台服務器失效,並將它從服務器集群中剔除。layer3的方式是以服務器的IP地址是否有效作為服務器工作是否正常的標准
layer4:layer4主要以TCP端口的狀態來決定服務器工作是否正常。例如Web服務端口一般為80,如果keepalived檢測到80端口沒有啟動,則keepalived把這台服務器從服務器集群中剔除
layer7:layer7工作在應用層,keepalived將根據用戶的設定檢查服務器的運行是否正常,如果與用戶的設定不相符,則keepalived將把服務器從服務器集群中剔除
二、nginx+keepalived集群
1、原理及環境
Nginx負載均衡一般位於整個架構的最前端或者中間層,如果為最前端時單台nginx會存在單點故障,一台nginx宕機,會影響用戶對整個網站的訪問。如果需要加入nginx備份服務器,nginx主服務器與備份服務器之間形成高可用,一旦發現nginx主宕機,能夠快速將網站切換至備份服務器。

原理圖:

 

 

 

准備環境:
nginx-1:172.25.70.1(master),主機名為:keep1
nginx-2:172.25.70.2(backup),主機名為:keep2

2、安裝配置
(1)master和backup均安裝nginx

##之前預編譯需要的gcc、gcc-c++、openssl、openssl-devel等默認已經安裝好
[root@keep1 ~]# yum install -y pcre-devel ##安裝perl兼容的正則表達式庫
[root@keep1 ~]# cd nginx-1.12.0
[root@keep1 nginx-1.12.0]# sed -i -e 's/1.12.0//g' -e 's/nginx\//TDTWS/g' -e 's/"NGINX"/"TDTWS"/g' src/core/nginx.h ##sed修改Nginx版本信息為TDTWS
[root@keep1 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module
[root@keep1 nginx-1.12.0]# make && make install
[root@keep1 ~]# vim /usr/local/nginx/conf/nginx.conf
將該文件里面的user nobody的注釋去掉
[root@keep1 ~]# ln -s /usr/local/nginx/sbin/nginx /sbin/nginx #創建命令快捷啟動
[root@keep1 ~]# nginx 
#沒有報錯表示啟動成功

(2)master和backup均安裝keepalived

##安裝依賴包
[root@keep1 ~]# yum -y install libnl libnl-devel libnfnetlink 
此時還需要一個包libnfnetlink-devel,但因為redhat6.5自身的鏡像源中沒有,所以給大家提供一個地址,下載了之后直接用rpm -ivh安裝即可
[root@localhost ~]# wget ftp://mirror.switch.ch/mirror/centos/6/os/x86_64/Packages/libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm
[root@keep1 keepalived-1.4.3]# rpm -ivh libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm
##編譯安裝 [root@keep1
~]# tar zxf keepalived-1.3.6.tar.gz [root@keep1 ~]# cd keepalived-1.3.6 [root@keep1 keepalived-1.3.6]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV [root@keep1 keepalived-1.3.6]# make && make install ##做啟動鏈接等 [root@keep1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/keepalived /etc/ [root@keep1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ [root@keep1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ [root@keep1 keepalived-1.3.6]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/ [root@keep1 keepalived-1.3.6]# chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived

(3)master和backup分別配置keepalived配置文件

master

[root@keep1 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost #健康檢查報告通知郵箱
}
notification_email_from keepalived@localhost #發送郵件的地址
smtp_server 127.0.0.1 #郵件服務器
smtp_connect_timeout 30
route_id LVS_DEVEL
}

vrrp_script_chk_nginx { 
script "/data/sh/check_nginx.sh" ##檢查本地nginx是否存活腳本需要自己寫,后面會有該腳本內容
interval 2
weight 2
}

#VIP1
vrrp_instance VI_1 {
state BACKUP
interface eth0
lvs_sync_daemon_interface eth0
virtual_router_id 151
priority 100
advert_int 5 #健康檢測頻率
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.70.100 ##VIP
}
track_script {
chk_nginx
}
}


##以下腳本用於檢查本地nginx是否存活,如果不存活,則服務實現切換
[root@keep1 ~]# vim /data/sh/check_nginx.sh
#!/bin/bash
killall -0 nginx
if [[ $? -ne 0 ]]; then
/etc/init.d/keepalived stop
fi

##編寫一個nginx顯示的html文件
[root@keep1 ~]# vim /usr/local/nginx/html/index.html
<h1>172.25.70.1</h1>

重新啟動nginx

backup

##backup的keepalived的配置文件和master只有優先級不一樣
[root@keep2 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost #健康檢查報告通知郵箱
}
notification_email_from keepalived@localhost #發送郵件的地址
smtp_server 127.0.0.1 #郵件服務器
smtp_connect_timeout 30
route_id LVS_DEVEL
}

vrrp_script_chk_nginx { 
script "/data/sh/check_nginx.sh" ##檢查本地nginx是否存活腳本需要自己寫,后面會有該腳本內容
interval 2
weight 2
}

#VIP1
vrrp_instance VI_1 {
state BACKUP
interface eth0
lvs_sync_daemon_interface eth0
virtual_router_id 151
priority 90 
advert_int 5 #健康檢測頻率
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.70.100 ##VIP
}
track_script {
chk_nginx
}
}

##backup和master的/data/sh/check_nginx.sh文件相同,這里就不再顯示了

##編寫一個nginx顯示的html文件
[root@keep2 ~]# vim /usr/local/nginx/html/index.html
<h1>172.25.70.2</h1>

重新啟動nginx

3、測試
1、兩台主機的nginx和keepalived都正常工作,使用瀏覽器訪問虛擬ip 172.25.70.100應該得到keep1主機的nginx頁面

 

 


2、關閉keep1的keepalived,再用瀏覽器訪問虛擬ip查看是否實現了高可用
如果在真實情況中,主的nginx宕掉了,兩個nginx頁面一致,那么會快速將網站切換到備份的服務器上面去

 

 


得到上圖結果,表示該實驗成功!

三、nginx+keepalived雙主架構
nginx+keepalived主備模式,始終有一台服務器處於空閑狀態。為了更好地利用服務器,可以把它們設置為雙主模式,另一台為這一台的備份,同時它又是另外一個VIP的主服務器,兩台同時對外提供不同服務,同時接收用戶的請求。

原理圖:

 

 

環境:

keep1:172.25.70.1
keep2:172.25.70.2
VIP1:172.25.70.100 ,主為keep1,從為keep2
VIP2:172.25.70.150,主為keep2,從為keep1
2、配置文件
(1)kepp1主機配置keepalived.conf

其實跟上面的集群都是一個套路,所以這里就沒有注釋了

keep1主機keepalived.conf配置文件內容如下:
[root@keep1 ~]# vim /etc/keepalived/keepalived.conf
global_defs { 
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
route_id LVS_DEVEL
}

vrrp_script_chk_nginx {
script "/data/sh/check_nginx.sh"
interval 2
weight 2
}

#VIP1
vrrp_instance VI_1 {
state MASTER
interface eth0
lvs_sync_daemon_interface eth0
virtual_router_id 151
priority 100
advert_int 5
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.70.100
}
track_script {
chk_nginx
}
}

#VIP2
vrrp_instance VI_2 {
state BACKUP
interface eth0
lvs_sync_daemon_interface eth0
virtual_router_id 152
priority 90
advert_int 5
nopreempt
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
172.25.70.150
}
track_script {
chk_nginx
}
}

(2)keep2主機配置keepalived.conf

keep2主機配置keepalived.conf文件內容如下:
[root@keep2 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
route_id LVS_DEVEL
}

vrrp_script_chk_nginx {
script "/data/sh/check_nginx.sh"
interval 2
weight 2
}

#VIP1
vrrp_instance VI_1 {
state BACKUP
interface eth0
lvs_sync_daemon_interface eth0
virtual_router_id 151
priority 90
advert_int 5
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.70.100
}
track_script {
chk_nginx
}
}

#VIP2
vrrp_instance VI_2 {
state MASTER
interface eth0
lvs_sync_daemon_interface eth0
virtual_router_id 152
priority 100
advert_int 5
nopreempt
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
172.25.70.150
}
track_script {
chk_nginx
}
}

配置完成后重新啟動服務

(3)兩台服務器上檢測腳本還是和集群實驗中的腳本內容相同

3、測試
1、正常情況下,兩個虛擬網卡在它自己為主的那個主機上,如下圖

 

 

 

 

 

2、當其中一台主服務器DOWN掉,則會發現宕掉的那個VIP的從機開始工作,那么兩個VIP此時都會在同一個主機上

 

 

那么雙主架構實驗則成功!

4、管理與維護
nginx+keepalived雙主架構,日常維護和管理需要從以下幾個方面:

keepalived主配置文件必須設置不同的VRRP名稱,同時優先級和VIP也不相同
該實驗中用到了兩台服務器,nginx網站訪問量為兩台服務器訪問之和,可以用腳本來統計
兩個nginx都是master,有兩個VIP地址,用戶從外網訪問VIP,需要配置域名映射到兩個VIP上,可以通過外網DNS映射不同的VIP
可以通過zabbix監控等實時監控VIP訪問是否正常

原文鏈接:https://blog.csdn.net/lcl_xiaowugui/java/article/details/81712925

nginx+keepalived高可用

負載均衡技術對於一個網站尤其是大型網站的web服務器集群來說是至關重要的!做好負載均衡架構,可以實現故障轉移和高可用環境,避免單點故障,保證網站健康持續運行。
由於業務擴展,網站的訪問量不斷加大,負載越來越高。現需要在web前端放置nginx負載均衡,同時結合keepalived對前端nginx實現HA高可用。
介紹下Nginx和keepalive
1.Nginx

Nginx 是一個很強大的高性能Web和反向代理服務器,它具有很多非常優越的特性:
Nginx作為負載均衡服務器:Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進行服務,也可以支持作為 HTTP代理服務器對外進行服務。Nginx采用C進行編寫,不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多。
2.keepalive

Keepalived是Linux下面實現VRRP備份路由的高可靠性運行件。基於Keepalived設計的服務模式能夠真正做到主服務器和備份服務器故障時IP瞬間無縫交接。二者結合,可以構架出比較穩定的軟件LB方案。
Nginx+keepalive高可用方式有兩種:
1.Nginx+keepalived 主從配置

這種方案,使用一個vip地址,前端使用2台機器,一台做主,一台做備,但同時只有一台機器工作,另一台備份機器在主機器不出現故障的時候,永遠處於浪費狀態,對於服務器不多的網站,該方案不經濟實惠。
2.Nginx+keepalived 雙主配置

這種方案,使用兩個vip地址,前端使用2台機器,互為主備,同時有兩台機器工作,當其中一台機器出現故障,兩台機器的請求轉移到一台機器負擔,非常適合於當前架構環境。所以在這里就詳細介紹下雙主模型配置

一、拓撲結構

Nginx+keepalived高可用(雙主模式)

二、測試環境介紹

系統centos7.4 64位
centos6.9 64位
前端node1服務器:DIP:192.168.92.136
VIP1:192.168.92.23
VIP2:192.168.92.24
前端node2服務器:DIP:192.168.92.133
VIP1:192.168.92.24
VIP2:192.168.92.23
后端服務器:web node3:192.168.92.123
web node4:192.168.92.124
web node5:192.168.92.125
我們開始之前先把防火牆和selinux關掉,很多時候我們服務器之間不通都是這些原因造成的。

三、軟件安裝

Nginx和keepalive的安裝非常簡單,我們可以直接使用yun來安裝。
yum install keepalived nginx -y
后端服務器我們同樣用yum來裝上Nginx
后端node3

[root@node3 ~]# yum -y install nginx [root@node3 ~]# echo "this is 192.168.92.123" > /usr/share/nginx/html/index.html [root@node3 ~]# service nginx start [root@node3 ~]# curl 192.168.92.123 this is 192.168.92.123

后端node4

[root@node4 ~]# yum -y install nginx [root@node4 ~]# echo "this is 192.168.92.124" > /usr/share/nginx/html/index.html [root@node4 ~]# service nginx start [root@node4 ~]# curl 192.168.92.124 this is 192.168.92.124

后端node5

[root@node5 ~]# yum -y install nginx [root@node5 ~]# echo "this is 192.168.92.125" > /usr/share/nginx/html/index.html [root@node5 ~]# service nginx start [root@node5 ~]# curl 192.168.92.125 this is 192.168.92.125

四、在node1、node2上配置Nginx

[root@node2 ~]# vim /etc/nginx/conf.d/node2.conf #在擴展配置目錄中配置需要注釋掉主配置文件中的server部分 upstream web1 { #ip_hash; #hash綁定ip server 192.168.92.123:80; server 192.168.92.124:80; server 192.168.92.125:80; } server { listen 80; server_name www.node.com; index index.html index.htm; location / { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://web1; } }

五、在node1上配置keepalive

[root@node1 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_gruop4 224.0.100.23 } vrrp_script chk_haproxy { script "/etc/keepalived/chk_nginx.sh" interval 2 weight 2 } vrrp_instance VI_1 { state MASTER interface ens37 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 111123 } track_script { chk_nginx } virtual_ipaddress { 192.168.92.23 } } vrrp_instance VI_2 { state BACKUP interface ens37 virtual_router_id 151 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 123123 } track_script { chk_nginx } virtual_ipaddress { 192.168.92.24 } }

六、在node2上配置keepalive

[root@node2 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_gruop4 224.0.100.23 } vrrp_script chk_haproxy { script "/etc/keepalived/chk_nginx.sh" interval 2 weight 2 } vrrp_instance VI_1 { state BACKUP interface ens34 virtual_router_id 51 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 111123 } track_script { chk_nginx } virtual_ipaddress { 192.168.92.23 } } vrrp_instance VI_2 { state MASTER interface ens34 virtual_router_id 151 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 123123 } track_script { chk_nginx } virtual_ipaddress { 192.168.92.24 } }

七、在雙主服務器上添加檢測腳本

此腳本作用是檢測Nginx是否運行,如果沒有運行就啟動Nginx
如果啟動失敗則停止keepalive,保證備用服務器正常運行。

[root@node2 ~]# cat /etc/keepalived/chk_nginx.sh #!/bin/bash status=$(ps -C nginx --no-heading|wc -l) if [ "${status}" = "0" ]; then systemctl start nginx status2=$(ps -C nginx --no-heading|wc -l) if [ "${status2}" = "0" ]; then systemctl stop keepalived fi fi

八、啟動Nginx、keepalive服務

[root@node2 ~]# service nginx start [root@node2 ~]# service keepalived start [root@node3 ~]# service nginx start [root@node3 ~]# service keepalived start

九、查看VIP並測試訪問

[root@node2 ~]# ip a .......... ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:ca:0b:2b brd ff:ff:ff:ff:ff:ff inet 192.168.92.133/24 brd 192.168.92.255 scope global dynamic ens34 valid_lft 1293sec preferred_lft 1293sec inet 192.168.92.24/32 scope global ens34 valid_lft forever preferred_lft forever inet6 fe80::9bff:2e2b:aebb:e35/64 scope link valid_lft forever preferred_lft forever ......... [root@node1 ~]# ip a .......... ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:04:b6:17 brd ff:ff:ff:ff:ff:ff inet 192.168.92.136/24 brd 192.168.92.255 scope global dynamic ens37 valid_lft 1567sec preferred_lft 1567sec inet 192.168.92.23/32 scope global ens37 valid_lft forever preferred_lft forever inet6 fe80::7ff4:9608:5903:1a4b/64 scope link valid_lft forever preferred_lft forever ..........
[root@node1 ~]# curl http://192.168.92.23 this is 192.168.92.123 [root@node1 ~]# curl http://192.168.92.23 this is 192.168.92.124 [root@node1 ~]# curl http://192.168.92.23 this is 192.168.92.125 [root@node1 ~]# curl http://192.168.92.24 this is 192.168.92.124

十、測試腳本是否能正常運行

手動停止Nginx后自動恢復啟動

[root@node1 ~]# systemctl stop nginx [root@node1 ~]# ss -tnlp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:80 *:* users:(("nginx",pid=20257,fd=6),("nginx",pid=20256,fd=6)) LISTEN 0 128 *:22 *:* users:(("sshd",pid=913,fd=3)) LISTEN 0 100 127.0.0.1:25 *:* users:(("master",pid=991,fd=13)) LISTEN 0 128 :::22 :::* users:(("sshd",pid=913,fd=4)) LISTEN 0 100 ::1:25 :::* 

 

原文:https://blog.51cto.com/13438667/2125166


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM