HAproxy + Keepalived负载均衡的安装部署及使用笔记(ubuntu)

负载均衡的安装部署及使用手册

一、首先环境介绍:
 
LB110.10.13.240
LB210.10.13.241

web server1 10.10.13.243

web server2 10.10.13.244

LB1LB2keepalived主从,对haproxy服务提供切换;haproxy服务将调度两台web server

web server 的对外虚拟IP10.10.13.245

二、243/244:两台RealServer web服务配置 

1、先安装web服务: apt-get install apache2 

2、修改web服务器日志格式 
vi /etc/apache2/apache2.conf 

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 

3、注释掉原来的CustomLog,并修改文档根路径DocumentRoot/var/www 
vi /etc/apache2/sites-available/default 
SetEnvIf Request_URI "^/check\.txt$" dontlog 

CustomLog /var/log/apache2/access.log combined env=!dontlog 

echo "The web service provider is 243|244" > /var/www/index.html 

4、重启web服务器 
/etc/init.d/apache2 restart
 
5、建立check文件,haproxy使用该文件检查WEB状态,必须建立 
touch /var/www/check.txt 

三、240/241两台服务器的haproxy配置 

1、 安装haproxy 
tar xvf haproxy-1.4.22.tar.gz
cd haproxy-1.4.22
make TARGET=36-Ubuntu
make PREFIX=/usr/local/haproxy install
 
2、 编辑其配置文件 
cd /etc
mkdir haproxy
vim haproxy/haproxy.cfg 

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

global
        #daemon

        #nbproc 1

        #pidfile /var/run/haproxy.pid

        log 127.0.0.1 local0

        log 127.0.0.1 local1 notice

        maxconn 4096

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

defaults

        log global

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

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

        #option redispatch       #serverId对应的服务器挂掉后,强制定向到其他健康的服务器

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

        option httplog

        option dontlognull

        option redispatch

        maxconn 2000            #默认的最大连接数

        timeout connect 5000ms    #连接超时

        timeout client 30000ms    #客户端超时

        timeout server 30000ms   #服务器超时

        #timeout check 2000       #=心跳检测超时

      log 127.0.0.1 local0 err    #开启记录haproxy日志 

listen web 10.10.13.245:80 

        mode http

        stats enable

        balance roundrobin

        option httpclose

        option forwardfor

        option httpchk HEAD /check.txt HTTP/1.0

        server nc243 10.10.13.243:80 cookie A check

        server nc244 10.10.13.244:80 cookie B check

或者:
 
frontend shishi

        bind *:82

        mode http

        acl api_net url_sub -i sip_apiname=engagecloud

        use_backend engagecloud if api_net

        default_backend engagecloud

backend engagecloud

        mode http

        balance roundrobin

        server app 10.15.14.130:80 cookie A

        server app1 10.15.14.131:8080 cookie B

backend salesapp

        mode http

        server app1 10.15.14.131:8080 cookie B

 
frontend shishi2

        bind *:822

        mode http

        acl api_net url_sub -i sip_apiname=engagecloud

        use_backend engagecloud if api_net

        default_backend salesapp1  

backend engagecloud1

        mode http

        server app 10.15.14.130:80 cookie A

backend salesapp1

        mode http

        server app1 10.15.14.131:8080 cookie B

        server app 10.15.14.130:80 cookie A 

frontend http-ip //前端节点定义
 
bind 10.10.13.245:80   //虚拟服务节点监听80端口
    mode http
    log global
    option httplog
    option httpclose //每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式,只能够模拟这种模式的实现

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

    capture request header Host len 20 //此配置和一下的类似配置都是抓取Http请求中的参数记录到日志中。
    capture request header User-Agent len 16
    capture request header Content-Length len 10    
    capture request header Referer len 20

    capture response header Content-Length len 10

//控制策略的配置,参考别人的配置,使用时要根据自己的实际情况。

    acl api_taobao url_sub -i sip_apiname=taobao. //在请求url中包含sip_apiname=taobao则此控制策略返回true否则为false

    acl api_alisoft url_sub -i sip_apiname=alisoft. //在请求url中包含sip_apiname=alisoft则此控制策略返回true否则为false

    acl invalid_req url_sub -i sip_apiname= //在请求url中包含sip_apiname=则此控制策略返回true否则为false

    acl stat_req url_dir -i admin //在请求url中存在admin作为部分地址路径则此控制策略返回true否则返回false

    block if !invalid_req !stat_req //block表示阻止请求返回403错误当前表示如果不满足策略invalid_req同时也不满足策略stat_req则阻止请求。(就是要求URL中必需有参数sip_apiname,除非是查看服务器状态的URL)。

    use_backend alisoft_server if api_alisoft //如果是满足策略api_alisoft的情况,则使用alisoft_server作为后端服务集群。

    use_backend taobao_server if api_taobao //如果是满足策略api_taobao的情况,则使用taobao_server作为后端服务集群。
    default_backend alisoft_server //使用alisoft_server作为默认后端服务集群。
