1. 程式人生 > >keepalived + nginx 實現高可用之遠端面籤專案

keepalived + nginx 實現高可用之遠端面籤專案

面籤系統部署文件

1. 準備工作

1.1 前提

  • 運維應確保各個系統網路策略已經開通並驗證通過
  • 運維需提供安裝系統的DVD光碟或映象
  • 雲屋視訊模組由雲屋工程師負責部署安裝
  • 客服系統由客服系統工程師負責部署安裝
  • 面籤系統由面籤系統工程師負責部署安裝

    1.2 開始準備工作

    //建立使用者
    useradd sunyard
    passwd sunyard
    //授權
    chmod -v u+w /etc/sudoers   (增加 sudoers 檔案的寫的許可權,預設為只讀)
    vi /etc/sudoers (修改 sudoers)
    ----------------------------------
    root    ALL=(ALL)       ALL
    sunyard   ALL=(ALL)       ALL (新增這一行)
    ----------------------------------
    //儲存,退出
    chmod -v u-w /etc/sudoers (刪除 sudoers 的寫的許可權)

    //掛載U盤
    mkdir /mnt/usb_disk
    mount /dev/sda /mnt/usb_disk
    //拷貝檔案
    cp /mnt/usb_disk/soft /home/sunyard/soft

2. 安裝nginx(使用root使用者)

2.1 安裝(正則匹配)模組

tar -zxvf pcre-8.42.tar.gz
./configure
make && make install

2.2 安裝nginx

./configure --prefix=/usr/local/nginx
make && make install

2.3 配置nginx

修改nginx.conf檔案
vi /usr/local/nginx/conf/nginx.conf
新增如下內容
upstream gzb{
  server 180.1.36.104:7001;
  server 180.1.36.105:7001;
}
server {
    listen       7001;
    server_name  localhost;

    location / {
        proxy_pass http://gzb;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-PORT $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

檢查nignx配置檔案正確性
/usr/local/nginx/sbin/nginx -t    

3. 安裝keepalived

3.1 解壓安裝keepalived

   tar -xzvf keepalived-2.0.7.tar.gz 
   cd keepalived-2.0.7
   ./configure --prefix=/usr/local/keepalived
   make && make install

3.2 配置keepalived

a. 在ngx-master,和ngx-backup主機上執行
    ln -s /usr/local/keepalived/etc/keepalived /etc/keepalived
    ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
    ln -s /usr/local/keepalived/sbin/keepalived /usr/bin/keepalived 
    複製指令碼到 
    cp /home/sunyard/soft/keepalived-2.0.7/keepalived/etc/init.d/keepalived /etc/init.d/

    chkconfig keepalived on  //設定開機啟動
b. 修改ngx-master機子上的keepalived.conf
    vi /etc/keepalived/keepalived.conf
    覆蓋檔案
c. 修改ngx-backup機子上的keepalived.conf
    覆蓋檔案
d. 寫入指令碼檔案
    vi /usr/local/keepalived/sbin/check_nginx.sh
    寫入
    #!/bin/bash
    if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ];then
        #echo 1
        /usr/local/nginx/sbin/nginx
        sleep 5
        if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ];then
            /etc/init.d/keepalived stop
            #echo 2
        fi
    fi

e. 指令碼加上可執行許可權
    chmod +x /usr/local/keepalived/sbin/check_nginx.sh
f. 驗證
    service keepalived start  #啟動Nginx-Master  
    service keepalived start  #啟動Nginx-Backup
    ip addr  #2臺伺服器分別執行,繫結虛擬IP在Nginx-Master
    service keepalived stop  #停止Nginx-Backup
    ip addr  #2臺伺服器分別執行,繫結虛擬IP在Nginx-Backup
    service keepalived start  #再啟動Nginx-Backup
    ip addr  #2臺伺服器分別執行,繫結虛擬IP在Nginx-Master

4. 安裝應用(面籤系統)

4.1 安裝JDK

a. 用root使用者登入到linux 應用伺服器
b. 在usr目錄下建立java安裝目錄
    cd /usr
    mkdir java
c. 將jdk安裝包拷貝到java目錄下
    cp /home/sunyard/soft/jdk-8u181-linux-x64.tar.gz /usr/java/
