Ubuntu下keepalived和nginx实现高可用性负载均衡

Posted bkzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ubuntu下keepalived和nginx实现高可用性负载均衡相关的知识,希望对你有一定的参考价值。

概述

1. 前导知识

Ubuntu安装keepalived
Ubuntu安装nginx并配置负载均衡

2. 本文项目目标

在Ubuntu下使用keepalived和nginx搭建高可用性负载均衡。keepalived虚拟IP为192.168.229.130,两台服务器的IP地址分别为192.168.229.128,192.168.229.129。两台服务器中81端口模拟网站,80端口为负载均衡端口。负载均衡的配置详情请参见《Ubuntu安装nginx并配置负载均衡

3. 系统环境

Ubuntu 20.04.2 LTS 桌面版(192.168.229.128)
Ubuntu 20.04.2 LTS 服务器版(192.168.229.129)

配置nginx负载均衡

Ubuntu安装nginx并配置负载均衡》中,配置完成了一台服务器(192.168.229.128)的负载均衡,参照文章继续配置192.168.229.129服务器的负载均衡:

sudo vim /etc/nginx/conf.d/ningx.conf


保存后,重启 nginx。
测试192.168.229.129服务器的负载均衡:

至此,192.168.229.128,192.168.229.129两台服务器的负载均衡全部配置完成。

安装配置keepalived

1. 安装

参照Ubuntu安装keepalived

sudo apt-get install keepalived

2. 设置随系统自启动

  • 编辑 /etc/rc.local文件
sudo vim /etc/rc.local

在文件中增加一行service keepalived start &

#!/bin/sh -e
# 上面一行不要删除
# 服务类要以 & 结尾一行,表示不要等待运行结束
service keepalived start &
 
#文末必须以exit 0结束
exit 0

3. keepalived的配置

编辑配置文件:

sudo vim /etc/keepalived/keepalived.conf

3.1 keepalived配置说明

! Configuration File for keepalived 
global_defs 
   #检测到realserver或者负载均衡出现故障后, 通知的邮箱地址
   notification_email 
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   
   #发送通知的邮箱的地址
   notification_email_from Alexandre.Cassen@firewall.loc
   #利用的stmp服务器地址
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   #自定义主机名,建议使用IP地址
   router_id 192.168.229.128
   vrrp_skip_check_adv_addr 
   vrrp_iptables
   vrrp_garp_interval 0
   vrrp_gna_interval 0

#预先定义一个脚本,方便后面调用,也可以定义多个,方便选择;
vrrp_script chk_nginx 
    script "/etc/keepalived/nginx_chk.sh"  #具体脚本路径
    interval 2  #脚本循环运行间隔,s

#一个虚拟路由器组的物理实例, 同一组KA里的实例不能重名
vrrp_instance VI_1
	#当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP
    state MASTER
    #非抢占模式;如果开启非抢占模式,上面的state需要都配置城BACKUP,利用优先级确定谁是MASTER
    #nopreempt 
     #绑定为当前虚拟路由器使用的物理接口,需要据实查询填写
    interface ens33
     #当前虚拟路由器惟一标识,也叫做分组名称,该组内的设备需要相同,范围是0-255
    virtual_router_id 100
    #当前物理节点在此虚拟路由器中的优先级,值越大优先级越大;范围1-254
    priority 101
    #vrrp通告的时间间隔,默认1s, 谁的优先级高, vip跑在哪个节点上, 就由哪个节点发送通告, backup节点接收通告。组内要一致
    advert_int 1
    #设置验证信息,组内一致
    authentication 
    	#有PASS 和 AH 两种,常用 PASS
        auth_type PASS
        #仅前8位字符有效, 每一组负载均衡器使用相同的密码即可
        auth_pass 1111
    
    #虚拟IP, 要和服务器在同一个网段, 能和服务器网关进行通信的, 而且是没有被占用的
    #可以设置多个IP
    virtual_ipaddress 
        192.168.229.130
    
     #使用在这个域中使用预先定义的脚本,上面定义的
    track_script    
        chk_nginx
    
    #当前节点成为主节点时触发的脚本
    #notify_master <STRING>|<QUOTED-STRING>
    #当前节点称为备用节点时触发的脚本
    #notify_backup <STRING>|<QUOTED-STRING>
    #当前节点转为“失败”状态时触发的脚本 
    # 一般不会使用, 一般一个节点不是master就是backup状态, 
    #很少出现fault, 除非是ip地址冲突或者资源不足, 导致角色切换失败会出现fault状态
    #notify_fault <STRING>|<QUOTED-STRING>
    #通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知
    #notify <STRING>|<QUOTED-STRING>

