Keepalived+Nginx负载均衡高可用

为了解决实验室每次演示项目的稳定性,提高项目的可用性。现在搭建一个Keepalived+Nginx的负载均衡高可用的一个环境。设置一个VIP地址,里面配置两个真实IP的地址,当一天Nginx服务器宕机之后,VIP会自动跳转到另一台Nginx服务上去,从而实现了高可用。

1.系统环境

系统为Centos 7.3

Keepalived的安装包为keepalived-1.2.16.tar.gz

Nginx的安装包为nginx/1.10.1

网络环境配置

进入/etc/sysconfig/network-scripts目前这两台虚拟机上都有两块网卡,第一块是外网网卡,第二块是内网网卡,基本信息如下:

虚拟IP 真实IP Nginx端口 默认主从 软件
59.69.29.10 59.68.29.xx 80 MAATER Keepalived+Nginx
59.69.29.10 59.68.29.xx 80 BACKUP Keepalived+Nginx

2.虚拟路由冗余协议(VRRP)

VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。

虚拟路由器冗余协议【原理篇】VRRP详解

3.Keepalived原理介绍

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器

image.png

1、刚开始VIP绑定到MASTER机器,对外提供VIP访问,实际访问的是MASTER机器

2、如果Nginx宕机,对外不可服务,则VIP会重新漂移到新的BACKUP机器上面,新的BACKUP重新选举MASTER机器,从而解决Nginx的单点故障问题

3、VIP选择问题

此架构需考虑的问题:

1、Master运行,则Master占有vipNginx能够正常服务;

2、Master挂了,则Backup抢占vipNginx能够正常服务

3、任何一台前端nginx服务挂了,则vip资源转移到另一台服务器上,并发送提醒邮件;

4、由于应用需要Session保持,但由于没有做Session共享,实际服务器角色转换时,应用会受到一定的影响。

4.Nginx安装与配置

分别在两台虚拟机(MASTER和BACKUP节点)上安装Nginx,安装Nginx的教程请看之前的一篇博客。

5.Keepalived的安装与配置

1.上传或下载 keepalived-1.2.16.tar.gz/usr/local/ 目录下,新建keepalived 目录,

2.解压安装,进入/usr/local 执行tar -zxvf keepalived-1.2.16.tar.gz

3.进入解压后的目录cd keepalived-1.2.16

  • 指定编译路径:./configure --prefix=/usr/local/keepalived
  • 编译安装:make && make install

4.将keepalived安装成Linux系统服务

复制默认的配置文件到默认路径:安装完成后,进入安装目录的etc目录下,将keepalived相应的配置文件拷贝到系统相应的目录当中。keepalived启动时会从/etc/keepalived目录下查找keepalived.conf 配置文件,如果没有找到测使用默认的配置。

#拷贝执行文件
cp /usr/local/keepalived/sbin/keepalived  /usr/sbin/

#将init.d文件拷贝到etc下,加入开机启动项
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/rc.d/init.d/keepalived

#将keepalived文件拷贝到etc下
cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/

#创建Keepalived文件夹
mkdir -p /etc/keepalived

#将keepalived配置文件拷贝到etc下
cp /usr/local/keepalived/etc/keepalived/keepalived.conf  /etc/keepalived/keepalived.conf

#添加可执行权限
chmod +x /etc/init.d/keepalived

设置keepalived服务开机启动:

chkconfig keepalived on

systemctl enable keepalived.service #设置开机自动启动
systemctl disable keepalived.service     #取消开机自动启动
systemctl start keepalived.service       #启动服务
systemctl restart keepalived.service     #重启服务
systemctl stop keepalived.service         #停止服务
systemctl status keepalived.service      #查看服务状态

Keepalived配置文件详解

在MASTER节点上,进入/usr/local/keepalived/etc/keepalived 这个目录下,打开配置文件keepalived.conf 如下:

