Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1649506
  • 博文数量: 631
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3920
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-06 21:58
个人简介

博客是我工作的好帮手,遇到困难就来博客找资料

文章分类

全部博文(631)

文章存档

2022年(2)

2021年(4)

2020年(40)

2019年(4)

2018年(78)

2017年(213)

2016年(41)

2015年(183)

2014年(66)

我的朋友

分类: 系统运维

2017-03-27 20:53:07

一、使用说明:


 HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。

 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。

 HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

 HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。


二、安装配置:

安装:


#下载

wget 

  

#解压

tar -zxvf haproxy-1.6.9.tar.gz


cd haproxy-1.6.9

 

#安装

make TARGET=linux2628 ARCH=x86_64 PREFIX=/usr/local/haproxy


make install PREFIX=/usr/local/haproxy

 

#参数说明

TARGET=linux26 #内核版本,使用uname -r查看内核,如:2.6.18-371.el5,此时该参数就为linux26;kernel 大于2.6.28的用:TARGET=linux2628


ARCH=x86_64 #系统位数


PREFIX=/usr/local/haprpxy                 #/usr/local/haprpxy为haprpxy安装路径


 配置:


vim /usr/local/haproxy/haproxy.cfg

 

内容为:

global

    log 127.0.0.1 local0

    log 127.0.0.1 local1 notice

    daemon

    nbproc 2

    maxconn 51200

    pidfile /usr/local/haproxy/logs/haproxy.pid  

 

 

defaults

    log global

    mode http

    option httplog

    option dontlognull

    retries 3

    option abortonclose

    timeout connect 5000ms

    timeout client 30000ms

    timeout server 60000ms

    balance roundrobin

 

 

listen stats

    bind 0.0.0.0:9080

    mode http

    option httplog

    maxconn 10

    stats refresh 30s

    stats uri /stats

    stats realm Haproxy Manager

    stats auth admin:mysqladmin

    stats hide-version

    stats admin if TRUE

 

 

listen mysqlha

    bind 127.0.0.1:3306

    mode tcp 

    balance static-rr

    option tcplog

    server s1 192.168.1.227:3306 weight 1

    server s3 192.168.1.228:3306 weight 1

    server s2 192.168.1.229:3306 weight 1

 此配置做为一个mysql的负载均衡实例,大家可以做为参考。


 启动haproxy:


/usr/local/haproxy/sbin/haproxy  -f  /usr/local/haproxy/haproxy.cfg


 至此haproxy便安装启动完成了


 也可以通过访问 来查看haproxy自带统计页面数据信息。



三、配置说明:


 负载均衡算法:


一、roundrobin,表示简单的轮询,每个服务器根据权重轮流使用,在服务器的处理时间平均分配的情况下这是最流畅和公平的算法。该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。


二、static-rr,表示根据权重,建议关注;每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权限是无效的。另外,它对服务器的数量没有限制。


三、leastconn,表示最少连接者先处理,建议关注;leastconn建议用于长会话服务,例如LDAP、SQL、TSE等,而不适合短会话协议。如HTTP.该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。


四、source,表示根据请求源IP,建议关注;对请求源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。


           只要服务器正常,同一个客户端IP地址总是访问同一个服务器。如果哈希的结果随可用服务器数量而变化,那么客户端会定向到不同的服务器;

           该算法一般用于不能插入cookie的Tcp模式。它还可以用于广域网上为拒绝使用会话cookie的客户端提供最有效的粘连;

           该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。


五、uri,表示根据请求的URI;表示根据请求的URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。

        只要服务器正常,同一个URI地址总是访问同一个服务器。

        一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端;

        该算法一般用于后端是缓存服务器;

        该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。


六、url_param,表示根据请求的URl参数'balance url_param' requires an URL parameter name

              在HTTP GET请求的查询串中查找中指定的URL参数,基本上可以锁定使用特制的URL到特定的负载均衡器节点的要求;

              该算法一般用于将同一个用户的信息发送到同一个后端服务器;

              该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。


七、hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;

              在每个HTTP请求中查找HTTP头,HTTP头将被看作在每个HTTP请求,并针对特定的节点;

              如果缺少头或者头没有任何值,则用roundrobin代替;

              该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。


八、rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。

                     为每个进来的TCP请求查询并哈希RDP cookie

                     该机制用于退化的持久模式,可以使同一个用户或者同一个会话ID总是发送给同一台服务器。

                     如果没有cookie,则使用roundrobin算法代替;

                     该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。

#其实这些算法各有各的用法,我们平时应用得比较多的应该是roundrobin、source和lestconn。



haproxy负载均衡算法



ACL规则定义:


########ACL策略定义#########################

1、#如果请求的域名满足正则表达式返回true -i是忽略大小写

acl denali_policy hdr_reg(host) -i ^(|image.inbank.com)$

2、#如果请求域名满足 返回 true -i是忽略大小写

acl tm_policy hdr_dom(host) -i

3、#在请求url中包含sip_apiname=,则此控制策略返回true,否则为false

acl invalid_req url_sub -i sip_apiname=#定义一个名为invalid_req的策略

4、#在请求url中存在timetask作为部分地址路径,则此控制策略返回true,否则返回false

acl timetask_req url_dir -i timetask

5、#当请求的header中Content-length等于0时返回 true

acl missing_cl hdr_cnt(Content-length) eq 0

 

