使用haproxy实现负载均衡集群
一、HAProxy概述:
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。
HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
其支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql的均衡负载。
相同点:在功能上,proxy通过反向代理方式实现 WEB均衡负载。和 Nginx,ApacheProxy,lighttpd,Cheroke 等一样。
不同点:Haproxy 并不是 web 服务器。以上提到所有带反向代理均衡负载的产品,都清一色是 WEB 服务器。简单说,就是他们能处理解析页面的。而Haproxy 仅仅是一款的用于均衡负载的应用代理。其自身并不能提供web服务。但其配置简单,拥有非常不错的服务器健康检查功能还有专门的系统状态监控页面,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。
www.haproxy.org #打不开
http://haproxy.com/ #收费
http://haproxy.1wt.eu/ #社区版地址, 打不开
https://github.com/haproxy/haproxy/releases/ 在github 可以下载
实验拓扑图:

二、实战
1.安装依赖
|
1
|
[root@xuegod63 ~]# yum -y install make gcc gcc-c++ openssl-devel |
2.安装haproxy
|
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@xuegod63 ~]# tar -zxvf haproxy-1.7.9.tar.gz[root@xuegod63 haproxy-1.7.9]# cd /root/haproxy-1.7.9[root@xuegod63 haproxy-1.7.9]# uname -r #查看内核版本3.10.0-693.el7.x86_64[root@xuegod63 haproxy-1.7.9]# make TARGET=linux2628 PREFIX=/usr/local/haproxy #指定操作系统内核类型和安装的路径。也可以直接修改Makefile配置文件中这两个变量的值。如下:[root@xuegod63 haproxy-1.7.9]# vim Makefile94 PREFIX = /usr/local/haproxy104 TARGET =linux26[root@xuegod63 haproxy-1.7.9]# make install PREFIX=/usr/local/haproxy #如果没有修改Makefile配置文件中PREFIX变量的值,就必须在此重新对,PREFIX=/usr/local/haproxy赋值,否则直接执行 make install 时,make install会直接读取Makefile文件中PREFIX的变量值。[root@xuegod63 haproxy-1.7.9]# ls /usr/local/haproxy/doc sbin share |