! Configuration File for keepalived
#全局配置段
global_defs {
    #通知邮件配置块
   notification_email {  
        root@localhost  #通知邮件收件人
   }
   #通知邮件发件人
   notification_email_from root@localhost
   #邮件服务器地址
   smtp_server localhost
   #邮件服务器连接超时时间
   smtp_connect_timeout 30
   #机器表示,通常设置为本机的hostname(本机是slave1)
   router_id LVS_DEVEL
}

#配置vrrp_script,主要用于健康检查,以及检查失败后执行的动作。
vrrp_script chk_nginx {
#健康检查脚本,当脚本返回值不为0时认为失败
    script "/etc/keepalived/ck_ng.sh"
#检查频率,以下配置每2秒检查1次
    interval 2
#当检查失败后,将vrrp_instance的priority减小5
    weight -5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
    fall 3
#连续监测2次成功,就认为成功。但不调整优先级
    rise 2
}

#VRRP实例配置段
vrrp_instance VI_1 {
    #指定vrrp_instance的初始状态。但如果master的优先级比某个backup还低,那么在通告时,那台backup就会抢占master
    state MASTER
    #绑定虚拟IP的网络接口,与本机IP地址所在的网络接口相同
    interface ens32
    #发送心跳包的源IP,可使用绑定的网卡IP,也可以使用本服务器上的其他IP
     mcast_src_ip 172.16.97.252
    #设置虚拟路由器标识(范围0-255)。只有相同的标识,才能实现在多播域内通告优先级以及其他信息(主从要一致)
    virtual_router_id 51
    #设置本机节点的优先级,优先级最高的为真正的MASTER
    priority 100
    #每隔多长时间通告并检查一次,默认为1秒
    advert_int 1
    #定义认证方式和密码。MASTER/BACKUP必须一样
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    
#本vrrp_instance所引用的脚本配置,名称就是vrrp_script 定义的容器名
track_script {
    chk_nginx
    }
    #设置VIP地址,也就是虚拟IP地址。可以设置多个VIP;只有当节点为MASTER时,此IP才会生效(每行一个)
    virtual_ipaddress {
        59.68.29.10/24
    }
}

在BUCKUP的节点上只需将:

route_id vs1 >> route_id vsN 只需要修改vs后的数字为backup的机器编号即可
state MASTER >> state BACKUP 在这之前我们说过,Master只能有一个,所以其他BAKCUP都要修改这里
priority 100 >> priority 90 其他BACKUP节点的优先级一定要比Master节点小

添加Nginx监控脚本,监控Nginx的运行状态,如果发现异常并不能重启成功则关闭Keepalived,让VIP漂移到备份服务器

vim  /etc/keepalived/ck_ng.sh

配置内容如下:

#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#尝试启动一次nginx,停止5秒后再次检测
    service nginx start
    sleep 5
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
#如果启动没成功,就杀掉keepalive触发主备切换
        service keepalived stop
    fi
fi

增加监控脚本的执行权限,设置keepalived开机启动

chmod +x /etc/keepalived/ck_ng.sh
systemctl enable keepalived.service

如果是自己测试练着玩的话,本机直接访问vip就可以了.如果应用到生产环境,还需有一个外网IP映射到VIP,然后申请一个域名解析到这个外网IP

如何解决session问题

ip_hash(只能解决不宕机的情况的)

#利用每个请求按访问的ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
upstream  mgmt {
        server  59.68.29.xx:19666;
        server  59.68.29.xx:19666;
        ip_hash;
 }

Tomcat session复制(测试可行)

1、对于每一个server.xml

 

2、在Engine标签内增加


image.png

3、在程序的web.xml的web-app结束前增加

image.png

4、session复制需用组播添加static route(这一步没有使用)

vim /etc/sysconfig/network-scripts/route-eth0
增加
192.0.2.0/24 dev eth0 scope host
default via 192.0.2.1
192.168.2.0/24 via 192.168.13.1 dev eth0

service network restart

6.参考资料

https://www.cnblogs.com/GreedyL/p/7519969.html

https://blog.csdn.net/qq_36243993/article/details/56958793

https://yq.aliyun.com/articles/42261

你可能感兴趣的:(Keepalived+Nginx负载均衡高可用)