Keepalived

发布时间 2023-07-21 16:57:40作者: ArMinLi

一、keepalived简介

概述:

keepalived起初为Lvs设计的一款强大的辅助工具,保证LB负载调度器的故障切换以及RS节点的健康状态检查,后续被应用到很多需要容错的场景下,keepalived自身基于VRRP协议--虚拟路由冗余协议,思科公有协议。

二、keepalived设计原理

2.1 为什么keepalived能够实现高可用呢?

因为他用到了虚拟路由冗余协议(VRRP)

2.2 keepalived有哪些设计模块?

core模块 //为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析

check模块 //负责real server 节点池内的节点的健康检测

VRRP模块 //在master与backup之间执行心跳检测

2.3 keepalived的热备实现过程

  • 将多个主机以软件的方式组成一个热备组,通过共有的虚拟ip(VIP)地址对外提供服务,同一时刻,热备组中只有一台主机在工作,别的主机冗余状态,当当前在线的主机失效时,其他冗余的主机会自动接替虚拟ip地址,继续提供服务,以保证架构的稳定性。

三、VRRP协议

3.1 简介

VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议。

VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个),而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,或者是通过算法选举产生,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;其他设备不拥有该IP,状态是BACKUP,除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。

配置VRRP协议时需要配置每个路由器的虚拟路由器ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0~255的正整数;同一组中的路由器通过使用优先权值来选举MASTER,优先权大者为MASTER,优先权也是一个0~255的正整数。

VRRP协议使用多播数据来传输VRRP数据,VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址,VRRP运行时只有MASTER路由器定时发送VRRP通告信息,表示MASTER工作正常以及虚拟路由器IP(组),BACKUP只接收VRRP数据,不发送数据,如果一定时间内没有接收到MASTER的通告信息,各BACKUP将宣告自己成为MASTER,发送通告信息,重新进行MASTER选举状态。

VRRP的工作过程为:

  1. 虚拟路由器中的路由器根据优先级选举出Master。Master 路由器通过发送免费ARP 报文,将自己的虚拟MAC 地址通知给与它连接的设备或者主机,从而承担报文转发任务;

  2. Master 路由器周期性发送VRRP 报文,以公布其配置信息(优先级等)和工作状况;

  3. 如果Master 路由器出现故障,虚拟路由器中的Backup 路由器将根据优先级重新选举新的Master;

  4. 虚拟路由器状态切换时,Master 路由器由一台设备切换为另外一台设备,新的Master 路由器只是简单地发送一个携带虚拟路由器的MAC 地址和虚拟IP地址信息的免费ARP 报文,这样就可以更新与它连接的主机或设备中的ARP 相关信息。网络中的主机感知不到Master 路由器已经切换为另外一台设备。

  5. Backup 路由器的优先级高于Master 路由器时,由Backup 路由器的工作方式(抢占方式和非抢占方式)决定是否重新选举Master。

3.2 VRRP的几个术语

  • 虚拟路由器:由一个Master路由器和多个Backup路由器组成。主机将虚拟路由器当作默认网关。
  • 虚拟路由器标识 VRID:虚拟路由器的标识。由相同VRID的一组路由器构成一个虚拟路由器。
  • Master路由器:虚拟路由器中承担报文转发任务的路由器。
  • Backup路由器:Master路由器出现故障时,能够代替Master路由器工作的路由器。
  • 虚拟IP地址:虚拟路由器的IP地址。一个虚拟路由器可以拥有一个或多个IP地址。
  • 优先级:VRRP根据优先级来确定虚拟路由器中每台路由器的地位。
  • 虚拟MAC地址:一个虚拟路由器拥有一个虚拟MAC地址。虚拟MAC地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址。

四、keepalived架构图

4.1 示图

4.2 各组件说明

组件说明
checkers 检查后端RS的健康状态,并且也能管理后端RS,该组件使用独立的子进程负责,由父进程管理。
VRRPstack 基于VRRP协议实现高可用的组件,它能够提供故障转移功能,并且能单独使用,即不对后端做健康检查,运行为一个独立的子进程由父进程管理
System Call 提供读取自定义脚本的功能
IPVS wrapper 能够读取配置文件的规则,通过系统调用直接管理ipvs
NetlinkReflector 用于管理和检查VIP地址
Watch Dog 用于检查Checkers和VRRPstack进程

五、Keepalived 实现双机热备

  • 案例环境
