配置Keepalived双实例高可用Nginx

我们知道Keepalived原生设计目的是为了高可用LVS集群的,但Keepalived除了可以高可用LVS服务之外,还可以基于vrrp_script和track_script高可用其它服务,如Nginx等。本篇主要演示如何使用Keepalived高可用Nginx服务(双实例),关于vrrp_script、track_script的更多介绍可以见上一篇博客《Keepalived学习总结》

实验要求 ==> 实现Keepalived基于vrrp_script、track_script高可用Nginx服务,要求配置为双实例,两个vrrp实例的VIP分别为192.168.10.77、192.168.10.78,可以分别将其配置在网卡别名上。

实验环境 ==> CentOS 7.x

实验目的 ==> 实现Keepalived双实例高可用Nginx服务

实验主机 ==> 192.168.10.6(主机名:node1)、192.168.10.8(主机名:node2)

实验前提 ==> 高可用对之间时间同步(可通过周期性任务来实现)

实验操作如下。

1、编辑Keepalived配置文件

2、在两个节点上分别使用yum安装Nginx,并启动Web服务

(1) 在node1(192.168.10.6)上

[[email protected] ~]# yum -y install nginx
[[email protected] ~]# systemctl start nginx.service
[[email protected] ~]# ss -tnl | grep :80
LISTEN     0      128          *:80                       *:*                  
LISTEN     0      128         :::80                      :::*

(2) 在node2(192.168.10.8)上

[[email protected] ~]# yum -y install nginx
[[email protected] ~]# systemctl start nginx.service
[[email protected] ~]# ss -tnl | grep :80
LISTEN     0      128          *:80                       *:*

3、在两个节点上分别启动Keepalived服务

(1) 在node1(192.168.10.6)上

