keepalive:
簡單一點來說,keepalive就是一個在TCP中可以檢測死連接的機制。
原理:
keepalive的原理很簡單,TCP會在空閒的時候發送數據給對方:
如果主機可達,對方就會響應ACK應答,就會認爲是該主機是存活的;
如果主機可達,但應用程序退出,對方就會發RST應答,發送TCP撤銷連接;
如果可達,但應用程序崩潰了,對方主機就會發送FIN消息;
如果對方主機不響應ACK、RST,則會繼續發送,直到超時,就會撤銷連接。(默認是2個小時)
雙機熱備:
特指基於高可用系統中的兩臺服務器的熱備(或高可用)。
雙機高可用按工作中的切換方式分爲:主-備方式(Active-Standby方式)和雙主機方式(Active-Active方式),主-備方式即指的是一臺服務器處於某種業務的激活狀態(即Active狀態),另一臺服務器處於該業務的備用狀態(即Standby狀態)。而雙主機方式即指兩種不同業務分別在兩臺服務器上互爲主備狀態(即Active-Standby和Standby-Active狀態)。
開始搭建實驗環境(CentOS 7)
一、大致拓撲圖:
拓撲圖
主機 | ip地址 | 主機角色 | vip |
keepalive-1 | 10.0.0.11 | keepalive+Nginx | vip1:10.0.0.100 vip2:10.0.0.200 |
keepalive-2 | 10.0.0.12 | keepalive+Nginx | |
web-1 | 10.0.0.13 | web服務器 | |
web-2 | 10.0.0.14 | web服務器 |
說明:
負載均衡器(keepalive-1):
10.0.0.11(通過keepalived配置了vip:10.0.0.100和10.0.0.200供外使用)
負載均衡器(keepalive-2):
10.0.0.12(通過keepalived配置了VIP:10.0.0.100和10.0.0.200供外使用)
後端代理的web服務器(這裏爲了簡單就使用Apache作爲web服務):
10.0.0.13:80(web-1)
10.0.0.14:80(web-2)
二、實驗步驟:
2.1、先弄好各主機的配置
1、配好ip地址,把selinux設置爲disabled,在這裏,我把firewalld防火牆也關掉了,設置爲開機不啓動,把yum源配置爲阿里雲的源。
2、在web-1和web-2,先用yum裝好Apache服務,並配置好網頁,這裏就不寫出來了。
3、爲防止各臺主機的時間不同步,在這裏先同步一下時間
yum install -y ntpdate ntpdate -u 0.pool.ntp.org
2.2、在主機keepalive-1和keepalive-2上安裝Nginx和keepalive(注:Nginx是源碼編譯安裝的)
1、安裝軟件依賴包:
yum-y groupinstall "Development Tools" "Server PlatformDeveopment" yum-y install openssl-devel pcre-devel
2、下載Nginx安裝包
cd /usr/local/src yum install -y wget wget http://nginx.org/download/nginx-1.2.8.tar.gz
3、添加Nginx用戶和解壓Nginx安裝包
useradd nginx cd /usr/local/src tar zxvf nginx-1.2.8.tar.gz cd nginx-1.2.8
4、安裝nginx包
./configure--prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module--with-http_flv_module --with-http_stub_status_module--with-http_gzip_static_module --with-pcre
5、開始編譯
make && make install
6、編譯完成後,我們就可以啓動Nginx了
/usr/local/nginx/sbin/nginx -t ##檢測Nginx配置是否正確 /usr/local/nginx/sbin/nginx ##啓動Nginx ##注: ##如果Nginx進程已經存在了,則可以先殺死該進程再啓動 ps -ef | grep nginx | awk '{print $2}'| xargs kill -9
7、啓動成功後,我們就可以看到以下的web頁面了
到此Nginx就已經編譯安裝完成了。
8、然後開始配置Nginx反向代理服務。
vim /usr/local/nginx/conf/nginx.conf ##找到server,並在server前面添加upstream,配置如下: upstream web{ server 10.0.0.13:80 max_fails=3 fail_timeout=20s weight=2; server 10.0.0.14:80 max_fails=3 fail_timeout=20s weight=2; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { # root html; # index index.html index.htm; proxy_pass http://web; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for; } }
然後檢查配置是否正確,如果沒有錯誤就重新讀取Nginx的配置文件(如果之前沒有啓動Nginx,就直接啓動Nginx就好了)
[root@keepalive-1 ~]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@keepalive-1 ~]# /usr/local/nginx/sbin/nginx -s reload
訪問Nginx,查看Nginx反向代理是否成功(Nginx反向代理成功)
[root@keepalive-1 ~]# curl 10.0.0.11
It is web1
[root@keepalive-1 ~]# curl 10.0.0.11
It is web2
[root@keepalive-1 ~]# curl 10.0.0.11
It is web1
[root@keepalive-1 ~]# curl 10.0.0.11
It is web2
到此Nginx就算配置好了,另外一臺(keepalive-2)也是一樣的配置。
2.3、開始配置keepalive
安裝keepalive(這裏使用yum安裝就好了)
yum install -y keepalived
開始配置keepalive文件(可以把原來的配置文件重命名爲.bak作爲備份,重新編輯一份配置文件)
##主機keepalive-1的配置文件: [root@keepalive-1 ~]# cat /etc/keepalived/keepalived.conf ##主機keepalive-1 ! Configuration File for keepalived global_defs { notification_email { [email protected] #[email protected] #[email protected] } } vrrp_script nginx_check { ##定義監控Nginx的腳本 script "/etc/keepalived/nginx_check.sh" interval 1 ##沒1s檢測一次 weight -5 ##優先級減去5 fall 2 rise 1 } vrrp_instance VI_1 { ##定義vrrptest實例 state MASTER ##服務器狀態 interface ens33 ##使用的接口 virtual_router_id 51 ##虛擬路由的標誌,一組lvs的虛擬路由標識必須相同,這樣才能切換 priority 150 ##服務啓動優先級,值越大,優先級越高,BACKUP 不能大於MASTER advert_int 1 ##服務器之間的存活檢查時間 authentication { auth_type PASS ##認證類型 auth_pass 123456 ##認證密碼,一組lvs 服務器的認證密碼必須一致 } virtual_ipaddress { ##虛擬IP地址 10.0.0.100 } track_script { ##執行監控nginx進程的腳本 nginx_check } } vrrp_instance VI_2 { state BACKUP interface ens33 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 10.0.0.200 } track_script { nginx_check } }
##主機keepalive-2的配置文件: [root@keepalive-1 ~]# cat /etc/keepalived/keepalived.conf ##主機keepalive-2 ! Configuration File for keepalived global_defs { notification_email { [email protected] #[email protected] #[email protected] } } vrrp_script nginx_check { ##定義監控Nginx的腳本 script "/etc/keepalived/nginx_check.sh" interval 1 ##沒1s檢測一次 weight -5 ##優先級減去5 fall 2 rise 1 } vrrp_instance VI_1 { ##定義vrrptest實例 state BACKUP ##服務器狀態 interface ens33 ##使用的接口 virtual_router_id 51 ##虛擬路由的標誌,一組lvs的虛擬路由標識必須相同,這樣才能切換 priority 100 ##服務啓動優先級,值越大,優先級越高,BACKUP 不能大於MASTER advert_int 1 ##服務器之間的存活檢查時間 authentication { auth_type PASS ##認證類型 auth_pass 123456 ##認證密碼,一組lvs 服務器的認證密碼必須一致 } virtual_ipaddress { ##虛擬IP地址 10.0.0.100 } track_script { ##執行監控nginx進程的腳本 nginx_check } } vrrp_instance VI_2 { state MASTER interface ens33 virtual_router_id 50 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 10.0.0.200 } track_script { nginx_check } }
配置Nginx檢查腳本,如果Nginx服務停掉了,自動關掉keepalive服務
[root@keepalive-1 ~]# cat /etc/keepalived/nginx_check.sh #!/bin/bash HOST=`hostname` [email protected] ##自己的郵箱地址 date=`date "+%F %H:%M:%S"` pgrep nginx if [ "$?" -ne "0" ] then systemctl stop keepalived echo "Your nginx:$HOST in $date is dowm" | mail -s "Your nginx is dowm" $mail fi chmod a+x /etc/keepalived/nginx_check.sh ##加入計劃任務 crontab -e */1 * * * * bash /etc/keepalived/nginx_check.sh >> /dev/null
在兩臺主機分別啓動keepalive,可以看到VIP已經起來了
主機keepalive-1
主機keepalive-2
至此,所有服務就已經配置完成了,接下來就剩下測試了。
三、測試
1、先檢查一下寫的檢查Nginx服務啓用的腳本是否能夠正常使用
[root@keepalive-1 ~]# bash -x /etc/keepalived/nginx_check.sh ++ hostname + HOST=keepalive-1 + [email protected] ++ date '+%F %H:%M:%S' + date='2017-10-22 17:21:36' + pgrep nginx 999 1005 + '[' 0 -ne 0 ']'
經檢查發現,該腳本是可以使用的(這裏我並沒有把Nginx服務停掉來測試)
2、在正常情況下使用vip來訪問web服務,我們發現是可以正常訪問的。
[root@localhost ~]# curl 10.0.0.100 It is web1 [root@localhost ~]# curl 10.0.0.100 It is web2 [root@localhost ~]# curl 10.0.0.100 It is web1 [root@localhost ~]# curl 10.0.0.100 It is web2 [root@localhost ~]# [root@localhost ~]# curl 10.0.0.200 It is web1 [root@localhost ~]# curl 10.0.0.200 It is web2 [root@localhost ~]# curl 10.0.0.200 is web1 [root@localhost ~]# curl 10.0.0.200 It is web2
3、當我們把主機keepalive-1的Nginx服務停掉時,可以看到主機keepalive-1的keepalive服務已經停掉了,並且vip也遷移到了主機keepalive-2上了,主機keepalive-2出現了兩個vip,並且此時也還是能正常訪問web頁面,說明我們的實驗做成功了。
主機keepalive-1
主機keepalive-2
訪問web頁面
[root@localhost ~]# curl 10.0.0.100 It is web1 [root@localhost ~]# curl 10.0.0.100 It is web2 [root@localhost ~]# curl 10.0.0.100 It is web1 [root@localhost ~]# curl 10.0.0.100 It is web2 [root@localhost ~]# [root@localhost ~]# curl 10.0.0.200 It is web1 [root@localhost ~]# curl 10.0.0.200 It is web2 [root@localhost ~]# curl 10.0.0.200 It is web1 [root@localhost ~]# curl 10.0.0.200 It is web2
到這裏,我們這次Nginx+keepalive雙主機熱備做負載均衡的實驗就結束了。