backend alisoft_server //后端节点1定义
   mode http
   balance roundrobin //负载均衡策略配置
   cookie SERVERID //允许插入serveridcookie中,serverid后面可以定义

   server app1 10.10.13.243:80 cookie 1 check fall 5 weight 1 //真实服务器配置定义cookie 1表示serverid1check表示需要状态检查,fall 5表示失败五次就认为服务器状态不可用(不在接受请求),weight 1表示权重

  server app2 x.x.x.x:8080 cookie 1 check fall 5 weight 10

backend taobao_server //后端节点2定义 
   mode http
   server app1 10.10.13.244:80 check fall 5
 
listen haproxy-status 10.10.13.245:8888
        mode          http
        option        httplog
       stats uri     /haproxy-stats
        stats realm   Global\ statistics
        stats auth    admin:123456 
haproxy配置结束。
 
3HA-Proxy日志配置说明:
HA-Proxy可以收集本机及其他后端服务器日志,但是需要在Load Balancer240/241)上作一些配置。

首先修改/etc/sysconfig/syslog文件,将SYSLOGD_OPTIONS="-m 0 修改为SYSLOGD_OPTIONS="-m 0 -r -x",支持收集远程服务器日志。

 然后修改/etc/syslog.conf,增加如下语句:
#add by haproxy
local0.* /path/to/haproxy.log //需要存储日志的地址
执行service syslog restart,重新启动系统日志器
最后就是在HA-Proxy的配置中增加日志输出,即capture 后的内容。
 
4、启动haproxy服务 

/usr/local/haproxy/sbin/haproxy –f /etc/haproxy/haproxy.cfg –d   或者-D

也可以:
cd /usr/local/haproxy/sbin
./haproxy –f /etc/haproxy/haproxy.cfg
 
5、打开网页测试:
 
 

 
6、打开haproxy的状态信息页:
 

HAproxy 使用手册: 

1、 HAProxy 常用参数说明 

#./haproxy help //haproxy相关命令参数介绍.

haproxy -f <配置文件> [-n 最大并发连接总数] [-N 每个侦听的最大并发数] [-d] [-D] [-q] [-V] [-c] [-p] [-s] [-l] [-dk] [-ds] [-de] [-dp] [-db] [-m <内存限制M>] [{-sf|-st} pidlist...]

-d     前台,debug模式
-D     daemon模式启动
-q     安静模式,不输出信息
-V     详细模式
-c     对配置文件进行语法检查
-s     显示统计数据
-l     显示详细统计数据
-dk    不使用kqueue
-ds    不使用speculative epoll
 -de    不使用epoll
-dp    不使用poll
-db    禁用后台模式,程序跑在前台
-sf    程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后
-st    程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后 

2HAProxy 错误排除 

在上述启动时, 若有出现下述错误:

    Starting haproxy: [ALERT] 015/191034 (15631) : Starting proxy webfarm: cannot bind socket...on both load balancer

   

    [ALERT] 056/103843 (1358) : Starting proxy www-balancer: cannot bind socket

解法
    暂时解法, 直接先修改设定, 让它先跑起来:

        sysctl -e net.ipv4.ip_nonlocal_bind=1

    永久解法, 让开机时自动设此参数.

        sysctl -a | grep nonlocal   #看是否已经有设定此参数

        vim /etc/sysctl.conf # 最下面加入

        net.ipv4.ip_nonlocal_bind=1

还有一种可能就是,haproxy Load Balancer的机器上开启了web服务,关闭即可。要保证web服务,在这两台机器上是关掉的。 

3、 HAProxy 配置手册 

haproxy.cfg 有分下列三种: (haproxy.cfg 的三个主项目)
    global
    listen
    defaults
注:

    下述所有 <name> 都必须由 / 写字母、数字、 - . : 组成. (大小写会视为不同名称)

    defaults <name> 下面所有参数的预设设定值,下面的设定值会盖掉上面的。
    listen <name>:完整的 Proxy 代理,frontend / backend 都在这个设定里 (用于 TCP)
global 分类
global 部分有下述几类:
 
    行程管理和安全
    chroot <jail dir>

        daemon: 执行 -D 也是同样

        gid
        group
        uid
        log

        nbproc: deamon 才能使用, 也是最推荐的模式, 如果小档案很多, 建议要多开几个, 但是 debug 时不建议开此参数. (arg: nbproc <number>)

        pidfile

        ulimit-n: 设定每个行程最大文件数, 此值会自动计算, 不建议设定此参数 (arg: ulimit-n <number>)

        user
    stats
   性能调校
     maxconn: 最大连接数, -n (arg: maxconn <number>)

       noepoll: Linux 系统不使用 epoll 等同 -de

       nokqueue: BSD 不使用 kqueue polling –dk

       nopoll: poll 在任何机器都可以跑, 不建议关闭, -dp

       nosepoll: Linux 系统不使用 speculative epoll 等同 -ds

     spread-checks: 多久去 check 一次, 默认值 0 (arg: spread-checks <0..50 in percent>)

     tune.maxaccept
     tune.maxpollevents
    测试
    debug: 将所有讯息都显示到画面上, -d
    quiet: 不显示任何讯息, -v
 
