这次实践主要是尝试:keepalived高可用lvs,完成对后端主机的负载均衡。lvs使用最为常用的DR模型,DIP,RIPs使用内网地址,节省公网IP的使用。

一、实验要求

    要求任何一台代理服务器不可用时,不影响正常访问,任何一台真实主机服务不可用时,不影响正常访问。

二、实验环境

  这里假设192.168.0.0/24作为外网地址(因为它确实能连接外网),192.168.100.0/24作为内网网络,前端代理放置在外网,真实服务器放在内网。这样设计可以使用更少的IP完成架构。这里要注意的是:1.要了解DR模型中的要点,需要所有的网卡都要在一个物理网络中,才能修改MAC实现转发;2.内网主机要求只有内网(保证其默认网关要指向内网路由),这里实在虚拟机内操作的,没用xshell。

  实验中物理图如下:wKioL1c5LuagaEWQAACdfaKcIng538.png

   系统中服务器配置(mysql服务器没有配置,不影响实验):

系统
角色IP网关软件
CentOS 6.6前端代理192.168.0.140
192.168.100.140
192.168.0.1keepalived+lvs(dr)
CentOS 6.6前端代理192.168.0.141
192.168.100.141
192.168.0.1keepalived+lvs(dr)
CentOS 6.6web服务器192.168.100.142192.168.100.146httpd
CentOS 6.6web服务器192.168.100.143192.168.100.146httpd
CentOS 6.6内网路由

192.168.0.146

192.168.100.146

192.168.0.1


   *说明keepalived VIP为192.168.0.144。

三、搭建后端web服务器,设置lvs(dr)模型真实服务器设置

  搭建web服务器只要简单设置就可以了,这里不在重复,要记住标准化环境;这里设置不同的页面标识调度器的情况,这里仅仅提供了不同的index页面。

  真实主机的设置使用脚本初始化:

#cat dr.sh
#!/bin/sh
#
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 192.168.0.144 netmask 255.255.255.255 broadcast 192.168.0.144
route add -host 192.168.0.144 gw 192.168.0.144

  脚本两台RS上都要运行,验证下web服务器可用。真实服务器准备好了。

四、建立前端的keepalived高可用

   在两台前端反向代理安装keepalived,ipvsadm,修改/etc/keepalived/keepalived.conf,配置如下:

  CentOS6-140的keepalived配置:

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node2
   vrrp_mcast_group4 224.0.29.18
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 20
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 11112222
    }
    virtual_ipaddress {
        192.168.0.144 dev eth0 label eth0:0 
    }
}

