高可用架構篇
Keepalived + Nginx 實現高可用 Web 負載均衡
1、場景需求(請看視頻解說):
雖然實現了tomcat的高可用,但是nginx是單點的,nginx沒有實現高可用html
2、Keepalived 簡要介紹
Keepalived 是一種高性能的服務器高可用或熱備解決方案,Keepalived 能夠用來防止服務器單點故障的發生,經過配合 Nginx 能夠實現 web 前端服務的高可用。
Keepalived 以 VRRP 協議爲實現基礎,用 VRRP 協議來實現高可用性(HA)。VRRP(Virtual Router Redundancy Protocol)協議是用於實現路由器冗餘的協議,VRRP 協議將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器 IP(一個或多個),而在路由器組內部,若是實際擁有這個對外 IP 的路由器若是工做正常的話就是 MASTER,或者是經過算法選舉產生,MASTER 實現針對虛擬路由器 IP 的各類網絡功能,如 ARP 請求,ICMP,以及數據的轉發等;其餘設備不擁有該虛擬 IP,狀態是 BACKUP,除了接收 MASTER 的 VRRP 狀態通告信息外,不執行對外的網絡功能。當主機失效時,BACKUP 將接管原先MASTER 的網絡功能。 VRRP 協議使用多播數據來傳輸VRRP 數據,VRRP 數據使用特殊的虛擬源 MAC 地址發送數據而不是自身
網卡的 MAC 地址,VRRP 運行時只有 MASTER 路由器定時發送 VRRP 通告信息,表示 MASTER 工做正常以及虛擬路由器 IP(組),BACKUP 只接收 VRRP 數據,不發送數據,若是必定時間內沒有接收到 MASTER 的通告信息,各 BACKUP 將宣告本身成爲 MASTER,發送通告信息,從新進行 MASTER 選舉狀態。
兩個nginx中都裝着keepalived,提供一個虛擬ip,當一個請求經過虛擬ip訪問nginx2的時候,這個時候nginx2掛了,keepalived經過檢測腳本,知道niginx掛了,嘗試啓動,仍是啓動不起來的話,就將本身(keepalived)掛掉,這樣這個請求就漂移到了nginx2中。
3、方案規劃前端
VIP | IP | 主機名 | Nginx 端口 | 默認主從 |
---|---|---|---|---|
192.168.1.50 | 192.168.1.51 | edu-proxy-01 | 88 | MASTER |
192.168.1.52 | edu-proxy-02 | 88 | BACKUP |
CentOS 6.6 x64
keepalived-1.2.18.tar.gz
nginx-1.6.2.tar.gz
4、安裝 Nginx
一、安裝編譯 Nginx 所需的依賴包nginx
# yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel
二、上傳 Nginx(nginx-1.6.2.tar.gz)到 /usr/local/src 目錄web
三、編譯安裝 Nginx算法
# cd /usr/local/src/ # tar -zxvf nginx-1.6.2.tar.gz # cd nginx-1.6.2 # ./configure --prefix=/usr/local/nginx # make && make install
四、配置 Nginxtomcat
# vi /usr/local/nginx/conf/nginx.conf user root; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 88; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
主要修改的內容是user root; 和server {listen 88;}
修改 Nginx 歡迎首頁內容(用於後面測試,用於區分兩個節點的 Nginx):bash
# vi /usr/local/nginx/html/index.html
192.168.1.51 中的標題加 1服務器
<h1>Welcome to nginx! 1</h1>
192.168.1.52 中的標題加 2網絡
<h1>Welcome to nginx! 2</h1>
五、系統防火牆打開對應的端口 88架構
# vi /etc/sysconfig/iptables ## Nginx -A INPUT -m state --state NEW -m tcp -p tcp --dport 88 -j ACCEPT # service iptables restart
六、測試 Nginx 是否安裝成功
# /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
七、啓動 Nginx
# /usr/local/nginx/sbin/nginx
重啓 Nginx
# /usr/local/nginx/sbin/nginx -s reload
八、設置 Nginx 開機啓動
# vi /etc/rc.local
加入:
/usr/local/nginx/sbin/nginx
九、分別訪問兩個 Nginx
5、安裝 Keepalived ( http://www.keepalived.org/download.html )
一、上傳或下載 keepalived(keepalived-1.2.18.tar.gz)到 /usr/local/src 目錄
二、解壓安裝
# cd /usr/local/src # tar -zxvf keepalived-1.2.18.tar.gz # cd keepalived-1.2.18 # ./configure --prefix=/usr/local/keepalived # make && make install
三、將 keepalived 安裝成Linux 系統服務:
由於沒有使用 keepalived 的默認路徑安裝(默認是/usr/local),安裝完成以後,須要作一些工做複製默認配置文件到默認路徑
# mkdir /etc/keepalived # cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
複製 keepalived 服務腳本到默認的地址
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ # cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ # ln -s /usr/local/sbin/keepalived /usr/sbin/ # ln -s /usr/local/keepalived/sbin/keepalived /sbin/
設置 keepalived 服務開機啓動
# chkconfig keepalived on
四、修改 Keepalived 配置文件
(1) MASTER 節點配置文件(192.168.1.51)
# vi /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { ## keepalived 自帶的郵件提醒須要開啓 sendmail 服務。建議用獨立的監控或第三方 SMTP router_id edu-proxy-01 ## 標識本節點的字條串,一般爲 hostname //edu-proxy-01就是咱們日常ssh到服務器上的時候root裏面的用戶名 } ## keepalived 會定時執行腳本並對腳本執行的結果進行分析,動態調整 vrrp_instance 的優先級。 若是 腳本執行結果爲 0,而且 weight 配置的值大於 0,則優先級相應的增長。若是腳本執行結果非 0, 而且 weight 配置的值小於 0,則優先級相應的減小。其餘狀況,維持本來配置的優先級,即配置文件中 priority 對應 的值。 vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 ## 檢測時間間隔 weight -20 ## 若是條件成立,權重-20,即若是檢測不正常,當前的權重減去二十 //看下面有一個配置priority 100,結合着用,若是master的權重小於了從節點的權重,就說明 //主節點不正常了,應該切花成從節點。 } ## 檢測 nginx 狀態的腳本路徑 ## 定義虛擬路由,VI_1 爲虛擬路由的標示符,本身定義名稱 vrrp_instance VI_1 { state MASTER ## 主節點爲 MASTER,對應的備份節點爲 BACKUP interface eth1 ## 綁定虛擬 IP 的網絡接口,與本機 IP 地址所在的網絡接口相同,個人是 eth1 ## 有的人的機器是eth0,或者eth2的自行更改,就是ifconfig例子本身IP地址的哪一個 eth virtual_router_id 51 ## 虛擬路由的 ID 號,兩個節點設置必須同樣,可選 IP 最後一段使用, 相同的 VRID 爲一個組,他將決定多播的 MAC 地址 ## 這個ip好就是本機ip的最後一段,如192.168.1.51就是51 mcast_src_ip 192.168.1.51 ## 本機 IP 地址 priority 100 ## 節點優先級,值範圍 0-254,MASTER 要比 BACKUP 高 nopreempt ## 優先級高 的設置 nopreempt 解決異常恢復後再次搶佔的問題 advert_int 1 ## 組播信息發送間隔,兩個節點設 置必須同樣,默認 1s ## 設置驗證信息,兩個節點必須一致 authentication { //默認的類型和密碼,本身能夠修改 auth_type PASS auth_pass 1111 ## 真實生產,按需求對應該過來 } ## 將 track_script 塊加入 instance 配置塊 track_script { //就是上面第一的chk_nginx chk_nginx ## 執行 Nginx 監控的服務 } ## 虛擬 IP 池, 兩個節點設置必須同樣 virtual_ipaddress { 192.168.1.50 ## 虛擬 ip,能夠定義多個 } }
(2)BACKUP 節點配置文件(192.168.1.52):
# vi /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id edu-proxy-02 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight -20 } vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 51 mcast_src_ip 192.168.1.52 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168.1.50 } }
**
對比兩個conf文件發現
state 不一樣
virtual_router_id 相同
macast_src_ip 不一樣
priority 權重主節點高於從節點
主節點有nopreempt ,防止再次搶佔
剩下的都是同樣的。
**
五、編寫 Nginx 狀態檢測腳本 /etc/keepalived/nginx_check.sh (已在keepalived.conf 中配置)
腳本要求:若是 nginx 中止運行,嘗試啓動,若是沒法啓動則殺死本機的 keepalived 進程,keepalied 將虛擬 ip 綁定到 BACKUP 機器上。內容以下:
# vi /etc/keepalived/nginx_check.sh #!/bin/bash //查看是否有nginx這個服務 A=`ps -C nginx –no-header |wc -l` //若是沒有的話 if [ $A -eq 0 ];then //嘗試啓動 /usr/local/nginx/sbin/nginx //由於不可能立刻就啓動成功,因此睡兩秒,再進行下面的判斷 sleep 2 //若是再次判斷nginx是否正常啓動 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then //將當前節點殺掉,讓備份的節點成爲主節點 killall keepalived fi fi
兩個nginx中都裝着keepalived,提供一個虛擬ip,當一個請求經過虛擬ip訪問nginx2的時候,這個時候nginx2掛了,keepalived經過檢測腳本,知道niginx掛了,嘗試啓動,仍是啓動不起來的話,就將本身(keepalived)掛掉,這樣這個請求就漂移到了nginx2中。
保存後,給腳本賦執行權限:
# chmod +x /etc/keepalived/nginx_check.sh
六、啓動 Keepalived
# service keepalived start Starting keepalived: [ OK ]
啓動以後運行命令
ip a eth1 : inet 192.168.1.52 inet 192.168.1.50
發現兩遍都多了一個50
若是 執行
service keepalived stop
發現50又沒有了,說明50是keepalived虛擬建立出來的。
七、Keepalived+Nginx 的高可用測試
(1)關閉 192.168.1.51 中的Nginx,Keepalived 會將它從新啓動
# /usr/local/nginx/sbin/nginx -s stop
由於上面的檢測腳本中,若是nginx掛掉,會自動重啓,因此關不掉。
(2)關閉 192.168.1.51 中的Keepalived,VIP 會切換到 192.168.1.52 中
關閉以前訪問
發現是訪問的nginx1
# service keepalived stop
Keepalived 中止後,該節點的網絡接口中的 VIP 將消失查看此時 VIP 對應的MAC,Windows 下使用CMD 命令查看:
50 和 52 的動態ip相同都是4e
說明此時 VIP 已經漂移到物理主機 192.168.1.52 上了
再經過 VIP 來訪問Nginx 集羣,訪問到的也是 192.168.1.52
將nginx中的配置文件 http節點註釋掉,使得其不能從新啓動,而後將nginx kill 掉,以後發現keepalived的檢測腳本沒法將niginx重啓,因此就將本身(keepalived)殺掉,最後發現殺掉以後,訪問的請求從nginx1漂流到了nginx2
(3)從新啓動 192.168.1.51 中的 Keepalived,VIP 又會切回到 192.168.1.51 中來
# service keepalived start
查看虛擬 IP 狀態
# ip add
Keepalived 啓動後,網絡接口上又會建立出 VIP 192.168.1.50
Keepalived 服務管理命令:
中止:service keepalived stop 啓動:service keepalived start 重 啓 :service keepalived restart 查看狀態:service keepalived status
其餘參考資料:
keepalived 之vrrp_script 總結:http://my.oschina.net/hncscwc/blog/158746
keepalived 雙機熱備實現故障時發送郵件通知:http://www.2cto.com/os/201407/317795.html
基於 keepalived 實現 VIP 轉移,lvs,nginx 的高可用:http://www.tuicool.com/articles/eu26Vz