heartbeat+Haproxy多VIP负载均衡高可用

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介:

环境就不多做介绍了,还是上一篇中用到的四台机器,这里只是之前Heartbeat+Haproxy实现负载均衡高可用的补充罢了,废话少说,进入正题。

本文的目的将实现heartbeat绑定多个VIP,多个VIP又将分别代理多个不同的web服务,这些web服务之间做负载均衡,而VIP是高可用,进而实现haproxy的高可用。

主机名 角色 IP地址 说明
mylinux1.contoso.com Heartbeat+Haproxy

eth0:192.168.100.121

eth1:172.16.100.121

VIP:192.168.100.120
mylinux2.contoso.com Heartbeat+Haproxy

eth0:192.168.100.122

eth1:172.16.100.122

VIP:192.168.100.110
mylinux3.contoso.com apache eth0:192.168.100.181 Web:80,8001,8002
mylinux4.contoso.com apache eth0:192.168.100.182 Web:80,8001,8002

这里heartbeat服务将产生两个VIP,mylinux1上默认启动VIP 192.168.100.120,而mylinux2上默认启动VIP 192.168.100.110,当某一台发生故障时,另一台将接管故障服务器的VIP。Haproxy两个服务器的配置相同,都将绑定192.168.100.110和192.168.100.120两个IP地址,从而达到高可用的目的。

注意:大家应该注意到,如果将两个VIP都绑定到同一台服务器上,然后让heartbeat控制haproxy服务,也可以达到上面的目的,但是这样的话,无论何时必定有一台主机获得两个VIP,且提供代理服务,而另外一个主机可能什么服务都没有,完全处于备用状态,为了充分利用服务器资源,所以不采用这种方式,因此才有了本文的介绍。

一、配置heartbeat

heartbeat的配置就不多介绍了,这里主要是修改haresources文件。

1
2
3
4
5
6
7
[root@mylinux1 conf] # vi /etc/ha.d/haresources 
[root@mylinux1 conf] # tail -2 /etc/ha.d/haresources 
mylinux1.contoso.com IPaddr::192.168.100.120 /24/eth0
mylinux2.contoso.com IPaddr::192.168.100.110 /24/eth0
[root@mylinux2 ~] # tail -2 /etc/ha.d/haresources 
mylinux1.contoso.com IPaddr::192.168.100.120 /24/eth0
mylinux2.contoso.com IPaddr::192.168.100.110 /24/eth0

二、修改haproxy配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[root@mylinux1 conf] # cat haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
         #log 127.0.0.1  local0
log 127.0.0.1:514  local0  warning
         pidfile  /usr/local/haproxy/var/run/haproxy .pid
         daemon
maxconn 4096
chroot  /usr/local/haproxy/var/chroot
user haproxy
group haproxy
         nbproc 1
defaults
logglobal
         mode    http
retries3
         option  httplog
         option  httpclose
         option  dontlognull
         option  forwardfor
option  redispatch
maxconn2000
         balance roundrobin
timeout connect 5000
timeout client  50000
timeoutserver          50000
listen  haproxy_stats
         bind   *:8000
         mode   http
         option httplog
         maxconn 20
         stats  enable
         stats refresh 30s
         stats uri  /haproxy_status
         stats auth admin:123456
         stats hide-version
listenwebsites_01
         bind  192.168.100.120:80
         option   forwardfor
         #option  httpchk GET /info.txt
         #option  httpchk HEAD /check.html HTTP/1.0
         timeout  server  15s
         timeout  connect 30s
         server  web1  192.168.100.181:8001 check port 8001 inter 2000 fall 3
         server  web2  192.168.100.182:8001 check port 8001 inter 2000 fall 3
listenwebsites_02
         bind  192.168.100.110:80
         option   forwardfor
         #option  httpchk GET /info.txt
         #option  httpchk HEAD /check.html HTTP/1.0
         timeout  server  15s
         timeout  connect 30s
         server  web1  192.168.100.181:8002 check port 8002 inter 2000 fall 3
         server  web2  192.168.100.182:8002 check port 8002 inter 2000 fall 3
[root@mylinux1 conf] # scp haproxy.cfg mylinux2:/usr/local/haproxy/conf/
root@mylinux2's password: 
haproxy.cfg                                   100% 1608     1.6KB /s    00:00

注意,要保证mylinux1和mylinux2上的配置文件一模一样。

三、同时启动heartbeat服务

1
2
3
4
5
6
7
8
[root@mylinux1 conf] # /etc/init.d/heartbeat start
Starting High-Availability services: INFO:  Resource is stopped
INFO:  Resource is stopped
Done.
[root@mylinux2 conf] # /etc/init.d/heartbeat start
Starting High-Availability services: INFO:  Resource is stopped
INFO:  Resource is stopped
Done.

最后,要确保VIP成功绑定:

1
2
3
4
[root@mylinux1 conf] # ip a |grep 120
     inet 192.168.100.120 /24  brd 192.168.100.255 scope global secondary eth0
[root@mylinux2 conf] # ip a |grep 110
     inet 192.168.100.110 /24  brd 192.168.100.255 scope global secondary eth0

四、启动haproxy服务

在mylinux1上启动haproxy服务:

1
2
3
4
5
[root@mylinux1 conf] # service haproxy start
[ALERT] 275 /163638  (2078) : Starting proxy websites_02: cannot bind socket [192.168.100.110:80]
Start haproxy failed.
[root@mylinux1 conf] # ps -ef|grep haproxy
root       2080   1035  0 16:36 pts /0     00:00:00  grep  haproxy

发现无法启动,错误是因为无法绑定IP地址192.168.100.110,所以启动不成功。同样的,在mylinux2上也因为无法绑定IP地址192.168.100.120而无法启动。

解决方法:

在/etc/sysctl.conf中添加如下配置:

net.ipv4.ip_nonlocal_bind = 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@mylinux1 conf] # echo "net.ipv4.ip_nonlocal_bind = 1" >>/etc/sysctl.conf
[root@mylinux1 conf] # tail -1 /etc/sysctl.conf 
net.ipv4.ip_nonlocal_bind = 1
[root@mylinux1 conf] # sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
fs. file -max = 2097152
fs.nr_open = 2097152
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 81920
net.ipv4.ip_nonlocal_bind = 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@mylinux2 conf] # echo "net.ipv4.ip_nonlocal_bind = 1" >>/etc/sysctl.conf
[root@mylinux2 conf] # sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error:  "net.bridge.bridge-nf-call-ip6tables"  is an unknown key
error:  "net.bridge.bridge-nf-call-iptables"  is an unknown key
error:  "net.bridge.bridge-nf-call-arptables"  is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.ip_nonlocal_bind = 1

然后再次尝试启动haproxy服务:

1
2
3
4
5
[root@mylinux1 conf] # service haproxy start
Start haproxy successful.
[root@mylinux1 conf] # ps -ef|grep haproxy
haproxy    2102      1  0 16:43 ?        00:00:00  /usr/local/haproxy/sbin/haproxy  -f  /usr/local/haproxy/conf/haproxy .cfg
root       2104   1035  0 16:43 pts /0     00:00:00  grep  haproxy
1
2
3
4
5
[root@mylinux2 conf] # service haproxy start
Start haproxy successful.
[root@mylinux2 conf] # ps -ef|grep haproxy
haproxy    3225      1  0 16:44 ?        00:00:00  /usr/local/haproxy/sbin/haproxy  -f  /usr/local/haproxy/conf/haproxy .cfg
root       3227   2036  0 16:44 pts /0     00:00:00  grep  haproxy

五、测试代理访问

wKiom1fwycnzcvTAAACYRUHnnMA744.jpg-wh_50

wKiom1fwycuxN35lAAChNcqrBsM493.jpg-wh_50

访问192.168.100.120,是转发给http://192.168.100.181:8001/和http://192.168.100.182:8001/,没有问题。

wKioL1fwycyBHu19AACNnT-bYoU758.jpg-wh_50

wKioL1fwyc6R1rkxAACNknlD6GU165.jpg-wh_50

访问192.168.100.110,是转发给http://192.168.100.181:8002/和http://192.168.100.182:8002/,这里也显示正常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@mylinux1 conf] # for i in {1..10};do curl http://192.168.100.120/;done
web1
web3
web1
web3
web1
web3
web1
web3
web1
web3
[root@mylinux1 conf] # for i in {1..10};do curl http://192.168.100.110/;done
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4

在linux上进行测试,代理访问也正常。

六、模拟故障切换

这里将mylinux1上的heartbeat服务关闭,然后再进行代理访问测试。

1
2
3
4
5
[root@mylinux1 conf] # /etc/init.d/heartbeat stop
Stopping High-Availability services: Done.
[root@mylinux1 conf] # ip a |grep 192.168.100.120
[root@mylinux1 conf] # service haproxy status
Haproxy (pid  2102) is running...
1
2
3
4
5
6
[root@mylinux2 conf] # ip a |grep 192.168.100
     inet 192.168.100.122 /24  brd 192.168.100.255 scope global eth0
     inet 192.168.100.110 /24  brd 192.168.100.255 scope global secondary eth0
     inet 192.168.100.120 /24  brd 192.168.100.255 scope global secondary eth0
[root@mylinux2 conf] # service haproxy status
Haproxy (pid  3225) is running...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@mylinux1 conf] # for i in {1..10};do curl http://192.168.100.120/;done
web1
web3
web1
web3
web1
web3
web1
web3
web1
web3
[root@mylinux1 conf] # for i in {1..10};do curl http://192.168.100.110/;done
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4