[[email protected] ~]# systemctl start keepalived
[[email protected] ~]# ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.6  netmask 255.255.255.0  broadcast 192.168.10.255
        ether 00:0c:29:f7:b3:4e  txqueuelen 1000  (Ethernet)
        RX packets 46064  bytes 21104876 (20.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 43548  bytes 3735943 (3.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.77  netmask 255.255.255.255  broadcast 0.0.0.0
        ether 00:0c:29:f7:b3:4e  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 195  bytes 12522 (12.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 195  bytes 12522 (12.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

(2) 在node2(192.168.10.8)上

[[email protected] ~]# systemctl start keepalived
[[email protected] ~]# ifconfig 
ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.8  netmask 255.255.255.0  broadcast 192.168.10.255
        ether 00:0c:29:ef:52:87  txqueuelen 1000  (Ethernet)
        RX packets 60646  bytes 17433464 (16.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 29539  bytes 2636829 (2.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens34:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.78  netmask 255.255.255.255  broadcast 0.0.0.0
        ether 00:0c:29:ef:52:87  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 319  bytes 20447 (19.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 319  bytes 20447 (19.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

可以发现,因为在第一个vrrp实例(VIP为192.168.10.77)中,node1节点为主节点,因此该VIP配置在node1上;而在第二个vrrp实例(VIP为192.168.10.78)中,node2节点为主节点,因此该VIP配置在node2上。

4、人为制造故障进行测试

(1) 在node2上杀死nginx进程,查看第二个vrrp实例的VIP(192.168.10.78)是否会漂移至node1。

[[email protected] ~]# killall nginx

#查看日志

[[email protected] ~]# tail /var/log/messages
...(其他省略)...
Aug  8 16:29:28 node2 Keepalived_vrrp[6832]: VRRP_Script(chk_nginx) failed
Aug  8 16:29:30 node2 Keepalived_vrrp[6832]: VRRP_Instance(VI_2) Received higher prio advert
Aug  8 16:29:30 node2 Keepalived_vrrp[6832]: VRRP_Instance(VI_2) Entering BACKUP STATE
Aug  8 16:29:30 node2 Keepalived_vrrp[6832]: VRRP_Instance(VI_2) removing protocol VIPs.
Aug  8 16:29:30 node2 Keepalived_healthcheckers[6831]: Netlink reflector reports IP 192.168.10.78 removed

#查看node2上的IP地址

[[email protected] ~]# ifconfig 
ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.8  netmask 255.255.255.0  broadcast 192.168.10.255
        ether 00:0c:29:ef:52:87  txqueuelen 1000  (Ethernet)
        RX packets 61483  bytes 17487867 (16.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 29994  bytes 2672261 (2.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 323  bytes 20647 (20.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 323  bytes 20647 (20.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

可以发现第二个vrrp实例的VIP(192.168.10.78)已经从node2上移除。

#查看node1上的IP地址

[[email protected] ~]# ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.6  netmask 255.255.255.0  broadcast 192.168.10.255
        ether 00:0c:29:f7:b3:4e  txqueuelen 1000  (Ethernet)
        RX packets 46700  bytes 21146944 (20.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 44417  bytes 3794925 (3.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.77  netmask 255.255.255.255  broadcast 0.0.0.0
        ether 00:0c:29:f7:b3:4e  txqueuelen 1000  (Ethernet)

ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.78  netmask 255.255.255.255  broadcast 0.0.0.0
        ether 00:0c:29:f7:b3:4e  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 199  bytes 12722 (12.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 199  bytes 12722 (12.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

此时node1不仅是第一个vrrp实例(VIP为192.168.10.77)的主节点,还是第二个vrrp实例(VIP为192.168.10.78)的主节点。

(2) 在node1上杀死nginx进程,在node2上重新启动nginx进程,查看第一个vrrp实例的VIP(192.168.10.77)和第二个vrrp实例的VIP(192.168.10.78)是否会漂移至node2。

#先在node2上重启nginx进程,此时第二个vrrp实例的VIP(192.168.10.78)应该会重新漂移至node2上

[[email protected] ~]# systemctl restart nginx.service
[[email protected] ~]# ss -tnl | grep :80
LISTEN     0      128          *:80                       *:*                  
[[email protected] ~]# ifconfig 
ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.8  netmask 255.255.255.0  broadcast 192.168.10.255
        ether 00:0c:29:ef:52:87  txqueuelen 1000  (Ethernet)
        RX packets 62438  bytes 17551143 (16.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 30145  bytes 2688809 (2.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens34:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.78  netmask 255.255.255.255  broadcast 0.0.0.0
        ether 00:0c:29:ef:52:87  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 331  bytes 21047 (20.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 331  bytes 21047 (20.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

果然在意料之中!

#在node1上杀死nginx进程,查看第一个vrrp实例的VIP(192.168.10.77)是否会重新漂移至node2上

[[email protected] ~]# killall nginx        # 杀死nginx进程
[[email protected] ~]# tail /var/log/messages    # 查看日志
Aug  8 16:36:41 node1 Keepalived_vrrp[7026]: VRRP_Instance(VI_2) Sending gratuitous ARPs on ens33 for 192.168.10.78
Aug  8 16:37:10 node1 Keepalived_vrrp[7026]: VRRP_Instance(VI_2) Received higher prio advert
Aug  8 16:37:10 node1 Keepalived_vrrp[7026]: VRRP_Instance(VI_2) Entering BACKUP STATE
Aug  8 16:37:10 node1 Keepalived_vrrp[7026]: VRRP_Instance(VI_2) removing protocol VIPs.
Aug  8 16:37:10 node1 Keepalived_healthcheckers[7025]: Netlink reflector reports IP 192.168.10.78 removed
Aug  8 16:38:44 node1 Keepalived_vrrp[7026]: VRRP_Script(chk_nginx) failed
Aug  8 16:38:45 node1 Keepalived_vrrp[7026]: VRRP_Instance(VI_1) Received higher prio advert
Aug  8 16:38:45 node1 Keepalived_vrrp[7026]: VRRP_Instance(VI_1) Entering BACKUP STATE
Aug  8 16:38:45 node1 Keepalived_vrrp[7026]: VRRP_Instance(VI_1) removing protocol VIPs.
Aug  8 16:38:45 node1 Keepalived_healthcheckers[7025]: Netlink reflector reports IP 192.168.10.77 removed
[[email protected] ~]# ifconfig     # 查看IP地址
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.6  netmask 255.255.255.0  broadcast 192.168.10.255
        ether 00:0c:29:f7:b3:4e  txqueuelen 1000  (Ethernet)
        RX packets 47288  bytes 21191119 (20.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 45193  bytes 3854623 (3.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 215  bytes 13522 (13.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 215  bytes 13522 (13.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

两个vrrp实例的VIP都不见了。

#重新查看node2上的IP地址

[[email protected] ~]# ifconfig 
ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.8  netmask 255.255.255.0  broadcast 192.168.10.255
        ether 00:0c:29:ef:52:87  txqueuelen 1000  (Ethernet)
        RX packets 62612  bytes 17562546 (16.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 30521  bytes 2712799 (2.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens34:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.77  netmask 255.255.255.255  broadcast 0.0.0.0
        ether 00:0c:29:ef:52:87  txqueuelen 1000  (Ethernet)

ens34:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.78  netmask 255.255.255.255  broadcast 0.0.0.0
        ether 00:0c:29:ef:52:87  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 335  bytes 21247 (20.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 335  bytes 21247 (20.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

两个vrrp实例的VIP都漂移到node2去了。

当然,本配置示例中自定义的vrrp_script过于简单,此处提供一个vrrp_script监控脚本,仅供参考。

[[email protected] ~]# vim /etc/keepalived/vrrp_script.sh 
#!/bin/bash
#
server=nginx

restart_server() {
    if ! systemctl restart $server &> /dev/null; then
        sleep 1
        return 0
    else
        exit 0
    fi
}

if ! killall -0 $server &> /dev/null; then
    restart_server
    restart_server
    restart_server
    [ $? -ne 0 ] && exit 1 || exit 0
fi

在keepalived.conf配置文件中需要指明脚本路径。

[[email protected] ~]# vim /etc/keepalived/keepalived.conf
...(其他省略)...
vrrp_script chk_nginx {
    script "/etc/keepalived/vrrp_script.sh"
    interval 2
    weight -5
}
...(其他省略)...

实验完成!

时间: 2024-10-17 03:03:45

配置Keepalived双实例高可用Nginx的相关文章

nginx+keepalived双主高可用负载均衡

实验环境及软件版本:CentOS版本: 6.6(2.6.32.-504.el6.x86_64)nginx版本: nginx-1.6.3keepalived版本:keepalived-1.2.7 主LB1:LB-110-05 主LB2:LB-111-06 一.安装准备及依赖(用SecureCRT的交互窗口同时对两台LB操作,只贴出LB1的操作过程在此) [[email protected] ~]# mkdir tools [[email protected] ~]# mkdir /applicat

[转] Haproxy、Keepalived双主高可用负载均衡

http://blog.chinaunix.net/uid-25266990-id-3989321.html 在测试了Nginx+Keepalived的负载均衡后,也对Haproxy+Keepalived双主模式做了测试,双主的模式充分利用了服务器资源,这样不会导致服务器浪费. 这里举例说明: 默认情况下,第一台负载均衡器主要分发www.zhirs.com的请求,第二台负载均衡器主要分发img.zhirs.com的请求. 任意一台宕机都不会影响网站分发. 实验环境 VIP1=192.168.13

Haproxy、Keepalived双主高可用负载均衡

一.HAPROXY介绍 提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的负载均衡软件. 它是免费.快速并且可靠的一种解决方案 特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理 二.衡量负责均衡器性能的因素 Session rate 会话率 – 每秒钟产生的会话数 Session concurrency 并发会话数 – 服务器处理会话的时间越长,并发会话数越多 Data rate 数据速率 – 以MB/s或Mbps衡量 – 大的对象导致并发会话数增加

配置Keepalived实现HTTPD高可用

一.环境说明 安装环境: 主机名 主机IP地址 集群角色 集群服务 虚拟IP地址 keepalived-master 192.168.1.1 MASTER(主节点) HTTPD 192.168.1.3 keepalived-backup 192.168.1.2 BACKUP(备用节点) HTTPD 官方地址:http://www.keepalived.org/ 一.软件部署 分别在keepalived-master 与 keepalived-backup 安装keepalived软件 yum i

MySQL集群(四)之keepalived实现mysql双主高可用

前面大家介绍了主从.主主复制以及他们的中间件mysql-proxy的使用,这一篇给大家介绍的是keepalived的搭建与使用! 一.keepalived简介 1.1.keepalived介绍 Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三.第四层.第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常, 或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完

Keepalived+Nginx实现双主高可用负载均衡

Keepalived+Nginx实现双主高可用负载均衡 一.部署Nginx+keepalived高可用有两种配置方案: 1.Nginx+keepalived 主从配置 前端使用两台机器,使用一个VIP,即其中一台为主负责全部请求,一台为备,只用在主出现故障时,才会替代主处理请求,平常处于闲置状态,此方案不够理想.  2.Nginx+keepalived 双主配置 前端使用2台机器,使用两个VIP,互为主备,不考虑其他情况时均衡处理请求,当其中一台机器出现故障时,另一台负责处理对两台机器的请求,此

keepalived双主模式实现nginx高可用及LNAMMP架构

keepalived双主模式实现nginx高可用及LNAMMP架构 一.利用keepalived实现nginx调度器高可用: 二.构建LNAMMP架构: 1) Nginx既是前端调度器,又是缓存服务器: 2) 将php的session缓存于memcached中: 3) 在Apache和php上部署Discuz论坛程序: 4) 使用https连接,即使用户使用的是http协议也可以以https协议进行访问: ---------------------------------------------

Keepalived+MariaDB10配置双主高可用数据库

Keepalived+MariaDB10配置双主高可用数据库 OS RS 子网掩码 路由网关 Centos6.6 MariaDB10 Keepalived Eth0:192.168.26.210 255.255.252.0 192.168.25.3 VIP:192.168.27.210 255.255.255.252 Centos6.6 MariaDB10 Keepalived Eth0:192.168.26.211 255.255.252.0 192.168.25.3 VIP:192.168.

配置MySQL实现主主互备模式并利用keepalived实现双主高可用

每台主机均需安装keepalived,mysql,安装过程这里不多介绍,不懂的可自行百度. 本次配置的环境为 DB1:192.168.31.190                DB2:192.168.31.184        MySQL VIP:192.168.31.189 1.修改MySQL配置文件 首先修改DB1的/etc/my.cnf配置文件,在"[mysqld]"段中添加一下内容: server-id = 1 log-bin=mysql-bin relay-log = my