入坑系列之HAProxy负载均衡

在大型系统设计中用代理在负载均衡是最常见的一种方式,而相对靠谱的解决方案中Nginx、HAProxy、LVS、F5在各大场中用得比较普遍,各有各的优势和使用场景,由于本次要使用到TCP,因此Nginx只能在HTTP层负载,因此用HAProxy来负载,为什么不用LVS?因为配置太麻烦。

HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。HAProxy还可以将后端的服务器与网络隔离,起到保护后端服务器的作用。HAProxy的负载均衡能力虽不如LVS,但也是相当不错,而且由于其工作在7层,可以对http请求报文做深入分析,按照自己的需要将报文转发至后端不同的服务器(例如动静分离),这一点工作在4层的LVS无法完成。

环境

CentOS6.X

HAProxy 1.7.3

用root用户安装

下载

若在线安装不用下载,可直接通过yum命令安装(建议),不过需要联网。

去官网下载 :http://www.haproxy.org/download/1.7/src/haproxy-1.7.3.tar.gz

下载后放进CentOS中的/usr/local/  文件夹中(至于怎么放,你不会 这个锅我不背,去学学Linux 操作基础)

关闭SElinux、配置防火墙

vi /etc/selinux/config#SELINUX=enforcing #注释掉#SELINUXTYPE=targeted #注释掉SELINUX=disabled#增加:wq!#保存退出setenforce 0#使配置立即生效

vi /etc/sysconfig/iptables#编辑-A RH-Firewall-1-INPUT -d 224.0.0.18 -j ACCEPT#允许组播地址通信(在做keepalived时用得到)-A RH-Firewall-1-INPUT -p    vrrp    -j ACCEPT#允许VRRP(虚拟路由器冗余协)通信-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT#允许80端口通过防火墙:wq!#保存退出service iptables restart#重启防火墙使配置生效

创建HAProxy运行账户和组

[root@H32 local]#groupadd haproxy #添加haproxy组[root@H32 local]#useradd -g haproxy haproxy -s /bin/false #创建nginx运行账户haproxy并加入到haproxy组,不允许haproxy

安装

分两种:

1、在线装:yum install haproxy (建议)

2、安装包:

环境中要有gcc,用于编译,一般安装环境时都会有,若没有 运行 :

yum install -y gcc

进入local文件夹中

[root@H32 ~]#cd /usr/local

然后解压下载好haproxy包到当前文件夹

[root@H32 local]#tar -zxvf haproxy-1.7.3.tar.gz[root@H32 local]#cd haproxy-1.7.3

安装

[root@H32 haproxy-1.7.3]#make TARGET=linux3100 CPU=x86_64 PREFIX=/usr/local/haproxy-1.7.3 #编译(源码才需要)  uname -r #查看系统内核版本号[root@H32 haproxy-1.7.3]#make install PREFIX=/usr/local/haproxy-1.7.3 #安装 haproxy-1.7.3为解压后的文件路径(很重要)

设置HAProxy

mkdir -p /usr/local/haproxy-1.7.3/conf#创建配置文件目录

mkdir -p /etc/haproxy#创建配置文件目录

touch /usr/local/haproxy-1.7.3/conf/haproxy.cfg#创建配置文件

ln -s /usr/local/haproxy-1.7.3/conf/haproxy.cfg  /etc/haproxy/haproxy.cfg#添加配置文件软连接

cp -r /usr/local/haproxy-1.7.3/examples/errorfiles  /usr/local/haproxy-1.7.3/errorfiles#拷贝错误页面

ln -s /usr/local/haproxy-1.7.3/errorfiles  /etc/haproxy/errorfiles#添加软连接

mkdir -p /usr/local/haproxy-1.7.3/log#创建日志文件目录

touch /usr/local/haproxy-1.7.3/log/haproxy.log#创建日志文件

ln -s /usr/local/haproxy-1.7.3/log/haproxy.log  /var/log/haproxy.log#添加软连接

cp /usr/local/haproxy-1.7.3/examples/haproxy.init  /etc/rc.d/init.d/haproxy#拷贝开机启动文件

chmod +x /etc/rc.d/init.d/haproxy#添加脚本执行权限

chkconfig haproxy on#设置开机启动

ln -s /usr/local/haproxy-1.7.3/sbin/haproxy  /usr/sbin#添加软连接

注意上面的文件夹,若与上面的文件夹路径一致,可以直接复制运行。

配置haproxy.cfg参数

vi  /usr/local/haproxy-1.7.3/conf/haproxy.cfg#编辑

这里是最关键的设置,在此有两个相同的服务由两台服务器提供:192.168.30.33,192.168.30.34

#---------------------------------------------------------------------#Global settings#---------------------------------------------------------------------globallog127.0.0.1 local2###[err warning info debug]chroot/usr/local/haproxy-1.7.3pidfile/var/run/haproxy.pid###haproxy的pid存放路径,启动进程的用户必须有权限访问此文件maxconn  4000###最大连接数,默认4000user  haproxy

group  haproxy

daemon###创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon"#---------------------------------------------------------------------#common defaults that all the 'listen' and 'backend' sections will#use if not designated in their block#---------------------------------------------------------------------defaults

