keepalived + nginx 实现高可用之远程面签项目
Posted wubenhui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中执行
- 创建表空间
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 实现高可用之远程面签项目的主要内容,如果未能解决你的问题,请参考以下文章