服务器之家:专注于服务器技术及软件下载分享
分类导航

云服务器|WEB服务器|FTP服务器|邮件服务器|虚拟主机|服务器安全|DNS服务器|服务器知识|Nginx|IIS|Tomcat|

服务器之家 - 服务器技术 - Nginx - Keepalived实现Nginx负载均衡高可用的示例代码

Keepalived实现Nginx负载均衡高可用的示例代码

2020-06-13 23:57庐州书院 Nginx

这篇文章主要介绍了Keepalived实现Nginx负载均衡高可用的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

第一章:keepalived介绍

VRRP协议
目的就是为了解决静态路由单点故障问题的

第二章: keepalived工作原理

2.1 作为系统网络服务的高可用功能(failover)

keepalived高可用功能实现的基本原理为:
两台主机同时安装好keepalived软件并启动服务,开始正常工作时
角色为Master的主机获得所有资源并对用户提供服务
角色为Backup的主机作为Master主机的热备;

当角色为Master的主机失效或出现故障时
角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务

而当角色为Master的主机故障修复后,又会自动接管回他原来处理的工作
角色为Backup的主机则同时释放Master主机失效时他接管的工作
此时,两台主机将恢复到启动时各自的原始角色及工作状态

2.2 什么是VRRP
VRRP,全称Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议
 VRRP的出现就是为了解决静态路由的单点故障问题
 VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的.

VRRP通过竞选机制来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(Multicast)包(默认的多播地址224.0.0.18)形式发送的
 虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址,:00-00-5E-00-01-{VRID}.
 所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MAC和IP(称之为VIP).
 客户端主机并不需要因Master的改变修改自己的路由配置.对它们来说,这种切换是透明的.

在一组虚拟路由器中,只有作为Master的VRRP路由器会一直发送VRRP广播包,此时Backup不会抢占Master
 当Master不可用时,Backup就收不到来自Master的广播包了,此时多台Backup中优先级最高的路由器会抢占为Master.
 这种抢占是非常快速的(可能只有1秒甚至更少),以保证服务的连续性,处于安全性考虑,VRRP数据包使用了加密协议进行了加密.

2.3 面试的时候怎么说
解答:
keepalived高可用对之间是通过VRRP通信的,因此,我从VRRP开始给您讲起.
1)VRRP,全称Virtual Router Reduancy Protocol,中文名为虚拟路由器冗余协议,VRRP的出现是为了解决静态路由的单点故障,
2)VRRP是通过一种竞选协议来将路由任务交给某台VRRP路由器的,
3)VRRP用IP多播的方式,(默认多播地址(224.0.0.18))实现高可用对之间通信.
4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的包的时候,就启动接管程序接管主节点的资源.备节点可以有多个,通过优先级竞选,但一般keepalived系统运维工作中都是一对.
5)VRRP使用了加密协议加密数据,但keepalived官方目前还是推荐用明文的方式配置认证类型和密码.
介绍完了VRRP,接下来我在介绍一下keepalived服务的工作原理;
keepalived高可用对之间是通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务.
在keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备他还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性,接管速度最快可以小于一秒

第三章: VRRP协议
VRRP通过竞选机制来实现虚拟路由器的功能
所有的协议报文都是通过IP多播(Multicast)包
默认的多播地址224.0.0.18

VIP前提条件:
1.虚拟公网IP必须是真实可用的
2.虚拟公网IP不能重复
3.组播地址必须是可以通讯的

第四章:keepalived安装配置

1.安装keepalived

?
1
yum install keepalived -y

2.配置文件解释

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
global_defs { 
  router_id lb01  #设置路由ID,每个主机不一样
}
 
vrrp_instance VI_1 { #设置VRRP组名,同一组组名相同
  state MASTER  #设置角色状态,分为MASTER BACKUP
    interface eth0 #VIP绑定的网卡
    virtual_router_id 50 #虚拟路由id,同一组一样
    priority 150 #权重,权重越高,优先级越高
    advert_int 1 #发送组播间隔
    authentication { #设置验证,密码为明文
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress { #设定的虚拟IP,这个虚拟IP必须是存在且合法且没有被使用的。
      10.0.0.3
    }
}

3.lb01配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
  router_id lb01
}
 
vrrp_instance VI_1 {
  state MASTER
    interface eth0
    virtual_router_id 50
    priority 150
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
      10.0.0.3
    }
}

