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. patA1059 Prime Factors

    这个问题叫做质因子分解,花了大概两个小时写对了.这道题细节挺多的,书上提到了几点,一个是n=1的话需要特判.有一个很容易错的点就是n一开始要先用一个变量保存起来,不保存的话后面有点麻烦,所以建议还是先 ...

  2. java项目的异常处理

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用System.ou ...

  3. PHPexcel(2)

    //导出 public function export(){ $xlsData = Db('ent_apply')->select(); Vendor('PHPExcel.PHPExcel'); ...

  4. Linux常用操作指令(面试专用)

    Linux:免费开源,多用户多任务,衍生出很多附属版本,例如常用的RedHat... 常用指令 ls        显示文件或目录 -l           列出文件详细信息l(list) -a   ...

  5. IT题库7-线程加锁

    转载:http://www.cnblogs.com/linjiqin/p/3208843.html 一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏.例如:两个线程T ...

  6. 福州大学软件工程1916 | W班 作业成绩排名汇总

    评分链接: 第一次作业-准备篇 https://www.cnblogs.com/deerCode/p/10527237.html 第二次作业-结对第一次-文献摘要热词统计原型设计 https://ww ...

  7. php 图片添加文字,水印

    因为工作需求,用到这个,网上找了很多,也没有找到好的方式,最后找到这种感觉比较简单的方式,记录下来,以备后用.   $im = imagecreatefrompng("img/yyk_bg. ...

  8. python 文件重命名

    将文件夹中的.jsp重命名为.html import os def rename(path): files = os.listdir(path) for file in files: dir = os ...

  9. 在 Azure 上部署 Kubernetes 集群

    在实验.演示的时候,或者是生产过程中,我经常会需要运行一些 Docker 负载.虽然这在本地计算机上十分容易,但是当你要在云端运行的时候就有点困难了.相比于本地运行,在云端运行真的太复杂了.我尝试了几 ...

  10. ubuntu 下安装 navicat 12

    一.去官网下载navicat112_premium_cs_x64 for linux版本二.用tar解压安装包三.navicat解压即可用,直接进入解压后的目录,然后用‘./’运行start_navi ...