zoukankan      html  css  js  c++  java
  • HAProxy负载均衡原理及企业级实例部署haproxy集群

    一 HAProxy简介

     

    HAProxy是一种高效、可靠、免费的高可用及负载均衡解决方案,非常适合于高负载站点的七层数据请求。客户端通过HAProxy代理服务器获得站点页面,而代理服务器收到客户请求后根据负载均衡的规则将请求数据转发给后端真实服务器。

    同一客户端访问服务器,HAProxy保持回话的三种方案:

    1 HAProxy将客户端ip进行Hash计算并保存,由此确保相同IP访问时被转发到同一真实服务器上。

    2 HAProxy依靠真实服务器发送给客户端的cookie信息进行回话保持。

    3 HAProxy保存真实服务器的session及服务器标识,实现会话保持功能。

    haproxy拓扑结构图

    wKiom1iX7W_y7bC2AAHh9xLZpkA752.jpg-wh_50

    二 配置文件解析

     

    Haproxy安装后默认没有配置文件,需要手动创建/etc/haproxy.cfg。启动haproxy时用-f指定配置文件路径。haproxy的配置文件包含全局设置段与代理段,global是全局段,defaults、listen、frontend、backend为代理段。frontend用来匹配客户端请求的域名或者URL;backend定义后端服务器集群

    haproxy配置文件参数详细解析

          配置项         描述

    global

    chroot<jail dir> 将工作目录切换到<jail dir>并执行chroot
    daemon 后台工作模式
    uid 进程账户id,建议设置为haproxy专用账户
    gid 进程组id,建议设置为haproxy专用组
    log<address><facility> 配置全局syslog,可以设置两台日志服务器
    nbproc<number> 指定后台进程数量
    pidfile<file> 指定pid文件
    ulimit-n<number>

    设置每个进程最大文件描述符数量

    maxconn<number> 每个进程支持的最大并发数
    tune.bufsize<number> 设置buffer大小,默认16384B

    代理

    设置

    mode 可选tcp、http、health
    timeout check<timeout> 设置检查超时时间
    contimeout<timeout> 设置连接超时时间
    balance roundrobin 设置轮询负载
    bind<address>:port 定义一个或者多个监听地址和端口
    stats auth admin:admin 设置监控界面的用户名和密码
    stats refresh<number> 统计页面刷新间隔时间
    option httplog 使用http日志
    cookie<name> 启用cookie的保持连接功能
    option forwardfor 允许插入这种数据包头,可以让后端服务器获取客户端ip
    option abortonclose 负载高时,自动关闭处理时间长的请求
    option allbackups 后端服务器宕机,是否激活全部备机,默认启动第一个备机
    option dontlognull 不记录空连接日志,主要用于不记录健康检查日志
    option redispatch 后端某个机器宕机,强制把请求转发给健康机器
    monitor-uri<URi> 检查uri文件是否存在,依次判断主机的健康状态
    monitor-fail if site_dead 服务器宕机时,返回503代码
    option httpchk<uri> 使用http协议检查服务器健康状态
    retries<value> 服务器连接失败后的重试次数
    timeout client 客户端最大超时时间,单位毫秒
    timeout server 服务器最大超时时间,单位毫秒
    timeout connect 最大连接超时时间,单位毫秒
    default_backend 默认后端服务器组
    use_backend 当条件满足时,指定后端服务器组
    acl<name><criterion> 定义访问控制列表

    三 Haproxy实例部署

     

    本例使用listen定义一个监控端口;

    使用frontend定义一个前端80端口;

    通过backend定义名为inside_servers 和 external_servers的服务器组;

    使用default_backend定义默认服务器组external_servers;

    external_servers包括web1.test.com和web2.test.com 两台服务器

    inside_servers包含web3.test.com 一台服务器

    服务器名称 网络配置
    haproxy.test.com eth0:10.10.10.10
    eth1:192.168.1.2
    web1.test.com eth0:192.168.1.3
    web2.test.com eth0:192.168.1.4
    web3.test.com eth0:192.168.1.5

    1 首先配置web服务器

    在web1 web2 web3上安装httpd并配置网卡

    vim /etc/sysconfig/network-scripts/ifcfg-eth0

    DEVICE=eth0

    BOOTPROTO=static

    IPADDR=192.168.1.3

    NETMASK=255.255.255.0

    GATEWAY=192.168.1.2

    ONBOOT=yes

    TYPE=Ethernet

    service network restart

    yum install -y httpd

    iptables -F

    iptables -X

    service iptables save

    setenforce 0

    sed -i s/enforcing/disabled/g /etc/sysconfig/selinux

    echo "web1  192.168.1.3" > /var/www/html/index.html

    service httpd restart

    chkconfig httpd on

    web2 web3机器上执行与web1相同步骤,注意修改部分参数

    2 接着haproxy服务器配置

    设置两块网卡

    vim /etc/sysconfig/network-scripts/ifcfg-eth0

    DEVICE=eth0

    BOOTPROTO=static

    IPADDR=10.10.10.10

    NETMASK=255.0.0.0

    ONBOOT=yes

    TYPE=Ethernet

    vim /etc/sysconfig/network-scripts/ifcfg-eth1

    DEVICE=eth1

    BOOTPROTO=static

    IPADDR=192.168.1.2

    NETMASK=255.255.255.0

    GATEWAY=192.168.1.1

    ONBOOT=yes

    TYPE=Ethernet

    service network restart

    service iptables stop

    内核调优,修改系统文件

    vim /etc/security/limits.conf

    *    soft    nofile        65535 

    *    hard    nofile        65535

    配置日志文件,添加三行

    vim /etc/rsyslog.conf

    $ModLoad    imudp

    $UDPServerRun    514

    local3.*                        /var/log/haproxy.log

    yum -y install gcc

    wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.11.tar.gz

    tar zxf haproxy-1.6.11.tar.gz -C /usr/src/

    cd /usr/src/haproxy-1.6.11/

    make TARGET=linux2628

    make install

    mkdir /var/haproxy

    3 创建配置文件

    vim /etc/haproxy.cfg

    global

    maxconn    4096

    log    127.0.0.1    local3    info

    chroot    /var/haproxy

    uid    99

    gid    99

    daemon

    nbproc    1

    pidfile    /var/run/haproxy.pid

    ulimit-n    65535

    stats    socket    /var/tmp/stats

    defaults

    log    global

    mode    http

    maxconn    20480

    option    httplog

    option    httpclose

    option    dontlognull

    option    forwardfor

    option    redispatch

    option    abortonclose

    stats    refresh    30

    retries    3

    balance    roundrobin

    cookie    SRV

    timeout    check    2000ms

    timeout    connect    5000ms

    timeout    server    50000ms

    timeout    client    50000ms

    listen    admin_status                                        #定义haproxy的监控界面

    bind    0.0.0.0:6553

    mode    http

    log    127.0.0.1    local3 info

    stats    enable

    stats    refresh    5s                                            #监控页面自动刷新时间5s

    stats    realm    Haproxy    Statistics                #登录监控页面提示符

    stats    uri    /admin?stats                                  #监控页面URL路径

    stats    auth    admin:123456                             #监控页面的账户密码

    stats    hide-version                                           #隐藏haproxy版本

    frontend    web_service                                     #定义前端服务器

    bind    0.0.0.0:80

    mode    http

    log    global

    option    httplog

    option    httpclose

    option    forwardfor

    #acl    inside_src src 192.168.1.0/24                    #定义acl

    #use_backend    inside_servers if inside_src        #判断acl的源地址,把请求转发到inside_servers组

    default_backend    external_servers                        #默认服务器组

    backend    external_servers

    mode    http

    balance    roundrobin                                            #轮询真实服务器

    option    httpchk    GET    /index.html                #检查index文件,判断服务器是否健康

    ##定义后端真实服务器,向cookie中插入web1信息,check进行健康检查,检查时间间隔为2000ms,##连续两次健康则认为是正常开启的,连续三次检查失败则认为宕机,服务器权重1

    server web1 192.168.1.3:80 cookie web1 check inter 2000 rise 2 fall 3 weight 1

    server web2 192.168.1.4:80 cookie web2 check inter 2000 rise 2 fall 3 weight 1

    #backend    inside_servers

    #mode    http

    #balance    roundrobin                                            #轮询真实服务器

    #option    httpchk    GET    /index.html                #检查index文件,判断服务器是否健康

    #server web3 192.168.1.5:80 cookie web3 check inter 2000 rise 2 fall 3 weight 1

    4 启动haproxy服务

    service rsyslog restart                #重启系统日志服务

    haproxy -f /etc/haproxy.cfg        #启动haproxy服务

    echo "/usr/local/sbin/haproxy -f /etc/haproxy.cfg" >> /etc/rc.local

    5 测试验证

    浏览器访问监控页面

    在一个ip为10.10.10.100的机器上访问http://10.10.10.10:6553/admin?stats

    多次刷新访问将得到web1和web2 不同页面信息

    如果配置文件中开启使用inside_servers,则在192.168.1.0/24网段机器上访问http://192.168.1.2,服务器返回的会一直是web3的页面信息。

    阅读原文

  • 相关阅读:
    C++中字符数组和字符指针问题
    C++中的常量指针和指针常量
    C++中指针形参问题
    Xcode视图调试Debug View Hierarchy
    第3章 程序的机器级表示(深入理解计算机系统)
    第2章 信息的表示和处理(深入理解计算机系统)
    第1章 计算机系统漫游(深入理解计算机系统)
    用gcc编译.cpp文件可能出现"undefined reference to `__gxx_personality_v0'"问题的解决
    第12章 并发编程(深入理解计算机系统)
    第11章 网络编程(深入理解计算机系统)
  • 原文地址:https://www.cnblogs.com/276815076/p/6402306.html
Copyright © 2011-2022 走看看