Ubuntu16.04下KeepAlived+Nginx 佈署

前言
         網上已經有不少相關文章,對各類概念介紹的比較清楚,也有各類詳細的步驟,這裏主要記錄本要在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 高可用雙機熱備(主從模式/雙主模式)

相關文章
相關標籤/搜索