4.lb02配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
  router_id lb02
}
 
vrrp_instance VI_1 {
  state BACKUP
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
      10.0.0.3
    }
}

5.启动

?
1
systemctl start keepalived

6.测试
关掉任意一台,观察VIP是否会漂移
恢复MASTER观察BACKUP的VIP是否会消失

第五章:脑裂现象

1.安装抓包工具

?
1
yum install tcpdump -y

2.lb02抓包查看

?
1
tcpdump -nn -i any host 224.0.0.18

3.lb02新开一个终端,然后开启防火墙

?
1
systemctl start firewalld.service

4.lb02观察抓包现象
观察是否两边都有VIP

5.添加放行规则

?
1
2
3
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
systemctl reload firewalld

6.lb02观察抓包现象
观察是否两边都有VIP

第六章:keepalived双主实验
1.lb01配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
  router_id lb01
}
 
vrrp_instance VI_1 {
  state MASTER
    interface eth0
    virtual_router_id 50
    priority 150
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
      10.0.0.3
    }
}
 
vrrp_instance VI_2 {
  state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 2222
    }
    virtual_ipaddress {
      10.0.0.4
    }
}

2.lb02配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
  router_id lb02
}
 
vrrp_instance VI_1 {
  state BACKUP
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
      10.0.0.3
    }
}
 
vrrp_instance VI_2 {
  state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 2222
    }
    virtual_ipaddress {
      10.0.0.4
    }
}

3.重启keepalived并观察现象

?
1
systemctl restart keepalived

第七章:keepalived结合nginx反向代理负载均衡
lb服务器的Nginx配置:
注意!两台lb服务器的Nginx配置一模一样

1.备份原有配置

?
1
2
3
mkdir /backup
cd /etc/nginx/conf.d
mv * /backup

2.编写Nginx配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@lb01 /etc/nginx/conf.d]# cat proxy.conf
upstream web_pools {
  server 172.16.1.7;
  server 172.16.1.8;
}
 
server {
  listen 80;
  server_name (www|bbs).mysun.com ;
  location / {
   proxy_pass http://web_pools;
   include proxy_params;
  }
}

3.测试并重启nginx

?
1
2
nginx -t
systemctl restart nginx

lb服务器的keepalived配置:

1.lb01的keepalived配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
  router_id lb01
}
 
vrrp_instance VI_1 {
  state MASTER
    interface eth0
    virtual_router_id 50
    priority 150
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
      10.0.0.3
    }
}

2.lb02的keepalived配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
  router_id lb02
}
 
vrrp_instance VI_1 {
  state BACKUP
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
      10.0.0.3
    }
}

web服务器配置:

注意!两台web服务器配置一模一样

1.nginx配置

?
1
2
3
4
5
6
7
8
9
[root@web01 ~]# cat /etc/nginx/conf.d/www.conf
server {
 listen 80;
 server_name www.mysun.com;
 location / {
   root /code;
   index www.html;
 }
}

2.写入测试文件

?
1
echo "$(hostname)" >/code/index.html

第八章: 防裂脑脚本

1.问题现象:
1.nginx挂了,但是keep还活着
2.两边都有VIP

2.思路:
解决nginx挂了问题:
1.编写一个脚本

  • 启动nginx
  • 如果启动2次都失败了,停掉自己的keepalived

2.keepalived定时去调用这个脚本

3.实现:

1.命令如何实现

?
1
systemctl start nginx

2.检查nginx进程

?
1
2
3
4
5
6
7
[root@lb01 ~]# ps -ef|grep nginx|grep -v "grep"
root    1210   1 0 11:21 ?    00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx   1211  1210 0 11:21 ?    00:00:00 nginx: worker process
[root@lb01 ~]# ps -ef|grep nginx|grep -v "grep"|wc -l
2
[root@lb01 ~]# ps -ef|grep nginx|grep -v "grep"|wc -l
0

脚本内容:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@lb01 ~]# cat check_web.sh
!/bin/bash
 
nginx_status=$(ps -C nginx --no-header|wc -l)
 
if [[ ${nginx_status} == 0 ]]
then
  systemctl start nginx &> /dev/null
  sleep 1
  nginx_status=$(ps -C nginx --no-header|wc -l)
  if [[ ${nginx_status} == 0 ]]
  then
    systemctl stop keepalived
  fi
