一、规划

角色

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后端节点配置_LVS后端节点配置

查看lvs后端情况:

[root@node3 ~]# ipvsadm -ln

LVS后端节点配置_nginx_02

[root@node3 ~]# ipvsadm -lnc

 

LVS后端节点配置_服务器_03

测试负载均衡轮询:

[root@master ~]# curl http://192.168.42.136:8080/

LVS后端节点配置_服务器_04

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

LVS后端节点配置_服务器_05

三、问题整理

问题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

LVS后端节点配置_服务器_06

 四、补充

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回收