您的位置:首页 > 理论基础 > 计算机网络

keepalived高可用lvs-dr 负载均衡httpd

2016-05-16 11:42 281 查看
这次实践主要是尝试: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.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
六、测试



七、总结
实验中出现问题:
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.确保内网主机使用默认网关为内网路由器的内网地址。
快速完成架构部署还不是熟练,尽量一步一步趋于完善。
实验就是这样了,如果有对其中实验的问题,欢迎留言!
本文出自 “深海鱼” 博客,请务必保留此出处http://kingslanding.blog.51cto.com/9130940/1773846
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: