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
----------------------------------
//保存,退出
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中執行
- 創建表空間
create tablespace mq_data datafile ‘+DATA/xyktelbank/datafile/mq_data.dbf‘ size 30G;
- 創建VIDEO 用戶
create user video identified by video;
- 授權角色
grant connect, resource, dba to video;
- 使用video用戶登錄,創建table
打開命令窗口執行1.table.sql
- 創建sequence
打開命令窗口執行2.sequence.sql
- 創建synonym
打開命令窗口執行3.synonym.sql
- 創建trigger
打開命令窗口執行4.trigger.sql
導入初始化數據
打開命令窗口執行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/CentOSc. 修改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 all7.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.rpm7.6 configure: error: libnfnetlink headers missing
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
查看應用進程是否存在
- 停止180.1.36.104 上的應用
./gzbservice.sh stop
- 查看請求是否能正常返回
curl http://180.1.36.103/VTA-GZB/
啟動180.1.36.104 上的應用,停止180.1.36.105上的應用.
- 查看請求是否能正常返回
curl http://180.1.36.103/VTA-GZB/
- 殺死180.1.36.101上的nginx進程
- 查看請求是否能正常返回
curl http://180.1.36.103/VTA-GZB/
- 等待片刻,查看nginx進程是否存在
ps -ef | grep nginx
- 殺死180.1.36.102上的nginx進程
- 查看請求是否能正常返回
curl http://180.1.36.103/VTA-GZB/
等待片刻,查看nginx進程是否存在
10 雲屋高可用驗證
雲屋視頻錄像存儲使用fastdfs自動同步,無需手動同步,
啟動180.1.36.98, 啟動180.1.36.99雲屋視頻服務
- 停止180.1.36.98 雲屋服務
opt/cloudroom/scripts/cloudroom-services.sh stop
- 查看請求是否正常返回
curl http://180.1.36.100:2727/
- 驗證錄像同步
分別登錄 http://180.1.36.98:2727/和http://180.1.36.99:2727/後臺管理系統查看,播放錄像。
11 keepalived ip 漂移驗證
- 啟動 先後在主,從服務器上啟動 keepalived服務,
ip addr
查看主服務器上網卡是否綁定虛擬IP
- 停止 主服務器上 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
keepalived + nginx 實現高可用之遠程面簽項目