Keepalived 简要介绍

Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前端服务的高可用。
Keepalived 以 VRRP 协议为实现基础,用 VRRP 协议来实现高可用性(HA)。VRRP(Virtual RouterRedundancy Protocol)协议是用于实现路由器冗余的协议,
VRRP 协议将两台或多台路由器设备虚拟成一个 设备,对外提供虚拟路由器 IP(一个或多个),而在路由器组内部,如果实际拥有这个对外 IP 的路由器如果工作正常的话就是 MASTER,
或者是通过算法选举产生,MASTER 实现针对虚拟路由器 IP 的各种网络功能, 如 ARP 请求,ICMP,以及数据的转发等;其他设备不拥有该虚拟 IP,状态是 BACKUP,
除了接收 MASTER 的 VRRP 状态通告信息外,不执行对外的网络功能。当主机失效时,BACKUP 将接管原先 MASTER 的网络功能。
VRRP 协议使用多播数据来传输 VRRP 数据,VRRP 数据使用特殊的虚拟源 MAC 地址发送数据而不是自身 网卡的 MAC 地址,VRRP 运行时只有 MASTER 路由器定时发送 VRRP 通告信息,
表示 MASTER 工作正常以及虚 拟路由器 IP(组),BACKUP 只接收 VRRP 数据,不发送数据,如果一定时间内没有接收到 MASTER 的通告信 息,各 BACKUP 将宣告自己成为 MASTER,
发送通告信息,重新进行 MASTER 选举状态。

Keepalived + Nginx 方案图

Nginx相关环境基于上篇Nginx安装博客的配置;

Keepalived 安装

通过yum安装:

yum install -y keepalived

耐心等待安装完毕。

安装完毕后 会生成 /etc/keepalived 目录

相关命令:

service keepalived start         #启动服务
service keepalived stop #停止服务
service keepalived restart #重启服务

Keepalived 配置

防火墙添加arrp组播规则,或关闭防火墙

iptables:

vi /etc/sysconfig/iptables
-A INPUT -p vrrp -d 224.0.0.18/ -j ACCEPT

firewall:

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT  --in-interface enp4s0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload

关闭selinux:(此处包含一个无敌天坑:如果不关闭此项,配置成功后关掉keepalived服务vip会正常切换,但若关闭服务器vip则不会切换,妈的坑了好久。。。)

vi /etc/sysconfig/selinux
#修改:
SELINUX=disabled
#setenforce

keepalived 的所有功能都是通过配置 keepalived.conf文件来实现的。

建议备份一下keepalived.conf文件重新添加一个新文件填写或者清空keepalived.conf文件重新填写。

抢占模式配置

红色字体为不同配置

Master节点:

global_defs {
router_id nginx_01 #标识本节点的名称,通常为hostname
} ## keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
##如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。如果脚本执行结果非0,
##并且weight配置的值小于 ,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval #每2秒检测一次nginx的运行状态
weight - #失败一次,将自己的优先级-
} vrrp_instance VI_1 {
state MASTER # 状态,主节点为MASTER,备份节点为BACKUP
interface eno16777736 # 绑定VIP的网络接口,通过ip add查看自己的网络接口
virtual_router_id # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
mcast_src_ip 192.168.60.131 # 本机IP地址(80端口已配置好nginx)
priority # 节点优先级,值范围0~,MASTER要比BACKUP高
advert_int # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
# 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass
}
# 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
virtual_ipaddress {
192.168.60.200
} track_script {
chk_nginx # nginx存活状态检测脚本
}
}

BackUp 节点:

global_defs {
router_id nginx_02 #标识本节点的名称,通常为hostname
} ## keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
##如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。如果脚本执行结果非0,
##并且weight配置的值小于 ,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval #每2秒检测一次nginx的运行状态
weight - #失败一次,将自己的优先级-
} vrrp_instance VI_1 {
state BACKUP # 状态,主节点为MASTER,备份节点为BACKUP
interface eno16777736 # 绑定VIP的网络接口,通过ip add查看自己的网络接口
virtual_router_id # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
mcast_src_ip 192.168.60.133 # 本机IP地址(80端口已配置nginx)
priority 90 # 节点优先级,值范围0~,MASTER要比BACKUP高
advert_int # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
# 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass
}
# 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
virtual_ipaddress {
192.168.60.200
} track_script {
chk_nginx # nginx存活状态检测脚本
}
}

