实现keepalived调用脚本进行资源监控

keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整

vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外

track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script
分两步:(1) 先定义一个脚本;(2) 调用此脚本

vrrp_script <SCRIPT_NAME> {
script ""
interval INT
weight -INT
}
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}

1、环境搭建:

类型

机器名称

IP配置

服务角色

A

client

192.168.37.7

客户端访问(桥接模式)

C

lvs-server1

VIP:192.168.37.100

DIP:192.168.37.17

负载均衡调度器(NAT模式)

D

lvs-server2

VIP:192.168.37.100

DIP:192.168.37.27

负载均衡调度器(NAT模式)

E

rs1

RIP:192.168.37.37

后端服务器(NAT模式)

F

rs2

RIP:192.168.37.47

后端服务器(NAT模式)

2、在keepalived主服务器配置

配置keepalived服务

[root@centos17~]#yum install keepalived
[root@centos17~]#vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
974212253@qq.com 接收邮箱地址
}
notification_email_from www.magedu.net 从哪个邮箱发送
smtp_server 127.0.0.1 本地IP地址
smtp_connect_timeout 30
router_id ka1 本地的主机名
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_down {
script "/etc/keepalived/test.sh" 调用本地脚本test.sh
interval 1
weight -30 权重减30
} vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh" 调用本地脚本check_nginx.sh
interval 1
weight -30 权重减30
} vrrp_instance VI_1 {
state MASTER 本机的主节点
interface ens33 本机的网卡名称
virtual_router_id 66 本机路由ID号
priority 100 本机keepalived优先级
unicast_src_ip 192.168.37.17 # 配置源地址的IP地址,绑定单播地址的目的是为了防止与其他主机的IP地址存在冲突问题。
unicast_peer {
192.168.37.27 # 配置从节点的目标IP地址
}
advert_int 1
authentication {
auth_type PASS
auth_pass 123456 密码
}
virtual_ipaddress {
192.168.37.100/24 dev ens33 label ens33:1 添加一个VIP地址
}
track_script {
chk_down 对宕机进行检查
}
track_script {
chk_nginx 对nginx进行检查
}
notify_master "/etc/keepalived/notify.sh master" 调用脚本,返回当前keepalived状态信息:master
notify_backup "/etc/keepalived/notify.sh backup" 返回backup信息
notify_fault "/etc/keepalived/notify.sh fault" 返回fault信息
} [root@centos17~]#systemctl start keepalived

配置主节点nginx服务,配置完成之后启动nginx服务:nginx

  yum install nginx -y  安装nginx服务包

[root@centos17~]#vim /etc/nginx/nginx.conf
upstream websrvs{
server 192.168.37.37:80;
server 192.168.37.47:80;
} server {
listen 80;
server_name www.magedu.net;
root /data/site1;
index index.html;
location / {
proxy_pass http://websrvs;
}

在keepalived主节点创建脚本

在keepalived主节点创建一个检查nginx状态脚本

[root@centos17keepalived]#vim check_nginx.sh
#!/bin/bash
killall -0 nginx &> /dev/null || exit 1 检查此时的nginx服务进程是否正常,如果非0(死机),就会执行退出显示1。
[root@centos17]#chmod +x check_nginx.sh 添加执行权限

当keepalived服务器宕机时,在keepalived主节点创建一个降优先级脚本。

[root@centos17keepalived]#vim test.sh
#!/bin/bash
[ -f /etc/keepalived/down ] && exit 1 || exit 0 判断/etc/keepalived/目录下是否有down文件,如果有就返回1,没有就返回0 [root@centos17keepalived]#chmod +x test.sh 加上执行权限

当nginx停止服务或者死机时,此时nginx服务器变成从节点,检测到主节点变成从节点后,此脚本就会提示主节点变为从节点,返回backup,就会重新启动nginx服务,又会抢占从节点nginx服务,变成主节点。

实现脚本如下:

[root@centos17keepalived]#vim notify.sh
#!/bin/bash
contact='root@localhost'
notify() {
mailsubject="$(hostname) to be $1, vip floating"
mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
systemctl restart nginx 当主节点的nginx宕机之后,返回backup,就会有重启nginx,又抢回主节点位置,继续为客户端提供服务。
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac

3、在keepalived从服务器配置

在keepalived从服务器上配置相关文件

[root@centos27~]#vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
974212253@qq.com
}
notification_email_from ka1@magedu.net
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka2
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_down {
script "/etc/keepalived/test.sh"
interval 1
weight -30
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 1
weight -30
} vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 66
priority 80
unicast_src_ip 192.168.37.27 配置从节点的IP地址
unicast_peer {
192.168.37.17 配置主节点的目标IP地址
}
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.37.100/24 dev ens33 label ens33:1
}
track_script {
chk_down
}
track_script {
chk_nginx
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}

