1. 程式人生 > 實用技巧 >Keepalived + Nginx 實現高可用 Web 負載均衡

Keepalived + Nginx 實現高可用 Web 負載均衡

一、Keepalived 簡要介紹

Keepalived 是一種高效能的伺服器高可用或熱備解決方案, Keepalived 可以用來防止伺服器單點故障的發生,通過配合 Nginx 可以實現 web 前端服務的高可用。
Keepalived 以 VRRP 協議為實現基礎,用 VRRP 協議來實現高可用性(HA)。 VRRP(Virtual RouterRedundancy 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 選舉狀態。

二、方案規劃

VIP IP 主機名 Nginx埠 預設主從
192.168.50.130 192.168.50.133 liuyazhuang133 88 MASTER
192.168.50.130 192.168.50.134 liuyazhuang134 88 BACKUP

CentOS 6.5 x64

三、安裝Nginx

1、參考《Nginx+Tomcat+Memcached負載均衡叢集服務搭建》

大家可以參考博文《Nginx+Tomcat+Memcached負載均衡叢集服務搭建》中安裝Nginx部分進行Nginx的安裝,也可以按照如下步驟安裝Nginx。

2、安裝編譯 Nginx 所需的依賴包

# yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel

3、下載Nginx

# cd /usr/local/src/
# wget http://nginx.org/download/nginx-1.13.0.tar.gz

4、 編譯安裝 Nginx

# cd /usr/local/src/
# tar -zxvf nginx-1.13.0.tar.gz
# cd nginx-1.13.0
# ./configure --prefix=/usr/local/nginx
# make && make install

5、 配置 Nginx

# 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;
		}
	}
}

修改 Nginx 歡迎首頁內容(用於後面測試, 用於區分兩個節點的 Nginx):

# vi /usr/local/nginx/html/index.html
192.168.50.133 中的標題加 1
<h1>Welcome to nginx! 1</h1>
192.168.50.134 中的標題加 2
<h1>Welcome to nginx! 2</h1>

6、系統防火牆開啟對應的埠 88

# vi /etc/sysconfig/iptables
## Nginx
-A INPUT -m state --state NEW -m tcp -p tcp --dport 88 -j ACCEPT
# service iptables restart

7、 測試 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

8、啟動 Nginx

# /usr/local/nginx/sbin/nginx

重啟 Nginx

# /usr/local/nginx/sbin/nginx -s reload

9、 設定 Nginx 開機啟動

# vi /etc/rc.local

加入:

/usr/local/nginx/sbin/nginx

10、 分別訪問兩個 Nginx


四、安裝 Keepalived

http://www.keepalived.org/download.html

1、 上傳或下載 keepalived

上傳或下載 keepalived(keepalived-1.2.18.tar.gz) 到 /usr/local/src 目錄

2、 解壓安裝

# 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

3、 將 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

4、 修改 Keepalived 配置檔案

(1) MASTER 節點配置檔案(192.168.50.133)

# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
	## keepalived 自帶的郵件提醒需要開啟 sendmail 服務。 建議用獨立的監控或第三方 SMTP
	router_id liuyazhuang133 ## 標識本節點的字條串,通常為 hostname
} 
## keepalived 會定時執行指令碼並對指令碼執行的結果進行分析,動態調整 vrrp_instance 的優先順序。如果指令碼執行結果為 0,並且 weight 配置的值大於 0,則優先順序相應的增加。如果指令碼執行結果非 0,並且 weight配置的值小於 0,則優先順序相應的減少。其他情況,維持原本配置的優先順序,即配置檔案中 priority 對應的值。
vrrp_script chk_nginx {
	script "/etc/keepalived/nginx_check.sh" ## 檢測 nginx 狀態的指令碼路徑
	interval 2 ## 檢測時間間隔
	weight -20 ## 如果條件成立,權重-20
}
## 定義虛擬路由, VI_1 為虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
	state MASTER ## 主節點為 MASTER, 對應的備份節點為 BACKUP
	interface eth0 ## 繫結虛擬 IP 的網路介面,與本機 IP 地址所在的網路介面相同, 我的是 eth0
	virtual_router_id 33 ## 虛擬路由的 ID 號, 兩個節點設定必須一樣, 可選 IP 最後一段使用, 相同的 VRID 為一個組,他將決定多播的 MAC 地址
	mcast_src_ip 192.168.50.133 ## 本機 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 ## 執行 Nginx 監控的服務
	} #
	# 虛擬 IP 池, 兩個節點設定必須一樣
	virtual_ipaddress {
		192.168.50.130 ## 虛擬 ip,可以定義多個
	}
}

(2)BACKUP 節點配置檔案(192.168.50.134)

# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
	router_id liuyazhuang134
}
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 33
	mcast_src_ip 192.168.50.134
	priority 90
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 1111
	}
	track_script {
		chk_nginx
	}
	virtual_ipaddress {
		192.168.50.130
	}
}

5、 編寫 Nginx 狀態檢測指令碼

編寫 Nginx 狀態檢測指令碼 /etc/keepalived/nginx_check.sh (已在 keepalived.conf 中配置)指令碼要求:如果 nginx 停止執行,嘗試啟動,如果無法啟動則殺死本機的 keepalived 程序, keepalied將虛擬 ip 繫結到 BACKUP 機器上。 內容如下:

# vi /etc/keepalived/nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
	killall keepalived
fi
fi

儲存後,給指令碼賦執行許可權:

# chmod +x /etc/keepalived/nginx_check.sh

6、 啟動 Keepalived

# service keepalived start
Starting keepalived: [ OK ]

7、 Keepalived+Nginx 的高可用測試

同時啟動192.168.50.133和192.168.50.134上的Nginx和Keepalived,我們通過VIP(192.168.50.130)來訪問Nginx,如下

我們關閉192.168.50.133上的Keepalived和Nginx

在192.168.50.133執行如下命令:

service keepalived stop
/usr/local/nginx/sbin/nginx -s stop

此時,再通過VIP(192.168.50.130)來訪問Nginx,如下

我們再開啟192.168.50.133上的Keepalived和Nginx

在192.168.50.133執行如下命令:

/usr/local/nginx/sbin/nginx
service keepalived start

或者只執行

service keepalived start

因為我們寫了指令碼 nginx_check.sh,這個指令碼會為我們自動自動Nginx

此時,我們再通過VIP(192.168.50.130)來訪問Nginx,如下

至此,Keepalived + Nginx 實現高可用 Web 負載均衡搭建完畢。

五、溫馨提示

大家可以到連結http://download.csdn.net/detail/l1028386804/9855362下載Keepalived + Nginx 實現高可用 Web 負載均衡配置檔案