共计 12413 个字符,预计需要花费 32 分钟才能阅读完成。
简介
HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代 理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大的 web 站点,这些站点通常又需要会话保持或七层处理。HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的 web 服务器不被暴露到网络上。
安装
安装介质
从 HaProxy 官方网站下载最稳定的发布版本 (1.4.25) 源码包;使用源码包的好处是可以在不同的 Linux 环境上进行编译安装。
haproxy-1.4.25.tar.gz
环境准备
HaProxy 支持大多数的 Linux OS,我选择开源的操作系统 Ubuntu Server 14.04(64Bites),当然选择 SUSE 或 RadHat 也没有问题。如果没有 Linux 环境,可以安装虚拟软件(如 VMWare)创建虚拟机并安装操作系统,由于 Ubuntu 比较小巧,占用资源较少,比较适合在本机虚拟化环境中运行。当然,现在的 PC 配置较高一般的 Linux OS 可以安装几台都不成问题。
查看源码包下面的 README 文件,可以知道 HAProxy 所支持的 OS:
– linux22 for Linux 2.2
– linux24 for Linux 2.4 and above (default)
– linux24e for Linux 2.4 with support for a working epoll (> 0.21)
– linux26 for Linux 2.6 and above
– linux2628 for Linux 2.6.28 and above (enables splice and tproxy)
– solaris for Solaris 8 or 10 (others untested)
– freebsd for FreeBSD 5 to 8.0 (others untested)
– osx for Mac OS/X
– openbsd for OpenBSD 3.1 to 5.2 (others untested)
– aix52 for AIX 5.2
– cygwin for Cygwin
– generic for any other OS.
– custom to manually adjust every setting
安装过程
(1)解压安装包
如果你的本地环境是 Linux,那就直接解压安装包;或者使用的是虚拟机,则把安装包上传至虚拟机(可以使用 Xftp 软件或 Linux scp 命令); 如果虚拟机可以连接 Internet,也可以在虚拟机里直接下载 HaProxy 源码安装包;把准备好的源码安装包解压缩;
(2)源码包目录结构
CHANGELOG : 版本变更信息,记录新增更能、BUG 修改等信息
doc : 文档
example : 配置示例
tests : 测试用例(配置文件)
include : 依赖类库
ebtree : 类库
src : 源代码(c)
(3)编译源码
与一般编译安装源码程序不同,HaProxy 安装不需要执行 configure 操作,在其安装包根目录下可以发现不存在 configure 脚本;执行 make 命令编译源码;
make TARGET=linux26 PREFIX=/opt/programs/haproxy-1.4.25
PREFIX 指定安装程序的根目录,如果不指定则安装到系统默认目录下,编译结束根目录下多了一个可执行的文件:haproxy,就是核心程序,执行该命令可以启动 HaProxy 进程(当然要先准备好配置文件)。
(4)安装
执行 make install 安装编译产物。
查看安装结果:
配置
HAProxy 源码安装包中带有配置示例和技术文档,可以参考学习。以下举例配置最常用的两种代理 HTTP 和 TCP。
HTTP
环境准备
Apache-tomcat | 192.168.226.128:8080 |
Apache-tomcat | 192.168.226.129:8080 |
配置文件
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
listen http-in
bind *:80
server server1 192.168.226.128:8080 maxconn 32
server server2 192.168.226.129:8080 maxconn 32
测试
先做一个简单的配置并测试。新建 haproxy 配置文件 ${haproxy.home}/conf/haproxy.cfg,输入上述配置内容后保存(配置文件可以任意命名,只要启动时指定配置文件路径即可 [-f ${cfgFilePath}])。执行 ${haproxy.home}/sbin/haproxy –f ${haproxy.home}/conf/haproxy.cfg 启动 haproxy 进程。如果不知道命令参数,可以输入 - h 查看帮助信息。
执行 ${haproxy.home}/sbin/haproxy -f ${haproxy.home}/conf/haproxy.cfg 启动 haproxy 进程;
————————————– 分割线 ————————————–
Haproxy+Keepalived 搭建 Weblogic 高可用负载均衡集群 http://www.linuxidc.com/Linux/2013-09/89732.htm
Keepalived+HAProxy 配置高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/56748.htm
CentOS 6.3 下 Haproxy+Keepalived+Apache 配置笔记 http://www.linuxidc.com/Linux/2013-06/85598.htm
Haproxy + KeepAlived 实现 WEB 群集 on CentOS 6 http://www.linuxidc.com/Linux/2012-03/55672.htm
Haproxy+Keepalived 构建高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/55880.htm
使用 HAProxy 配置 HTTP 负载均衡器 http://www.linuxidc.com/Linux/2015-01/112487.htm
————————————– 分割线 ————————————–
编写一个 JSP 文件放入 tomcat 自带的 example 应用中(每个 server 里都放置一份),查看每次访问的 server 信息(可以在每个 tomcat 启动参数中加入不同的值 -D${key}=${value},方便测试),JSP 文件内容如下:
<%@pageimport=”java.util.Properties”%>
<%@pageimport=”java.net.InetAddress”%>
<%@pagelanguage=”java”contentType=”text/html; charset=UTF-8″
pageEncoding=”UTF-8″%>
<%
InetAddress address = InetAddress.getLocalHost();
String hostAddress = address.getHostAddress();
String hostName = address.getHostName();
Properties props = System.getProperties();
%>
<!DOCTYPEhtmlPUBLIC”-//W3C//DTD HTML 4.01 Transitional//EN””http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<metahttp-equiv=”Content-Type”content=”text/html; charset=UTF-8″>
<title>Test HAProxy HTTP mode</title>
</head>
<body>
<spanstyle=”color: blue;”>ZhongWen.Li (lizw@primeton.com)</span>
<tablewidth=”100%”border=”0.1″>
<thead>
<tr>
<thcolspan=”2″align=”center”>Server information</th>
</tr>
</thead>
<tbody>
<tr>
<td>SERVER ADDRESS</td>
<td><%=hostAddress %></td>
</tr>
<tr>
<td>SERVER NAME</td>
<tdstyle=”color: red;”><%=hostName %></td>
</tr>
<tr>
<td>Session ID</td>
<td><%=session.getId() %></td>
</tr>
<tr>
<tdcolspan=”2″align=”center”>System information</td>
</tr>
<%for (Object key : props.keySet()) {%>
<tr>
<td><%=key %></td>
<td><%=props.get(key) %></td>
</tr>
<% } %>
</tbody>
</table>
</body>
</html>
直接访问应用容器 1
直接访问应用容器 2
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-02/128654p2.htm
通过 HaProxy 访问,不断刷新页面,由于请求比较少,配置的第一台 server 响应的几率比较高(HaProxy 把大部分请求分发到第一台 Server 上);如果每个 Server 的处理能力不一样(例如硬件环境不同)可以配置每个 Server 的最大请求数,优先级(权重)等并结合分发策略来合理利用每个 Server 的处理能力。更多高级配置可以参考官方文档(安装包根目录下 doc/configuration.txt 以及示例配置 examples)
关闭其中一台 Server,并通过 HAProxy 地址不断请求,你会发现有时请求正常响应,有时会出现 503 Service Unavailable 错误。这是因为使用上述的配置,HaProxy 不知道后面的 Server 状态,只是安装现有的请求分发策略去处理请求,如果发到正常运行的 Server 上则响应正常,否则出现 503 错误。解决这个问题很简单,只要给这些 Server 配置一个健康检查页面即可和健康检查时间间隔,建议配置一个小的静态页面(如果健康检查太频繁、响应页面太大会消耗网络流量);这样 HaProxy 发现后端 Server 服务不可用时,则不会把请求转发给他。(通常可以使用 HaProxy+ Keepalived 来做应用的高可用方案)
应用集群会遇到一个问题:如何保持各个 Server 的回话(session)一致。这一点,HaProxy 无能为力,只能通过其他手段来实现。可以通过扩展应用容器的 session 实现,集中存储 session 信息(例如存储在 Memcached 上),Jetty、Tomcat 有很多开源的共享 session 实现。
TCP
环境准备
VMWare RabbitMQ | 192.168.226.128:5672 |
VMWare RabbitMQ | 192.168.226.129:5672 |
配置文件
global
daemon
maxconn 256
defaults
mode tcp
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
listen rabbitmq
bind *:8001
server server1 192.168.226.128:5672 maxconn 32
server server2 192.168.226.129:5672 maxconn 32
测试
使用 rabbitmq-java 客户端 API 编写测试代码。
package org.amqp.dev.test;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
public class MessageConsumer {
private final static String QUEUE_NAME = “hello_world”;
private static String SERVER_HOST_1 = “192.168.226.128”;
private static String SERVER_HOST_2 = “192.168.226.129”;
private static int SERVER_1_PORT = 5672;
private static int SERVER_2_PORT = 5672;
private static String HAPROXY_HOST = “192.168.226.128”;
private static int HAPROXY_PORT = 8001;
public static void main(String[] args) throws Exception {
// 新建连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(SERVER_HOST_1);
// factory.setHost(SERVER_HOST_2);
// factory.setHost(HAPROXY_HOST);
factory.setVirtualHost(“/”);
factory.setPort(SERVER_1_PORT);
// factory.setPort(SERVER_2_PORT);
// factory.setPort(HAPROXY_PORT);
factory.setUsername(“guest”);
factory.setPassword(“guest”);
// 新建连接
Connection connection = factory.newConnection();
// 建立通道
Channel channel = connection.createChannel();
// 重复声明队列,如果存在该队列且声明的参数与现在队列的参数一致则不会出错否则异常
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(“Waiting for messages.”);
// 新建消息接收器
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME, true, consumer);
boolean flag = true;
while (flag) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery(/* 可以传入一个超时时间,否则死等 */);
String message = new String(delivery.getBody());
System.out.println(“Received ‘” + message + “‘”);
// TODO biz
}
channel.close();
connection.close();
}
}
在 Eclipse 中使用 Debug 方式运行 MessageConsumer:
从 Debug 视图中可以看到长连接的线程
从 rabbitmq_management 可以看到客户端连接;192.168.226.1:56423 是 rabbitmq java 客户端在我的本地开启的一个端口;下面我们在更改连接方式,通过 HaProxy 连接 rabbitmq。
编写 HaProxy 配置文件 ${haproxy.home}/conf/rabbitmq.cfg,输入上述配置后保存;执行 ${haproxy.home}/sbin/haproxy –f ${haproxy.home}/conf/rabbitmq.cfg 启动 HaProxy 进程;修改 MessageConsumer 代码,使用 HaProxy 的主机和端口:
在 Eclipse 中使用 Debug 方式运行 MessageConsumer:
从 Debug 视图看到的连接线程显示的是 HaProxy 服务端口;
从 rabbitmq_management 可以看到客户端连接;但显示的客户端地址不是我本地的,而是 HaProxy 的地址。
可以编写测试类创建很多 Connection,会发现和之前测试 HTTP 模式一样,他会连接到不同的 Server 上;这样我们就可以使用 HaProxy 来做负载。(rabbitmq 可以搭建集群环境)
监控
可以通过配置 listen 监控 HaProxy 后端服务状态:
listen admin
bind 0.0.0.0:11111
mode http
stats refresh 5s# 刷新时间间隔
stats uri /admin# 访问地址
stats auth admin:admin# 登陆账户密码
需要为 Server 配置健康检查才能显示状态。
关于配置
上述示例使用的是 listen 模块配置,也可以使用 frontend(端口,引用的 backend 等)+ backend(后端服务)模块配置;
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:80
default_backend servers
backend servers
server server1 127.0.0.1:8001 maxconn 32
server server1 127.0.0.1:8002 maxconn 32
每个配置文件可以配置多个 listen,但不能配置一样的端口;虽然可以配置多组,但不建议这么做,可以编写多个配置文件,分别为这些配置文件启动 HaProxy 进程完成,各个 HaProxy 独立运行,需要更新集群 URL 列表时(应用伸缩,应用迁移等)可以停止而不会影响其他应用。在使用 HaProxy+keepalived 做高可用方案时,可以主备先后停机更新配置做到服务不中断。
结论
本文讲述了 HaProxy 的入门,利用简单的配置测试 HaProxy 的负载功能,更多高级的配置需要结合应用场景来配置测试。可以通过学习 HaProxy 的文档和示例掌握更多的配置技巧。
HAproxy 的详细介绍:请点这里
HAproxy 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-02/128654.htm
简介
HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代 理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大的 web 站点,这些站点通常又需要会话保持或七层处理。HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的 web 服务器不被暴露到网络上。
安装
安装介质
从 HaProxy 官方网站下载最稳定的发布版本 (1.4.25) 源码包;使用源码包的好处是可以在不同的 Linux 环境上进行编译安装。
haproxy-1.4.25.tar.gz
环境准备
HaProxy 支持大多数的 Linux OS,我选择开源的操作系统 Ubuntu Server 14.04(64Bites),当然选择 SUSE 或 RadHat 也没有问题。如果没有 Linux 环境,可以安装虚拟软件(如 VMWare)创建虚拟机并安装操作系统,由于 Ubuntu 比较小巧,占用资源较少,比较适合在本机虚拟化环境中运行。当然,现在的 PC 配置较高一般的 Linux OS 可以安装几台都不成问题。
查看源码包下面的 README 文件,可以知道 HAProxy 所支持的 OS:
– linux22 for Linux 2.2
– linux24 for Linux 2.4 and above (default)
– linux24e for Linux 2.4 with support for a working epoll (> 0.21)
– linux26 for Linux 2.6 and above
– linux2628 for Linux 2.6.28 and above (enables splice and tproxy)
– solaris for Solaris 8 or 10 (others untested)
– freebsd for FreeBSD 5 to 8.0 (others untested)
– osx for Mac OS/X
– openbsd for OpenBSD 3.1 to 5.2 (others untested)
– aix52 for AIX 5.2
– cygwin for Cygwin
– generic for any other OS.
– custom to manually adjust every setting
安装过程
(1)解压安装包
如果你的本地环境是 Linux,那就直接解压安装包;或者使用的是虚拟机,则把安装包上传至虚拟机(可以使用 Xftp 软件或 Linux scp 命令); 如果虚拟机可以连接 Internet,也可以在虚拟机里直接下载 HaProxy 源码安装包;把准备好的源码安装包解压缩;
(2)源码包目录结构
CHANGELOG : 版本变更信息,记录新增更能、BUG 修改等信息
doc : 文档
example : 配置示例
tests : 测试用例(配置文件)
include : 依赖类库
ebtree : 类库
src : 源代码(c)
(3)编译源码
与一般编译安装源码程序不同,HaProxy 安装不需要执行 configure 操作,在其安装包根目录下可以发现不存在 configure 脚本;执行 make 命令编译源码;
make TARGET=linux26 PREFIX=/opt/programs/haproxy-1.4.25
PREFIX 指定安装程序的根目录,如果不指定则安装到系统默认目录下,编译结束根目录下多了一个可执行的文件:haproxy,就是核心程序,执行该命令可以启动 HaProxy 进程(当然要先准备好配置文件)。
(4)安装
执行 make install 安装编译产物。
查看安装结果:
配置
HAProxy 源码安装包中带有配置示例和技术文档,可以参考学习。以下举例配置最常用的两种代理 HTTP 和 TCP。
HTTP
环境准备
Apache-tomcat | 192.168.226.128:8080 |
Apache-tomcat | 192.168.226.129:8080 |
配置文件
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
listen http-in
bind *:80
server server1 192.168.226.128:8080 maxconn 32
server server2 192.168.226.129:8080 maxconn 32
测试
先做一个简单的配置并测试。新建 haproxy 配置文件 ${haproxy.home}/conf/haproxy.cfg,输入上述配置内容后保存(配置文件可以任意命名,只要启动时指定配置文件路径即可 [-f ${cfgFilePath}])。执行 ${haproxy.home}/sbin/haproxy –f ${haproxy.home}/conf/haproxy.cfg 启动 haproxy 进程。如果不知道命令参数,可以输入 - h 查看帮助信息。
执行 ${haproxy.home}/sbin/haproxy -f ${haproxy.home}/conf/haproxy.cfg 启动 haproxy 进程;
————————————– 分割线 ————————————–
Haproxy+Keepalived 搭建 Weblogic 高可用负载均衡集群 http://www.linuxidc.com/Linux/2013-09/89732.htm
Keepalived+HAProxy 配置高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/56748.htm
CentOS 6.3 下 Haproxy+Keepalived+Apache 配置笔记 http://www.linuxidc.com/Linux/2013-06/85598.htm
Haproxy + KeepAlived 实现 WEB 群集 on CentOS 6 http://www.linuxidc.com/Linux/2012-03/55672.htm
Haproxy+Keepalived 构建高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/55880.htm
使用 HAProxy 配置 HTTP 负载均衡器 http://www.linuxidc.com/Linux/2015-01/112487.htm
————————————– 分割线 ————————————–
编写一个 JSP 文件放入 tomcat 自带的 example 应用中(每个 server 里都放置一份),查看每次访问的 server 信息(可以在每个 tomcat 启动参数中加入不同的值 -D${key}=${value},方便测试),JSP 文件内容如下:
<%@pageimport=”java.util.Properties”%>
<%@pageimport=”java.net.InetAddress”%>
<%@pagelanguage=”java”contentType=”text/html; charset=UTF-8″
pageEncoding=”UTF-8″%>
<%
InetAddress address = InetAddress.getLocalHost();
String hostAddress = address.getHostAddress();
String hostName = address.getHostName();
Properties props = System.getProperties();
%>
<!DOCTYPEhtmlPUBLIC”-//W3C//DTD HTML 4.01 Transitional//EN””http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<metahttp-equiv=”Content-Type”content=”text/html; charset=UTF-8″>
<title>Test HAProxy HTTP mode</title>
</head>
<body>
<spanstyle=”color: blue;”>ZhongWen.Li (lizw@primeton.com)</span>
<tablewidth=”100%”border=”0.1″>
<thead>
<tr>
<thcolspan=”2″align=”center”>Server information</th>
</tr>
</thead>
<tbody>
<tr>
<td>SERVER ADDRESS</td>
<td><%=hostAddress %></td>
</tr>
<tr>
<td>SERVER NAME</td>
<tdstyle=”color: red;”><%=hostName %></td>
</tr>
<tr>
<td>Session ID</td>
<td><%=session.getId() %></td>
</tr>
<tr>
<tdcolspan=”2″align=”center”>System information</td>
</tr>
<%for (Object key : props.keySet()) {%>
<tr>
<td><%=key %></td>
<td><%=props.get(key) %></td>
</tr>
<% } %>
</tbody>
</table>
</body>
</html>
直接访问应用容器 1
直接访问应用容器 2
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-02/128654p2.htm