#########acl策略匹配相应###################

1、#当请求中header中Content-length等于0 阻止请求返回403

block if missing_cl

2、#block表示阻止请求,返回403错误,当前表示如果不满足策略invalid_req,或者满足策略timetask_req,则阻止请求。

block if !invalid_req || timetask_req

3、#当满足denali_policy的策略时使用denali_server的backend

use_backend denali_server if denali_policy

4、#当满足tm_policy的策略时使用tm_server的backend

use_backend tm_server if tm_policy

5、#reqisetbe关键字定义,根据定义的关键字选择backend

reqisetbe ^Host:\ img dynamic

reqisetbe ^[^\ ]*\ /(img|css)/ dynamic

reqisetbe ^[^\ ]*\ /admin/stats stats

6、#以上都不满足的时候使用默认mms_server的backend

default_backend mms



配置说明:


###########全局配置#########

global

  log 127.0.0.1 local0 #[日志输出配置,所有日志都记录在本机,通过local0输出]

  log 127.0.0.1 local1 notice #定义haproxy 日志级别[error warringinfo debug]

  daemon #以后台形式运行harpoxy

  nbproc 1 #设置进程数量

  maxconn 4096 #默认最大连接数,需考虑ulimit-n限制

  #user haproxy #运行haproxy的用户

  #group haproxy #运行haproxy的用户所在的组

  #pidfile /var/run/haproxy.pid #haproxy 进程PID文件

  #ulimit-n 819200 #ulimit 的数量限制

  #chroot /usr/share/haproxy  #chroot运行路径

  #debug #haproxy 调试级别,建议只在开启单进程的时候调试

  #quiet

########默认配置############

defaults

  log global

  mode http  #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK

  option httplog #日志类别,采用httplog

  option dontlognull #不记录健康检查日志信息

  retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置

  #option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip

  option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现

  #option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持

  option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接

  maxconn 4096 #默认的最大连接数

  timeout connect 5000ms #连接超时

  timeout client 30000ms #客户端超时

  timeout server 30000ms #服务器超时

  #timeout check 2000 #心跳检测超时

  #timeout http-keep-alive10s #默认持久连接超时时间

  #timeout http-request 10s #默认http请求超时时间

  #timeout queue 1m #默认队列超时时间

  balance roundrobin #设置默认负载均衡方式,轮询方式

  #balance source #设置默认负载均衡方式,类似于nginx的ip_hash

  #balnace leastconn #设置默认负载均衡方式,最小连接数

########统计页面配置########

listen stats

  bind 0.0.0.0:1080 #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称

  mode http #http的7层模式

  option httplog #采用http日志格式

  #log 127.0.0.1 local0 err #错误日志记录

  maxconn 10 #默认的最大连接数

  stats refresh 30s #统计页面自动刷新时间

  stats uri /stats #统计页面url

  stats realm XingCloud\ Haproxy #统计页面密码框上提示文本

  stats auth admin:admin #设置监控页面的用户和密码:admin,可以设置多个用户名

  stats auth Frank:Frank #设置监控页面的用户和密码:Frank

  stats hide-version #隐藏统计页面上HAProxy的版本信息

  stats admin if TRUE #设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本)

########设置haproxy 错误页面#####

#errorfile 403 /home/haproxy/haproxy/errorfiles/403.http

#errorfile 500 /home/haproxy/haproxy/errorfiles/500.http

#errorfile 502 /home/haproxy/haproxy/errorfiles/502.http

#errorfile 503 /home/haproxy/haproxy/errorfiles/503.http

#errorfile 504 /home/haproxy/haproxy/errorfiles/504.http

########frontend前端配置##############

frontend main

  bind *:80 #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。

  acl web hdr(host) -i  #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问这个域名,就触发web规则,。

  acl img hdr(host) -i img.abc.com  #如果访问img.abc.com这个域名,就触发img规则。

  use_backend webserver if web   #如果上面定义的web规则被触发,即访问,就将请求分发到webserver这个作用域。

  use_backend imgserver if img   #如果上面定义的img规则被触发,即访问img.abc.com,就将请求分发到imgserver这个作用域。

  default_backend dynamic #不满足则响应backend的默认页面

########backend后端配置##############

backend webserver #webserver作用域

  mode http

  balance roundrobin #balance roundrobin 负载轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数

  option httpchk /index.html HTTP/1.0 #健康检查, 检测文件,如果分发到后台index.html访问不到就不再分发给它

  server web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3

  server web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3

  #cookie 1表示serverid为1,check inter 1500 是检测心跳频率 

  #rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

backend imgserver

  mode http

  option httpchk /index.php

  balance roundrobin 

  server img01 192.168.137.101:80 check inter 2000 fall 3

  server img02 192.168.137.102:80 check inter 2000 fall 3

backend dynamic 

  balance roundrobin 

  server test1 192.168.1.23:80 check maxconn 2000 

  server test2 192.168.1.24:80 check maxconn 2000

listen tcptest 

  bind 0.0.0.0:5222 

  mode tcp 

  option tcplog #采用tcp日志格式 

  balance source 

  #log 127.0.0.1 local0 debug 

  server s1 192.168.100.204:7222 weight 1 

  server s2 192.168.100.208:7222 weight 1



haproxy监测页面参数解释:


Queue

Cur: current queued requests //当前的队列请求数量