d. 解壓jdk到當前目錄
    tar -zxvf jdk-8u181-linux-x64.tar.gz
e.配置環境變數(新的啟動指令碼指定jdk路徑,不做環境變數配置)
    vim /etc/profile
    在檔案中新增如下內容
    export JAVA_HOME=/usr/java/jdk1.8.0_181
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
f. 讓環境變數生效
    source /etc/profile
g. 檢視安裝情況
    java -version

4.2 面籤系統應用安裝

a. 將軟體安裝包拷貝到sunyard 目錄中
   cp /xxx/gzb-0.0.1-SNAOSHOT.jar /home/sunyard/
b. 執行shell指令碼啟動jar包
   chmod +x gzbservice.sh
   ./gzbservice.sh start

5. 設定共享儲存

a. 在master機啟動NFS
   service rpcbind start
   service nfs start
b. 在設定共享目錄,把該目錄開放給180.1.36.105,編輯/etc/exports,增加一行
   /home/sunyard/video_pic 180.1.36.105(rw,no_root_squash,no_all_squash,sync)
c. 使配置生效,輸入命令:exportfs -r

d. 關閉防火牆 systemctl stop firewalld
   開機禁用防火牆 systemctl disable firewalld
e. 在backup機具上mount
   mount -t nfs 180.1.36.104:/home/sunyard/video_pic /home/sunyard/video_pic

6. 資料初始化

6.1 資料庫指令碼初始化

面籤系統和客服系統公用一個oracle資料庫例項,直接建立使用者即可
以下內容均在plsql中執行

  1. 建立表空間
    create tablespace mq_data datafile '+DATA/xyktelbank/datafile/mq_data.dbf' size 30G;
  2. 建立VIDEO 使用者
    create user video identified by video;
  3. 授權角色
    grant connect, resource, dba to video;
  4. 使用video使用者登入,建立table
    開啟命令視窗執行1.table.sql
  5. 建立sequence
    開啟命令視窗執行2.sequence.sql
  6. 建立synonym
    開啟命令視窗執行3.synonym.sql
  7. 建立trigger
    開啟命令視窗執行4.trigger.sql
  8. 匯入初始化資料
    開啟命令視窗執行5.startdata.sql

    6.2 加入話術模版

    在遠端面籤應用>話術配置中,加入話術模版遠端面籤話術模板1.0.txt

    7. 安裝問題彙總

    7.1 error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory

    如果是32位系統
    ln -s /usr/local/lib/libpcre.so.1 /lib
    如果是64位系統
    ln -s /usr/local/lib/libpcre.so.1 /lib64
    然後在啟動nginx就OK了

    7.2 設定本地yum源

    a. 如果使用虛擬機器,那麼就在虛擬機器中掛載DVD的iso檔案。 b. 使用如下命令新建一個掛載點並掛載修改yum源配置
    mkdir /media/CentOS
    mount -t auto /dev/cdrom /media/CentOS

    c. 修改yum源配置,把CentOS-Base.repo檔案備份
    cd /etc/yum.repos.d/
    mv CentOS-Base.repo CentOS-Base.repo.bak
    vi CentOS-Media.repo
    設定 CentOS-Media.repo 中 enabled=1
    yum clean all

    7.3 安裝gcc

    yum install gcc
    yum install gcc-c++

    7.4 安裝OpenSSL

    yum -y install openssl-devel

    7.5 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 libnfnetlink-devel

    離線安裝
    rpm -ivh libnl-devel-1.1.4-3.el7.x86_64.rpm

    rpm -ivh libnfnetlink-devel-1.0.1-4.el7.x86_64.rpm

8 應用部署環境

  • 應用伺服器
    180.1.36.104
    180.1.36.105
  • nginx伺服器
    180.1.36.101 master
    180.1.36.102 backup
    180.1.36.103 VIP
  • 雲屋伺服器
    180.1.36.98 master
    180.1.36.99 backup
    180.1.36.100 VIP

9 高可用驗證方案