系统类型 IP地址 主机名 软件包
Centos7 192.168.2.1 keep01 keepalived-1.2.13.tar.gz
Centos7 192.168.2.2 keep02 keepalived-1.2.13.tar.gz

5.1 两台节点上部署httpd服务

//keep01节点
[root@keep01 ~]# yum -y install httpd
[root@keep01 ~]# systemctl start httpd;systemctl enable httpd
[root@keep01 ~]# netstat -utpln |grep 80
[root@keep01 ~]# cat <<END > /var/www/html/index.html
<h1> 192.168.2.1 </h1>
END

//keep02节点
[root@keep02 ~]# yum -y install httpd
[root@keep01 ~]# systemctl start httpd;systemctl enable httpd
[root@keep02 ~]# netstat -utpln |grep 80
[root@keep02 ~]# cat <<END > /var/www/html/index.html
<h1> 192.168.2.2 </h1>
END
  • 访问查看一下

5.2 两台节点上安装keepalived(操作相同)

5.2.1 下载官方的软件包并解压

[root@keep01 ~]# wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
[root@keep01 ~]# tar -xf keepalived-1.2.13.tar.gz -C /usr/src/
[root@keep01 ~]# cd /usr/src/keepalived-1.2.13/

5.2.2 YUM安装依赖包

//安装内核开发包,popt支持库等工具;如果安装不上,请使用阿里的yum源
[root@keep01 keepalived-1.2.13]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum makecache
[root@keep01 keepalived-1.2.13]# yum -y install kernel-devel openssl-devel popt-devel

5.2.3 配置、编译、安装

[root@keep01 keepalived-1.2.13]# ./configure --prefix=/usr/local/keepalived
[root@keep01 keepalived-1.2.13]# make &&make install && cd

5.2.4 安装后产生的目录

  • 安装完成后会在keepalived家目录生成这 bin etc sbin share 这 4 个目录。
  • 其中一个是主配置文件(keepalived.conf)在 /usr/local/keepalived/etc/keepalived/ 这个路径下
  • 还有一个是启动文件(keepalived)在 /usr/local/keepalived/etc/rc.d/init.d/ 这个路径下

5.2.5 将上面相关的文件拷贝到对应目录下