3. 没有生成配置文件,自己手动写一个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
|
[root@xuegod63 ~]# mkdir /usr/local/haproxy/etc[root@xuegod63 ~]# vim /usr/local/haproxy/etc/haproxy.cfg #手动创建配置文件globallog 127.0.0.1 local0#log 127.0.0.1 local1 notice#log loghost local0 infomaxconn 4096chroot /usr/local/haproxyuid 99 #所属运行的用户uidgid 99 #所属运行的用户组daemon #以后台形式运行haproxynbproc 1 #启动1个haproxy实例。# #工作进程数量(CPU数量) ,实际工作中,应该设置成和CPU核心数一样。 这样可以发挥出最大的性能。pidfile /usr/local/haproxy/run/haproxy.pid #将所有进程写入pid文件#debug #调试错误时用#quiet #安静defaultslog globallog 127.0.0.1 local3 #日志文件的输出定向。产生的日志级别为local3. 系统中local1-7,用户自己定义mode http #工作模式,所处理的类别,默认采用http模式,可配置成tcp作4层消息转发option httplog #日志类别,记载http日志option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现option dontlognull #不记录空连接,产生的日志option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ipoption redispatch #当serverid对应的服务器挂掉后,强制定向到其他健康服务器retries 2 #2次连接失败就认为服务器不可用,主要通过后面的check检查maxconn 2000 #最大连接数balance roundrobin #负载均衡算法stats uri /haproxy-stats #haproxy 监控页面的访问地址 # 可通过 http://localhost:80/haproxy-stats 访问timeout connect 5000 #连接超时时间。 单位:ms 毫秒timeout client 50000 #客户端连接超时时间timeout server 50000 #服务器端连接超时时间mode httpoption httpchk GET /index.html #健康检测#注意实际工作中测试时,应该下载某一个页面来进行测试,因此这个页面应该是个小页面,而不要用首页面。这里是每隔一秒检查一次页面。frontend http #前端配置,http名称可自定义bind 0.0.0.0:80 #发起http请求80端口,会被转发到设置的ip及端口default_backend http_back #转发到后端 写上后端名称backend http_back #后端配置,名称上下关联server s1 192.168.1.62:80 weight 3 check #后端的主机 IP &权衡server s2 192.168.1.64:80 weight 3 check #后端的主机 IP &权衡#server node1 192.168.179.131:8081 check inter 2000 rise 3 fall 3 weight 30 # inter 2000 健康检查时间间隔2秒 # rise 3 检测多少次才认为是正常的 # fall 3 失败多少次才认为是不可用的# weight 30 权重使用nobody用户运行haproxy[root@xuegod63 haproxy-1.7.9]# id nobodyuid=99(nobody) gid=99(nobody) groups=99(nobody) #id 为99 |
关于负载均衡算法
#source 根据请求源IP
#static-rr 根据权重
#leastconn 最少连接者先处理
#uri 根据请求的uri
#url_param 根据请求的url参数
#rdp-cookie 据据cookie(name)来锁定并哈希每一次请求
#hdr(name) 根据HTTP请求头来锁定每一次HTTP请求
#roundrobin 轮询方式
4.设置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
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
[root@xuegod63 ~]# cp ./haproxy-1.7.9/examples/haproxy.init /etc/init.d/haproxy[root@xuegod63 ~]# chmod 755 /etc/init.d/haproxy[root@xuegod63 ~]# vim /etc/init.d/haproxy #修改后的脚本#!/bin/sh# chkconfig: - 85 15# description: HA-Proxy server# processname: haproxy# config: /usr/local/haproxy/etc/haproxy.cfg# pidfile: /usr/local/haproxy/run/haproxy.pid# Source function library.if [ -f /etc/init.d/functions ]; then . /etc/init.d/functionselif [ -f /etc/rc.d/init.d/functions ] ; then . /etc/rc.d/init.d/functionselse exit 0fi# Source networking configuration.. /etc/sysconfig/network# Check that networking is up.[ "$NETWORKING" = "no" ] && exit 0# This is our service nameBASENAME=`haproxy`BIN=/usr/sbin/haproxyCFG=/usr/local/haproxy/etc/haproxy.cfg[ -f $CFG ] || exit 1PIDFILE=/usr/local/haproxy/run/haproxy.pidLOCKFILE=/usr/local/haproxy/run/haproxyRETVAL=0start() { quiet_check if [ $? -ne 0 ]; then echo "Errors found in configuration file, check it with '$BASENAME check'." return 1 fi echo -n "Starting $BASENAME: " daemon $BIN -D -f $CFG -p $PIDFILE RETVAL=$? echo [ $RETVAL -eq 0 ] && touch $LOCKFILE return $RETVAL}stop() { echo -n "Shutting down $BASENAME: " killproc $BASENAME -USR1 RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f $LOCKFILE [ $RETVAL -eq 0 ] && rm -f $PIDFILE return $RETVAL}restart() { quiet_check if [ $? -ne 0 ]; then echo "Errors found in configuration file, check it with '$BASENAME check'." return 1 fi stop start}reload() { if ! [ -s $PIDFILE ]; then return 0 fi quiet_check if [ $? -ne 0 ]; then echo "Errors found in configuration file, check it with '$BASENAME check'." return 1 fi $BIN -D -f $CFG -p $PIDFILE -sf $(cat $PIDFILE)}check() { $BIN -c -q -V -f $CFG}quiet_check() { $BIN -c -q -f $CFG}rhstatus() { status $BASENAME}condrestart() { [ -e $LOCKFILE ] && restart || :}# See how we were called.case "$1" in start) start ;; stop) stop ;; restart) restart ;; reload) reload ;; condrestart) condrestart ;; status) rhstatus ;; check) check ;; *) echo $"Usage: $BASENAME {start|stop|restart|reload|condrestart|status|check}" exit 1esac exit $?复制haproxy文件到/usr/sbin下因为上面的haproxy.init启动脚本默认会去/usr/sbin下找[root@xuegod63 ~]#cp /usr/local/haproxy/sbin/haproxy /usr/sbin/创建目录和权限[root@xuegod63 ~]# mkdir -p /usr/local/haproxy/run[root@xuegod63 ~]# chown nobody /usr/local/haproxy/ -R配置日志收集[root@xuegod63 ~]# vim /etc/rsyslog.conf #打开以下两行的注释,不打开收不到日志$ModLoad imudp #取消注释$UDPServerRun 514 #取消注释local7.* /var/log/boot.log #下面添加两行local3.* /var/log/haproxy.loglocal0.* /var/log/haproxy.log[root@xuegod63 ~]# systemctl restart rsyslog |
5. 启动停止haproxy服务
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
特殊启动方法1[root@xuegod63 etc]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg查看状态:[root@xuegod63 etc]# ps -axu | grep haproxynobody 3871 0.0 0.0 12228 1036 ? Ss 21:53 0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg[root@xuegod63 etc]# netstat -antup | grep 80tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3871/haproxy ##停止[root@xuegod63 etc]# killall haproxy #没有killall命令?安装yum -y install psmiscHAproxy脚本启动方法2[root@xuegod63 ~]# /etc/init.d/haproxy start 或 systemctl restart haproxy |
6.配置xuegod62,xuegod64后端服务器
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
配置后端服务器: xuegod62配置web服务器:[root@xuegod62 html]# yum install httpd php -y生成测试文件:root@xuegod62 html]#echo 192.168.1.62 > /var/www/html/index.html启动apache服务器:[root@xuegod62 html]# service httpd restart配置后端服务器: xuegod64IP: 192.168.1.64配置web服务器:[root@xuegod64 html]# yum install httpd php -y生成测试文件:echo 192.168.1.64 > /var/www/html/index.html[root@xuegod64 html]# service httpd restart |
7.查看HAproxy的监控页面
http://192.168.1.63/haproxy-stats,类似如下图