fi

keepalived调用脚本:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
  router_id lb01
}
 
vrrp_script check_web {
  script "/server/scripts/check_web.sh"
  interval 5
  weight 50
}
 
vrrp_instance VI_1 {
  state MASTER
    interface eth0
    virtual_router_id 50
    priority 150
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
      10.0.0.3
    }
 
  track_script {
    check_web
  }
 
}

4.第二个问题:脑裂问题
两边都有VIP

现象:
2边都有VIP
2边Nginx都活着

对面的MASTER的Nginx还活着

?
1
curl -I -s -w "%{http_code}\n" -o /dev/null 10.0.0.5

但是我又有了VIP

?
1
ip a |grep "10.0.0.3"|wc -l

我就把自己干掉

?
1
2
systemctl stop nginx
systemctl stop keepalived

脚本内容:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@lb02 /server/scripts]# cat check_vip.sh
 
#!/bin/bash
 
master_status=$(curl -I -s -w "%{http_code}\n" -o /dev/null 10.0.0.5)
 
my_vip=$(ip a |grep "10.0.0.3"|wc -l)
 
if [ ${master_status} == 200 -a ${my_vip} == 1 ]
then
  systemctl stop nginx
  systemctl stop keepalived
fi

keepalived配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
  router_id lb02
}
 
vrrp_script check_web {
  script "/server/scripts/check_web.sh"
  interval 5
  weight 50
}
 
vrrp_script check_vip {
  script "/server/scripts/check_vip.sh"
  interval 5
  weight 50
}
 
vrrp_instance VI_1 {
  state BACKUP
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
      10.0.0.3
    }
  track_script {
    check_web
    check_vip
  }
}

到此这篇关于Keepalived实现Nginx负载均衡高可用的示例代码的文章就介绍到这了,更多相关Keepalived Nginx负载均衡高可用内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/centlnx/p/12728870.html

延伸 · 阅读

精彩推荐
  • NginxNginx Rewrite使用场景及代码案例详解

    Nginx Rewrite使用场景及代码案例详解

    这篇文章主要介绍了Nginx Rewrite使用场景及代码案例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可...

    盗哥泡茶去了11862020-09-27
  • NginxNginx location 和 proxy_pass路径配置问题小结

    Nginx location 和 proxy_pass路径配置问题小结

    本文是基于 location 的匹配末尾是否配置 / 和 proxy_pass 末尾是否配置 / ,进行测试,完全还原了整个测试过程,本文给大家介绍Nginx location 基本配置及相关配...

    自由早晚乱余生18742021-09-24
  • Nginx通过Nginx规则重写URL去掉index.php不显示index.php

    通过Nginx规则重写URL去掉index.php不显示index.php

    Nginx不仅占用内存少,并发能力强,而且拓展功能丰富,可以通过安装模板来强化功能,也能通过规则优化,优化服务器并发处理能力,是建站的不二之选...

    Genius日记5872020-10-16
  • Nginx利用nginx和腾讯云免费证书制作https的方法

    利用nginx和腾讯云免费证书制作https的方法

    这篇文章主要介绍了利用nginx和腾讯云免费证书制作https的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    dalaoyang5992019-12-30
  • Nginxnginx ssl免密码重启教程详解

    nginx ssl免密码重启教程详解

    这篇文章给大家介绍了nginx 如何启动以及nginx ssl 免密码重启 的方法,非常不错,具有参考借鉴价值,需要的朋友参考下吧 ...

    mrr4272019-11-19
  • NginxNginx动静分离实现案例代码解析

    Nginx动静分离实现案例代码解析

    这篇文章主要介绍了Nginx动静分离实现案例代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参...

    盗哥泡茶去了3382020-09-27
  • Nginxnginx rewrite 伪静态配置参数和使用例子

    nginx rewrite 伪静态配置参数和使用例子

    nginx下伪静态配置参数详细说明,使用nginx的朋友,nginx rewrite 伪静态配置参数和使用例子 附正则使用说明 ...

    服务器之家3102019-10-08
  • Nginx如何优化Nginx的处理性能

    如何优化Nginx的处理性能

    Nginx是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性,在连接高并发的情况下,Nginx是Apache服务不错的替代品。其特点是占有内存少,...

    Dockone.io5142020-12-11