原理

nginx 可以实现负载均衡,但 nginx 自身存在单点故障的问题,这时候最先想到的就是 keepalived,可以解决单点故障的问题

由于没有使用 lvs,所以这里 nginx 之间不存在负载均衡

同时,如果 keepalived 的 master 节点 nginx 服务宕了以后,如果 keepalived 还在运行,则用户就访问不到 nginx 服务了,所以需要添加监控脚本,当 nginx 宕机时,杀死本机的 keepalived 服务

这样,keepalived 的 master 就会切换,同时用户访问的 nginx 服务也会切换到原来的 backup 节点

测试节点

  RIP VIP
MASTER 192.168.132.136 192.168.132.200
SLAVE 192.168.132.140 192.168.132.200

配置nginx

安装 nginx 不是重点,这里就是用 yum 简单安装
yum -y install nginx
systemctl start nginx

配置keepalived

安装 keepalived 使用 yum 安装即可
keepalived 配置如下:
global_defs {
notification_email {
chen@test.com
}
notification_email_from chen@test.com
smtp_server smtp.exmail.qq.com
smtp_connect_timeout
router_id my-slave
} vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval
} vrrp_instance my_nginx {
state MASTER # BACKUP 节点这里配置成 BACKUP
interface ens37
virtual_router_id
priority # BACKUP 节点配置要比该值小
advert_int # vrrp_script定义的chk_nginx需要放到vrrp_instance里,用track_script指定,才能执行
track_script {
chk_nginx
} authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.132.200/ dev ens37 label ens37:
}
}
以上配置中,重点在脚本 /etc/keepalived/nginx_check.sh
该脚本会被每 5s 执行一次,用来检测 nginx 是否存活,如果不存活,则尝试重启 nginx,启动失败的话,会将本机的 keepalived 服务也杀死,保证切换主节点,不影响 nginx 访问
脚本 /etc/keepalived/nginx_check.sh 内容如下:
#!/bin/bash

# 注意,整个脚本的执行时间必须小于keepalived中定义的时间间隔,即interval定义的时间,否则下次执行脚本时,会杀死上次正在执行的脚本
systemctl status nginx &> /dev/null
# 检查nginx状态,nginx正常运行,$?为0,否则为非零数
if [ $? -ne ];then
systemctl start nginx # 启动nginx后等待2s,保证nginx已经正常启动运行,如果nginx还未正常运行,则关闭keepalived服务,使用备用keepalived
sleep
systemctl status nginx &> /dev/null if [ $? -ne ];then
systemctl stop keepalived
fi
fi

keepalived 配置公网虚拟IP

因为内网IP我们可以随意支配,随意容易配置,但配置公网虚拟IP时,还是有很大不同的,这里以云厂商提供的云主机为例
首先,需要主备keepalived机器都包含两个网卡,其中一个网卡为绑定内网,另一个绑定公网
事实上,两台云主机只需要有一个绑定了公网即可,但网卡数量不能少
大部分云厂商提供的云主机中,都包含公网网卡,但是也有只有内网网卡的
之所以可以使用公网IP访问,应该是通过路由器设置的,如金山云的云主机就只有内网网卡,这种机器暂时不知道怎么配置keepalived 的虚拟公网IP
 
这里服务器ip如下:
服务器 内网 外网
A 192.168.10.30 118.110.20.14
B 192.168.10.40  
外网IP的默认路由为118.110.20.11
内网网卡名为 ens224
外网网卡名为 ens160
 
方法一:
这里需要将两个服务器外网网卡都配置成不包含IP的配置并启动:
[admin@test ~]$ cat /etc/sysconfig/network-scripts/ifcfg-ens160
# 其中大部分配置都不是必须的,只需要能保证网卡能正常启动且不包含IP即可
HWADDR=:::8b::
NAME=ens160
# GATEWAY=118.110.20.12
# NETMASK=255.255.255.240
# IPADDR=118.110.20.14
DNS1=8.8.4.4
DNS2=8.8.8.8
DOMAIN=example
DEVICE=ens160
ONBOOT=yes
USERCTL=no
BOOTPROTO=static
PEERDNS=no check_link_down() {
return ;
}
keepalived配置如下:
# 这里只列出了主要部分,其他部分按照前面的例子来即可
vrrp_instance my_nginx {
state MASTER
interface ens224 # 这里必须写成内网网卡名,不能写成外网网卡名
virtual_router_id
priority
advert_int track_script {
chk_nginx
} authentication {
auth_type PASS
auth_pass 111111
}
virtual_ipaddress {
118.110.20.14/ dev ens160 # 这里配置和上面的例子不一样,相当于直接配置ens160网卡,没用到label
}
virtual_routes {
default via 118.110.20.12 # 这里配置默认路由
}
}
注意,我们前面的例子中,interface 和虚拟网卡指定的网卡名都是一样,但事实上,这两个是没有联系的
interface 指定的网卡是用来发送arrp包的源地址,而虚拟网卡指定的网卡是为了做虚拟IP的
因为,如果我们这里interface 指定的网卡名为ens160,由于这个网卡没有IP,则由于发送arrp包时找不到源地址,而导致启动keepalived失败,报错如下,在/var/log/message中能找到报错信息:
Cannot find an IP address to use for interface
方法二:
主要思路是,两台机器都配置好公网网卡,IP都配置成118.193.20.4,然后让主的公网网卡启动,从的公网网卡关闭
具体步骤如下:
网卡配置如下:
[root@test sites]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
HWADDR=:::8b:0e:
NAME=ens160
GATEWAY=118.110.20.12
DNS1=8.8.4.4
DNS2=8.8.8.8
DOMAIN=example
DEVICE=ens160
ONBOOT=yes
USERCTL=no
BOOTPROTO=static
NETMASK=255.255.255.240
IPADDR=118.110.20.14
PEERDNS=no check_link_down() {
return ;
}
keepalived配置如下:
vrrp_instance my_nginx {
state BACKUP
interface ens224 # 这里必须写成内网网卡名,不能写成外网网卡名
virtual_router_id
priority
advert_int track_script {
chk_nginx
} authentication {
auth_type PASS
auth_pass 111111
}
notify_master /etc/keepalived/script/master.sh
notify_backup /etc/keepalived/script/backup.sh
}
这里master.sh内容如下,主要功能是保证公网网卡启动:
#!/bin/bash

