Keepalived + Nginx 搭建主備模式的高可用
Nginx 介紹
nginx是一款高性能的輕量級的http 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器。并且cpu、記憶體等資源消耗卻非常低,運作非常穩定,并發高。很多公司均使用nginx。
Keepalived 介紹
keepalived是進群工作管理中保證叢集高可用的一個服務軟體,用來防止單點故障。
keepalived的作用是檢測web伺服器的狀态,如果有一台web伺服器當機,或工作出現故障,keepalived将檢測到,并将有故障的web伺服器從系統中剔除,當web伺服器工作正常後keepalived自動将web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工幹涉,需要人工做的隻是修複故障的web伺服器。
環境準備
nginx安裝包: http://nginx.org/download ,我這裡使用1.14.2
keepalived安裝包: http://www.keepalived.org/download.html,我這裡使用1.4.5
伺服器 | 主備 | ip |
---|---|---|
CentOS7 | 主 | 192.168.1.110 |
CentOS7 | 備 | 192.168.1.111 |
環境安裝
- 使用 VMware15Pro + CentOS7 虛拟機。安裝教程
-
nginx安裝(兩台伺服器相同步驟安裝)
(1) 安裝gcc:yum install gcc-c++
(2) 安裝PCRE庫:yum install -y pcre pcre-devel
(3) 安裝zlib庫:yum install -y zlib zlib-devel
(4) 安裝openssl:yum install -y openssl openssl-devel
(5) 上傳nginx-1.14.2.tar.gz
(6) 解壓:tar -zxvf nginx-1.14.2.tar.gz
(7) onfigure配置:cd nginx-1.14.2 && ./configure --prefix=/usr/local/nginx
(8) 編譯:make && make install
(9) 啟動指令:/usr/local/nginx/sbin/nginx
(10) 浏覽器通路:http://ip:80(出現nginx初始頁面即安裝nginx成功)
注:如主機通路http://ip:80失敗,檢查虛拟機端口是否開放。
為了更容易區分伺服器,我這邊修改了nginx的index.html頁面。
vim /usr/local/nginx/html/index.html
Keepalived + Nginx 搭建主備高可用
-
keepalived安裝(兩台伺服器相同步驟安裝)
(1) 上傳keepalived-1.4.5.tar.gz
(2) 解壓tar -zxvf keepalived-1.4.5.tar.gz
(2) cd keepalived-1.4.5/
(3) ./configure --prefix=/usr/local/keepalived
注:如遇警告 WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS。
則執行:
yum -y install libnl libnl-devel
yum install -y libnfnetlink-devel
(4)make && make install
(5) 将keepalived安裝為linux服務:
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/
cp /usr/local/sbin/keepalived /usr/sbin/
cp /tools/keepalived-1.4.5/keepalived/etc/init.d/keepalived /etc/init.d/
(6) 設定開機啟動:chkconfig keepalived on
keepalived配置
配置詳解[https://blog.csdn.net/u010391029/article/details/48311699]
vim /etc/keepalived/keepalived.conf
主(MASTER)配置:
! Configuration File for keepalived
global_defs {
#主要配置預警資訊,如郵件發送
}
#keepalived 會定時執行腳本并且對腳本的執行結果進行分析,動态調整vrrp_instance的優先級。
#這裡的權重weight 是與下面的優先級priority有關。
#如果執行了一次檢查腳本成功,則權重會-20,也就是由100 - 20 變成了80,Master 的優先級為80 就低于了Backup的優先級90,那麼會進行自動的主備切換。
#如果腳本執行結果為0并且weight配置的值大于0,則優先級會相應增加。
#如果腳本執行結果不為0 并且weight配置的值小于0,則優先級會相應減少。
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 ens33 # 綁定虛拟 IP 的網絡接口,ipconfig檢視。
virtual_router_id 99 # 虛拟路由的 ID 号, 兩個節點設定必須一樣
mcast_src_ip 192.168.1.110 #填寫本機ip
priority 100 # 節點優先級,主要比從節點優先級高 取值範圍0~254
nopreempt # 優先級高的設定 nopreempt 解決異常恢複後再次搶占的問題
advert_int 1 # 多點傳播資訊發送間隔,兩個節點設定必須一樣,預設 1s
# 驗證資訊 兩個節點設定必須一樣
authentication {
auth_type PASS
auth_pass 123456
}
# 将 track_script 塊加入 instance 配置塊
track_script {
chk_nginx #執行 Nginx 監控的服務
}
# 虛拟ip,也就是解決寫死程式的ip怎麼能切換的ip.可設定多個
virtual_ipaddress {
192.168.1.99
}
}
備份(BACKUP)配置:
! Configuration File for keepalived
global_defs {
#主要配置預警資訊,如郵件發送
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #運作腳本,當nginx當機以後,自動開啟服務
interval 2 #檢測時間間隔
weight -20 #如果條件成立的話,則權重 -20,這裡比備機的
}
# 定義虛拟路由,VI_1 為虛拟路由的标示符,自己定義名稱
vrrp_instance VI_1 {
state BACKUP#來決定主從,主節點為MASTER 備份節點為BACKUP
interface ens33 # 綁定虛拟 IP 的網絡接口,ipconfig檢視。
virtual_router_id 99 # 虛拟路由的 ID 号, 兩個節點設定必須一樣
mcast_src_ip 192.168.1.111 #填寫本機ip
priority 80 # 節點優先級,主要比從節點優先級高 取值範圍0~254
nopreempt # 優先級高的設定 nopreempt 解決異常恢複後再次搶占的問題
advert_int 1 # 多點傳播資訊發送間隔,兩個節點設定必須一樣,預設 1s
# 驗證資訊 兩個節點設定必須一樣
authentication {
auth_type PASS
auth_pass 123456
}
# 将 track_script 塊加入 instance 配置塊
track_script {
chk_nginx #執行 Nginx 監控的服務
}
# 虛拟ip,也就是解決寫死程式的ip怎麼能切換的ip.可設定多個
virtual_ipaddress {
192.168.1.99
}
}
這裡寫入啟動腳本 vim /etc/keepalived/nginx_check.sh
#!/bin/bash
#判斷 nginx 程序是否存在
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
#如果為0則嘗試啟動nginx
/usr/local/nginx/sbin/nginx
#給予2秒鐘的啟動時間
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
#如果啟動失敗,将keepalived服務殺死。将轉移至備份節點
killall keepalived
fi
fi
腳本賦權: chmod +x /data/program/nginx/sbin/nginx_service.sh
啟動測試
啟動主備兩台的keepalived:service keepalived start
查詢keepalived是否啟動:ps -ef|grep keepalived
停止nginx:/usr/local/nginx/sbin/nginx -s quit
查詢keepalived是否将nginx重新開機成功:ps -ef | grep nginx
指令:ip a,192.168.1.99在主nginx上
頁面通路192.168.1.99展示内容為主伺服器的ip。
将主伺服器的keepalived關閉:service keepalived stop
頁面通路192.168.1.99展示内容為備份伺服器的ip。