zoukankan      html  css  js  c++  java
  • 【负载均衡】3.Keepalived+lvs DR模式部署

    一、规划

    角色
    IP
    安装软件
    VIP
    master
    192.168.42.135
    keepalived+lvs
    192.168.42.136
    backup
    192.168.42.129
    keepalived+lvs
     
    web1
    192.168.42.130
    nginx-web1
     
    web2
    192.168.42.133
    nginx-web2
     
    二、部署

    1、部署后端webserver

    在web1、web2上部署nginx,并且因为环境冲突,Nginx监听端口都用8080,创建不同的index.html,以便后续验证。
    [root@node2 ~]# yum install nginx -y
    [root@node2 ~]# echo "web-server1" > /usr/share/nginx/html/index.html
    [root@node1 ~]# yum install nginx -y 
    [root@node1 ~]# echo "web-server2" > /usr/share/nginx/html/index.html
    配置realserver lo网卡和arp抑制
    [root@node1 ~]# vim realserver
    VIP=192.168.42.136case "$1" in
    start)
           ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
           /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)
           ifconfig lo:0 down
           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
    [root@node1 ~]# chmod +x realserver
    [root@node1 ~]# ./realserver start

    2、部署keepalived

    在master和backup上部署keepalived,安装ipvs管理工具
    [root@master ~]# yum install -y keepalived
    [root@master ~]# lsmod |grep ip_vs  #查看ip_vs是否加载
    [root@master ~]# modprobe ip_vs #加载ip_vs模块
    [root@master ~]# cat /proc/net/ip_vs  #查看ip_vs信息
    [root@master ~]# yum -y install ipvsadm
    修改keepalived配置文件
    [root@master ~]# vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.200.1
       smtp_connect_timeout 30
       router_id LVS_MASTER
       vrrp_skip_check_adv_addr
       #vrrp_strict            #记得注释,不然VIP绑定了网卡,也无法被ping通
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    }
     
    vrrp_instance VI_1 {
        state MASTER    #指定实例初始状态,实际的MASTER和BACKUP是选举决定的。backup此处应配置为BACKUP  
        interface ens33  #指定实例绑定的网卡
        virtual_router_id 91  #设置VRID标记,多个集群不能重复(0..255)
        priority 100      #设置优先级,优先级高的会被竞选为Master,backup此处应配置小于100
        advert_int 1      #检查的时间间隔,默认1s
        nopreempt #禁止抢占服务。默认情况,当MASTER服务挂掉之后,BACKUP自动升级为MASTER并接替它的任务,当MASTER服务恢复后,升级为MASTER的BACKUP服务又自动降为BACKUP,把工作权交给原MASTER。当配置了                    #nopreempt,MASTER从挂掉到恢复,不再将服务抢占过来。
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.42.136
        }
    }
    virtual_server 192.168.42.136 8080 {
        delay_loop 6   #健康检查时间间隔
        lb_algo rr        #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh等
        lb_kind DR      #lvs工作模式
        persistence_timeout 0  #会话保持时间,设置为0方便后面测试
        protocol TCP
        real_server 192.168.42.130 8080 {
            weight 1
            HTTP_GET {      //检测方法除HTTP_GET外还支持TCP_CHECK,脚本,SSL_GET等。
                url {
                  path /index.html
                  status_code 200
                }
                connect_timeout 3  #连接超时时间
                nb_get_retry 3  #重试次数
                delay_before_retry 3  #重连间隔时间
            }
        }
     
            real_server 192.168.42.133 8080 {
            weight 1
            HTTP_GET {
                url {
                  path /index.html
                 status_code 200
                }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }
        }
    }
     #主从启动keepalived
    [root@node3 ~]# systemctl restart keepalived
    查看master的ens33网卡上是否有VIP
    查看lvs后端情况:
    [root@node3 ~]# ipvsadm -ln
    [root@node3 ~]# ipvsadm -lnc
     
    测试负载均衡轮询:
    [root@master ~]# curl http://192.168.42.136:8080/

    测试高可用,停用master上的keepalived,观察VIP是否漂移到backup上。

    三、问题整理

    问题1:keepalived.conf中vip配置好后,通过ip addr可以看到vip已经顺利挂载,但是无法ping通,并且防火墙都已关闭,原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。重启keepalived即可ping通。
    问题2:使用curl测试负载均衡时,能够轮询调度到不同的后端主机,但是使用浏览器时却不行,总是访问到同一个后端。原因是,curl命令请求时,每次请求都从不同的端口发请求,所以每次lvs都当做一个新的客户端来处理,而且curl请求完后,就关闭了tcp连接;而浏览器则不然,每次刷新很可能还是以同一个端口发出请求,而且tcp连接也会保持,所以lvs就会认为是同一个客户端,每次刷新就会指向同一rs。
    如果要想浏览器测试也能达到轮询效果,则需要将lvs的连接处于空闲状态的超时时间设置的很短。
    [root@node3 ~]# ipvsadm --list --timeout (默认过期时间分别是900 120 300)
    [root@node3 ~]# ipvsadm --set 1 1 1

     四、补充

    1、Linux修改内核参数

    方法1:
    echo value > /proc/sys/path  例: echo 0 > /proc/sys/net/ipv4/ip_nonlocal_bind
    方法2:
    sysctl -w kernel.name=value 修改值
    sysctl -a 查看
    方法3:
    vim /etc/sysctl.conf  #将内容写入sysctl.conf文件
    sysctl -p #使文件内容的修改立即生效

    2、内核模块的操作

    查看内核模块:lsmod  
    移除模块: modprob -r 模块名    或者  rmmod 模块名
    装载模块: modprob 模块名  或者 insmod 模块名
    查看模块详细信息:modinfo 模块名

    3、ipvsadm命令行选项

    -A        添加一个虚拟服务,使用ip地址、端口号、协议来唯一定义一个虚拟服务
    -E        编辑一个虚拟服务
    -D        删除一个虚拟服务
    -C        清空虚拟服务列表
    -R        从标准输入中还原虚拟服务列表
    -S        保存虚拟服务规则至标准输出,输出规则可使用-R选项还原
    -L        显示虚拟服务列表
    -Z        虚拟服务器列表计数器清零(清空当前连接数)
    -a        添加一台真实服务器
    -e        编辑一台真实服务器
    -d        减少一台真实服务器
    -t        使用TCP服务,该参数后需加主机与端口信息
    -u        使用UDP服务,该参数后需加主机与端口信息
    -s        指定lvs的调度算法
    -r        设置真实服务器IP与端口
    -g        设置lvs工作模式为DR直连路由
    -i        设置lvs工作模式为TUN隧道
    -m      设置lvs工作模式为NAT地址转换模式
    -w        指定真实服务器权重
    -c        连接状态,配和-L使用
    -n        数字格式显示
    --stats   显示统计信息
    --rate    显示速率信息
    --sort    对虚拟服务器和真实服务器排序输出
    --set tcp tcpfin udp
              设置ipvs连接超时值,三个参数分别代表tcp会话超时时间、收到FIN包后tcp会话超时时间、udp超时时间
    --timeout
              显示tcp tcpfin udp的timeout值
    --start-daemon
              启动同步守护进程
    --stop-daemon
              停止同步守护进程

    4、lvs持久性连接介绍

    (1)把同一个client的请求信息记录到lvs的hash表里,保存时间使用persistence_timeout控制,单位为秒。 persistence_granularity 参数是配合persistence_timeout的,在某些情况特别有用,他的值是子网掩码,表示持久连接的粒度,默认是 255.255.255.255,也就是单独的client ip,如果改成,255.255.255.0就是client ip一个网段的都会被分配到同一个real server。
    设置方式:
        persistence_timeout 可以通过"ipvsadm -p timeout" 来设置,默认360秒
        # ipvsadm -A -t 192.168.20.154:80 -s rr -p 60
        注意:上面命令中红色标记的80端口,表示同一客户端访问服务器的80端口,会被定义到同一个real server,如果把80端口改为0,那么同一客户端访问服务器的任何服务都会被转发到同一real server。
        修改keepalived配置文件,在虚拟服务器配置下面加入persistence_timeout 60 
    (2)一个连接创建后空闲时的超时时间,这个时间为3种
    ① tcp的空闲超时时间
    ② lvs收到客户端tcp fin的超时时间
    ③ udp的超时时间
     设置方式:
    # tcp tcpfin udp 可以通过"ipvsadm --set 对应超时时间"来设置
    ipvsadm --set tcp tcpfin udp
    建议:tcpfin的值最好小于persistence_timeout的值,这样比较方便计算,也有利于tcpfin回收
  • 相关阅读:
    [poj解题]1017
    [算法] aov图拓扑算法
    【supervisord】部署单进程服务的利器
    【python】一个备份把文件备份到邮箱的python实现
    【GO】关于GO的浅显总结
    iOS开发快捷键
    iOS开发笔记
    VS2012智能提示无效解决方案
    国内几个WindowPhone广告平台
    纪念自己的第四个App:秘密Secret
  • 原文地址:https://www.cnblogs.com/cmxu/p/12368894.html
Copyright © 2011-2022 走看看