配置从节点的nginx服务,配置完成之后启动nginx服务:nginx 

[root@centos17~]#vim /etc/nginx/nginx.conf
upstream websrvs{
server 192.168.37.37:80;
server 192.168.37.47:80;
} server {
listen 80;
server_name www.magedu.net;
root /data/site1;
index index.html;
location / {
proxy_pass http://websrvs;
}

在keepalived从节点创建脚本

在keepalived从节点创建一个检查nginx状态脚本

[root@centos17keepalived]#vim check_nginx.sh
#!/bin/bash
killall -0 nginx &> /dev/null || exit 1 检查此时的nginx服务进程是否正常,如果非0(死机),就会执行退出显示1。
[root@centos17]#chmod +x check_nginx.sh 添加执行权限

当keepalived服务器宕机时,在keepalived从节点创建一个降优先级脚本。

[root@centos17keepalived]#vim test.sh
#!/bin/bash
[ -f /etc/keepalived/down ] && exit 1 || exit 0 判断/etc/keepalived/目录下是否有down文件,如果有就返回1,没有就返回0 [root@centos17keepalived]#chmod +x test.sh 加上执行权限

此时nginx从节点服务器变成主节点。

创建完成之后加上执行权限,实现脚本如下:

[root@centos17keepalived]#vim notify.sh
#!/bin/bash
contact='root@localhost'
notify() {
mailsubject="$(hostname) to be $1, vip floating"
mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
systemctl restart nginx
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac

后端http服务器上创建网页

在两个后端服务器上创建网页,作为测试效果使用。

[root@cenots47~]#yum install httpd  -y
[root@cenots47~]#echo 192.168.37.47 > /var/www/html/index.html
[root@cenots47~]#systemctl start httpd
[root@cenots37~]#yum install httpd -y
[root@cenots37~]#echo 192.168.37.37 > /var/www/html/index.html
[root@cenots37~]#systemctl start httpd

客户端验证效果

在客户端修改hosts配置文件,并测试效果,如果主keepalived服务器宕机了,VIP地址就会漂移到从节点上去,继续运行nginx服务,不会影响用户访问效果。

 vim /etc/hosts

[root@centos7network-scripts]#while true;do  curl 192.168.37.100;sleep 0.5;done
192.168.37.47
192.168.37.47
192.168.37.37
192.168.37.47
192.168.37.37

当主节点的nginx服务器死机了,此时的VIP地址会临时漂移到从节点上,当脚本检测到主节点的nginx服务死机后,就会重新启动nginx服务,将VIP地址就会从从节点服务器抢过来,继续作为主节点为客户端进行服务。

测试如下:

1、杀掉主节点的nginx服务

[root@centos17keepalived]#killall nginx

2、在http后端服务器上监控多播地址,此时可以看到主节点的优先级由100降到70,然后从节点的优先级80进行为客户端提供服务,由于有脚本检测主节点返回了backup,就会重新启动nginx,此时主节点就又会将优先级变回100,将从节点的服务抢占回来。

3、在客户端进行查看效果,当主节点的nginx死机后,重启nginx后就会又为客户端进行服务。

keepalived实现nginx反向代理的高可用的更多相关文章

  1. haproxy+keepalived配置haproxy反向代理的高可用

    http://www.cnblogs.com/shantu/p/4586277.html

  2. Keepalived+LVS+Nginx负载均衡之高可用

    Keepalived+LVS+Nginx负载均衡之高可用 上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致整个系统无法正常 ...

  3. Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用

    上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致整个系统无法正常运行.针对系统架构设计的高可用要求,我们需要解决Nginx ...

  4. Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...

  5. Keepalived+Nginx实现负载均衡高可用

    一.负载均衡高可用 Nginx作为负载均衡器,所有请求都到了Nginx,可见Nginx处于非常重点的位置,如果Nginx服务器宕机后端web服务将无法提供服务,影响严重. 为了避免负载均衡服务器的宕机 ...

  6. suse 12 编译部署Keepalived + nginx 为 kube-apiserver 提供高可用

    文章目录 编译部署nginx 下载nginx源码包 编译nginx 配置nginx.conf 配置nginx为systemctl管理 分发nginx二进制文件和配置文件 启动kube-nginx服务 ...

  7. Linux系统——Nginx反向代理与负载均衡

    集群集群是指一组(若干个)相互独立的计算机,利用高速通信网路组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运用各自服务的独立服务器.这些服务器之间可以彼此通信,协同向用户提供 ...

  8. LVS和nginx反向代理网站架构

    LVS和nginx反向代理网站架构 nginx反向代理和lvs的dr都存在单点,要keepalived做高可用,但是成本高了 f

  9. Linux实战教学笔记30:Nginx反向代理与负载均衡应用实践

    1.1 集群简介 简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器.这些服务器之间可 ...

随机推荐

  1. 必须要注意的 C++ 动态内存资源管理(一)——视资源为对象

    必须要注意的 C++ 动态内存资源管理(一)——视资源为对象 一.前言         所谓资源就是,一旦你用了它,将来必须还给系统.如果不这样,糟糕的事情就会发生.C++ 程序中最常见使用的资源就是 ...

  2. React之改变页面上方图标

    首先在public/index.html中 <!-- <link rel="shortcut icon" href="%PUBLIC_URL%/bitbug6 ...

  3. 【Python开发】【编程开发】各种系统的清屏操作命令

    mac os x terminal清屏快捷键 cammand+k linux系统清屏快捷键 ctrl+l linux系统命令行清屏命令 clear windows 命令行清屏命令 cls Matlab ...

  4. java开发异常Exception集锦

    背景:整理开发过程中的异常问题 java.lang.Exception: No tests found matching 一般出现在新导入的工程中.在sts中通过open project的方式导入工程 ...

  5. Python代码编码规范

    目录 1. Introduction 介绍 2. A Foolish Consistency is the Hobgoblin of Little Minds 尽信书,则不如无书 3. Code la ...

  6. url与uri区别

    url属性: 是要求按照url的写法来写地址 URL:Uniform Resource Locator 统一资源定位符.它是可以唯一标识一个资源的位置 写法: http://localhost:808 ...

  7. pipeline的添加顺序和执行顺序

    原文链接:https://www.cnblogs.com/ruber/p/10186571.html 本文只想讨论一下pipeline的执行顺序问题,因为这个搞不明白就不知道先添加编码还是解码,是不是 ...

  8. Java基础之(四)HashMap(jdk10)

    JDK1.7以前的HashMap jdk1.7中,当冲突时,在冲突的地址上生成一个链表,将冲突的元素的key,通过equals进行比较,相同即覆盖,不同则添加到链表上,此时如果链表过长,效率就会大大降 ...

  9. 喜马拉雅 FM 已购付费音频下载

    如何下载在喜马拉雅 FM 中已购买的付费音频.之前想分享自己购买的付费音频给朋友听,碍于喜马拉雅 FM 的音频不能直接导出,所以准备自己搞个下载的小软件. 仅可下载已购买的付费音频.当然,如果你是会员 ...

  10. 一起来学Spring Cloud | 第八章:消息总线(Spring Cloud Bus)

    上一章节,我们讲解了分布式配置中心spring cloud config,我们把配置项存放在git或者本地,当我们修改配置时,需要重新启动服务才能生效.但是在生产上,一个服务部署了多台机器,重新启动比 ...