virtual_server 192.168.0.144 80 {
    delay_loop 6
    lb_algo rr 
    lb_kind DR
#    persistence_timeout 50
    protocol TCP

    sorry_server 127.0.0.1  80

    real_server 192.168.100.142 80 {
        weight 1
        HTTP_GET {
            url { 
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.100.143 80 {
        weight 1
        HTTP_GET {
            url { 
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

   CentOS6-141的keepalived配置如下:

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node2
   vrrp_mcast_group4 224.0.29.18
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 20
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 11112222
    }
    virtual_ipaddress {
        192.168.0.144 dev eth0 label eth0:0 
    }
}

virtual_server 192.168.0.144 80 {
    delay_loop 6
    lb_algo rr 
    lb_kind DR
#    persistence_timeout 50
    protocol TCP

    sorry_server 127.0.0.1  80

    real_server 192.168.100.142 80 {
        weight 1
        HTTP_GET {
            url { 
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.100.143 80 {
        weight 1
        HTTP_GET {
            url { 
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

  先启动从服务器,查看IP:

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:31:79:fe brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.141/24 brd 192.168.0.255 scope global eth3
    inet 192.168.0.144/32 scope global eth3
    inet6 fe80::250:56ff:fe31:79fe/64 scope link 
       valid_lft forever preferred_lft forever
3: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:35:d5:87 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.141/24 brd 192.168.100.255 scope global eth2
    inet6 fe80::250:56ff:fe35:d587/64 scope link 
       valid_lft forever preferred_lft forever

  可以看到keepalived备服务器已经取得了IP地址,再启动主服务器可用看到从服务器IP被主服务器夺了过去。

[root@CentOS6-140-basic ~]# service keepalived start
Starting keepalived:                                       [  OK  ]
[root@CentOS6-140-basic ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:4a:2a:21 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.140/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.144/32 scope global eth0:0
    inet6 fe80::20c:29ff:fe4a:2a21/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:24:1e:26 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.140/24 brd 192.168.100.255 scope global eth1
    inet6 fe80::250:56ff:fe24:1e26/64 scope link 
       valid_lft forever preferred_lft forever

  从前端主机请求后端真实的web服务(这里实验设置的web服务器内容不一致,真实服务器要求一致):

[root@CentOS6-140-basic ~]# curl http://192.168.100.142
<h1>server 142</h1>
[root@CentOS6-140-basic ~]# curl http://192.168.100.143
<h1>server 143</h1>

 查看lvs的转发情况:

# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.144:http rr
  -> 192.168.100.142:http         Route   1      0          0         
  -> 192.168.100.143:http         Route   1      0          0

五、设置内网路由器

  这时候请求http://192.168.0.144不能请求到。实际上可以看到lvs链接记录,但是不会得到回应,因为后端这时服务器不知道该向哪里转发,找不到网关MAC信息。

  这里需要配置双网的内网路由器转发。

  配置路由器可以转发:

[root@CentOS6-146 ~]# cat /proc/sys/net/ipv4/ip_forward 
1

  设置IP地址和路由如下:

[root@CentOS6-146 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:3e:e1:4f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.146/24 brd 192.168.0.255 scope global eth0
    inet 192.168.100.146/24 brd 192.168.100.255 scope global eth0:0
    inet6 fe80::250:56ff:fe3e:e14f/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:50:56:2b:e1:67 brd ff:ff:ff:ff:ff:ff

 配置路由:

# route -n 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.100.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0       192.168.0.1         0.0.0.0         UG    0      0        0 eth0

六、测试

wKioL1c5O4nzyv4iAAC3CwJgnR8110.gif

七、总结

  实验中出现问题:

  1.keepalived 140对142监控可以连接上,但是从来不把请求转发到142服务器,其他正常。以后再做一次看看什么问题;

 2.实验中keepalive对真实主机的测试,回被记录到access日志中,可以再建立虚拟主机并设置日志的位置,方便线上统计;

 3.现有的结构中除了没有提供mysql(当然也需要高可用),由于http协议是无状态协议,对于一次用户访问,session不会和调度一致,理论上也属于单点故障,所以后期还可以添加session的解决方案,比如session 集群或session server。想想还有好多东西要做,后期慢慢完善。

  实验中有的地方值得留下mark,搭建结构的步骤很重要,弄清来龙去脉:

  1. 做好需求,安装好服务器的各种软件(可能没有内网YUM源,所以在外网环境中安装好);

  2. 网络设计:搞清楚DR要求的条件,VIP、DIP、RIPs要求在一个物理网络,DIP,RIPs可以用私网地址但是使用私网地址需要设置内网路由;设置内网路由,那么需要开启转发功能;当然在实际环境中可能一个真实路由器搞定了,路由器性能要好点,毕竟需要转发响应报文,而响应报文是需要转发能力和带宽的,不容忽视;

  3. 良好的步骤和验证:

  首先,设计内网真实的主机,能够正常服务;

   其次,设置外网负载均衡,保证能够动态负载后端,任何一台前端或后端失败都不会影响后端服务器正常访问;

   再次,设置内网路由器,确保其能够转发,最好外网自己的主机设置返回内网的路由条目,使内网的报文能够返回到内网服务器,这时候用RS是能够ping外网主机,路由功能正常。

 4.确保内网主机使用默认网关为内网路由器的内网地址。

  快速完成架构部署还不是熟练,尽量一步一步趋于完善。

  实验就是这样了,如果有对其中实验的问题,欢迎留言!