目录
一、高可用nginx规划图
二、克隆一个nginx
启动测试
编辑 三、keepalived简介
四、安装配置keepalived保活nginx
4.1、安装
编辑 4.2、配置
4.2.1、主机配置(nginx1(主)配置)
4.2.2、从机配置(nginx2(主)配置)
4.2.3、编写检查nginx是否正常运行脚本(主备都需要有)
4.3、自动故障切换测试
故障切换测试
一、高可用nginx规划图
二、克隆一个nginx
直接利用之前的nginx服务克隆一个,不用在搭建nginx了,并用远程连接链接
启动测试
/usr/local/nginx/sbin/nginx
因为是克隆的,所以直接访问ip+端口,和之前负载均衡的访问一样
http://192.168.37.184:8088/index.jsp
三、keepalived简介
Keepalived的作用是检测服务器(目前保活的是nginx,可以保活其他软件)的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
Keepalived 是一个用 C 语言编写的路由软件。这个项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载平衡和高可用性设施 。底层基于VRRP( Virtual Router Redundancy Protocol,简称VRRP)协议编写。VRRP作用:它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱
四、安装配置keepalived保活nginx
4.1、安装
为了安装方便使用yum在线安装,不从官网下载安装包。
在nginx1和nginx2上都安装:
yum install -y keepalived
4.2、配置
4.2.1、主机配置(nginx1(主)配置)
vim /etc/keepalived/keepalived.conf
使用下面的conf替换原先的
:19 脚本位置 :32 网卡名称 :47 虚拟IP (注意一定要和自己的网段对应,后面IP随便写,两台配置虚拟IP要一致)
! Configuration File for keepalived
global_defs {
#唤醒邮箱配置
notification_email {
test@qq.com
}
notification_email_from test@qq.com
smtp_server 127.0.0.1
#配置邮件服务器链接超时时间
smtp_connect_timeout 30
#当前机子的字符串id
router_id LVS_DEVEL
}
#vrrp脚本 名称必须和实例中的属性track_script中的值一致
vrrp_script track_nginx{
#配置脚本路径
script "/root/shell-script-dir/checknginx.sh"
#调用脚本的间隔时间 ,单位是秒
interval 2
#权重 调整优先级的权重 如果说执行脚本保活nginx失败 ,就会把优先级数值减去对应的权重
weight 10
}
#vrrp的实例
vrrp_instance VI_1 {
#服务器状态
state MASTER
当前实例绑定的网卡接口
interface ens33
#虚拟路由id 主备必须相同
virtual_router_id 51
#取值 优先级 1-255
priority 100
#主备心跳间隔时间 单位 s
advert_int 1
#认证 主备切换时 进行认证 主备必须相同
authentication {
auth_type PASS
auth_pass 1111
}
#虚拟ip 配置LVS=IPVS keepalived虚拟出来的ip 以后对外公布是虚拟ip
virtual_ipaddress {
#虚拟IP 必须和要保活的软件所在的主机的ip的网段一致
192.168.37.37
}
#追踪脚本
track_script{
track_nginx
}
}
4.2.2、从机配置(nginx2(从)配置)
! Configuration File for keepalived
global_defs {
#唤醒邮箱配置
notification_email {
test@qq.com
}
notification_email_from test@qq.com
smtp_server 127.0.0.1
#配置邮件服务器链接超时时间
smtp_connect_timeout 30
#当前机子的字符串id
router_id LVS_DEVEL_BAK
}
#vrrp脚本 名称必须和实例中的属性track_script中的值一致
vrrp_script track_nginx{
#配置脚本路径
script "/root/shell-script-dir/checknginx.sh"
#调用脚本的间隔时间 ,单位是秒
interval 2
#权重 调整优先级的权重 如果说执行脚本保活nginx失败 ,就会把优先级数值减去对应的权重
weight -10
}
#vrrp的实例
vrrp_instance VI_1 {
#服务器状态
state BACKUP
当前实例绑定的网卡接口
interface ens33
#虚拟路由id 主备必须相同
virtual_router_id 51
#取值 优先级 1-255
priority 50
#主备心跳间隔时间 单位 s
advert_int 1
#认证 主备切换时 进行认证 主备必须相同
authentication {
auth_type PASS
auth_pass 1111
}
#虚拟ip 配置LVS=IPVS keepalived虚拟出来的ip 以后对外公布是虚拟ip
virtual_ipaddress {
#虚拟IP 必须和要保活的软件所在的主机的ip的网段一致
192.168.37.37
}
#追踪脚本
track_script{
track_nginx
}
}
4.2.3、编写检查nginx是否正常运行脚本(主备都需要有)
vim /root/shell-script-dir/checknginx.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [$A -eq 0];then
/usr/local/nginx/sbin/nginx
if [ `ps -C nginx --no-header |wc -l` -eq 0];then
killall keepalived
fi
fi
chmod u+x /root/shell-script-dir/checknginx.sh
这里脚本里使用了killall,killall 不可用,可用安装psmisc包解决
yum install psmisc -y
4.3、自动故障切换测试
确保nginx在启动(在nginx1和nginx2上都执行)
ps -ef|grep nginx |grep -v grep
启动, 两边都使用轮询
/usr/local/nginx/sbin/nginx
使用nginx1和nginx2分别访问
http://192.168.37.183:8088/index.jsp
http://192.168.37.184:8088/index.jsp
如果不是按照轮询的方式请求,可以尝试重启nginx/usr/local/nginx/sbin/nginx -s reload
启动keepalived(在nginx1和nginx2上都启动)
service keepalived status
service keepalived start
service keepalived status
通过虚拟IP测试
http://192.168.37.37:8088/index.jsp
故障切换测试
windows环境下,cmd窗口执行以下指令
arp -a 192.168.37.37 这里的ip是虚拟ip
然后 去linux环境下nginx1中执行
ip a
说明当前请求在nginx1上
在windows,cmd窗口中执行
ping -t 192.168.170.168
可以ping通
在nginx1 上杀死keepalived
killall keepalived
service keepalived stop 停止不了keepalived
当杀死进程后 ping -t 会出现短暂超时,又正常
再次使用 arp -a 192.168.170.168
就会发现切换到nginx2上了