然后将mylinux1的heartbeat服务开启,同时将mylinux2的heartbeat服务关闭,再次进行代理访问测试。

1
2
3
4
5
6
[root@mylinux1 conf] # /etc/init.d/heartbeat start
Starting High-Availability services: INFO:  Resource is stopped
INFO:  Resource is stopped
Done.
[root@mylinux2 conf] # /etc/init.d/heartbeat stop
Stopping High-Availability services: Done.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
[root@mylinux3 conf] # for i in {1..1000};do curl http://192.168.100.120/;sleep 1;done
web3
web1
web3
web1
web3
web1
web3
web1
web3
web1
web3
web1
web3
web1
web1
web3
web1
web3
web1
web3
web1
web3
web1
web3
web1
web3
web1
web3
web1
web3
web1
web3
web1
web3
[root@mylinux4 conf] # for i in {1..1000};do curl http://192.168.100.110/;sleep 1;done
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4
web2
web4

在客户端上的测试发现,VIP的转移基本没有造成服务的中断,说明haproxy代理服务高可用设置成功。

七、建议配置

因为heartbeat的停止或者服务器宕机都会影响VIP的切换,但是haproxy服务需要自动启动,而不能由heartbeat控制,所以建议在开机启动项中把haproxy设置为开机启动,至于heartbeat服务,不建议设置开机启动,以防止出现裂脑现象。

1
2
3
4
5
6
7
8
[root@mylinux1 conf] # chkconfig --add haproxy
[root@mylinux1 conf] # chkconfig haproxy on
[root@mylinux1 conf] # chkconfig --list haproxy
haproxy        0:off1:off2:on3:on4:on5:on6:off
[root@mylinux2 conf] # chkconfig --add haproxy
[root@mylinux2 conf] # chkconfig haproxy on
[root@mylinux2 conf] # chkconfig --list haproxy
haproxy        0:off1:off2:on3:on4:on5:on6:off

注意:要让haproxy脚本能添加到chkconfig列表中去,需要添加如下内容:

#!/bin/bash

#

#chkconfig: 2345 20 70

#description: Start and stop haproxy service.

#

...

这样,以后只需要在重启服务器后手动开启heartbeat服务即可,即使出现脑裂,也只需要人为的处理一下,从而避免了haproxy服务的维护,提高了工作效率。



本文转自 jerry1111111 51CTO博客,原文链接:http://blog.51cto.com/jerry12356/1858448,如需转载请自行联系原作者

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
1月前
|
负载均衡 前端开发 应用服务中间件
负载均衡指南:Nginx与HAProxy的配置与优化
负载均衡指南:Nginx与HAProxy的配置与优化
60 3
|
5月前
|
负载均衡 算法 前端开发
HAProxy 和负载均衡概念简介
HAProxy 和负载均衡概念简介
93 3
|
6月前
|
负载均衡 NoSQL 应用服务中间件
搭建高可用及负载均衡的Redis
【7月更文挑战第10天】
214 1
|
6月前
|
负载均衡 安全 Cloud Native
云上负载均衡:构建高可用、高性能的网络应用架构
与云原生技术深度融合:随着云原生技术的普及和发展未来的云上负载均衡将更加紧密地与云原生技术相结合。例如与Kubernetes等容器编排平台集成实现自动化的服务发现和路由管理;与Serverless架构结合提供无缝的流量接入和请求处理能力。 安全性能提升:面对日益严峻的网络安全威胁云上负载均衡将更加注重安全性能的提升。通过引入加密传输、访问控制、DDoS防护等安全措施确保网络流量的安全性和隐私性;同时还将建立完善的安全监控和应急响应机制以应对各种安全事件和突发事件。 支持多协议和多场景:未来的云上负载均衡将支持更多种类的网络协议和应用场景以满足不同用户和业务的需求。例如支持HTTP/2、
290 0
|
6月前
|
负载均衡 算法 Java
实现高可用和可扩展的负载均衡系统的Java方法
实现高可用和可扩展的负载均衡系统的Java方法
|
7月前
|
负载均衡 应用服务中间件 开发工具
技术笔记:nginx和keeplive实现负载均衡高可用
技术笔记:nginx和keeplive实现负载均衡高可用
|
8月前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
158 0
|
7月前
|
缓存 负载均衡 算法
解读 Nginx:构建高效反向代理和负载均衡的秘密
解读 Nginx:构建高效反向代理和负载均衡的秘密
138 2
|
6月前
|
负载均衡 算法 应用服务中间件
nginx自定义负载均衡及根据cpu运行自定义负载均衡
nginx自定义负载均衡及根据cpu运行自定义负载均衡
113 1
|
6月前
|
运维 负载均衡 算法
SLB与NGINX的异同是什么
SLB与NGINX的异同是什么
572 2