美文网首页
Keepalived+Nginx负载均衡高可用

Keepalived+Nginx负载均衡高可用

作者: Michaelhbjian | 来源:发表于2018-04-25 15:17 被阅读0次

    为了解决实验室每次演示项目的稳定性,提高项目的可用性。现在搭建一个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

     <Engine name="Catalina" defaultHost="localhost">
    

    2、在Engine标签内增加

    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
    
    image.png

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

    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负载均衡高可用

          本文链接:https://www.haomeiwen.com/subject/qpfylftx.html