2018-05-23 nginx和keepalived实现IT服

作者: 止一量化养家 | 来源:发表于2018-05-23 21:15 被阅读114次

    通过nginx的反向代理功能实现负载均衡,通过keepalived的故障转移功能实现nginx的高可用。

    1环境

    192.168.159.134 nginx + keepalived master
    192.168.159.139 nginx + keepalived backup
    192.168.159.137 tomcat
    192.168.159.138 tomcat
    192.168.159.3 VIP(虚拟IP)

    2 tomcat 做应用服务器

    3 nginx做负载均衡

    nginx.conf的配置如下:

    
    user nobody nobody; #运行用户:任意
    worker_processes 1; #设置值和CPU核心数一致
    
    error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和日志级别
    pid /usr/local/webserver/nginx/nginx.pid; #PID文件
    
    # 工作模式和连接数上限
    events
    {
        use epoll;
        worker_connections 65535; # 单个后台worker process进程的最大并发
    }
    
    
    http
    {
        include mime.types;
        default_type application/octet-stream;
    
        # 日志格式
        log_format main  '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" $http_x_forwarded_for';
    
    
        #设定请求缓冲
        server_names_hash_bucket_size 128;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 8m;
    
        # 设置为on表示启动高效传输文件的模式
        sendfile on; 
        tcp_nopush on;
        tcp_nodelay on;
    
        #连接超时时间
        keepalive_timeout 60;
    
    
        #开启gzip压缩,降低传输流量
        gzip on;
        gzip_min_length 1k;
        gzip_buffers 4 16k;
        gzip_http_version 1.0;
        gzip_comp_level 2;
        gzip_types text/plain application/x-javascript text/css application/xml;
        gzip_vary on;
    
    
        # 真实服务器
        upstream myWeb
        {
            server 192.168.159.137:8080;
            server 192.168.159.138:8080;
        }
    
        # 虚拟服务器
        server
        {
            listen 80;#监听端口
            server_name localhost;
    
              location /myWeb/
            {
                proxy_pass http://myWeb;
                proxy_set_header Host $host;
            }
    
        }
    
    }
    
    

    同一个链接访问到两台机器:

    master backup

    4 keepalived实现nginx高可用

    master的keepalived.conf配置:

    global_defs {
       router_id lb01
    }
    
    vrrp_script check {     #定义脚本
       script "/home/admin/software/script/check_web.sh"  --- 表示将一个脚本信息赋值给变量check_web
       interval 2    --- 执行监控脚本的间隔时间
       weight 2  ---利用权重值和优先级进行运算,从而降低主服务优先级使之变为备服务器(建议先忽略)
    }
    
    vrrp_instance VI_1 {
        state MASTER # 指定keepalived的角色,MASTER为主机
        interface eth0 # 当前的网卡
        virtual_router_id 71 # 虚拟路由编号,主机和备份要一直
        priority 150 # 优先级,数值越大,获取处理请求的优先级越高
        advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.159.3/24 dev eth0 label eth0:1 # 定义虚拟ip(VIP)
        }
        track_script {     #调用脚本
           check
        }
    }
    

    backup的keepalived.conf配置:

    global_defs {
       router_id lb02
    }
    
    vrrp_instance VI_1 {
        state BACKUP # 指定keepalived的角色,BACKUP为备份
        interface eth1 # 当前的网卡
        virtual_router_id 71 # 虚拟路由编号,主机和备份要一直
        priority 100 # 优先级,数值越大,获取处理请求的优先级越高
        advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.159.3/24 dev eth1 label eth1:1 # 定义虚拟ip(VIP)
        }
    
    }
    

    脚本check_web.sh,主要作用是监控nginx,当进程小于2个,则关闭keepalived,让备份进入主机模式。

    #!/bin/bash
    
    while true
    do
    if [ `ps -ef |grep nginx |grep -v grep |wc -l` -lt 2 ]
    then
       /etc/init.d/keepalived stop
       exit
    fi
    done
    

    配置好并启动之后,访问虚拟IP:

    cat /var/log/messages看下日志:

    master日志 backup日志

    master终止keepalived服务模拟宕机,可以看到backup切换为master,接管虚拟IP:

    重新启动master的keepalived服务,模拟master恢复,可以看到backup切换回备份模式:

    在主机和备份切换的过程中,对于前面访问VIP的客户端来说是不可见的。

    5 注意

    问题1:虚拟IP没有绑定到网卡

    通过 ifconfig 查不到VIP的信息:

    发现在启动了keepalived服务之后,虚拟IP没有绑定到网卡,这需要修改内核参数开启允许绑定非本机的IP。

    vim /etc/sysctl.conf
    

    添加:

    net.ipv4.ip_nonlocal_bind = 1
    

    然后通过命令 sysctl -p 让修改立刻生效。

    VIP添加成功:

    如果还是不成功,可以尝试在指定虚拟IP的时候指定绑定的网卡:

    问题2:主机备机同时进入master模式(裂脑)

    其实就是主机和备机之间的心跳失败。

    1)检查虚拟路由编号(virtual_router_id)是否一致。
    2)调整iptables
    可以直接关闭:

    service iptables stop 
    

    也可以增加对vrrp的过滤【vim /etc/sysconfig/iptables】:

    -A INPUT -p vrrp -j ACCEPT 
    

    Keepalived的主备之间是通过VRRP( Virtual Router Redundancy Protocol,虚拟路由冗余协议)通信的,因此要开通防火墙的过滤。

    6 参考文章链接

    Nginx安装及配置详解:
    http://www.cnblogs.com/zhouxinfei/p/7862285.html

    高并发场景 LVS 安装及高可用实现:
    http://www.cnblogs.com/clsn/p/7920637.html

    keepalived实现服务高可用:
    http://www.cnblogs.com/clsn/p/8052649.html

    Keepalived无法绑定VIP故障排查经历:
    https://www.linuxidc.com/Linux/2015-03/114981.htm

    相关文章

      网友评论

        本文标题:2018-05-23 nginx和keepalived实现IT服

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