Max:max queued requests     //最大的队列请求数量

Limit:           //队列限制数量

Session rate(每秒的连接回话)列表:

scur: current sessions        //每秒的当前回话的限制数量

smax: max sessions           //每秒的新的最大的回话量

slim: sessions limit           //每秒的新回话的限制数量

 

Sessions 

Total:            //总共回话量 

Cur:             //当前的回话

Max: //最大回话 

Limit: //回话限制

Lbtot: total number of times a server was selected  //选中一台服务器所用的总时间

 

Bytes

In: //网络的字节数输入总量  

Out: //网络的字节数输出总量

 

Denied

Req: denied requests//拒绝请求量

Resp:denied responses //拒绝回应

 

Errors

Req:request errors             //错误请求 

Conn:connection errors          //错误的连接

Resp: response errors (among which srv_abrt)  ///错误的回应

 

Warnings

Retr: retries (warning)                      //重新尝试

Redis:redispatches (warning)               //再次发送

Server列表:

Status:状态,包括up(后端机活动)和down(后端机挂掉)两种状态

LastChk:    持续检查后端服务器的时间

Wght: (weight) : 权重

Act: server is active (server), number of active servers (backend) //活动链接数量

Bck: server is backup (server), number of backup servers (backend) //backup:备份的服务器数量

Down:          //后端服务器连接后都是down的数量

Downtime: downtime: total downtime (in seconds)    //总的downtime 时间

Throttle: warm up status                          //设备变热状态



Haproxy的安装和配置

 

Desktop1:172.25.68.1

Desktop2:172.25.68.2

Desktop3:172.25.68.3


真机:172.25.68.250


在desktop1和desktop2上


 yum install haproxy -y


 cd /etc/haproxy

 

 /etc/init.d/nginx stop    


 /etc/init.d/haproxy start


 编辑vim haproxy.cfg

 

listen westos *:80

        balance roundrobin

        server web1 172.25.68.1:80 check

        server web2 172.25.68.2:80 check

 

 /etc/init.d/haproxy reload

 

desktop3:

  yum install httpd

 编辑 vim /var/www/html/index.html

 Desktop3.example.com

 

  /etc/init.d/httpd start

测试:输入172.25.68.250:80

 

 

 

 

在desktop1上修改

编辑 vim haproxy.cfg

listen admin 172.25.68.250:8080

        stats enable

        stats uri /status

        stats auth admin:westos

        stats refresh 5s

 

listen westos 172.25.68.250:80

        balance roundrobin

        server web1 172.25.68.1:80 check

        server web2 172.25.68.2:80 check

 

 /etc/init.d/haproxy reload

 

测试: 172.25.68.250:8080/status 任意关闭开启desktop1和desktop2的http服务 注意观察颜色变化

 

动静分离:

desktop1:

编辑vim /etc/haproxy/haproxy.cfg

listen admin 172.25.68.250:8080

        stats enable

        stats uri /status

        stats auth admin:westos

        stats refresh 5s

 

frontend  westos 172.25.68.250:80

         acl url_static       path_beg       -i  /images

         acl url_static       path_end       -i .jpg .gif .png

 

         use_backend static          if url_static

         default_backend             app

 

backend static ##静态

        balance roundrobin

        server web1 172.25.68.2:80 check

 

backend app ##动态

        balance roundrobin

        server web2 172.25.68.1:80 check

 

 /etc/init.d/haproxy reload

 

Desktop2

cd /var/www/html

mkdir images

cd images

拷贝OSI.gif,redhat.jpg到该目录

 

 

测试:172.25.68.250/images/redhat.jpg 或者 172.25.68.250/images/OSI.gif

 

 

访问权限的设置

desktop1:

编辑vim /etc/haproxy/haproxy.cfg

listen admin 172.25.68.250:8080

        stats enable

        stats uri /status

        stats auth admin:westos

        stats refresh 5s

 

frontend  westos 172.25.68.250:80

         acl url_static       path_beg       -i  /images

         acl url_static       path_end       -i .jpg .gif .png

 

         acl badhost src 172.25.68.2

         block if badhost

 

   use_backend static          if url_static

         default_backend             app

 

 /etc/init.d/haproxy reload

 

测试: 172.25.68.250 报错403

 

 

修改默认端口:编辑vim /etc/httpd/conf/httpd.conf

 135 #Listen 12.34.56.78:80

 136 Listen 8000

 

编辑vim /var/www/html

维护中,表闹........

 

/etc/init.d/httpd start

 

Desktop1:

编辑vim /etc/haproxy/haproxy.cfg

listen admin 172.25.68.250:8080

        stats enable

        stats uri /status

        stats auth admin:westos

        stats refresh 5s

 

frontend  westos 172.25.68.250:80

         acl url_static       path_beg       -i  /images

         acl url_static       path_end       -i .jpg .gif .png

 

         acl badhost src 172.25.68.2

 

#        block if badhost

         errorloc 403

 

 use_backend static          if url_static

         default_backend             app

 

backend static

        balance roundrobin

        server web1 172.25.68.2:80 check

 

backend app

        balance roundrobin

        server web2 172.25.68.1:80 check

        server local 172.25.68.250:8000 backup

 

 /etc/init.d/haproxy reload

测试:172.25.68.250




一、安装HAProxy