测试:反向代理功能
http://192.168.1.63/
注:
相关配置文件和启动脚本可以从这个配置模版中获得
|
1
2
3
4
5
|
[root@xuegod63 haproxy-1.7.9]# cd /root/haproxy-1.7.9/examples/[root@xuegod63 examples]# ls配置随机启动[root@xuegod63 examples]# chkconfig --add haproxy[root@xuegod63 examples]# chkconfig haproxy on |
使用haproxy实现负载均衡集群的更多相关文章
- 基于 Haproxy 构建负载均衡集群
1.HAPROXY简介 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种负载均衡解决方案.HAProxy特别适用于那些负载特大的web ...
- Haproxy 构建负载均衡集群
1.HAPROXY简介 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种负载均衡解决方案.HAProxy特别适用于那些负载特大的web ...
- Haproxy+Keepalived搭建Weblogic高可用负载均衡集群
配置环境说明: KVM虚拟机配置 用途 数量 IP地址 机器名 虚拟IP地址 硬件 内存3G 系统盘20G cpu 4核 Haproxy keepalived 2台 192.168.1.10 192 ...
- Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived
文章目录 MyCat在MySQL主从复制的基础上实现读写分离 一.环境 二.依赖课程 三.MyCat 介绍 ( MyCat 官网:http://mycat.org.cn/ ) 四.MyCat 的安装 ...
- 高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群
高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群 libnet软件包<-依赖-heartbeat(包含ldirectord插件(需要perl-MailTools的rpm包)) l ...
- LB 高可扩展性集群(负载均衡集群)
一.什么是负载均衡 首先我们先介绍一下什么是负载均衡: 负载平衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载, ...
- 负载均衡集群企业级应用实战—LVS
一.负载均衡集群介绍 1.集群 ① 集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能.可靠性.灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技 ...
- 实现基于LVS负载均衡集群的电商网站架构
背景 上一期我们搭建了小米网站,随着业务的发展,网站的访问量越来越大,网站访问量已经从原来的1000QPS,变为3000QPS,网站已经不堪重负,响应缓慢,面对此场景,单纯靠单台LNMP的架构已经无法 ...
- LVS负载均衡集群
回顾-Nginx反向代理型负载 负载均衡(load balance)集群,提供了一种廉价.有效.透明的方法,来扩展网络设备和服务器的负载.带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用 ...
随机推荐
- Webpack配置区分开发环境和生产环境
在项目开发的时候,我们通常会将程序分为开发环境和生产环境(或者叫线上环境),开发环境通常指的是我们正在开发的这个阶段所需要的一些环境配置,也就是方便我们开发人员调试开发的一种环境:生产环境通常指的是我 ...
- Fliptile POJ-3279 DFS
题目链接:Fliptile 题目大意 有一个01矩阵,每一次翻转(0->1或者1->0)一个元素,就会把与他相邻的四个元素也一起翻转.求翻转哪些元素能用最少的步骤,把矩阵变成0矩阵. 思路 ...
- (七十八)c#Winform自定义控件-倒影组件
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- XLNet预训练模型,看这篇就够了!(代码实现)
1. 什么是XLNet XLNet 是一个类似 BERT 的模型,而不是完全不同的模型.总之,XLNet是一种通用的自回归预训练方法.它是CMU和Google Brain团队在2019年6月份发布的模 ...
- sql server编写archive通用模板脚本实现自动分批删除数据
博主做过比较多项目的archive脚本编写,对于这种删除数据的脚本开发,肯定是一开始的话用最简单的一个delete语句,然后由于部分表数据量比较大啊,索引比较多啊,会发现删除数据很慢而且影响系统的正常 ...
- Spring 梳理 - filter、interceptor、aop实现与区别 -第一篇
前言 项目中我们经常需要对RESTful api进行拦截,主流实现方法有filter.interceptor.aop,先说一下他们各自的实现. Filter AnimalFilter实现javax.s ...
- 设计模式之UML类图以及类间关系
类图是描述系统中的类,以及各个类之间的关系的静态视图.能够让我们在正确编写代码以前对系统有一个全面的认识.类图是一种模型类型,确切的说,是一种静态模型类型.类图表示类.接口和它们之间的协作关系. 以下 ...
- 前端获取后台传输过来是数据 {张三:12} 解析为[object object],获取其中内容
昨天遇到前端传输过来的数据为[{张三:12},{李四:23}],后台用的是map格式,我在前端js中暂未找到直接调用对象内容的方法,故利用以下方法来获取: $.each(data.data,funct ...
- 利用threading模块开线程
一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 1.创建线程的开销比创建进程的开销小, ...
- 004-python面向对象,错误,调试和测试
---恢复内容开始--- 1.面向对象 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...