前言
網上已經有不少相關文章,對各類概念介紹的比較清楚,也有各類詳細的步驟,這裏主要記錄本要在ubuntu16.04下的佈署過程,主要記錄編譯安裝keepalived時遇到的坑及解決辦法。html
能夠參考的文章:前端
Nginx+keepalived 高可用雙機熱備(主從模式/雙主模式)nginx
LVS+KeepAlived+Nginx高可用實現方案https://blog.csdn.net/lupengfei1009/article/details/86514445shell
環境
系統: ubuntu16.04ubuntu
keepalived: 2.0.15vim
nginx:1.14.2後端
架構
雙機高可用方法目前分爲兩種:bash
1)Nginx+keepalived 雙機主從模式:即前端使用兩臺服務器,一臺主服務器和一臺熱備服務器,正常狀況下,主服務器綁定一個公網虛擬IP,提供負載均衡服務,熱備服務器處於空閒狀態;當主服務器發生故障時,熱備服務器接管主服務器的公網虛擬IP,提供負載均衡服務;可是熱備服務器在主機器不出現故障的時候,永遠處於浪費狀態,對於服務器很少的網站,該方案不經濟實惠。服務器
2)Nginx+keepalived 雙機主主模式:即前端使用兩臺負載均衡服務器,互爲主備,且都處於活動狀態,同時各自綁定一個公網虛擬IP,提供負載均衡服務;當其中一臺發生故障時,另外一臺接管發生故障服務器的公網虛擬IP(這時由非故障機器一臺負擔全部的請求)。這種方案,經濟實惠。網絡
下面分別是兩種模式對應的架構示意圖。須要說明的是,雖然每臺服務器都配置了VIP,但正常狀況下,對於每一個VIP,同時只會有一臺機器實際佔用。
安裝步驟
說明:本文主要介紹安裝keepalived時遇到的問題及解決辦法,因此沒有隻用了兩臺機器,並無介紹後端服務。另外這裏只介紹了主從模式。
主要的問題概括:
1. 須要從解壓後的源碼包去找 服務腳本,這是2.0以後的變化
cp keepalived-2.0.15/keepalived/etc/init.d/keepalived /etc/init.d/
2. 這個腳本里的默認路徑配置不正確,須要針ubuntu作處理
3. 這個腳本里的命令有問題,須要修改
主從模式
1. 安裝nginx (兩臺都要安裝)
apt-get update #更新包源
#安裝gcc g++的依賴庫、 pcre依賴庫、 zlib依賴庫、 openssl、libssl-dev
apt install build-essential
apt install libtool
apt install libpcre3 libpcre3-dev
apt install zlib1g-dev
apt install openssl libssl-dev
#下載nginx,解壓
wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar -zxvf nginx-1.14.2.tar.gz
cp -r nginx-1.14.2 /usr/local/src
#添加www用戶,其中 -M參數表示不添加用戶家目錄,-s參數表示指定shell類型
useradd www -M -s /sbin/nologin
#配置nginx 並安裝
cd /usr/local/src/nginx-1.14.2
./configure --prefix=/usr/local/nginx --user=www
make && make install
#配置測試頁,能夠方便識別內容來自哪臺服務器,主上是come from master,從上是slave
echo "come from master" >/usr/local/nginx/html/test.html
#啓動nginx
/usr/local/nginx/sbin/nginx
#訪問
curl localhost/test.html
come from master #從上的話應該返回 come from slave.
2.安裝 keepalived
#解壓並安裝
tar zxvf keepalived-2.0.15.tar.gz
cp -r keepalived-2.0.15 /usr/local/src
cd /usr/local/src/keepalived-2.0.15/
./configure --prefix=/usr/local/keepalived
make && make install
#使keepalived命令能直接使用
cp /usr/local/keepalived/sbin/keepalived /sbin/
# 建立配置文件並修改
mkdir -p /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
vim /etc/keepalived/keepalived.conf
爲了測試方便,個人配置文件比較簡單:
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
! Configuration File for keepalived
global_defs {
router_id kp_s1 #在一個網絡應該是惟一的
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #定時檢查nginx是否正常運行的腳本
interval 2 #腳本執行間隔,每2s檢測一次
weight -5 #腳本結果致使的優先級變動,檢測失敗(腳本返回非0)則優先級 -5
fall 2 #檢測連續2次失敗纔算肯定是真失敗。會用weight減小優先級(1-255之間)
rise 1 #檢測1次成功就算成功。但不修改優先級
}
vrrp_instance VI_1 {
#指定keepalived的角色,這裏指定的不必定就是MASTER,實際會根據優先級調整,另外一臺爲BACKUP
state MASTER
interface ens33 #當前進行vrrp通信的網卡
virtual_router_id 200 #虛擬路由編號(數字1-255),主從要一致
# mcast_src_ip 192.168.79.191 #
priority 100 #定義優先級,數字越大,優先級越高,MASTER的優先級必須大於BACKUP的優先級
nopreempt
advert_int 1 #設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒
authentication {
auth_type PASS
auth_pass 2222
}
#執行監控的服務。注意這個設置不能緊挨着寫在vrrp_script配置塊的後面(實驗中碰過的坑),
#不然nginx監控失效!!
track_script {
chk_nginx #引用VRRP腳本,即在 vrrp_script 部分指定的名字。
#按期運行它們來改變優先級,並最終引起主備切換。
}
virtual_ipaddress {#VRRP HA 虛擬地址 若是有多個VIP,繼續換行填寫
192.168.79.210
}
}
#建立檢查nginx狀態的腳本
vim /etc/keepalived/nginx_check.sh
腳本的內容以下(檢查nginx運行):
#!/bin/bash
counter=`ps -C nginx --no-heading|wc -l`
echo "$counter"
if [ "${counter}" = 0 ]; then
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
sleep 2
counter=`ps -C nginx --no-heading|wc -l`
if [ "${counter}" = 0 ]; then
/etc/init.d/keepalived stop
fi
fi
#修改腳本權限,使其能夠被執行
chmod +x /etc/keepalived/nginx_check.sh
3. 設置服務啓動
複製服務腳本
cp keepalived-2.0.15/keepalived/etc/init.d/keepalived /etc/init.d/
#注意:上面的服務啓動腳本是在源文件目錄,而不是安裝目錄(/usr/local/keepalived)下,這是2.0以後的變化。
修正相關配置問題
vim /etc/init.d/keepalived 能夠看到下圖內容,其中有3個地方有問題。
圖中1: 因爲 ubuntu下沒有 /etc/rc.d/init.d/functions,須要爲其創建軟連接
mkdir -p /etc/rc.d/init.d
ln -s /lib/lsb/init-functions /etc/rc.d/init.d/functions
圖中2:拷貝相應文件的源配置文件
註釋內容有介紹 ,這個源配置文件(在裏面設置keepalived啓動參數)
mkdir /etc/sysconfig
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
圖中3:安裝daemon,並修改命令
1. 安裝 daemon: apt install daemon
2. 圖中3的命令 修改成daemon -- keepalived ${KEEPALIVED_OPTIONS} #加了一個「--」
說明:命令裏的變量 ${KEEPALIVED_OPTIONS} 是在/etc/sysconfig/keepalived裏設置的,默認內容如圖。
這裏的-D 表明記錄詳細日誌。那麼命令 daemon keepalived ${KEEPALIVED_OPTIONS}的結果是
daemon keepalived -D
這個命令是有問題的,其中的-D原本是給keepalived用的,但這樣組合後被認爲是daemon命令的參數。這會致使服務不能啓動。 若是不修改,會提示啓動失敗,但卻不輸出具體信息。但能夠經過查看 /var/log/syslog 找到錯誤信息
$Starting keepalived: daemon: option requires an argument -- 'D' 。這是一個底層錯誤,因此只在系統日誌裏看到。
執行 daemon --help, 能夠看到幫助信息
能夠看出, daemon命令的-D參數是須要一個path參數的,因此會出現系統日誌裏的錯誤。
由 usage: daemon [options] [--] [cm arg...],可知正確的命令格式應該是:daemon -- keepalived -D
因此上面力中標示的第3處,應該修改成 daemon -- keepalived ${KEEPALIVED_OPTIONS}
注意:每次修改/etc/init.d/keepalived後,須要從新運行 systemctl daemon-reload 從新加載服務腳本
啓動測試(兩臺都啓動)
systemctl daemon-reload #從新加載服務
service keepalived start #啓動keealived服務
service keepalived status #能夠查看運行狀態
ip a #查看是否佔用了VIP,只有主服務器能夠佔用,主有問題時,纔會漂移到從服務器,而且從服務器狀態變爲MASTER
若是啓動出現問題,除了這裏的輸出信息,還能夠經過 /var/log/syslog來查看問題
正常狀態是
1) 在任意一臺服務器上關閉nginx,會發現keepalived自動重啓nginx
2) 關閉任意一臺服務器,VIP漂移到另外一臺服務器
3)經過curl http://192.168.79.210/test.html 能夠查看返回內容是來自主仍是來自從。
更多細節和 雙主模式,能夠參考 Nginx+keepalived 高可用雙機熱備(主從模式/雙主模式)