1.下载最新haproxy安装包,官网:,如果不能访问,可以使用在线代理访问下载。下载:haproxy-1.5.8.tar.gz

2.上传到linux上,并解压:

# mkdir -p /app/zpy/3rd

# cd /app/zpy/3rd

# tar -zxvf haproxy-1.5.8.tar.gz 


创建目录


# mkdir /app/zpy/haproxy


3.安装

# cd haproxy-1.5.8

make  TARGET=linux26 ARCH=x86_64 PREFIX=/app/zpy/haproxy   


#将haproxy安装到/app/zpy/haproxy ,TARGET是指定内核版本


make install PREFIX=/app/zpy/haproxy 


进入/app/zpy/haproxy  目录创建/app/zpy/haproxy/conf目录,复制配置examples


cp  /app/zpy/3rd/haproxy-1.5.8/examples/haproxy.cfg  /app/zpy/haproxy/conf/


4.修改配置

配置说明如下:(参考:http://freehat.blog.51cto.com/1239536/1347882)

###########全局配置#########  

global  

    log 127.0.0.1   local0 #[日志输出配置,所有日志都记录在本机,通过local0输出]  

    log 127.0.0.1   local1 notice  #定义haproxy 日志级别[error warringinfo debug]  

        daemon      #以后台形式运行harpoxy  

        nbproc 1   #设置进程数量  

        pidfile /home/haproxy/haproxy/conf/haproxy.pid   #haproxy 进程PID文件  

    ulimit-n 819200   #ulimit 的数量限制  

    maxconn 4096    #默认最大连接数,需考虑ulimit-n限制  

        #chroot /usr/share/haproxy #chroot运行路径  

    uid 99                    #运行haproxy 用户 UID  

        gid 99                    #运行haproxy 用户组gid  

        #debug      #haproxy 调试级别,建议只在开启单进程的时候调试  

        #quiet  

  

########默认配置############  

defaults  

    log global  

    mode http               #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK  

    option  httplog         #日志类别,采用httplog  

    option  dontlognull      #不记录健康检查日志信息  

    retries 2               #两次连接失败就认为是服务器不可用,也可以通过后面设置  

    option  forwardfor   #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip  

    option  httpclose    #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现  

    #option redispatch       #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持  

        option abortonclose     #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接  

        maxconn 4096            #默认的最大连接数  

        timeout connect  5000ms  #连接超时  

        timeout client 30000ms  #客户端超时  

        timeout server 30000ms  #服务器超时  

        #timeout check 2000      #心跳检测超时  

    #timeout http-keep-alive10s   #默认持久连接超时时间  

    #timeout http-request   10s   #默认http请求超时时间  

        #timeoutqueue          1m     #默认队列超时时间  

    balance roundrobin    #设置默认负载均衡方式,轮询方式  

        #balance source        # 设置默认负载均衡方式,类似于nginx的ip_hash  

        #balnace leastconn     #设置默认负载均衡方式,最小连接数  

  

########统计页面配置########  

listen admin_stats  

        bind 0.0.0.0:1080               #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称  

        mode http                       #http的7层模式  

        option httplog                  #采用http日志格式  

        #log 127.0.0.1 local0 err       #错误日志记录  

        maxconn 10                      #默认的最大连接数  

        stats refresh 30s               #统计页面自动刷新时间  

        stats uri /stats                #统计页面url  

        stats realm XingCloud\ Haproxy  #统计页面密码框上提示文本  

        stats auth admin:admin     #设置监控页面的用户和密码:admin,可以设置多个用户名  

        stats auth  Frank:Frank   #设置监控页面的用户和密码:Frank  

        stats hide-version              #隐藏统计页面上HAProxy的版本信息  

    stats  admin if TRUE       #设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本)  

          

########设置haproxy 错误页面#####  

errorfile 403  /home/haproxy/haproxy/errorfiles/403.http  

errorfile 500 /home/haproxy/haproxy/errorfiles/500.http  

errorfile 502 /home/haproxy/haproxy/errorfiles/502.http  

errorfile 503 /home/haproxy/haproxy/errorfiles/503.http  

errorfile 504 /home/haproxy/haproxy/errorfiles/504.http  

  

########frontend前端配置##############  

bind *:80  

    #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。  

    acl web hdr(host) -i  

    #acl后面是规则名称,-i是要访问的域名,  

    acl img hdr(host) -i img.abc.com  

    如果访问这个域名就分发到下面的webserver 的作用域。  

    #如果访问img.abc.com.cn就分发到imgserver这个作用域。  

    use_backend webserver if web  

    use_backend imgserver if img  

      

########backend后端配置##############  

backend webserver             #webserver作用域  

    mode http  

    balance   roundrobin        

    #banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数  

    option  httpchk /index.html HTTP/1.0  #健康检查  

    #检测文件,如果分发到后台index.html访问不到就不再分发给它  

    server  web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3  

    server  web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3  

    #cookie 1表示serverid为1,check inter 1500 是检测心跳频率    

    #rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重  

backend imgserver  

    mode http  

    option  httpchk /index.php  

    balance     roundrobin                            

    server      img01 192.168.137.101:80  check inter 2000 fall 3  

    server      img02 192.168.137.102:80  check inter 2000 fall 3  

      

########tcp配置#################  

listen test1  

        bind 0.0.0.0:90  

        mode tcp  

    option  tcplog          #日志类别,采用tcplog  

        maxconn 4086  

        #log 127.0.0.1 local0 debug  

        server s1 10.18.138.201:80  weight 1  

        server s2 10.18.102.190:80  weight 1 

 

5.加上日志支持


# vim /etc/syslog.conf

在最下边增加

local3.*        /home/haproxy/haproxy/logs/haproxy.log

local0.*        /home/haproxy/haproxy/logs/haproxy.log


vim /etc/sysconfig/syslog

修改: SYSLOGD_OPTIONS="-r -m 0"

重启日志服务service syslog restart


6.启动服务

启动服务:

/home/haproxy/haproxy/sbin/haproxy -f /home/haproxy/haproxy/conf/haproxy.cfg

重启服务:

# /home/haproxy/haproxy/sbin/haproxy -f /home/haproxy/haproxy/conf/haproxy.cfg -st `cat /home/haproxy/haproxy/conf/haproxy.pid`


停止服务:

# killall haproxy





Haproxy是一款免费、稳定、高效的轻量级负载均衡软件,现将其配置文件参数作如下说明:


global #全局配置参数

        log 127.0.0.1 local3 info #日志级别

        maxconn 4096

        user haproxy

        group haproxy

        daemon #设置为后台进程

pidfile /usr/local/haproxy/haproxy.pid #进程的pid文件

defaults #默认配置,被frontend,backend,listen段继承使用

        log global

        mode http #Haproxy工作模式,四层工作模式为TCP

        option httplog

option forwardfor  #使后端服务器获取客户端的真实IP

option redispatch #如果cookie中写入ServerID而客户端不会刷新Cookie,那么当ServerID对应的服务器宕机后,将强制定向到其它健康的服务器上

option abortonclose #当服务器负载过高时,将自动关闭队列中处理时间较长的连接请求

cookie SERVERID #允许向cookie中插入SERVERID,服务器的SERVERID在后端使用cookie关键字定义

        retries 3               #服务器连接失败后的重试次数

        maxconn 2000            #每个进程的最大连接数

        timeout connect 5000    #连接最大超时时间,默认毫秒

        timeout client 30000 #客户端最大超时时间

        timeout server 30000 #服务端超时时间

listen haproxy_stats #定义Haproxy监控

        bind 0.0.0.0:8080

        mode http

        log global

        stats enable

        stats refresh 5s #页面刷新间隔为5s

        stats realm Haproxy\ Statistics

        stats uri /haproxy_stats #监控页面的URL

        stats hide-version

        stats auth haproxy:abc-123 #指定监控页面登陆的用户名和密码

frontend haproxy_web #定义客户端访问的前端服务器

        bind 0.0.0.0:80 #定义监听的套接字

        mode http

        log global

        option httplog #启用http日志

        option httpclose #每次请求完毕后,关闭http通道

acl php_web path_end .php  #定义一个名叫php_web的acl策略,当请求的url以.php结尾时会被匹配到


use_backend php_server if php_web #如果条件满足策略php_web时,则将请求交给后端的php_server服务器

        default_backend servers #设置默认的后端服务器组

backend servers #定义后端服务器组

        mode http

        option httpchk GET /index.html #开启对后端服务器的健康检查,通过检查index.html文件来判断服务器的健康状况

        balance roundrobin              #负载均衡算法为轮询,

        server web1 192.168.154.162:80 check inter 2000 rise 2 fall 3  #对后端服务器的健康状况检查间隔为2000毫秒,连续2次健康检查成功,则认为是有效的,连续3次健康检查失败,则认为服务器宕机

        server web2 192.168.154.156:80 check inter 2000 rise 2 fall 3

backend php_server

mode http

option httpchk GET /index.php

server web3 192.168.154.158:80 cookie web3 check inter 2000 rise 2 fall 3 weight 2





安装haproxy

1、安装

[root@localhost ~]# yum -y install pcre-devel zlib-devel


[root@localhost ~]# tar -zxvf haproxy-1.4.24.tar.gz -C /usr/src/


[root@localhost ~]# cd /usr/src/haproxy-1.4.24/


[root@localhost ~]# make TARGET=linux26 PREFIX=/usr/local/haproxy

注意:linux26 是指linux 的内核版本号。

[root@localhost ~]# make install PREFIX=/usr/local/haproxy


2、配置haproxy

[root@localhost ~]# mkdir /etc/haproxy

[root@localhost ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.cfg /etc/haproxy/

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg

修改:

global

log 127.0.0.1 local0 //配置日志记录,local0 为日志设备,默认存放到系统日志

log 127.0.0.1 local1 notice //notice 为日志级别,通常有7 个级别

#log loghost local0 info

maxconn 4096 //默认最大连接数,需考虑ulimit-n 限制 :可增加ulimitn

819200 #ulimit 的数量限制

chroot /usr/share/haproxy //运行路径

uid 99

gid 99

#debug

#quiet

defaults

log global //定义日志为global 中的日志

mode tcp //模式为四层

option tcplog //采用http 的日志格式

option dontlognull //不记录健康检查日志信息

retries 3 //三次连接失败就认为是服务器不可用,也可以通过后面设置

#redispatch

maxconn 2000 //最大连接数

contimeout 5000 //连接超时时间

clitimeout 50000 //客户端超时时间

srvtimeout 50000 //服务端超时时间

listen stats

mode http

bind :6677

stats enable

stats hide-version

stats uri /haproxyadmin?stats

stats realm Haproxy\ Statistics

stats auth admin:admin

stats admin if TRUE

listen mysqlcluster 0.0.0.0:3306

balance roundrobin

server m1 192.168.56.202:3306 check port 3306 maxconn 300

server m2 192.168.56.203:3306 check port 3306 maxconn 300

注意:

如果启动时出现报错:/haproxy.main()] Cannot chroot(/usr/share/haproxy)


则手动创建:

[root@localhost ~]# mkdir /usr/share/haproxy

如果启动时出现报错:Starting proxy cacti: cannot bind socket

则执行:

[root@localhost ~]# sysctl -e net.ipv4.ip_nonlocal_bind=1


3、启动haproxy


[root@localhost ~]# ln -s /usr/local/haproxy/sbin/* /usr/sbin/ //注意软链接的目录


[root@localhost ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.init


/etc/init.d/haproxy

[root@localhost ~]# chmod +x /etc/init.d/haproxy


[root@localhost ~]# /etc/init.d/haproxy start

[root@localhost ~]# /etc/init.d/haproxy status


[root@localhost ~]# netstat -anp | grep haproxy //占用的也是TCP 的80 端口

[root@localhost ~]# chkconfig --add haproxy

[root@localhost ~]# chkconfig haproxy on


查看集群的状态


四、MySql 授权用户登录(集群内的mysql 都要授权)

mysql> GRANT ALL ON *.* TO 'root'@'192.168.56.%' IDENTIFIED BY 'redhat';

mysql> flush privileges;

五、测试:

[root@localhost ~]# mysql -u root -h 192.168.56.200 -p

登录两次分别查看

可增加keepalived




HAproxy简单概述


HAProxy是免费极速且可靠的用于为TCP和基于HTTP应用程序提供代理服务的解决方案。是工作在应用空间的程序,跟Nginx一样受限于套接字。且只类同于Nginx四层和七层代理服务器仅此而已。但更多用在web反向代理上!!! 

HAProxy还可以将后端的服务器与网络隔离,起到保护后端服务器的作用。HAProxy的负载均衡能力虽不如LVS,但也是相当不错。而且由于其工作在7层,可以对http请求报文做深入分析,按照自己的需要将报文转发至后端不同的服务器(例如动静分离),这一点工作在4层的LVS无法完成。 


其中一点点不同Nginx的是一个Master Worker模型负责接收用户请求,装载配置文件,平滑升级…但是更多的用户请求是通过worker来实现。而HAProxy是单一进程模型,支持多进程,但更多建议使用单一进程模型。使用单个进程直接响应用户多个请求,不启用子进程。也能够支持单进程巨大并发连接数,且必须支持事件驱动,如果不支持事件驱动,并发效率是可想而知。


HAproxy工作模式


HAProxy的工作模式一般有两种: 


tcp模式:实例运行于TCP模式,在客户端和服务器端之间将建立一个全双工的连接,且不会对7层报文做任何类型的检查,只能以简单模式工作。此为默认模式,通常用于SSL、SSH、SMTP等应用。 


http模式:实例运行于HTTP模式,客户端请求在转发至后端服务器之前将被深度分析,所有不与RFC格式兼容的请求都会被拒绝。 


注意:当实现内容交换时,前端和后端必须工作于同一种模式(一般都是HTTP模式),否则将无法启动实例。 


工作模式可通过mode参数在default,frontend,listen,backend中实现定义。 

两种模块分别是:通过mod_tcp来限定反代模式和mod_http来实现负载均衡 





HAproxy程序环境:


配置文件:/etc/haproxy/haproxy.cfg

Unit File: haproxy.service

主程序:/usr/sbin/haproxy

配置文件分两部分组成:

    global:全局配置段

        进程及安全配置相关的参数

        性能调整相关的参数

        Debug相关的参数

    proxies:代理配置段

        defaults:为frontend, backend以及listen提供默认配置;

        frontend:前端,相当于Nginx中的server{ ... };

        backend:后端,相当于nginx中的upstream { ...  };

        listen:前后端的直接组合;


简单实现用haproxy实现后端主机代理,简单均衡 


1、> vim /etc/haproxy.cfg 在haprxoy 10.1.15.40主机上修改以下内容 

frontend main 

bind *:80,*:8080 

default_backend web 

# static backend for serving up images, stylesheets and such 

backend web 

balance roundrobin 

server web1 10.1.15.41:80 check 

server web2 10.1.15.42:80 check 

2、在后端两台主机安装httpd启动服务,给指定网页分别叫backend1和backend2 

10.1.15.41 

vim /var/www/html 

backend 1

 

10.1.15.42 

vim /var/www/html 

backend 2

 

HAproxy相关配置参数全局段:


global配置参数: 

进程及安全配置相关的参数:user/uid, group/gid, nbproc, ulimit-n, ca-base, … 

log < address > [len < length >] < facility > [ max level [min level]] 

定义日志相关配置属性address是日志服务器的地址, [len < length >]是每行日志记录的最大长度 

举例:如何记录haproxy的日志呢? 

1、 让haproxy服务器启用接收远程主机所传来的日志信息 

2、 如果启用local2.,指明local2.日志记录于何处 

3、如果启用日志,使用udp和tcp都可以,我们这里使用的udp,把注释去掉


vim  /etc/rsyslog.conf 第一步

#Provides UDP syslog reception

    $ModLoad imudp

    $UDPServerRun 514

    指明日志记录到哪里去   第二步

# Save boot messages also to boot.log

    local2.*             /var/log/haproxy.log

systemctl restart rsyslog.service,确保UDP 514端口被监听


[root@localhost log]# cat haproxy.log 


Nov 12 13:26:24 localhost haproxy[23610]: 10.1.15.85:6703 [12/Nov/2016:13:26:24.829] main web/web1 0/0/0/3/3 200 280 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"

性能调优相关参数 

maxconn < number>:设定单haproxy进程的最大并发连接数; 

maxconnrate < number>:设定单haproxy进程每秒所能接受的连接数; 

maxsslconn < number>:设定单haproxy进程的ssl连接最大并发连接数; 

maxsslrate < number>:单haproxy进程的ssl连接的创建速率上限; 

spread-checks <0..50, in percent> 


向后端主机做健康状态检测时,该如何散开检测机制 


tune.bufsize < number> 缓冲池大小 

tune.rcvbuf.client < number> 接收客户端请求时缓冲池大小 

tune.rcvbuf.server < number> 接收后端服务器的响应时缓冲池大小 

tune.sndbuf.client < number> 向客户端发送响应 

tune.sndbuf.server < number> 向服务端发送请求 

tune.ssl.cachesize < number> ssl的缓存大小 

tune.ssl.lifetime < timeout> ssl的缓存会话的有效时长 

Debugging: 

debug 尽量输出详细信息 

quiet 不输出详细信息 

Userlists:定义用户、组及用户列表; 

userlist < listname > 

group < groupname > [users < user >,< user >,(…)] 

user < username > [password|insecure-password < password >] 

strong text[groups < group >,< group >,(…)] 

Peers:把多个haproxy定义构建为同步集群 

peer 

peers 

其它未尽详细的参数请参考官方帮助文档 



**演示示例**

更改调度算法为source,把同一IP地址的请求将始终被调度至某特定的服务器

vim /etc/haproxy/haproxy.cfg

backend web

    balance     roundrobin //修改为source

    server       web1 10.1.15.41:80 check

    server       web2 10.1.15.42:80 check

systemctl reload haproxy.service

测试:

更改调度算法为uri,把同一页面请求通过调度算法发往到后端指定服务器

vim /etc/haproxy/haproxy.cfg

backend web

    balance     roundrobin //修改为uri

    server       web1 10.1.15.41:80 check

    server       web2 10.1.15.42:80 check

for i in {1..10}; do echo "test page $i at BACKEND 1 " > /var/www/html/test$i.html; done

systemctl reload haproxy.service

测试:

for i in {1..10}; do curl

结果:把同一个被请求到的页面始终发往到指定的后端服务器上


更改调度算法为hdr,把同一浏览器的请求,始终发往到后端指定服务器上

vim /etc/haproxy/haproxy.cfg

backend web

    balance     roundrobin //修改为hdr(User-Agent)

    server       web1 10.1.15.41:80 check

    server       web2 10.1.15.42:80 check

systemctl reload haproxy.service

测试:

for i in {1..10}; do curl  

结果:只要浏览器一样,请求始终被调度到指定后端服务器上

调整服务器的最大并发连接数,并启用stats页面做认证


定义并发数有两种方法: 

一种,全局定义,一种默认定义 

vim /etc/haproxy/haproxy.cfg 

frontend main //在此下面定义maxconn 10000 

bind * :80, * :8080 

maxconn 10000 

定义stats页面,在代理配置段四项中都可以定义 

vim /etc/haproxy/haproxy.cfg 

frontend main 

bind :80,:8080 

maxconn 10000 //最大并发连接数 

stats enable // 开启stats页面 

stats uri /admin?stats //自定义stats页面 

default_backend web //默认的后端主机标识web 

stats realm stats\ page\ area //开启认证界面 

stats auth admin:admin //认证用户名密码 

stats hide-version //隐藏版本信息 

stats refresh 5s //指定stats页面5秒刷新一次 

stats admin if TRUE //内建访问控制列表 

测试:

对后端服务器做健康状况检测


check为server的参数,可启动对此server执行健康状态的检测。check借助其额外的参数可实现更精细的监测机制。 

inter < delay>: 

健康状态检测的时间间隔,单位为毫秒,默认为2000,可以使用fastinter和downinter来根据服务器端状态优化此时间延迟 

rise < count>: 

健康状态检测中某离线的server从离线状态转换至正常状态需要成功检查的次数 

fall < count>: 

确认server从正常状态转换为不可用状态需要检查的次数 

默认为传输层检测,即探测端口是否能响应。 

需要执行应用层检测,则需要 

httpchk, smtpchk, mysql-check, pgsql-check, ssl-hello-chk; 

vim /etc/haproxy/haproxy.cfg 

backend web //下面修改内容 

balance roundrobin 

server web1 10.1.15.41:80 weight 2 maxconn 5000 check inter 1 rise 1 fall 2 

server web2 10.1.15.42:80 weight 1 maxconn 3000 check inter 1 rise 1 fall 2 

测试:10.1.15.40/haproxy?stats

对后端服务器做加权轮询


vim /etc/haproxy/haproxy.cfg

backend web //在后端主机下列加入

balance roundrobin

server  web1 10.1.15.41:80 check weight 2 maxconn 5000 cookie web1

server  web2 10.1.15.42:80 check weight 1 maxconn 3000 cookie web2

systemctl reload haproxy.service

测试:

for i in {1..10}; do curl

结果:权重weight,并发maxconn,指定的值cookie 

注意:修改后端服务器的调度算法:一定要重启haproxy的服务,reload是不成功

基于cookie的session绑定


在响应报文中添加cookie信息,下一次的客户请求会带上这个cookie信息,服务器端根据cookie将请求始终定向至后端的某一台服务器,可用于保持session会话。 

而cookie信息该怎么插入进来 

rewrite: 重新改写原有的所有cookie 

insert: 在原有cookie信息当中插入 

prefix: 在原有cookie附加为前缀

举例:把基于浏览器的用户会话访问,对当前服务器讲第一次调度到某个主机,那么就调度某主机

vim /etc/haproxy/haproxy.cfg

backend web //在后端主机下列加入

balance roundrobin

cookie webserver insert nocache indirect

server  web1 10.1.15.41:80 check weight 2 maxconn 5000 cookie web1

server  web2 10.1.15.42:80 check weight 1 maxconn 3000 cookie web2

服务器第一次为某客户度挑选中的主机,会把webserver中的参数值赋值到web1上或者web2上

systemctl reload haproxy.service

测试:

for i in {1..10}; do curl

[root@localhost haproxy]# curl -I 10.1.15.40

自定义haproxy错误页面


> vim /etc/haproxy/haproxy.cfg

> frontend  main 

bind *:80,*:8080

maxconn 10000

stats enable

default_backend web

stats realm stats\ page\ area

stats auth admin:admin

stats hide-version

stats refresh 5s

stats admin if TRUE

#errorfile 503 /etc/haproxy/errorfiles/503sorry.http //直接以文件形式显示错误页面

errorloc 503 // 直接以url形式显示错误页面,重定向302

errorloc 503

mkdir /etc/haproxy/errorfiles      

vim  /etc/haproxy/errorfiles/503sorry/http

< h1 >sorry page home < h1 >

systemctl reload haproxy.service

测试:stop后端所有主机,然后请求haproxy前端主机地址 :10.1.15.40

option forwardfor


客户端的请求经前端的代理服务器转发至后端的web服务器,代理服务器在转发时将目标地址改为后端的某台web服务器地址,将源地址由client ip(客户端地址)改为自己面向后端服务器的地址。后端的web服务器若使用默认格式记录日志,则记录的客户端IP地址都为前端的代理服务器地址。这时需要在发往后端的请求报文中添加内容为客户端IP地址的首部,以便后端的web服务器能够正确获取客户端地址。 

x-forwardfor 

在配置文件默认段里已经定义了转发,所以我们直接用就可以了。 

vim /etc/haproxy/haproxy.cfg 

defaults 

option forwardfor except 127.0.0.0/8 

然后修改两台后端主机的httpd.conf文件,vim /etc/httpd/conf/httpd.conf 

把LogFormat %h修改为{X-forwarded-For}i 

重启服务systemctl restart httpd.service 

在haproxy前端主机上刷新下页面。然后在后端主机看日志是否记录的是客户端的真实地址就可以。 

tail /var/log/httpd/access.log看请求的是真实的客户端地址功能就实现了。

修改请求或响应报文首部相关:


增加响应报文相关信息 

frontend main 

rspadd X-Via:\ HAProxy/1,5 

rspidel Server.* 

rspadd X-Via:\ HAProxy/1,5 

客户端请求看一看在Response Headers报文里有没有值:X-Via:HAProxy/1,5 

删除响应报文Server相关信息 

rspidel Server.*

ACL basics


HAPAroxy的ACL能够通过检测请求报文的首部、响应报文的内容或其他的环境状态信息作出转发决策,增强了其配置弹性。 

配置分两步骤:首先定义ACL,即定义一个测试条件,再定义动作,即满足测试条件的情况下执行的某特定动作。 

语法格式: 

acl < aclname> < criterion> [flags] [operator] [< value>] … 

取值类型: 

– boolean 

– integer or integer range 

– IP address / network 

– string (exact, substring, suffix, prefix, subdir, domain) 

– regular expression 

– hex block 

匹配的操作符:数值匹配,字符串匹配,逻辑条件等… 

注意注意:语法太多,让人很蛋疼,简直太头疼,咋么那么多 

注意注意:自定义ACL全部都是小写

举例:四层匹配

vim /etc/haproxy/haproxy.cfg

在 frontend  main 中定义

acl myhost src 10.1.15.85

acl myport dst_port 8080

block if !myhost myport

任何人试图去访问8080端口时,但不是来自于myhost主机就全部拒绝 

举例:七层匹配 

acl text_file  path_end  -i  .txt

block if text_file

任何人去试图访问txt文件,结尾不区分大小写的全部拒绝

举例:匹配某个浏览器类型

acl chrome hdr_reg(User-Agent) -i .*chrome.*$

block if chrome

HTTP层访问控制指令


acl valid_method method GET HEAD

http-request deny if ! valid_method 

举例:

acl myhost src 10.1.15.40

http-request deny if url_admin !myhost  

动静分离


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 //如果上面的条件满足调至backend static主机 

default_backend app //否则调至app主机 

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 


阅读(9499) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~