
1.前言
在PostgreSQL使用的一些高可用方案当中,会经常使用到一些重要的组件,而且是多个组合的组合。如果要全面了解,不妨把它们一个个拆解开,了解其中的大致原理,再进行组合配置,也就更加清晰了。
本文就只介绍一个HAProxy。从最简单的例子入手。
HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。(想想,基于TCP层不就可以用到PostgreSQL数据库当中吗?)
Keepalived则提供有效的VIP功能 。这样,在一个多机系统的环境里头,可以最终只暴露一个IP给外界。形成一个真正的高可用系统。打算另外再写篇短文介绍它以及它与HAProxy的组合。
2.系统实践
2.1 两个Web容器
这里为示方便,直接使用tomcat web容器:9.0.74。这个可以直接从:https://tomcat.apache.org/download-90.cgi#9.0.74 里头下载。
主机centos1: (192.168.0.6)
tomcat/apache-tomcat-9.0.74/webapps/ROOT]
1<% out.print("HOST_1: Hello!"); %>
主机centos2:(192.168.0.10)
tomcat/apache-tomcat-9.0.74/webapps/ROOT]vihello.jsp¨G0G主机centos2:(192.168.0.10)tomcat/apache−tomcat−9.0.74/webapps/ROOT] vi hello.jsp
1<% out.print("HOST_2: Hello!"); %>
分别启动tomcat:
1./tomcat/apache-tomcat-9.0.74/bin/startup.sh
这里为了区分不同的请求,特意把结果输成不同的字符串,以标识来自不同的机器。
http://192.168.0.6:8080/hello.jsp
http://192.168.0.10:8080/hello.jsp 会显示不同的内容,代表来自不同的host。
当然这个tomcat版本有些限制,不允许远程机器访问它的一些example。所以,如果你不想动ROOT,想在example目录 里边构造上边的jsp文件,可以直接修改配置文件:
1# 把下边这个文件中的一个IP地址过滤器过滤掉就行了
2vi apache-tomcat-9.0.74/webapps/examples/META-INF/context.xml
3
4<!--
5 <Valve className="org.apache.catalina.valves.RemoteAddrValve"
6 allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
7-->
2.2 配置和运行HAProxy
在centos1上,配置一个HAProxy:
1global
2 maxconn 100000
3 stats timeout 5s
4 user haproxy
5 group haproxy
6 daemon
7
8defaults
9 mode http
10 log global
11 retries 2
12 timeout queue 5s
13 timeout connect 5s
14 timeout client 60m
15 timeout server 60m
16 timeout check 15s
17
18listen stats
19 mode http
20 bind 192.168.0.6:7000
21 stats enable
22 stats uri /stats
23
24frontend webser
25 option forwardfor
26 bind *:80
27 default_backend app
28backend app
29 balance roundrobin
30 server websrv1 192.168.0.6:8080 check maxconn 2000
31 server websrv2 192.168.0.10:8080 check maxconn 2000
上边来了个最简单的配置,就是让来自80端口的访问,可以实现负载均衡,让那些请求以roundrobin的方式均匀的分发到上边两个host中 (见balance roundrobin)
我们使用root用户启动这个haproxy: (假设配置文件名为:haproxy.cfg.web)
haproxy -f proxy.cfg.web
统一入口:http://192.168.0.6/hello.jsp, 我们使用浏览器或者curl访问,会发现它的结果是依次从centos1和centos2响应得到的。
1c:\logs>curl http://192.168.0.6/hello.jsp
2HOST_2: Hello!
3c:\logs>curl http://192.168.0.6/hello.jsp
4HOST_1: Hello!
5c:\logs>curl http://192.168.0.6/hello.jsp
6HOST_2: Hello!
7c:\logs>curl http://192.168.0.6/hello.jsp
8HOST_1: Hello!
9c:\logs>curl http://192.168.0.6/hello.jsp
10HOST_2: Hello!
11.......
启动并查看统计的页面,绑定的是7000端口。
http://192.168.0.6:7000/stats

上边的例子很简单,就是演示了一个再简单不过的负载均衡的HAProxy功能。但是呢,它有一个小缺陷,就是HAProxy进程自身crash了,怎么办?它也不保险,对吧?
这个时候,加一个VIP层,同时在多个节点上启动完全一样配置的HAProxy,但是对外体现为一个VIP地址。就达到了它自身的高可用了。即算一个HAProxy挂了,利用VIP的机制,它会挑另一个活着的HAProxy,使用这个真正的VIP地址,向外提供服务,就能达到目的了。而Keepalived就起这么个作用。后续会有相应的短文进行介绍。
3.参考
[1] [https://www.bookstack.cn/read/HAProxy-zh/ch5.md](