创建nginx服务检测脚本

分别在主备服务器/etc/keepalived目录下创建nginx_check.sh脚本,并为其添加执行权限chmod +x /etc/keepalived/nginx_check.sh

用于keepalived定时检测nginx的服务状态,如果nginx停止了,会尝试重新启动nginx,如果启动失败,会将keepalived进程杀死,将vip漂移到备份机器上。

#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq ];then
/usr/local/nginx/sbin/nginx #尝试重新启动nginx
sleep #睡眠2秒
if [ `ps -C nginx --no-header | wc -l` -eq ];then
killall keepalived #启动失败,将keepalived服务杀死。将vip漂移到其它备份节点
fi
fi

配置完毕,分别启动主从服务器keepalived服务

service keepalived start
ps aux | grep keepalived

两节点的启动情况

查看vip绑定情况

ip add

主节点:

BackUp节点:

测试vip漂移

停止Master上的keepalived服务

BackUp节点:

重新开启Master的keepalived服务再次看下vip绑定情况:

BackUp:

实现抢占式配置。

非抢占模式

Master 节点修改配置文件:

global_defs {
router_id nginx_01 #标识本节点的名称,通常为hostname
} ## keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
##如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。如果脚本执行结果非0,
##并且weight配置的值小于 ,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval #每2秒检测一次nginx的运行状态
weight - #失败一次,将自己的优先级-
} vrrp_instance VI_1 {
state MASTER # 状态,主节点为MASTER,备份节点为BACKUP
interface eno16777736 # 绑定VIP的网络接口,通过ifconfig查看自己的网络接口
virtual_router_id # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
mcast_src_ip 192.168.60.131 # 本机IP地址
priority # 节点优先级,值范围0~,MASTER要比BACKUP高
advert_int # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
#非抢占式
nopreempt
# 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass
}
# 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
virtual_ipaddress {
192.168.60.200
} track_script {
chk_nginx # nginx存活状态检测脚本
}
}

BackUp节点修改配置文件:

global_defs {
router_id nginx_02 #标识本节点的名称,通常为hostname
} ## keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
##如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。如果脚本执行结果非0,
##并且weight配置的值小于 ,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval #每2秒检测一次nginx的运行状态
weight - #失败一次,将自己的优先级-
} vrrp_instance VI_1 {
state BACKUP # 状态,主节点为MASTER,备份节点为BACKUP
interface eno16777736 # 绑定VIP的网络接口,通过ifconfig查看自己的网络接口
virtual_router_id # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
mcast_src_ip 192.168.60.133 # 本机IP地址
priority 100 # 节点优先级,值范围0~,MASTER要比BACKUP高
advert_int # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
#非抢占式
nopreempt
# 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass
}
# 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
virtual_ipaddress {
192.168.60.200
} track_script {
chk_nginx # nginx存活状态检测脚本
}
}

红色为修改部分,从中可看出backup节点需要把优先级设置与master节点一样。

重启两个节点的keepalived服务,再次断开Master节点keepalived服务,vip漂移到BackUp节点,然后再开启Master节点keepalived服务:

Master:

BackUp:

Master没有抢占过去,非抢占式配置成功。

最后看下keepalived与nginx的配置成果:

使用Keepalived配置主从热备实现Nginx高可用(HA)的更多相关文章

  1. Lvs+keepalived+mysql主从热备

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...

  2. nginx:负载均衡实战(四)nginx+keepalived配置双机热备

    1.下载安装 下载keepalived地址:http://www.keepalived.org/download.html 解压安装: tar -zxvf keepalived-.tar.gz 安装o ...

  3. tomcate+keepalived配置双机热备

    环境清单: 应用1:192.168.51.101 应用2:192.168.51.75 虚拟IP:192.168.51.179 一.安装Tomcat(参照其他文档): 二.部署应用,并修改响应的端口(9 ...

  4. 使用Docker-compose搭建nginx-keepalived双机热备来实现高可用nginx集群

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_117 最近同学出去面试经常会被问到一个问题. 面试官:你说你们公司使用nginx反向代理tornado,部署了多少多少台机器,好像 ...

  5. Centos7 Mysql 双机热备实现数据库高可用

    mysql双主热备,也称主主互备,目的是mysql数据库高可用,只支持双机,原因是mysql的复制是一主多从,但一个从服务器只能有一个主服务器. 双机热备的条件是双机mysql版本必须一致. 服务器分 ...

  6. Mysql双机热备实现数据库高可用

    mysql双主热备,也称主主互备,目的是mysql数据库高可用,只支持双机,原因是mysql的复制是一主多从,但一个从服务器只能有一个主服务器. 双机热备的条件是双机mysql版本必须一致. 服务器分 ...

  7. docker toolbox的redis 配置主从及哨兵模式保证高可用

    redis 的缓存中间件安装方法,简单举例如下: 环境: docker toolbox 一   主从模式1 搜索redis镜像  docker search redis2 拉取镜像docker pul ...

  8. LVS + keepalived + nginx + tomcat 实现主从热备 + 负载均衡

    前言 首先声明下,由于这两天找资料,看了不少博客 ,但是出于不细心,参考者的博客地址没有记录下来,所有文中要是出现了与大家博客相同的地方,那么请大家在评论区说明并附上博客地址,我好引用进来:这里表示抱 ...

  9. Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

    拓扑环境 以下表格是这次測试须要的拓扑环境,几台server.每台server上安装什么,都有介绍. server名称 系统版本号 预装软件 IP地址/VIP Nginx主server CentOS ...

随机推荐

  1. webservice学习教程(一):理论

    一. WebService到底是什么? webservice是一种跨平台,跨语言的规范,用于不同平台,不同语言开发的应用之间的交互 WebService是一个SOA(面向服务的编程)的架构,它是不依赖 ...

  2. 阿里云RDS数据库改造迁移方案

    1. 改造原因 (1) 由于历史原因, 本应该是同一个库的表分布在两个数据库中,需要对这两个库进行合并. (2) 已有的数据库性能无法满足业务的增长需要, 查询卡,慢问题突出. (3) 当前自建Mys ...

  3. 【转】mysql保存图片技术决定:保存二进制文件还是只保存图片相对路径,图片放在硬盘上面?

    最近遇到上面这个问题,一开始我就果断否决了数据库保存图片的策略,主要是太蠢!事实上我的决定是正确的,我仅仅理解为mysql读写性能提高的境界,具体为什么可以提高?很模糊,知道我看到了这里: 大佬做的实 ...

  4. Redis集群方案怎么做?

    转载自:https://www.jianshu.com/p/1ecbd1a88924 Redis集群方案 Redis数据量日益增大,而且使用的公司越来越多,不仅用于做缓存,同时趋向于存储这块,这样必促 ...

  5. 来测试下你的Java编程能力

    上篇整理了下后面准备更系统化写的Java编程进阶的思路,如果仅看里面的词,很多同学会觉得都懂,但我真心觉得没有多少人是真懂的,所以简单的想了一些题目,感兴趣的同学们可以来做做看,看看自己的Java编程 ...

  6. 时区切换导致quartz定时任务没有触发问题

    时区切换对Quartz的cron表达式有影响,切换的1小时内停止触发定时任务,导致sla没有定时清空内存计数,误发限流. 美国夏令时PST切换到冬令时PDT,会有时间跳变.不带时区跳变的,会出现时间重 ...

  7. 一张图解释IaaS,PaaS,SaaS

    图片来源于MVA教程:快速入门——面向IT专业人员的Windows Azure IaaS

  8. Windows 2008 r2上安装MySQL

    用MSI安装包安装 根据自己的操作系统下载对应的32位或64位安装包.按如下步骤操作: MySQL数据库官网的下载地址http://dev.mysql.com/downloads/mysql,第一步: ...

  9. JS对象、构造器函数和原型对象之间的关系

    一.基本概念 1.对象:属性和方法的集合,即变量和函数的封装.每个对象都有一个__proto__属性,指向这个对象的构造函数的原型对象. 2.构造器函数:用于创建对象的函数,通过new关键字生成对象. ...

  10. React组件绑定this的三种方法

    我们在使用React组件时,调用方法常常用到this和event对象,默认情况是不会绑定到组件上的,需要特殊处理. 节点上使用bind绑定 特点:该方法会在每次渲染组件时都会重新绑定一次,消耗一定的性 ...