ifconfig | grep 118.110.20.14
if [ $? -ne ];then
ifconfig ens160 up
fi
backup.sh内容如下,主要功能就是关闭公网网卡:
#!/bin/bash

# 即使已经关闭了,再执行该命令也不会有报错,所以不用做判定
ifconfig ens160 down

keepalived + nginx 实现高可用的更多相关文章

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

    1.安装编译 Nginx 所需的依赖包# yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zli ...

  2. Keepalived+Nginx实现高可用(HA)

    Keepalived+Nginx实现高可用(HA) service iptables stopchkconfig iptables offsetenforce 0/etc/selinux/config ...

  3. Dubbo入门到精通学习笔记(十六):Keepalived+Nginx实现高可用Web负载均衡

    文章目录 Keepalived+Nginx实现高可用Web负载均衡 Keepalived+Nginx实现高可用Web负载均衡 高可用架构篇 Keepalived + Nginx 实现高可用 Web 负 ...

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

    一.Keepalived 简要介绍 Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前 ...

  5. [转]搭建Keepalived+Nginx+Tomcat高可用负载均衡架构

    [原文]https://www.toutiao.com/i6591714650205716996/ 一.概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最 ...

  6. KeepAlived+Nginx实现高可用负载

    一.环境及安装版本: centos6.5.Nginx1.4.7.keepalived1.3.2 虚拟IP 真是IP Nginx端口 主从分配 10.0.90.215 10.0.90.217 80 MA ...

  7. Keepalived+Nginx实现高可用负载均衡集群

    一 环境介绍 1.操作系统CentOS Linux release 7.2.1511 (Core) 2.服务keepalived+nginx双主高可用负载均衡集群及LAMP应用keepalived-1 ...

  8. Linux巩固记录(9) keepalived+nginx搭建高可用负载分发环境

    环境准备(继续服用hadoop节点) slave1  192.168.2.201(CentOs 7) slave2  192.168.2.202(CentOs 7) slave1 和 slave2 上 ...

  9. Keepalived+Nginx实现高可用和双主节点负载均衡

    简介 Nginx可以实现高并发反向代理,lvs集群可以实现负载均衡,但是他们都有一个共同的弊端,就是Nginx,lvs架构中Director是单点故障,有没有一个好的方案解决这个问题呢?答案是有.通过 ...

  10. keepalived + nginx实现高可用

    1. Keepalived介绍 Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat.corosync.pacemaker. ...

随机推荐

  1. 12 个最佳 GNOME(GTK)主题

    作者: Phillip Prado 译者: LCTT 郑 | 2019-04-14 09:45   评论: 1 收藏: 2 让我们来看一些漂亮的 GTK 主题,你不仅可以用在 Ubuntu 上,也可以 ...

  2. Java基础——过滤器和监听器

    什么是过滤器? Servlet过滤器和Servlet十分相似,但它具有拦截客户端请求的功能,Servlet过滤器可以改变请求中的内容,来满足实际开发中的需要.对于开发人员而言,过滤器实际上就是在Web ...

  3. CentOS 7最小安装配置网络

    安装环境: VMware Workstation14 centos 7.5.1804 最小化安装 安装过程: 在系统安装成功后进行网络配置,我这里采用的是动态ip配置.首先得知道网络配置存放的目录: ...

  4. eclipse引入svn插件,并将项目同步到svn

    1. eclipse中不存在SVN问题的解决 1.1发现Team->Share project 下没有svn. 1.2下载安装svn插件. 选择help->Eclipse Marketpl ...

  5. HDU——T 2119 Matrix

    http://acm.hdu.edu.cn/showproblem.php?pid=2119 Time Limit: 5000/1000 MS (Java/Others)    Memory Limi ...

  6. UVALive - 2031 Dance Dance Revolution 三维dp

    题目大意:有一个胖子在玩跳舞机.刚開始的位置在(0,0).跳舞机有四个方向键,上左下右分别相应1,2,3,4.如今有下面规则 1.假设从0位置移动到随意四个位置,消耗能量2 2.假设从非0位置跳到相邻 ...

  7. (hdu step 7.1.6)最大三角形(凸包的应用——在n个点中找到3个点,它们所形成的三角形面积最大)

    题目: 最大三角形 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  8. unity3d 延迟运行脚本语句

    在Unity3D中.有yield语句它负责延迟操作,yield return WaitForSeconds(3.0); //等待 3 秒 查看unity3d脚本手冊,使用方法须要在对应的格式. 以下代 ...

  9. duang!!!为什么函数能够返回unique_ptr

    C++虐我千百遍,我待C++如初恋 从智能指针说起 对高手而言.指针是上天入地的神器.对新手而言,那简直是灾难的源泉.高级语言如Java,C#都自己主动管理内存.你仅仅管new.不必担心内存释放问题. ...

  10. Compiler Warning (level 2) CS0436

    https://docs.microsoft.com/en-us/dotnet/csharp/misc/cs0436 // CS0436_a.cs // compile with: /target:l ...