使用 Keepalived 實現nginx 主從熱備,nginx實現面籤應用的負載均衡。
啟動 180.1.36.104 和 180.1.36.105 應用
輸入ps-ef | grep gzb 檢視應用程序是否存在

  1. 停止180.1.36.104 上的應用
    ./gzbservice.sh stop
  2. 檢視請求是否能正常返回
    curl http://180.1.36.103/VTA-GZB/
  3. 啟動180.1.36.104 上的應用,停止180.1.36.105上的應用.

  4. 檢視請求是否能正常返回
    curl http://180.1.36.103/VTA-GZB/
  5. 殺死180.1.36.101上的nginx程序
  6. 檢視請求是否能正常返回
    curl http://180.1.36.103/VTA-GZB/
  7. 等待片刻,檢視nginx程序是否存在
    ps -ef | grep nginx
  8. 殺死180.1.36.102上的nginx程序
  9. 檢視請求是否能正常返回
    curl http://180.1.36.103/VTA-GZB/
  10. 等待片刻,檢視nginx程序是否存在

10 雲屋高可用驗證

雲屋視訊錄影儲存使用fastdfs自動同步,無需手動同步,
啟動180.1.36.98, 啟動180.1.36.99雲屋視訊服務

  1. 停止180.1.36.98 雲屋服務
    opt/cloudroom/scripts/cloudroom-services.sh stop
  2. 檢視請求是否正常返回
    curl http://180.1.36.100:2727/
  3. 驗證錄影同步
    分別登入 http://180.1.36.98:2727/和http://180.1.36.99:2727/後臺管理系統檢視,播放錄影。

11 keepalived ip 漂移驗證

  1. 啟動 先後在主,從伺服器上啟動 keepalived服務,ip addr檢視主伺服器上網絡卡是否繫結虛擬IP
  2. 停止 主伺服器上 keepalived 檢視從伺服器網絡卡是否繫結虛擬IP

附件

應用啟動指令碼 gzbservice.sh

#!/bin/bash
#JDK所在路徑
JAVA_HOME="/usr/java/jdk1.8.0_181"
#java虛擬機器啟動引數
JAVA_OPTS="-server -Xms1024m -Xmx1024m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF8 -Duser.timezone=GMT+08"
#這裡可替換為你自己的執行程式,其他程式碼無需更改
APP_NAME=gzb-0.0.1-SNAPSHOT.jar
#app啟動引數
APP_OPTS="--spring.profiles.active=test"
#使用說明,用來提示輸入引數
usage() {
    echo "Usage: sh 執行指令碼.sh [start|stop|restart|status]"
    exit 1
}
 
#檢查程式是否在執行
is_exist(){
  pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
  #如果不存在返回1,存在返回0     
  if [ -z "${pid}" ]; then
   return 1
  else
    return 0
  fi
}
 
#啟動方法
start(){
  is_exist
  if [ $? -eq "0" ]; then
    echo "${APP_NAME} is already running. pid=${pid} ."
  else
    nohup $JAVA_HOME/bin/java $JAVA_OPTS -jar lib/$APP_NAME $APP_OPTS > start.log 2>&1 &
  fi
}
 
#停止方法
stop(){
  is_exist
  if [ $? -eq "0" ]; then
    kill -9 $pid
  else
    echo "${APP_NAME} is not running"
  fi  
}
 
#輸出執行狀態
status(){
  is_exist
  if [ $? -eq "0" ]; then
    echo "${APP_NAME} is running. Pid is ${pid}"
  else
    echo "${APP_NAME} is NOT running."
  fi
}
 
#重啟
restart(){
  stop
  start
}
 
#根據輸入引數,選擇執行對應方法,不輸入則執行使用說明
case "$1" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  *)
    usage
    ;;
esac

檢測nginx是否存活 check_nginx.sh

#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ];then
    #echo 1
    /usr/local/nginx/sbin/nginx
    sleep 5
    if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ];then
        /etc/init.d/keepalived stop
        #echo 2
    fi
fi

ngx_master keepalived.conf 配置