3.2 去除注释的精简版配置

  • 服务器192.168.229.128使用的配置文件:
global_defs 
   router_id 192.168.229.128

vrrp_script chk_nginx 
    script "/etc/keepalived/nginx_chk.sh"  
    interval 2  

vrrp_instance VI_1
    state MASTER
    interface ens33
    virtual_router_id 100
    priority 101
    advert_int 1
    authentication 
        auth_type PASS
        auth_pass 1111
    
    virtual_ipaddress 
        192.168.229.130
    
    track_script    
        chk_nginx
    

  • 服务器192.168.229.129使用的配置文件:
global_defs 
   router_id 192.168.229.129

vrrp_script chk_nginx 
    script "/etc/keepalived/nginx_chk.sh"  
    interval 2  

vrrp_instance VI_1
    state BACKUP
    interface ens33
    virtual_router_id 100
    priority 101
    advert_int 1
    authentication 
        auth_type PASS
        auth_pass 1111
    
    virtual_ipaddress 
        192.168.229.130
    
    track_script    
        chk_nginx
    

  • 其中,interface参数的值ens33要通过ifconfig指令查询,找到要进行虚拟化的物理网卡的名称。
ifconfig

3.3 nginx_chk脚本

  • 脚本文件
    脚本文件/etc/keepalived/nginx_chk.sh用于检查nginx相关服务器是否启动,如果没有启动则重启。如果重启不成功,则杀死keepalived服务,切换到备用服务
#!/bin/bash
#上面这句注释不可删除
#检查是否有nginx相关的进程
A=`ps -C nginx --no-header |wc -l`
#如果没有  
if [ $A -eq 0 ];then
	# 重启nginx,延迟2秒 
    service nginx restart
    sleep 2  
    # 重新检查是否有nginx相关的进程
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then  
    	# 仍然没有nginx相关的进程,杀死当前keepalived,切换到备用机
        killall keepalived  
    fi  
fi 
  • 为脚本文件添加执行权限
sudo chmod +x /etc/keepalived/nginx_chk.sh
  • 测试脚本,如果有错误会输出错误信息,没有错误什么也不输出
cd /etc/keepalived
./nginx_chk.sh

  • 两台服务器都要添加这个脚本和权限。

4. 重启keepalived

sudo service keepalived restart

5. 检查keepalived重启是否成功

systemctl status keepalived.service
  • 不成功的例子
    如果不成功,根据提示信息检查哪里有错误
  • 成功的例子

测试

1. 检查虚拟IP是否设置成功,以及能否切换

ip a

192.168.229.128的虚拟IP已经设置进来了:

192.168.229.129(BACKUP)上没有虚拟IP:

停掉Master的keepalived再检查

sudo service keepalived stop
ip a

Master的虚拟IP没有了:

backup上有了虚拟IP:

2. 检查页面能否访问

  • 先将上面停掉的master上的keepalived启动起来
sudo service keepalived start
  • 通过虚拟IP 192.168.229.130访问页面:

  • 停掉master上的keepalived,再次通过虚拟IP访问页面,仍然能正常

3. 检查停掉nginx后是否能自动重启

  • 在任意master或者backup上停止掉nginx:
sudo service nginx stop
  • 再次通过虚拟IP访问页面,应仍能访问到不断切换的两个页面

结论

高可用性负载均衡配置成功

参考文献

Keepalived安装和基础功能实现
centos7安装keepalived记录最新版踩坑
Nginx+keepalived双机热备(主从模式)
Ubuntu下运行.sh文件

以上是关于Ubuntu下keepalived和nginx实现高可用性负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

nginx+keepalived实现高可用负载均衡

ubuntu 14.04.3 LTS 版本 通过 nginx + keepalived 配置 高可用 负载均衡集群演示

Keepalived+Nginx实现高可用(HA)

Keepalived+Nginx实现高可用(HA)

初识keepalived——keepalived与nginx代理实现高可用

Nginx+keepalived高可用(双主模式)