zoukankan      html  css  js  c++  java
  • HaProxy+keepalived实现负载均衡

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

       haproxy 配置中分成五部分内容,分别如下:

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

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

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

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

    5、Listen Fronted和backend的组合体

    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请求。

                        192.168.1.90

                 +-----------VIP----------+  

                 |                        |

                 |                        |

               Master                   Backup

            192.168.0.110            192.168.0.111

            +----------+             +----------+

            | HAProxy  |  ß------à | HAProxy  |

            |keepalived|             |keepalived|

            +----------+             +----------+

                 | 

                 v 

        +-----------+---------+

        |           |         |

        |           |         |

        v           v         v

    +--------+  +-------+  +-------+

    | Docker |  | Docker | | Docker |

    |  WEB1  |  |  WEB2 | |  WEB3  |

    +--------+  +-------+  +-------+

    安装HAProxy,KeepAlived

    add-apt-repository ppa:vbernat/haproxy-1.5

    apt-get update

    apt-get install haproxy

    修改配置

    sudo vim /etc/haproxy/haproxy.cfg

    global

             #log /dev/log   local0

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

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

             chroot /var/lib/haproxy            #chroot运行路径

        nbproc  1               #设置进程数量

             stats socket /run/haproxy/admin.sock mode 660 level admin        #定义统计信息保存位置

             stats timeout 30s                       #监控页面超时时间

             user haproxy                                #运行haproxy 用户

             group haproxy                             #运行haproxy 用户组

             daemon                                         #以后台形式运行harpoxy

             # Default SSL material locations

             ca-base /etc/ssl/certs

             crt-base /etc/ssl/private

             # Default ciphers to use on SSL-enabled listening sockets.

             # For more information, see ciphers(1SSL). This list is from:

             #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/

             ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS

             ssl-default-bind-options no-sslv3

    defaults

             log    global                          #设置日志继承全局配置段的设置

             mode        http                    #设置haproxy的运行模式,有三种{http|tcp|health},tcp是4层,http是7层,health只会返回OK

             option       abortonclose

        option  http-server-close       #打开http协议中服务器端关闭功能,使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录。

             option       httplog              #表示开始打开记录http请求的日志功能

             option       dontlognull       #如果产生了一个空连接,那这个空连接的日志将不会记录。

        timeout connect 5000     #haproxy与后端服务器连接超时时间,如果在同一个局域网可设置较小的时间。

        timeout client  50000    #定义客户端与haproxy连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间

        timeout server  50000  #定义haproxy与上游服务器非活动连接的超时时间。

           

    listen admin_stats  #frontend和backend的组合体,监控组的名称,按需自定义名称

             bind 0.0.0.0:8080    #配置监听端口

             mode http                  #配置监控运行的模式,在这为http模式。

             option httplog           #表示开始打开记录http请求的日志功能

             maxconn 10               #最大连接数

        stats enable             #开启统计页面

        stats hide-version    #配置隐藏统计页面上的HAproxy版本信息。

        stats refresh 30s     #配置每隔30秒自动刷新监控页面。

        stats show-node      #

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

    stats uri /haproxy              #统计页面url

    stats admin if TRUE #设置手工启动/禁用,后端服务器

    #设置错误页面

             errorfile 400 /etc/haproxy/errors/400.http

             errorfile 403 /etc/haproxy/errors/403.http

             errorfile 408 /etc/haproxy/errors/408.http

             errorfile 500 /etc/haproxy/errors/500.http

             errorfile 502 /etc/haproxy/errors/502.http

             errorfile 503 /etc/haproxy/errors/503.http

             errorfile 504 /etc/haproxy/errors/504.http

    frontend www-frontend           #定义一个名为www-frontend的frontend。

             Bind *:80 #定义haproxy前端部分监听的端口。

             reqadd X-Forwarded-Proto: http   #

             default_backend http-backend        #定义默认backend

             option  forwardfor          #使后端server获取到客户端的真实IP

             acl http hdr(host) -i www.aaa.com          #根据域名定义acl

             acl web    hdr(host) -i www.bbb.com

             use_backend http-backend if http            #定义访问www.aaa.com的到http-backend

             use_backend web-backend if web            #定义访问www.bbb.com的到web-backend

    backend http-backend

             balance roundrobin          #定义负载均衡方式,roundrobin轮询方式

             cookie SERVERID insert indirect nocache

        server web1 192.168.0.110:8001 cookie A check inter 1500 weight 1 rise 3 fall 3 

        server web2 192.168.0.110:8002 cookie B check inter 1500 weight 2 rise 3 fall 3

    server web3 192.168.0.110:8003 cookie C check inter 1500 weight 3 rise 3 fall 3

    #chookie指定serverID ,check inter指定检测心跳频率,rise指定正确次数,fall指定失败次数,weight代表权重

    backend web-backend

             balance roundrobin          #定义负载均衡方式,roundrobin轮询方式

             cookie SERVERID insert indirect nocache

        server www1 192.168.0.111:8010 cookie A check inter 1500 weight 1 rise 3 fall 3

        server www2 192.168.0.111:8020 cookie B check inter 1500 weight 2 rise 3 fall 3

    listen tcptest            #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称 

        bind 0.0.0.0:8009    #设置监听端口

        mode tcp                  #采用tcp

        option tcplog            #采用tcp日志格式  

        balance source         #定义负载均衡方式

        server s1 192.168.0.111:8010 weight 1 check inter 1500 rise 3 fall 3

             server s2 192.168.0.111:8020 weight 2 check inter 1500 rise 3 fall 3

    日志配置

    sudo vi /etc/rsyslog.d/50-default.conf

    增加以下一行

    local2.*        /var/log/haproxy.log

    sudo vi /etc/rsyslog.conf

    找到下面两行,把注释去掉

    #$ModLoad imudp

    #$UDPServerRun 514

    重启rsyslog服务

    sudo service rsyslog restart

    重启haproxy服务

    Sudo service haproxy restart

    配置KeepAlived

    Sudo vim /etc/keepalived/keepalived.conf ! Configuretion File for keepalived

    globel_defs{

        notification_email {

             yqb813@gmail..com        #指定keepalived在切换时需要发送到的email对象,一行一个

      }

        notification_email_from root@localhost        ##指定发件人

        smtp_server 127.0.0.1                      #指定SMTP服务器地址

        smtp_connect_timeout 30                         #指定SMTP连接超时时间

        router_id HAProxy_DEVEL                        #设置lvs的id,在一个网络内应该是唯一的

    }

    #监测haproxy进程状态,每2秒执行一次

    vrrp_script chk_haproxy {

        script "/usr/local/keepalived/chk_haproxy.sh"

        interval 2

        weight 2

    }

    vrrp_instance VI_1{

        state MASTER #指定keepalived的角色,MASTER为主,BACKUP为备

        interface eth0 #设置实例绑定到那个网卡

        virtual_router_id 200 #VRID标记(0~255),主备要保持相同

        priority 150 #优先级,MASTER要高于BACKUP的优先级(至少50)

        advert_int 3 #检查间隔时间,默认1秒

        authentication {

             auth_type PASS #指定要使用那一种认证(PASS|AH)

             auth_pass 111111 #指定要使用的密码字符串

        }

        track_script {

             chk_haproxy              #监测haproxy进程状态

        }

        virtual_ipaddress {

             192.168.0.90 dev eth0    #定义虚拟IP(VIP),可多设,每行-个

        }

    }

    /usr/local/keepalived/chk_haproxy.sh

    #!/bin/bash

    #

    # description:

    # 定时查看haproxy是否存在,如果不存在则启动haproxy,

    # 如果启动失败,则停止keepalived

    #

    status=$(ps aux|grep haproxy | grep -v grep | grep -v bash | wc -l)

    if [ "${status}" = "0" ]; then

        /etc/init.d/haproxy restart

        status2=$(ps aux|grep haproxy | grep -v grep | grep -v bash |wc -l)

        if [ "${status2}" = "0"  ]; then

                /etc/init.d/keepalived stop

        fi

    fi

    高可用测试

    在master停掉keepalived,查看系统日志

    发现master释放了vip

     

    在backup查看系统日志,发现backup已经进入master 角色,并绑定vip

     

    在master上启动keepalived,查看系统日志,发现重新获得master角色,并绑定vip

     

    在backup上查看系统日志,发现重新回到backup角色,并释放vip

     

  • 相关阅读:
    php工作笔记5-css定位
    php工作笔记4-mysql笔记1
    php工作笔记3-php基础加强
    php工作笔记2-php编码效率
    php工作笔记1-数组常用方法总结,二维数组的去重,上传图片到oss服务器
    android浏览器 源码共享
    违章查询源码分享
    CENTOS 6.5 配置YUM安装NGINX
    Linux下安装Oracle11g服务器
    ARCGIS SDE空间化处理
  • 原文地址:https://www.cnblogs.com/mhten/p/5023796.html
Copyright © 2011-2022 走看看