1.1 说明
- Keepalived
keepalived主要通过VRRP(虚拟路由冗余协议)协议实现高可用,在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。于是就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。在这里我用的两台搭建的Keepalived,一台master,一台backup.保证nginx的高可用
- Nginx
nginx保证web服务器的高可用,在nginx的upstream里配置两台服务器的地址和端口.
1.1.1 准备
名称 | IP | 虚拟IP | 操作系统 |
---|---|---|---|
虚拟机1 (lb02) | 192.168.92.132 | 192.168.92.100 | centos7 |
虚拟机2(lb03) | 192.168.92.133 | 192.168.92.100 | centos7 |
1.2 整体架构图
nginx+kepalived高可用.png客户端访问vip(虚拟ip),虚拟ip由keepalived(master)所在的主机接收,映射真正的ip,把请求交给nginx处理,nginx反向代理两台web服务器通过iphash的方式选择一台web服务器处理请求.
1.3 实现步骤
1.3.1 搭建nginx
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum -y install nginx
设置Nginx开机启动
systemctl enable nginx.service
启动nginx并检查状态
systemctl nginx start
ps -ef | grep nginx
# nginx已成功启动
root 8220 1 0 09:52 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 8221 8220 0 09:52 ? 00:00:00 nginx: worker process
root 8223 7657 0 09:52 pts/0 00:00:00 grep --color=auto nginx
以下是Nginx的默认路径:
- Nginx配置路径:/etc/nginx/
- PID目录:/var/run/nginx.pid
- 错误日志:/var/log/nginx/error.log
- 访问日志:/var/log/nginx/access.log
- 默认站点目录:/usr/share/nginx/html
为了测试方便先关闭防火墙
systemctl stop firewalld.service #临时关闭,重启失效
systemctl disable firewalld.service #禁止开机启动
两台服务器都要启动tomcat服务,具体安装启动这里不再简述了.请参考: https://blog.51cto.com/1197822/2166795
1.3.2 修改nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 转发到tomcat服务器
upstream tomcat_pool
{
# iphash;
server 192.168.92.132:8080;
server 192.168.92.133:8080;
}
server {
listen 80;
server_name 192.168.92.133; #修改为本机的ip地址,另一台主机这里要修改为192.168.92.132
location / {
proxy_pass http://tomcat_pool; #代理到哪个upstream
}
}
}
修改后启动nginx,访问192.168.92.133,192.168.92.132发现都可以进行反向代理,为了测试能代理两台服务器,这里把iphash给注释掉了,iphash
代表同一个客户端的请求只会转发到同一台服务器.
1.3.3 安装并启用keepalived
keepalived
有两种安装方式,源码安装和yum安装,yum安装会相当简单
yum -y install keepalived
1.3.4 修改keepalived.conf
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
# 当出错了给哪些邮件发提醒
notification_email {
#sysadmin@firewall.loc
}
# 邮件发送者信息
router_id LVS_lb01
}
#配置vrrp_script,主要用于健康检查,以及检查失败后执行的动作。
vrrp_script chk_nginx {
#健康检查脚本,当脚本返回值不为0时认为失败
script "/etc/keepalived/nginx_check.sh"
#检查频率,以下配置每2秒检查1次
interval 2
#当检查失败后,将vrrp_instance的priority减小5
weight -5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
fall 3
#连续监测2次成功,就认为成功。但不调整优先级
rise 2
}
#定义对外提供服务的VIP vrrp_instance配置
vrrp_instance VI_1 {
#指定vrrp_instance的初始状态,是MASTER还是BackUP主要还是看优先级
state MASTER
#指定vrrp_instance绑定的网卡,最终会通过指定的网卡宣告VIP
interface ens33
#相当于VRID,用于在一个网内区分组播,需要组播域内内唯一。
virtual_router_id 55
#本机的优先级,VRID相同的机器中,优先级最高的会被选举为MASTER
priority 150
#心跳间隔,下面配置,MASTER会每隔1秒发送一个报文高职组内其他机器,自己还活着。
advert_int 1
#定义主从的验证方式以及密码,一般使用PASS(最长8位,超过了只会识别前8位作为密码)
authentication {
auth_type PASS
auth_pass 123456
}
#VIP
virtual_ipaddress {
192.168.92.100/24 dev ens33 label ens33:1
}
#本vrrp_instance所引用的脚本配置,名称就是vrrp_script 定义的容器名
track_script {
chk_nginx
}
}
BACKUP服务器的配置
! Configuration File for keepalived
global_defs {
notification_email {
#sysadmin@firewall.loc
}
router_id LVS_lb02
}
#配置vrrp_script,主要用于健康检查,以及检查失败后执行的动作。
vrrp_script chk_nginx {
#健康检查脚本,当脚本返回值不为0时认为失败
script "/etc/keepalived/nginx_check.sh"
#检查频率,以下配置每2秒检查1次
interval 2
#当检查失败后,将vrrp_instance的priority减小5
weight -5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
fall 3
#连续监测2次成功,就认为成功。但不调整优先级
rise 2
}
vrrp_instance VI_1 {
#指定vrrp_instance的初始状态BACKUP
state BACKUP
interface ens33
virtual_router_id 55
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.92.100 dev ens33 label ens33:1
}
#本vrrp_instance所引用的脚本配置,名称就是vrrp_script 定义的容器名
track_script {
chk_nginx
}
}
添加Nginx监控脚本nginx_check.sh
,监控Nginx的运行状态,如果发现异常并不能重启成功则关闭Keepalived,让VIP漂移到备份服务器.
#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#尝试启动一次nginx,停止1秒后再次检测
systemctl nginx start
sleep 1
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#如果启动没成功,就杀掉keepalive触发主备切换
systemctl keepalived stop
fi
fi
增加监控脚本的执行权限
chmod +x /etc/keepalived/ck_ng.sh
1.4 测试
- 访问虚拟ip 192.168.92.100能正确的转发到nginx
- 停掉主机,虚拟ip会自动漂移到另一台机器,所以访问192.168.92.100还是正常的,用户无法感知主机已下线
- 停掉主机上的Nginx,由于keepalived会定时(我这里配置的两秒)执行自己写的shell脚本,当nginx挂了后会尝试启动一次nginx,如果启动失败,就杀掉keepalive触发主备切换
- 停掉Keepalived,虚拟ip自动漂移到另一台机器,程序正常运行
- 停掉备机,功能不受影响
1.5 踩到的坑
- yum安装的时候,不能用systemctl start keepalived启动,否则keepalived只会监控你的脚本并不会真正的去执行,准确的来说是找不到这个命令执行你的脚本,127是命令没找到,command not found
xxx.sh exited due to signal 127
期间还发生126 0 1 状态码,无一例外都是用systemctl start keepalived惹的祸,我用/usr/sbin/keepalived启动就一切正常
- vrrp_script{}中interval的间隔时间要大于脚本中的sleep时间会报错
xxx.sh exited due to signal 15
- 要关闭防火墙,或者把vrrp加到防火墙里面,不然可能出现脑裂现象
网友评论