这次实践主要是尝试:keepalived高可用lvs,完成对后端主机的负载均衡。lvs使用最为常用的DR模型,DIP,RIPs使用内网地址,节省公网IP的使用。
一、实验要求
要求任何一台代理服务器不可用时,不影响正常访问,任何一台真实主机服务不可用时,不影响正常访问。
二、实验环境
这里假设192.168.0.0/24作为外网地址(因为它确实能连接外网),192.168.100.0/24作为内网网络,前端代理放置在外网,真实服务器放在内网。这样设计可以使用更少的IP完成架构。这里要注意的是:1.要了解DR模型中的要点,需要所有的网卡都要在一个物理网络中,才能修改MAC实现转发;2.内网主机要求只有内网(保证其默认网关要指向内网路由),这里实在虚拟机内操作的,没用xshell。
实验中物理图如下:
系统中服务器配置(mysql服务器没有配置,不影响实验):
系统 |
角色 | IP | 网关 | 软件 |
CentOS 6.6 | 前端代理 | 192.168.0.140 192.168.100.140 |
192.168.0.1 | keepalived+lvs(dr) |
CentOS 6.6 | 前端代理 | 192.168.0.141 192.168.100.141 |
192.168.0.1 | keepalived+lvs(dr) |
CentOS 6.6 | web服务器 | 192.168.100.142 | 192.168.100.146 | httpd |
CentOS 6.6 | web服务器 | 192.168.100.143 | 192.168.100.146 | httpd |
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
六、测试
七、总结
实验中出现问题:
1.keepalived 140对142监控可以连接上,但是从来不把请求转发到142服务器,其他正常。以后再做一次看看什么问题;
2.实验中keepalive对真实主机的测试,回被记录到access日志中,可以再建立虚拟主机并设置日志的位置,方便线上统计;
3.现有的结构中除了没有提供mysql(当然也需要高可用),由于http协议是无状态协议,对于一次用户访问,session不会和调度一致,理论上也属于单点故障,所以后期还可以添加session的解决方案,比如session 集群或session server。想想还有好多东西要做,后期慢慢完善。
实验中有的地方值得留下mark,搭建结构的步骤很重要,弄清来龙去脉:
做好需求,安装好服务器的各种软件(可能没有内网YUM源,所以在外网环境中安装好);
网络设计:搞清楚DR要求的条件,VIP、DIP、RIPs要求在一个物理网络,DIP,RIPs可以用私网地址但是使用私网地址需要设置内网路由;设置内网路由,那么需要开启转发功能;当然在实际环境中可能一个真实路由器搞定了,路由器性能要好点,毕竟需要转发响应报文,而响应报文是需要转发能力和带宽的,不容忽视;
良好的步骤和验证:
首先,设计内网真实的主机,能够正常服务;
其次,设置外网负载均衡,保证能够动态负载后端,任何一台前端或后端失败都不会影响后端服务器正常访问;
再次,设置内网路由器,确保其能够转发,最好外网自己的主机设置返回内网的路由条目,使内网的报文能够返回到内网服务器,这时候用RS是能够ping外网主机,路由功能正常。
4.确保内网主机使用默认网关为内网路由器的内网地址。
快速完成架构部署还不是熟练,尽量一步一步趋于完善。
实验就是这样了,如果有对其中实验的问题,欢迎留言!