mode  http###默认的模式,tcp是4层,http是7层,health只会返回OK若是混合模式则 mode 不需要设置logglobal###采用全局定义的日志option  dontlognull###不记录健康检查的日志信息option  httpclose###每次请求完毕后主动关闭http通道option  httplog###日志类别http日志格式混合模式 此处还需要加上 tcplog#option  forwardfor###如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ipoption  redispatch###serverId对应的服务器挂掉后,强制定向到其他健康的服务器timeout connect 10s#default 10 second timeout if a backend is not foundtimeout client 10s###客户端连接超时timeout server 10s###服务器连接超时maxconn    60000###最大连接数retries    3###3次连接失败就认为服务不可用,也可以通过后面设置########统计页面配置########listen admin_stats#监听端口bind 0.0.0.0:8089#启用状态监控stats enable

mode http

logglobal#统计页面URLstats uri /stats#统计页面密码框上提示文本stats realm Haproxy\ Statistics#统计页面用户名和密码设置stats auth admin:admin#隐藏统计页面上HAProxy的版本信息#stats hide-version#当通过认证才可管理stats adminifTRUE#统计页面自动刷新时间stats refresh 30s########WEB配置#################listen web1080

bind0.0.0.0:1080mode http

option httplog

logglobalmaxconn3000balance leastconnserver web33192.168.80.33:8007  weight 1 rise 2 fall 3server web34 192.168.80.34:8007 weight 1 rise 2 fall 3#---------------------------------------------------------------------#main frontend which proxys to the backends 这里不需要动静分离,所以全部注释掉#---------------------------------------------------------------------#frontend  main *:5000#acl url_static      path_beg      -i /static /images /javascript /stylesheets#acl url_static      path_end      -i .jpg .gif .png .css .js#use_backend static          if url_static#default_backend            app#---------------------------------------------------------------------#static backend for serving up images, stylesheets and such#---------------------------------------------------------------------#backend static#balance    roundrobin#server      static 127.0.0.1:4331 check#---------------------------------------------------------------------#round robin balancing between the various backends#---------------------------------------------------------------------#backend app#balance    roundrobin#server  app1 127.0.0.1:5001 check#server  app2 127.0.0.1:5002 check#server  app3 127.0.0.1:5003 check#server  app4 127.0.0.1:5004 check#---------------------------------------------------------------------#round robin balancing between the various backends#---------------------------------------------------------------------#errorloc  503  http://www.osyunwei.com/404.htmlerrorfile 403 /etc/haproxy/errorfiles/403.http

errorfile500 /etc/haproxy/errorfiles/500.http

errorfile502 /etc/haproxy/errorfiles/502.http

errorfile503 /etc/haproxy/errorfiles/503.http

errorfile504 /etc/haproxy/errorfiles/504.http

统一绑定的对外接口为1080, 监控页面端口为8089。

启动

:wq!#保存退出

service haproxy start#启动

#设置开机启动

chkconfig haproxy on

设置HAProxy日志

vi  /etc/syslog.conf#编辑,在最下边增加#

haproxy.log

local0.*  /var/log/haproxy.log

local1.*  /var/log/haproxy.log

local2.*  /var/log/haproxy.log

local3.*  /var/log/haproxy.log

:wq!#保存退出

vi  /etc/sysconfig/rsyslog#编辑修改

SYSLOGD_OPTIONS="-r -m 0"#接收远程服务器日志

:wq!#保存退出

service rsyslog restart#重启syslog

监控页面

打开监控页面,用户名密码为admin,出现下面的页面就说明配置成功:

http://192.168.30.32:8089/stats

service haproxy stop#关闭service haproxy restart#重启

扩展问题:

此处只做了简单的IP请求负载,还可以做TCP层的负载,但里面的设置需要根据自己的实际情况不停的压力测试进行调置。

此后还要做Keepalived + HAProxy 多机热备的负载实用方案。

还可做mysql的读写负载、动静态资源分离等等

ACL规则介绍

ACL控制哪些开放,往哪里转,哪些屏蔽 ,具体的内容网上也有介绍,此处只做抛砖引玉。

实例:实现动静分离功能

首先定义两个backend,分别以动态和静态进行分组

backend jingtai

balance roundrobin

server web1 10.0.10.82:80 check weight 1maxconn 2000

backend dongtai

balance roundrobin

server web2 10.0.10.83:80 check weight 1maxconn 3000

配置frontend

frontend web_server

bind *:80

default_backend webservers

acl badguy src 10.0.10.1

acl denyfile path /1.html

#http-request deny if badguy denyfile

acl static path_end .html

use_backend jingtai if static

default_backend dongtai

定义acl名称为static ,如果访问匹配是.html的文件,那么直接跳转至jingtai 这个backend

如果访问的不匹配.html 那么直接跳转至默认backend dongtai组

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 参考文档: 1.haproxy:http://www.haproxy.org/ 本文涉及haproxy的安装,并做...
    Netonline阅读 2,372评论 1 51
  • 互联网架构基础知识 一、网站常见架构 负载层 页面缓存层 web层 数据层 二、运维法则 缓存为王 尽量在前端(缓...
    魏镇坪阅读 4,724评论 0 9
  • 目录: HAProxy是什么 HAProxy的核心能力和关键特性 HAProxy的安装和运行 使用HAProxy搭...
    kelgon阅读 79,213评论 9 159
  • 因为昨天晚上我们睡得都很晚,所以今天早上我们一起睡了一个大懒觉,十点才起床。 女儿和同学约好下...
    静等花开之心路阅读 386评论 10 13
  • 小乙哥,大名燕青,江湖俗称:浪子燕青,小乙哥。随主人卢俊义入梁山,封天巧星,位列36天罡第36位,曾以百步穿杨的的...
    庄生的蝶梦阅读 795评论 1 4