listen 分类

    listen <instance_name> [ <IP_address>:<port_range>[...] ]

listen 部分有下述几类:
    bind
    mode: TCP / HTTP / health

    balance: roundrobin / source / url / url_param

    server
    option
    # defaults 的参数都可于此写入, 于此 listen 的设定中, 会以此写入的为主。

4httpchk 范例 

httpchk (启用 HTTP server health check.) 特别重要, 范例多记录一点.

    option httpchk
    option httpchk <uri>

    option httpchk <method> <uri>

    option httpchk <method> <uri> <version>

    ex:

        # Relay HTTPS traffic to Apache instance and check service availability

        # using HTTP request "OPTIONS * HTTP/1.1" on port 80.

        backend https_relay
            mode tcp

            option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www

            server apache1 192.168.1.1:443 check port 80

        option httpchk GET /robots.txt
        option httpchk GET /index.html
        option httpchk *

    option httpchk GET /robots.txt # 指的是 GET /robots.txt HTTP/1.0

    option httpchk # 指的是 OPTIONS / HTTP/1.0

    option httpchk * # 指的是 OPTIONS * HTTP/1.0 

四、240/241两台服务器的keepalived配置 

1、 安装keepalived 
tar xvf keepalived-1.2.7.tar.gz
cd keepalived-1.2.7
./configure –prefix=/usr/local/keepalived/
make
make install
 
2、 keepalivedipvsadm 是在一起使用的,不可缺少。所以,要先安装ipvsadm 
apt-get install ipvsadm
 
3、 编辑配置文件 
mkdir –pv /etc/keepalived
vim /etc/keepalived/keepalived.conf
 
global_defs {

        router_id LVS_DEVEL

}
vrrp_instance VI_1 {

state MASTER         #241服务器上将MASTER改为BACKUP

interface eth0          #HA监测网络接口
virtual_router_id 51     #主、备机的virtual_router_id必须相同
priority 90            #主、备机取不同的优先级,主机值较大,241的值较小
advert_int 1           #VRRP Multicast广播周期秒数
authentication {

            auth_type PASS       #VRRP认证方式

            auth_pass 123456789   #VRRP口令字

        }

virtual_ipaddress {

        10.10.13.245    #LVS虚拟地址

        }

}
 
4、 启动keepalived服务 

/usr/local/keepalived/sbin/keepalived –f /etc/keepalived/keepalived.conf 

ipvsadm –l
ip a 此命令可以看到,

eth010.10.13.240ip下有一个新的ip生成。如:

1: lo: <LOOPBACKUPLOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCASTMULTICASTUPLOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:e0:4c:ec:d7:e5 brd ff:ff:ff:ff:ff:ff

    inet 10.10.13.240/24 brd 10.10.13.255 scope global eth0

    inet 10.10.13.245/32 scope global eth0

    inet6 fe80::2e0:4cff:feec:d7e5/64 scope link

       valid_lft forever preferred_lft forever

eth010.10.13.241ip下没有新的ip生成,如下:

1: lo: <LOOPBACKUPLOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCASTMULTICASTUPLOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000

    link/ether 00:e0:4c:ec:d7:d3 brd ff:ff:ff:ff:ff:ff

    inet 10.10.13.241/24 brd 10.10.13.255 scope global eth0

    inet6 fe80::2e0:4cff:feec:d7d3/64 scope link

       valid_lft forever preferred_lft forever

5、 240keepalived服务停掉,重新看一下:

240ip a

1: lo: <LOOPBACKUPLOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCASTMULTICASTUPLOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:e0:4c:ec:d7:e5 brd ff:ff:ff:ff:ff:ff

    inet 10.10.13.240/24 brd 10.10.13.255 scope global eth0

    inet6 fe80::2e0:4cff:feec:d7e5/64 scope link

       valid_lft forever preferred_lft forever

241:ip a

1: lo: <LOOPBACKUPLOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCASTMULTICASTUPLOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000

    link/ether 00:e0:4c:ec:d7:d3 brd ff:ff:ff:ff:ff:ff

    inet 10.10.13.241/24 brd 10.10.13.255 scope global eth0

    inet 10.10.13.245/32 scope global eth0

    inet6 fe80::2e0:4cff:feec:d7d3/64 scope link

       valid_lft forever preferred_lft forever

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章