//创建keepalived主配置文件目录
[root@keep01 ~]# mkdir -p /etc/keepalived
//主配置文件
[root@keep01 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
//启动时需要加载的配置文件
[root@keep01 ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
//服务的控制脚本
[root@keep01 ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
//优化keepalived的命令
[root@keep01 ~]# ln -s /usr/local/keepalived/sbin/* /usr/bin/
//给启动脚本指定权限
[root@keep01 ~]# chmod 755 /etc/init.d/keepalived
//查看一下keepalived版本
[root@keep02 ~]# keepalived -v
Keepalived v1.2.13 (05/16,2020)

5.2.6 配置文件详解

  • 默认的配置文件中,使用第三方smtp服务器,但这在现实中几乎没有意义(需要验证的原因),我们将其指定为localhost, 将通知信息的发送交给本地sendmail服务处理。查阅说明文档得知route_id配置是为了标识当前节点,我将其设置为NodeA。当然两个节点的此项设置可相同,也可不相同。

  • Keepalived的配置文件分为3部分:

    • 全局定义本分
    • VRRPD部分
    • virtual_server部分
! Configuration File for keepalived
global_defs {                                   #全局定义部分
    notification_email {                        #设置报警邮件地址,可设置多个
        acassen@firewall.loc                    #接收通知的邮件地址
    }
    notification_email_from test0@163.com       #设置 发送邮件通知的地址
    smtp_server smtp.163.com                    #设置 smtp server 地址,可是ip或域名.可选端口号 (默认25)
    smtp_connect_timeout 30                     #设置 连接 smtp server的超时时间
    router_id LVS_DEVEL                         #主机标识,用于邮件通知
    vrrp_skip_check_adv_addr                   
    vrrp_strict                                 #严格执行VRRP协议规范,此模式不支持节点单播
    vrrp_garp_interval 0                       
    vrrp_gna_interval 0     
    script_user keepalived_script               #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
    enable_script_security                      #如过路径为非root可写,不要配置脚本为root用户执行。
}       

vrrp_script chk_nginx_service {                 #VRRP 脚本声明
    script "/etc/keepalived/chk_nginx.sh"       #周期性执行的脚本
    interval 3                                  #运行脚本的间隔时间,秒
    weight -20                                  #权重,priority值减去此值要小于备服务的priority值
    fall 3                                      #检测几次失败才为失败,整数
    rise 2                                      #检测几次状态为正常的,才确认正常,整数
    user keepalived_script                      #执行脚本的用户或组
}                                             

vrrp_instance VI_1 {                            #vrrp 实例部分定义,VI_1自定义名称
    state MASTER                                #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
    interface ens33                             #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
    virtual_router_id 51                        #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
    priority 100                                #定义优先级,数字越大,优先级越高。
    advert_int 1                                #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
    authentication {                            #设置验证类型和密码,两个节点必须一致
        auth_type PASS                        
        auth_pass 1111                        
    }                                         
    virtual_ipaddress {                         #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        192.168.119.130                       
    }
    track_script {                              #脚本监控状态
        chk_nginx_service                       #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
    }
        notify_master "/etc/keepalived/shell.sh start"     #当前节点成为master时,通知脚本执行任务
        notify_backup "/etc/keepalived/shell.sh stop"      #当前节点成为backup时,通知脚本执行任务
        notify_fault  "/etc/keepalived/shell.sh stop"      #当当前节点出现故障,执行的任务; 
}                                             

virtual_server 192.168.119.130 80  {     #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
    delay_loop 6                         #每隔6秒查询realserver状态
    lb_algo rr                           #后端调试算法(load balancing algorithm)
    lb_kind DR                           #LVS调度类型NAT/DR/TUN
    #persistence_timeout 60              #同一IP的连接60秒内被分配到同一台realserver
    protocol TCP                         #用TCP协议检查realserver状态
    real_server 192.168.119.120 80 {          
        weight 1                         #权重,最大越高,lvs就越优先访问
        TCP_CHECK {                      #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 10           #10秒无响应超时
            retry 3                      #重连次数3次
            delay_before_retry 3         #重连间隔时间
            connect_port 80              #健康检查realserver的端口
        }                                     
    }                                         
    real_server 192.168.119.121 80 {          
        weight 1                         #权重,最大越高,lvs就越优先访问
        TCP_CHECK {                      #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 10           #10秒无响应超时
            retry 3                      #重连次数3次
            delay_before_retry 3         #重连间隔时间
            connect_port 80              #健康检查realserver的端口
        }                                     
    }                                         
}                                             

vrrp_instance VI_2 {                     #vrrp 实例部分定义,VI_1自定义名称
    state   BACKUP                       #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP 分别表示(主|备)
    interface ens33                      #网卡设置,绑定vip的子接口,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
    virtual_router_id 52                 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
    priority 90                          #定义优先级,数字越大,优先级越高。
    advert_int 1                         #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
    authentication {                     #设置验证类型和密码,两个节点必须一致
        auth_type PASS                        
        auth_pass 1111                        
    }                                         
    virtual_ipaddress {                  #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        192.168.119.131                       
    }                                         
}                                             

virtual_server 192.168.119.131 80 {      #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
    delay_loop 6                         #每隔6秒查询realserver状态
    lb_algo rr                           #后端调试算法(load balancing algorithm)
    lb_kind DR                           #LVS调度类型NAT/DR/TUN
    #persistence_timeout 60              #同一IP的连接60秒内被分配到同一台realserver
    protocol TCP                         #用TCP协议检查realserver状态
    real_server 192.168.119.120 80 {          
        weight 1                         #权重,最大越高,lvs就越优先访问
        TCP_CHECK {                      #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 10           #10秒无响应超时
            retry 3                      #重连次数3次
            delay_before_retry 3         #重连间隔时间
            connect_port 80              #健康检查realserver的端口
        }                                     
    }                                         
    real_server 192.168.119.121 80 {          
        weight 1                         #权重,最大越高,lvs就越优先访问
        TCP_CHECK {                      #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 10           #10秒无响应超时
            retry 3                      #重连次数3次
            delay_before_retry 3         #重连间隔时间
            connect_port 80              #健康检查realserver的端口
        }
    }
}

5.3 配置keep01的master主节点

  • 修改keepalived.conf配置文件
[root@keep01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id kp01                   #本服务器的名称,若环境中有多个keepalived时,此名称不能一致
}

vrrp_instance VI_1 {                #定义VRRP热备实例,每一个keep组都不同
    state MASTER                    #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
    interface ens32                 #承载VIP地址的物理接口
    virtual_router_id 51            #虚拟路由器的ID号,每一个keep组都不同
    priority 100                    #优先级,数值越大优先级越高,MASTER的优先级必须大于BACKUP的优先级
    advert_int 1                    #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    authentication {                #认证信息
        auth_type PASS              #设置验证类型,主要有PASS和AH两种
        auth_pass 123123            #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
    }
    virtual_ipaddress {             #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        192.168.2.100
    }
}

virtual_server 192.168.2.100 80 {   #设置虚拟服务器,需要指定虚拟IP地址和服务端口
    delay_loop 3                    #每隔3秒检查一次real_server状态
    lb_algo wrr                     #指定lvs的调度算法(如若不结合LVS请删掉此两个配置)
    lb_kind DR                      #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
    persistence_timeout 60          #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。注意:这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作,那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制。
    protocol TCP                    #指定转发协议类型,有TCP和UDP两种

    real_server 192.168.2.1 80 {    #配置服务节点,需要指定real server的真实IP地址和端口
        weight 3                    #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源。
        notify_down /etc/keepalived/check.sh     #指定节点失效后,采用的脚本,notify_up表示节点正常后,采用的脚本;##健康检查方式一共有|HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK|这些。
        TCP_CHECK {                 #realserver的状态检测设置部分,单位是秒
            connect_timeout 10      #连接超时时间
            nb_get_retry 3          #重连次数
            delay_before_retry 3    #重连间隔时间
            connect_port 80         #健康检查端口
        }
    }
}
  • 编写配置文件中指定的check.sh采用脚本
[root@keep01 ~]# vim /etc/keepalived/check.sh
#!/bin/bash
/etc/init.d/keepalived stop
IPV4=`ip a|grep ens32|grep inet|awk '{print $2}'|awk -F'/' '{print $1}'`
echo "$IPV4 (httpd) is down on $(date +%F-%T)" >>/root/check_httpd.log
:wq
[root@keep01 ~]# chmod 777 /etc/keepalived/check.sh
  • 启动主keepalived 并 检查虚拟VIP是否在他这里
[root@keep01 ~]# /etc/init.d/keepalived startStarting keepalived (via systemctl):                       [  确定  ][root@keep01 ~]# ip a |grep 192.168.2.100    inet 192.168.2.100/32 scope global ens32

5.4 配置keep02上backup从节点

[root@keep02 ~]# vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {   router_id kp02}vrrp_instance VI_1 {    state BACKUP    interface ens32    virtual_router_id 51    priority 99    advert_int 1    authentication {        auth_type PASS        auth_pass 123123    }    virtual_ipaddress {        192.168.2.100    }}virtual_server 192.168.2.100 80 {    delay_loop 3    lb_algo wrr    lb_kind DR    persistence_timeout 60    protocol TCP    real_server 192.168.2.2 80 {        weight 3        notify_down /etc/keepalived/check.sh        TCP_CHECK {            connect_timeout 10            nb_get_retry 3            delay_before_retry 3            connect_port 80        }    }}
  • 编写配置文件中指定的check.sh采用脚本
[root@keep02 ~]# vim /etc/keepalived/check.sh#!/bin/bash/etc/init.d/keepalived stopIPV4=`ip a|grep ens32|grep inet|awk '{print $2}'|awk -F'/' '{print $1}'`echo "$IPV4 (httpd) is down on $(date +%F-%T)" >>/root/check_httpd.log:wq[root@keep02 ~]# chmod 777 /etc/keepalived/check.sh
  • 启动主keepalived 并 检查虚拟VIP是否在他这里
[root@keep02 ~]# /etc/init.d/keepalived startReloading systemd:                                         [  确定  ]Starting keepalived (via systemctl):                       [  确定  ][root@keep02 ~]# ip a |grep 192.168.2.100#因为他是备的身份,所以只要在主没出现问题的时候,VIP都不会到他这里来
  • 启动之后会有三个进程

5.5 客户端访问测试双机热备的效果

  • 当master的httpd服务down掉后

  • 查看keep01的keepalived的状态

  • 查看有没有root下有没有生产check_httpd.log日志文件

  • 此时再回到keep02从主机上查看VIP是否会自动漂移过来

可以看到,这里已经实现了双机热备的功能~~~

  • 将keep01节点的http和keepalived服务重新启动
[root@keep01 ~]# systemctl start httpd
[root@keep01 ~]# /etc/init.d/keepalived
startStarting keepalived (via systemctl):                       [  确定  ]
  • 验证虚拟VIP在主keepalived恢复后是否还会飘过来

可以看到,当主keepalived恢复后,VIP会自动再回到他的上面来,下面再来访问一下浏览器

  • 上述步骤实现了keepalived在real server节点池中进行了四层健康监测(传输层,基于协议或者端口号),下面展示keepalived如何对节点池中进行七层健康监测(应用层)
[root@keep01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
   router_id r1
}

vrrp_script_check_apache {
   script/etc/keepalived/check_apache.sh
   interval 2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens32
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123123
    }
    virtual_ipaddress {
        192.168.2.100
    }
    track_script {
        check_apache
    }
}

virtual_server 192.168.2.100 80 {
    protocol TCP
    real_server 192.168.2.1 80 {
        weight 3
    }
}

[root@keep01 ~]# vi /etc/keepalived/check_apache.sh
#!/bin/bash
Count1= `netstat -anpt|grep -v grep|grep httpd|wc -l`
if [ $Count1 -eq 0 ];then
       /etc/init.d/keepalived stop
fi

#重启服务就行了

六、脑裂是什么?【重点】

  • 脑裂:经常会出现在高可用软件身上,什么是脑裂?也就是主从上都有vip,那是怎么导致
    的这种情况?网络波动、抖动导致的。
  • 怎么解决这种问题?
    • 直接重启keepalived服务【不建议】
    • 给中从做一个机制策略,仲裁,给中从写入一个脚本,让他俩定时ping自己的网关,以但一方ping不通的时候,就把这一方的keepalived服务停掉。【建议】

keepalived实战案例

案例(一)

  • LVS+Keepalived实现高可用负载均衡

  • 架构图如下:

  • 环境准备
主机名 / 角色 操作系统 IP地址 软件包
keep01 / LB-MASTER Centos7.4_3.10 X86 192.168.1.1 keepalived-1.2.13.tar.gz
keep02 / LB-BACKUP Centos7.4_3.10 X86 192.168.1.2 keepalived-1.2.13.tar.gz
web01 / RS-WEBSERVER Centos7.4_3.10 X86 192.168.1.3 apache或者nginx
web02 / RS-WEBSERVER Centos7.4_3.10 X86 192.168.1.4 apache或者nginx
client01 / 测试 Centos7.4_3.10 X86 192.168.1.5 curl 或者 wget

1. 在两台web主机上安装httpd服务

yum -y install httpd
systemctl start httpd;systemctl enable httpd
[root@web01 ~]# echo '<h1> RS-web01_192.168.2.3 </h1>' > /var/www/html/index.html
[root@web02 ~]# echo '<h1> RS-web02_192.168.2.4 </h1>' > /var/www/html/index.html

2. 在两台keep主机上安装keepalived和ipvsadm管理工具(相同配置)

[root@keep01 ~]# wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
[root@keep01 ~]# tar -xf keepalived-1.2.13.tar.gz -C /usr/src/
[root@keep01 ~]# cd /usr/src/keepalived-1.2.13/
//安装内核开发包,popt支持库等工具;如果安装不上,请使用阿里的yum源
[root@keep01 keepalived-1.2.13]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum makecache
[root@keep01 keepalived-1.2.13]# yum -y install kernel-devel openssl-devel popt-devel
[root@keep01 keepalived-1.2.13]# ./configure --prefix=/usr/local/keepalived
[root@keep01 keepalived-1.2.13]# make &&make install && cd
//创建keepalived主配置文件目录
[root@keep01 ~]# mkdir -p /etc/keepalived
//主配置文件
[root@keep01 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
//启动时需要加载的配置文件
[root@keep01 ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
//服务的控制脚本
[root@keep01 ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
//优化keepalived的命令
[root@keep01 ~]# ln -s /usr/local/keepalived/sbin/* /usr/bin/
//给启动脚本指定权限
[root@keep01 ~]# chmod 755 /etc/init.d/keepalived
//查看一下keepalived版本
[root@keep02 ~]# keepalived -v
Keepalived v1.2.13 (05/16,2020)
//在LVS集群环境中应用时,也需要用到ipvsadm管理工具
[root@keep01 ~]# yum install -y ipvsadm
[root@keep01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

3. 配置MASTER调度器(keep01)

[root@keep01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
    router_id kp01_2.1
}

vrrp_instance VI_1 {
    state MASTER
    interface ens32
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123123
    }
    virtual_ipaddress {
        192.168.2.100 
    }
}

virtual_server 192.168.2.100 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    #persistence_timeout 60      #这里就不要开启持久连接了,为了更方便的查看负载均和的效果
    protocol TCP
    real_server 192.168.2.3 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        } 
    }
    real_server 192.168.2.4 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

4. 配置BACKUP调度器(keep02)

[root@keep01 ~]# scp /etc/keepalived/keepalived.conf 192.168.2.2:/etc/keepalived/
[root@keep02 ~]# vim /etc/keepalived/keepalived.conf

5. 接下来启动lvs 和 keepalived

//启动keep01的lvs和keepalived
[root@keep01 ~]# modprobe ip_vs                          //#加载ip_vs模块(启动lvs)
[root@keep01 ~]# lsmod |grep ip_vs                       //查看加载的模块是否成功
[root@keep01 ~]# echo "modprobe ip_vs" >>/etc/rc.local   //加入开机启动项
[root@keep01 ~]# chmod +x /etc/rc.d/rc.local
[root@keep01 ~]# /etc/init.d/keepalived start            //启动keepalived

//启动keep02的lvs和keepalived
[root@keep02 ~]# modprobe ip_vs
[root@keep02 ~]# lsmod |grep ip_vs
[root@keep02 ~]# echo "modprobe ip_vs" >>/etc/rc.local
[root@keep02 ~]# chmod +x /etc/rc.d/rc.local
[root@keep02 ~]# /etc/init.d/keepalived start

6. 在两台keep节点上查看一下虚拟VIP

  • 以上图中可以看到vip地址已经承载到了这块网卡上,接下来启动从服务器查看IP地址

  • 以上图中可以看到从服务器上面没有vip地址的,那么就是正常的,因为它是老二,是一个备用服务器,啥时候等主服务器挂了那么它就会自动继承主服务器该做的事情。

7. 在两台keep节点上查看一下LVS集群转发情况

8. 在两台RS上编写realserver.sh脚本

#在两台RS上编写以下脚本文件realserver.sh
vim /opt/realserver.sh
#!/bin/bash

VIP=192.168.2.100

#/etc/rc.d/init.d/functions

case "$1" in
start)
       /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
       /sbin/route add -host $VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       /sbin/ifconfig lo:0 down
       /sbin/route del $VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac

exit 0

9. 在两台RS上分别执行脚本

[root@web01 ~]# bash /opt/realserver.sh start
RealServer Start OK

[root@web02 ~]# bash /opt/realserver.sh start
RealServer Start OK

10. 客户端测试负载均衡

11. 查看两台web服务的访问日志

12. 模拟主服务器down掉后是否还能正常访问

[root@keep01 ~]# /etc/init.d/keepalived stop
Stopping keepalived (via systemctl):                       [  确定  ]

[root@keep02 ~]# ip a|grep 192.168.2.100         //去从上面查看vip是否飘了过来
    inet 192.168.2.100/32 scope global ens32

13. 验证主服务器恢复之后vip是否还会回来

[root@keep01 ~]# /etc/init.d/keepalived start
Starting keepalived (via systemctl):                       [  确定  ]
[root@keep01 ~]# 
[root@keep01 ~]# ip a|grep 192.168.2.100
    inet 192.168.2.100/32 scope global ens32
#可以看到,将主恢复后,vip会自动回到主keepalived上

[root@keep02 ~]# ip a|grep 192.168.2.100
[root@keep02 ~]# 而此时从上vip已然消失

至此,nginx + keepalived高可用负载均衡已经完成~~~

案例(二)

  • Nginx+Keepalived实现高可用负载均衡
  • 架构图如下:

环境准备

主机名 / 角色 操作系统 IP地址 软件包
keep01 / LB-MASTER Centos7.4_3.10 192.168.1.1 keepalived-1.2.13.tar.gz、nginx-1.12.2.tar.gz
keep02 / LB-BACKUP Centos7.4_3.10 192.168.1.2 keepalived-1.2.13.tar.gz、nginx-1.12.2.tar.gz
web01 / RS-WEBSERVER Centos7.4_3.10 192.168.1.3 jdk-8u181-linux-x64.tar.gz、apache-tomcat-8.5.32.tar.gz
web02 / RS-WEBSERVER Centos7.4_3.10 192.168.1.4 jdk-8u181-linux-x64.tar.gz、apache-tomcat-8.5.32.tar.gz
client01 / 测试 Centos7.4_3.10 192.168.1.5 curl 或者 wget

1. 安装Tomcat

1.1 安装JDK(配置相同)

[root@web01 ~]# tar xf jdk-8u181-linux-x64.tar.gz
[root@web01 ~]# mv jdk1.8.0_181 /usr/local/java
[root@web01 ~]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
[root@web01 ~]# source /etc/profile
[root@web01 ~]# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

1.2 安装tomcat(配置相同)

#安装tomcat
[root@web01 ~]# tar xf apache-tomcat-8.5.32.tar.gz
[root@web01 ~]# mv apache-tomcat-8.5.32 /usr/local/tomcat
# 在/usr/local/tomcat/bin/catalina.sh这个文件的注释下追加一下两条配置
[root@web01 ~]# sed -i '1a # JDK' /usr/local/tomcat/bin/catalina.sh
[root@web01 ~]# sed -i '2a JAVA_HOME=/usr/local/java' /usr/local/tomcat/bin/catalina.sh
#备份主配置及删除配置文件注释
[root@web01 ~]# cp /usr/local/tomcat/conf/server.xml /usr/local/tomcat/conf/server.xml.bak && perl -lne 'print unless (/<!--/../-->/)' /usr/local/tomcat/conf/server.xml.bak > /usr/local/tomcat/conf/server.xml && sed -i /^$/d /usr/local/tomcat/conf/server.xml
#启动tomcat服务
[root@web01 ~]# /usr/local/tomcat/bin/startup.sh
#查看tomcat是否启动成功
[root@web01 ~]# netstat -anptu|grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      16297/java

1.3 修改两台tomcat的默认页面

//web01
[root@web01 ~]# vim /usr/local/tomcat/webapps/ROOT/index.jsp
 52                     <h2>RS_web01-192.168.2.3</h2>

//web02
[root@web02 ~]# vim /usr/local/tomcat/webapps/ROOT/index.jsp
 52                     <h2>RS_web02-192.168.2.4</h2>

1.4 访问两台web服务

2. 安装 keepalived + Nginx

2.1 安装keepalived

[root@keep01 ~]# wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
[root@keep01 ~]# tar -xf keepalived-1.2.13.tar.gz -C /usr/src/
[root@keep01 ~]# cd /usr/src/keepalived-1.2.13/
//安装内核开发包,popt支持库等工具;如果安装不上,请使用阿里的yum源
[root@keep01 keepalived-1.2.13]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum makecache
[root@keep01 keepalived-1.2.13]# yum -y install kernel-devel openssl-devel popt-devel nmap
[root@keep01 keepalived-1.2.13]# ./configure --prefix=/usr/local/keepalived
[root@keep01 keepalived-1.2.13]# make &&make install && cd
//创建keepalived主配置文件目录
[root@keep01 ~]# mkdir -p /etc/keepalived
//主配置文件
[root@keep01 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
//启动时需要加载的配置文件
[root@keep01 ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
//服务的控制脚本
[root@keep01 ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
//优化keepalived的命令
[root@keep01 ~]# ln -s /usr/local/keepalived/sbin/* /usr/bin/
//给启动脚本指定权限
[root@keep01 ~]# chmod 755 /etc/init.d/keepalived
//查看一下keepalived版本
[root@keep02 ~]# keepalived -v
Keepalived v1.2.13 (05/16,2020)

2.2 分别配置两台keepalived

2.2.1 主Keepalived配置
[root@keep01 ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局配置
global_defs {
   router_id nginx-master
}

#执行脚本配置
vrrp_script chk_nginx {
    #脚本所在路径
    script "/etc/keepalived/check_nginx.sh"
    #脚本执行间隔时间,单位为秒
    interval 2
    #优先级
    weight 2
}

#keepalived实例配置
vrrp_instance VI_1 {
    #指定实例的初始状态,MASTER或BACKUP两种状态,并且需要大写
    state MASTER
    #实例绑定的网卡
    interface ens32
    #虚拟路由标识,是一个数字,整个VRRP内唯一,如果keepalived配置了主备,需要相同
    virtual_router_id 51
    #优先级,数值越大,优先级越高
    priority 100
    #MASTER与BACKUP之间同步检查的时间间隔,单位为秒
    advert_int 1
    #通信验证
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #追踪外围脚本
    track_script {
        #这里配置vrrp_script的名称
        chk_nginx
    }
    #虚拟vip配置,可配置多个
    virtual_ipaddress {
        192.168.2.100
    }
}
2.2.2 备Keepalived配置
[root@keep02 ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局配置
global_defs {
   #Keepalived的机器标识,一个网络内保持唯一
   router_id nginx-backup
}

#执行脚本配置
vrrp_script chk_nginx {
    #脚本所在路径
    script "/etc/keepalived/check_nginx.sh"
    #脚本执行间隔时间,单位为秒
    interval 2
    #优先级
    weight 2
}
#keepalived实例配置
vrrp_instance VI_1 {
    #指定实例的初始状态,MASTER或BACKUP两种状态,并且需要大写
    state BACKUP
    #实例绑定的网卡
    interface ens32
    #虚拟路由标识,是一个数字,整个VRRP内唯一,如果keepalived配置了主备,需要相同
    virtual_router_id 51
    #优先级,数值愈大,优先级越高
    priority 99
    #MASTER与BACKUP之间同步检查的时间间隔,单位为秒
    advert_int 1
    #通信验证
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #追踪外围脚本
    track_script {
        #这里配置vrrp_script的名称
        chk_nginx
    }
    #虚拟ip配置,可配置多个
    virtual_ipaddress {
        192.168.2.100
    }
}
2.2.3 Nginx状态检查脚本创建(内容相同)
[root@keep01 ~]# vim /etc/keepalived/check_nginx.sh
#!/bin/sh
NGINX=/usr/local/nginx/sbin/nginx
PORT=80
IPV4=`ip a|grep ens32|grep inet|awk '{print $2}'|awk -F'/' '{print $1}'`
nmap localhost -p $PORT | grep "$PORT/tcp open" > /dev/null
if [ $? -ne 0 ];then
    $NGINX -s stop
    sleep 5
    $NGINX
    nmap localhost -p $PORT | grep "$PORT/tcp open" > /dev/null
    if [ $? -ne 0 ];then
        killall -9 keepalived
        echo "$IPV4 (nginx) is down on $(date +%F-%T)" >> /etc/keepalived/check_nginx.log
    fi
fi
[root@keep01 ~]# chmod 777 /etc/keepalived/check_nginx.sh
[root@keep01 ~]# scp /etc/keepalived/check_nginx.sh root@192.168.2.2:/etc/keepalived/

2.3 安装Nginx

[root@keep01 ~]# yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel

[root@keep01 ~]# tar xf nginx-1.12.2.tar.gz -C /usr/src/ && cd /usr/src/nginx-1.12.2/

[root@keep01 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install && cd

[root@keep01 ~]# useradd -s /sbin/nologin -M nginx && chown -R nginx:nginx /usr/local/nginx/

[root@keep01 ~]# ln -s /usr/local/nginx/sbin/* /usr/local/bin/

2.4 分别配置两台服务器的Nginx(内容相同)

[root@keep01 ~]# vim /usr/local/nginx/conf/nginx.conf
#nginx运行用户
user  nginx;

#nginx进程数
worker_processes  1;

#单个进程最大连接数
events {
    worker_connections  1024;
}

#http服务器配置
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    #长连接超时时间,单位是秒
    keepalive_timeout  65;
    #upstream负载均衡配置,配置路由到tomcat的服务地址以及权重
    upstream tomcat {
       server 192.168.2.3:8080 weight=2;
       server 192.168.2.4:8080 weight=2;
    }

    #虚拟主机的配置
    server {
        #监听端口
        listen       80;
         #域名可以有多个,用空格隔开
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
            #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_connect_timeout 3;
            #后端服务器数据回传时间(代理发送超时)
            proxy_send_timeout 30;
            #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_read_timeout 30;
            proxy_pass http://tomcat;
        }

        error_page  500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
[root@keep01 ~]# cd /usr/local/nginx/conf/
[root@keep01 conf]# scp nginx.conf root@192.168.2.2:$PWD

3. 启动nginx 和 keepalived

nginx -s start/etc/init.d/keepalived start
  • 查看虚拟VIP

4. 模拟主服务器的nginx宕机后VIP自动漂移

[root@keep01 ~]# echo 'error' >> /usr/local/nginx/conf/nginx.conf     #注释:这上面必须要先在nginx配置文件中插入一条错误配置,不然就算是你关闭了nginx,他之后也会靠着check_nginx.sh脚本将nginx起来!!
[root@keep01 ~]# nginx -s stop

  • 验证是否还能够正常访问

  • 可以看到,这里已经实现了双机热备的功能~~~

5. 将主节点的nginx和keepalived恢复

[root@keep01 ~]# sed -i '/^error/d' /usr/local/nginx/conf/nginx.conf      #将刚才插入到nginx中的配置给其删掉
[root@keep01 ~]# nginx -s start
[root@keep01 ~]# /etc/init.d/keepalived start

可以看到,当主keepalived恢复后,VIP会自动再回到他的上面来,下面再来访问一下浏览器