zoukankan      html  css  js  c++  java
  • Haproxy 构建负载均衡集群

    1、HAPROXY简介

          HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种负载均衡解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。

    官网:http://www.haproxy.com

    2、HAProxy的特点是:
    1、HAProxy支持虚拟主机。
    2、HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。
    3、HAProxy跟LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
    4、HAProxy支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,可以用LVS+Keepalived对MySQL主从做负载均衡。
    5、HAProxy负载均衡策略非常多,HAProxy的负载均衡算法现在具体有如下8种:
      ① roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
      ② static-rr,表示根据权重,建议关注;
      ③ leastconn,表示最少连接者先处理,建议关注;
      ④ source,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法,建议关注;
      ⑤ ri,表示根据请求的URI;
      ⑥ rl_param,表示根据请求的URl参数’balance url_param’ requires an URL parameter name;
      ⑦ hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
      ⑧ rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。

    3、haproxy 配置中分成五部分内容详解

    1、global:参数是进程级的,通常是和操作系统相关。这些参数一般只设置一次,如果配置无误,就不需要再次进行修改

    2、defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件

    3、frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend

    4、backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器

    5、Listen Fronted和backend的组合体

    4、案例环境:

    主机            操作系统                     IP地址                  主要的软件
    ----------------------------------------------------------------------------
    Haproxy    CentOS6.6 x86_64   192.168.200.101  haproxy-1.4.24.tar.gz
    Nginx1    CentOS6.6 x86_64   192.168.200.103  nginx-1.6.2.tar.gz
    Nginx2    CentOS6.6 x86_64   192.168.200.104  nginx-1.6.2.tar.gz

    5、安装配置Haproxy

    5.1 安装Haproxy依赖包及源码包编译安装

    [root@localhost ~]# yum -y install gcc gcc-c++ make pcre-devel bzip2-devel
    [root@localhost ~]# tar xf haproxy-1.4.24.tar.gz -C /usr/src/
    [root@localhost ~]# cd /usr/src/haproxy-1.4.24/
    [root@localhost haproxy-1.4.24]# make TARGET=linux26 && make install

    5.2 建立haproxy的配置目录及文件

    [root@localhost haproxy-1.4.24]# mkdir /etc/haproxy
    [root@localhost haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy/

    5.3 haproxy配置项的介绍

    ###########全局配置#########
    global
     log 127.0.0.1 local0           #日志输出配置,所有日志都记录在本机系统日志,通过local0输出
     log 127.0.0.1 local1 notice         #notice为日志级别,通常有24个级别(error warringinfo debug)
     nbproc 1                    #设置进程数量,通常是CPU核心数或者2倍
     pidfile /etc/haproxy/haproxy.pid       #haproxy 进程PID文件
     maxconn 4096               #最大连接数(需考虑ulimit-n限制 )
     #chroot /usr/share/haproxy             #chroot运行路径
     uid 99                 #用户uid
     gid 99                 #用户gid
     daemon                  #守护进程模式,以后台服务形式允许
     #debug                                 #haproxy 调试级别,建议只在开启单进程的时候调试 
     
    ########默认配置############
    defaults
     log global                 #定义日志为global配置中的日志定义
     mode http                   #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
     option httplog              #日志类别,采用http日志格式记录日志
     #option  dontlognull             #不记录健康检查日志信息             
     retries 3              #检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
     #option  forwardfor             #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端i
     #option  httpclose                     #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
     maxconn 4096               #最大连接数
     contimeout 5000            #连接超时时间
     clitimeout 50000           #客户端超时时间
     srvtimeout 50000           #服务器超时时间
     #timeout check 2000              #心跳检测超时
     #timeout http-keep-alive10s         #默认持久连接超时时间
     #timeout http-request   10s         #默认http请求超时时间
     #timeoutqueue          1m           #默认队列超时时间
      ########统计页面配置########
    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 Crushlinux Haproxy     #统计页面密码框上提示文本
      stats auth admin:admin         #设置监控页面的用户和密码:admin,可以设置多个用户名
      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前端配置##############
    bibind *:80   #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。
      acl web hdr(host) -i www.abc.com   #acl后面是规则名称,-i是要访问的域名,
      acl img hdr(host) -i img.abc.com     #如果访问www.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 192.168.200.103:80 cookie 1 weight 1 check inter 2000 rise 2 fall 3
      server web2 192.168.200.104:80 cookie 2 weight 1 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.200.105:80 check inter 2000 fall 3
      server img02 192.168.200.106: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 192.168.200.107:80 weight 1
      server s2 192.168.200.108:80 weight 1

      

    5.4 haproxy 配置文件修改

    [root@localhost ~]# vim /etc/haproxy/haproxy.cfg
    # this config needs haproxy-1.1.28 or haproxy-1.2.1
     
    global
    #   log 127.0.0.1   local0
    #   log 127.0.0.1   local1 notice
        log /dev/log    local0 info
        log /dev/log    local0 notice
        maxconn 4096
        uid 99
        gid 99
        daemon
     
    defaults
        log global
        mode    http
        option  httplog
        retries 3
        maxconn 4096
        contimeout  5000
        clitimeout  50000
        srvtimeout  50000
     
    listen  webcluster 0.0.0.0:80
        option  httpchk GET /index.html
        balance roundrobin
        server  inst1 192.168.200.103:80 check inter 2000 fall 3
        server  inst1 192.168.200.104:80 check inter 2000 fall 3
     
    listen admin_stats
        bind 0.0.0.0:8000
        mode http
        option httplog
        maxconn 100
        stats refresh 30s
        stats uri /stats
        stats realm Crushlinux Haproxy
            stats auth admin:admin
        stats hide-version

      

    5.5 准备服务自启动脚本

    [root@localhost ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy
    [root@localhost ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
    [root@localhost ~]# chmod +x /etc/init.d/haproxy
    [root@localhost ~]# /etc/init.d/haproxy start
    Starting haproxy:                                          [确定]

     

    6、安装配置Web服务Nginx  

    6.1 首先搭建Nginx1,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@localhost ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel openssl-devel
    [root@localhost ~]# useradd -M -s /sbin/nologin nginx
    [root@localhost ~]# tar xf nginx-1.6.2.tar.gz -C /usr/src
    [root@localhost ~]# cd /usr/src/nginx-1.6.2
    [root@localhost nginx-1.6.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
    [root@localhost nginx-1.6.2]# cd /usr/local/nginx/html/
    [root@localhost html]# echo "server 192.168.200.103" > index.html
    [root@localhost html]# /usr/local/nginx/sbin/nginx
    [root@localhost html]# netstat -anpt |grep nginx
    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4503/nginx

      

    6.2 搭建nginx2, 同nginx1搭建方式是一样的。
    与6.1唯一不同的是:

    [root@localhost html]# echo "server 192.168.200.104" > index.html

     

    注意:nginx服务控制方式

    /usr/local/nginx/sbin/nginx 启动服务
    killall -s HUP nginx 重新加载服务
    killall -s QUIT nginx 退出服务

     

    7、客户端访问测试:
    用浏览器打开 http://192.168.200.101
    打开一个新的浏览器再次访问 http://192.168.200.101


    可以验证两次访问到的结果分别为:
    server 192.168.200.103
    server 192.168.200.104

    8、Haproxy 日志

    Haproxy 的日志默认输出到系统的syslog中,为了更好的管理Haproxy 的日志,在生产环境中一般单独定义出来。
    8.1 修改Haproxy配置文件中关于日志配置选项,

    [root@localhost ~]# vim /etc/haproxy/haproxy.cfg
    # this config needs haproxy-1.1.28 or haproxy-1.2.1
     
    global
        #log 127.0.0.1  local0
        #log 127.0.0.1  local1 notice
         
        log /dev/log    local0 info
        log /dev/log    local0 notice
    [root@localhost ~]# service haproxy restart
    Shutting down haproxy:                                     [确定]
    Starting haproxy:                                          [确定]

    这两行配置放到global选项中,主要是将Haproxy的info和notice日志分别记录到不同的日志文件中

    8.2 修改rsyslog配置
    为了便于管理,将Haproxy相关的配置独立定义到haproxy.conf 并放到/etc/rsyslog.d/ 下,rsyslog启动时会自动加载此目录下的所有配置文件。

    [root@localhost ~]# vim /etc/rsyslog.d/haproxy.conf
    if ($programname == 'haproxy' and $syslogserverity-text == 'info') then -/var/log/haproxy/haproxy-info.log
    &~
    if ($programname == 'haproxy' and $syslogserverity-text == 'notice') then -/var/log/haproxy/haproxy-notice.log
    &~  

    将haproxy的info日志记录到/var/log/haproxy/haproxy-info.log中,将notice日志记录到/var/log/haproxy/haproxy-notice.log中,将notice日志记录到/var/log/haproxy/haproxy-notice
    &~ 表示当写入到日志文件后,rsyslog停止处理这个信息,(rainerscript 脚本语言)

    重启rsyslog服务
    [root@localhost ~]# service rsyslog restart
    关闭系统日志记录器: [确定]
    启动系统日志记录器: [确定]

    8.3 查看日志文件是否创建成功

    [root@localhost ~]# ls -l /var/log/haproxy/haproxy-info.log
    [root@localhost ~]# ls -l /var/log/haproxy/haproxy-notice.log
     
    Sep 20 23:39:26 localhost haproxy[2674]: 192.168.200.1:51629 [20/Sep/2015:23:38:27.256] web-cluster web-cluster/inst2 0/0/0/1/59740 200 1648 - - CD-- 0/0/0/0/0 0/0 "GET / HTTP/1.1"
    Sep 20 23:40:06 localhost haproxy[2674]: 192.168.200.1:51693 [20/Sep/2015:23:39:34.423] web-cluster web-cluster/inst2 0/0/0/0/32120 200 580 - - ---- 1/1/1/1/0 0/0 "GET / HTTP/1.1"

    8.4 状态统计功能测试

  • 相关阅读:
    LeetCode 79. 单词搜索
    LeetCode 1143. 最长公共子序列
    LeetCode 55. 跳跃游戏
    LeetCode 48. 旋转图像
    LeetCode 93. 复原 IP 地址
    LeetCode 456. 132模式
    LeetCode 341. 扁平化嵌套列表迭代器
    LeetCode 73. 矩阵置零
    LeetCode 47. 全排列 II
    LeetCode 46. 全排列
  • 原文地址:https://www.cnblogs.com/canflyfish/p/11634867.html
Copyright © 2011-2022 走看看