! Configuration File for keepalived
global_defs {
   notification_email {
       [email protected]     #設定報警郵件地址,可以設定多個,每行一個。 需開啟本機的sendmail服務
   }
   notification_email_from [email protected]  #設定郵件的傳送地址
   smtp_server 127.0.0.1      #設定smtp server地址
   smtp_connect_timeout 30    #設定連線smtp server的超時時間
   router_id LVS_DEVEL        #表示執行keepalived伺服器的一個標識。發郵件時顯示在郵件主題的資訊
}
vrrp_script chk_nginx {
    script "/usr/local/keepalived/sbin/check_nginx.sh"   #該指令碼檢測ngnix的執行狀態,並在nginx程序不存在時嘗試重新啟動ngnix,如果啟動失敗則停止keepalived,準備讓其它機器接管。
    interval 2              #每2s檢測一次
    weight 2                #檢測失敗(指令碼返回非0)則優先順序2
}
vrrp_instance VI_1 {
    state MASTER            #指定keepalived的角色,MASTER表示此主機是主伺服器,BACKUP表示此主機是備用伺服器
    interface ens33         #指定HA監測網路的介面
    virtual_router_id 55    #虛擬路由標識,這個標識是一個數字,同一個vrrp例項使用唯一的標識。即同一vrrp_instance下,MASTER和BACKUP必須是一致的
    priority 100            #定義優先順序,數字越大,優先順序越高,在同一個vrrp_instance下,MASTER的優先順序必須大於BACKUP的優先順序
    advert_int 1            #設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒
    authentication {        #設定驗證型別和密碼
        auth_type PASS      #設定驗證型別,主要有PASS和AH兩種
        auth_pass linuxeye  #設定驗證密碼,在同一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通訊
    }
    virtual_ipaddress {     #設定虛擬IP地址,可以設定多個虛擬IP地址,每行一個
        180.1.36.103
    }
    track_script {
        chk_nginx           #引用VRRP指令碼,即在 vrrp_script 部分指定的名字。定期執行它們來改變優先順序,並最終引發主備切換。
    }
}

ngx_backup keepalived.conf 配置

! Configuration File for keepalived
global_defs {
   notification_email {
       [email protected]     #設定報警郵件地址,可以設定多個,每行一個。 需開啟本機的sendmail服務
   }
   notification_email_from [email protected]  #設定郵件的傳送地址
   smtp_server 127.0.0.1      #設定smtp server地址
   smtp_connect_timeout 30    #設定連線smtp server的超時時間
   router_id LVS_DEVEL        #表示執行keepalived伺服器的一個標識。發郵件時顯示在郵件主題的資訊
}
vrrp_script chk_nginx {
    script "/usr/local/keepalived/sbin/check_nginx.sh"   #該指令碼檢測ngnix的執行狀態,並在nginx程序不存在時嘗試重新啟動ngnix,如果啟動失敗則停止keepalived,準備讓其它機器接管。
    interval 2              #每2s檢測一次
    weight 2                #檢測失敗(指令碼返回非0)則優先順序2
}
vrrp_instance VI_1 {
    state BACKUP            #指定keepalived的角色,MASTER表示此主機是主伺服器,BACKUP表示此主機是備用伺服器
    interface ens33         #指定HA監測網路的介面
    virtual_router_id 55    #虛擬路由標識,這個標識是一個數字,同一個vrrp例項使用唯一的標識。即同一vrrp_instance下,MASTER和BACKUP必須是一致的
    priority 50             #定義優先順序,數字越大,優先順序越高,在同一個vrrp_instance下,MASTER的優先順序必須大於BACKUP的優先順序
    advert_int 1            #設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒
    nopreempt               #設定nopreempt防止搶佔資源,只生效BACKUP節點
    authentication {        #設定驗證型別和密碼
        auth_type PASS      #設定驗證型別,主要有PASS和AH兩種
        auth_pass linuxeye  #設定驗證密碼,在同一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通訊
    }
    virtual_ipaddress {     #設定虛擬IP地址,可以設定多個虛擬IP地址,每行一個
        180.1.36.103
    }
    track_script {
        chk_nginx           #引用VRRP指令碼,即在 vrrp_script 部分指定的名字。定期執行它們來改變優先順序,並最終引發主備切換。
    }
}

Author by wubenhui
2018/11/16 17:28:24