首页 > 代码库 > keepalied和haproxy的部署及配置

keepalied和haproxy的部署及配置

Keepalived部署

编译keepalived

#cd /opt/soft

# wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz

#tar zxvf keepalived-1.2.12.tar.gz

#cd keepalived-1.2.12

# ./configure && make && make install

 

将keepalived做成启动脚务

#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

#mkdir /etc/keepalived/

#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

#cp /usr/local/sbin/keepalived /usr/sbin/

# chkconfig keepalived on

主备机间时间要同步

##############实现双机互信#######

#########node1#######

ssh-keygen -t rsa -P ‘‘

ssh-copy-id-i.ssh/id_rsa.pub root@172.16.18.9

#########node2#######

ssh-keygen -t rsa -P ‘‘

ssh-copy-id-i .ssh/id_rsa.pubroot@172.16.18.7

##############查看时间###########

[root@node1 ~]#date;ssh node2 ‘date‘

#####为实现同步可使用下面同步#####

crontab-e

*/5* * * * /usr/sbin/ntpdate172.16.0.1 &< /dev/nul

 

Keepalived配置

配置文件说明

global_defs { #全局配置,这里额外的静态路由并未添加因为它是非必要的,除非我们在当前或特定的主机上生成特殊的静态路由等

   notification_email { #收件人信息

     zhangj@corp.21cn.com

     liangyw1@corp.21cn.com

   }

   notification_email_fromsmtp.21cn.com #发件人信息(可以随意伪装)

   smtp_server 192.168.200.1#发邮件的服务器(一定不可为外部地址)

   smtp_connect_timeout 30 #连接超时时间

   router_id LVS_21cn1 #路由器的标识(可以随便改动)

}

/*keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。

如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加

如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少

其他情况,维持原本配置的优先级,即配置文件中priority对应的值。

这里需要注意的是:

1) 优先级不会不断的提高或者降低

2) 可以编写多个检测脚本并为每个检测脚本设置不同的weight

3) 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况

这样可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。*/

vrrp_scriptchk_ha {  //定义检查脚本

script"/root/chk_ha.sh"  //要执行的脚本

interval1  //多长时间执行一次(s)

weight-10  //如果执行出现情况,优先级相应增减

}

vrrp_instance VI_1 { #配置虚拟路由器的(VI_1是实例名称)

    state BACKUP #初始状态,master|backup,当state指定的instance的初始化状态,在两台服务器都启动以后,马上发生竞选,优先级高的成为MASTER,所以这里的MASTER并不是表示此台服务器一直是MASTER

    interface eth0 #通告选举所用端口

    virtual_router_id 151  #虚拟路由的ID号(一般不可大于255)(同网段不同主备值不应相同,同一主备相同)

priority 100 #优先级信息,这个值与备机是不同的,备机可以设置为90

nopreempt #state都设置为Backup,在先级高的那台设置参数nopreempt,可以避免master宕掉恢复后再次接管业务,如果state区分了master和slaver则可不配置此项

    advert_int 1 #初始化通告几个

    authentication {  #认证

        auth_type PASS  #认证机制

        auth_pass 21cnlvs  #密码(尽量使用随机

    }

virtual_ipaddress {

       121.14.120.162

        121.14.120.176}

track_script{  //执行检查脚本

chk_ha

}

}

virtual_server 121.14.120.162 80 {

    delay_loop6

    lb_algowlc

    lb_kind DR

   persistence_timeout 3600

    protocolTCP

   real_server 121.14.120.193 80 {

        weight3

       TCP_CHECK {

       connect_timeout 15

       nb_get_retry 2

       delay_before_retry 2

       connect_port 80

        }

  }

 real_server121.14.120.192 80 {

        weight3

       TCP_CHECK {

       connect_timeout 15

        nb_get_retry 2

       delay_before_retry 2

       connect_port 80

        }

  }

}

virtual_server 121.14.120.176 8080 {

    delay_loop6

    lb_algowlc

    lb_kind DR

   persistence_timeout 3600

    protocolTCP

 real_server121.14.120.193 8080 {

        weight 3

       TCP_CHECK {

       connect_timeout 15

       nb_get_retry 2

       delay_before_retry 2

       connect_port 8080

        }

  }

 real_server121.14.120.192 8080 {

        weight3

       TCP_CHECK {

       connect_timeout 15

        nb_get_retry 2

       delay_before_retry 2

       connect_port 8080

        }

  }

}

Haproxy部署

#cd /opt/soft

#wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.25.tar.gz

#tar zxf haproxy-1.4.25.tar.gz

#cd haproxy-1.4.25

uname -a //查看linux内核版本

# make TARGET=linux26 PREFIX=/opt/haproxy-1.4.25

# make install PREFIX=/opt/haproxy-1.4.25

# useradd haproxy

#passwd haproxy

#mkdir /opt/haproxy-1.4.25/conf

#mkdir /opt/haproxy-1.4.25/logs

#touch /opt/haproxy-1.4.25/conf/haproxy.cfg

#chown -R haproxy.haproxy /opt/haproxy-1.4.25

 

启动haproxy服务

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

启动成功

关闭haproxy服务

pkill haproxy

重启haproxy

/usr/local/haproxy/sbin/haproxy - f/usr/local/haproxy/haproxy.cfg -st cat /usr/local/haproxy/haproxy.pid

 

制作haproxy启动脚本

Vi /etc/init.d/haproxy

#!/bin/bash

BASE_DIR="/opt/haproxy"

ARGV="$@"

start()

{

$BASE_DIR/sbin/haproxy -f$BASE_DIR/conf/haproxy.cfg

}

stop()

{

echo "STOP HAPoxy Listen"

kill -TTOU $(cat $BASE_DIR/haproxy.pid)

echo "STOP HAPoxy process"

kill -USR1 $(cat $BASE_DIR/haproxy.pid)

}

case $ARGV in

start)

start

ERROR=$?

;;

stop)

stop

ERROR=$?

;;

restart)

stop

start

ERROR=$?

;;

*)

echo "hactl.sh[start|restart|stop]"

esac

exit $ERROR

Haproxy配置

global   # 全局参数的设置 

log 127.0.0.1 local0 info 

# log语法:log [max_level_1] 

全局的日志配置,使用log关键字,指定使用127.0.0.1上的syslog服务中的local0日志设备,

记录日志等级为info的日志 

user haproxy 

group haproxy 

设置运行haproxy的用户和组,也可使用uid,gid关键字替代之 

daemon 

以守护进程的方式运行 

nbproc 16

设置haproxy启动时的进程数,根据官方文档的解释,我将其理解为:该值的设置应该和服务

#器的CPU核心数一致,即常见的2颗8核心CPU的服务器,即共有16核心,则可以将其值设置为:

#< code>

#的崩溃。这里我设置为16 

maxconn 4096 

定义每个haproxy进程的最大连接数 ,由于每个连接包括一个客户端和一个服务器端,所以单

#个进程的TCP会话最大数目将是该值的两倍。 

#ulimit -n 65536 

设置最大打开的文件描述符数,在1.4的官方文档中提示,该值会自动计算,所以不建议进行

#设置 

pidfile /var/run/haproxy.pid 

定义haproxy的pid

defaults # 默认部分的定义

mode http

# mode语法:mode {http|tcp|health} 。http是七层模式,tcp是四层模式,health是健康检测

#,返回OK

log 127.0.0.1 local3 err

使用127.0.0.1上的syslog服务的local3设备记录错误信息

retries 3

定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为

#不可用

option httplog

启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求的,只记录“时间[Jan 5 13

#:23:46] 日志服务器[127.0.0.1] 实例名已经pid[haproxy[25218]] 信息[Proxy http_80_in s

#topped.]”,日志格式很简单。

option redispatch

当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证

#会话的SESSION持久性;而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的

#,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常

option abortonclose

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

option dontlognull

启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了

#探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描

#端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负

#载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来

option httpclose

这个参数我是这样理解的:使用该参数,每处理完一个request时,haproxy都会去检查http头

#中的Connection的值,如果该值不是close,haproxy将会将其***,如果该值为空将会添加为:

#Connection: close。使每个客户端和服务器端在完成一次传输后都会主动关闭TCP连接。与该

#参数类似的另外一个参数是“option forceclose”,该参数的作用是强制关闭对外的服务通道

#,因为有的服务器端收到Connection: close时,也不会自动关闭TCP连接,如果客户端也不关

#闭,连接就会一直处于打开,直到超时。

contimeout 5000

设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout

#connect替代,该参数向后兼容

clitimeout 3000

设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用

#timeout client替代。该参数向后兼容

srvtimeout 3000

设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用

#timeout server替代。该参数向后兼容

listen status 

定义一个名为status的部分,可以在listen指令指定的区域中定义匹配规则和后端服务器ip,

#相当于需要在其中配置frontend,backend的功能。一般做tcp转发比较合适,不用太多的规则

#匹配。

bind 0.0.0.0:1080

定义监听的套接字

mode http

定义为HTTP模式

log global

继承global中log的定义

stats refresh 30s

# stats是haproxy的一个统计页面的套接字,该参数设置统计页面的刷新间隔为30s

stats uri /admin?stats

设置统计页面的uri为/admin?stats

stats realm Private lands

设置统计页面认证时的提示内容

stats auth admin:password

设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可

stats hide-version

隐藏统计页面上的haproxy版本信息

frontend http_80_in # 定义一个名为http_80_in的前端部分,haproxy会监听bind的端口

bind 0.0.0.0:80

# http_80_in定义前端部分监听的套接字

mode http

定义为HTTP模式

log global

继承global中log的定义

option forwardfor

启用X-Forwarded-For,在requests头部插入客户端IP发送给后端的server,使后端server获

#取到客户端的真实IP

acl static_down nbsrv(static_server) lt 1

定义一个名叫static_down的acl,当backend static_sever中存活机器数小于1时会被匹配到

acl php_web url_reg /*.php$

#acl php_web path_end .php

定义一个名叫php_web的acl,当请求的url末尾是以.php结尾的,将会被匹配到,上面两种写

#法任选其一

acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$

#acl static_web path_end .gif .png .jpg .css .js .jpeg

定义一个名叫static_web的acl,当请求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif

结尾的,将会被匹配到,上面两种写法任选其一

use_backend php_server ifstatic_down

如果满足策略static_down时,就将请求交予backend php_server

use_backend php_server ifphp_web

如果满足策略php_web时,就将请求交予backend php_server

use_backend static_server ifstatic_web

如果满足策略static_web时,就将请求交予backend static_server

backend php_server #定义一个名为php_server的后端部分,frontend定义的请求会到到这里处理

mode http

设置为http模式

balance source

设置haproxy的调度算法为源地址hash

cookie SERVERID

允许向cookie插入SERVERID,每台服务器的SERVERID可在下面使用cookie关键字定义

option httpchk GET /test/index.php

开启对后端服务器的健康检测,通过GET /test/index.php来判断后端服务器的健康情况

server php_server_1 10.12.25.68:80 cookie 1 check inter 2000 rise 3 fall 3 weight 2

server php_server_2 10.12.25.72:80 cookie 2 check inter 2000 rise 3 fall 3 weight 1

server php_server_bak 10.12.25.79:80 cookie 3 check inter 1500 rise 3 fall 3 backup

# server语法:server [:port] [param*]

使用server关键字来设置后端服务器;为后端服务器所设置的内部名称[php_server_1],该名

#称将会呈现在日志或警报中、后端服务器的IP地址,支持端口映射[10.12.25.68:80]、指定该

#服务器的SERVERID为1[cookie 1]、接受健康监测[check]、监测的间隔时长,单位毫秒[inter 

#2000]、监测正常多少次后被认为后端服务器是可用的[rise 3]、监测失败多少次后被认为后端

#服务器是不可用的[fall 3]、分发的权重[weight 2]、最为备份用的后端服务器,当正常的服

#务器全部都宕机后,才会启用备份服务器[backup]

backend static_server

mode http

option httpchk GET /test/index.html

server static_server_1 10.12.25.83:80 cookie 3 check inter 2000 rise 3 fall 3

 

一个端口只能被一个frontend监听,但是可以被多个listen标签监听

 

Haproxy的acl规则使用

acl is_e_redirect_ssl1 path_end -ichangePwd.do login.do getPassword.do findPwd.do register.do registerMobile.doiframe/modifyPassword.do addRegisterInfo.do

acl is_e_redirect_ssl2 url      -i /index.do

acl is_e_not_redirect_ssl2 path_end -iheadPic.do uploadFlash.do cropZoomFlash.do

acl is_open hdr_beg(host) -i open.e.189.cn10.235.1.83

acl is_message  path_beg -i /message

 

 

Haproxy对后端机器的健康监听

1、通过监听端口进行健康检测

这种检测方式,haproxy只会去检查后端server的端口,并不能保证服务的真正可用。 

listen http_proxy 0.0.0.0:80 

        mode http 

        cookie SERVERID 

        balance roundrobin 

        option httpchk 

        server web1192.168.1.1:80 cookie server01 check 

        server web2192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2 

2、通过URI获取进行健康检测

这种检测方式,是用过去GET后端server的的web页面,基本上可以代表后端服务的可用性。

listen http_proxy 0.0.0.0:80 

        mode http 

        cookie SERVERID 

        balance roundrobin 

        option httpchk GET/index.html 

        server web1192.168.1.1:80 cookie server01 check 

        server web2 192.168.1.2:80cookie server02 check inter 500 rise 1 fall 2 

3、通过request获取的头部信息进行匹配进行健康检测

这种检测方式,则是基于高级,精细的一些监测需求。通过对后端服务访问的头部信息进行匹配检测。 

listen http_proxy 0.0.0.0:80 

        mode http 

        cookie SERVERID 

        balance roundrobin 

        option httpchk HEAD/index.jsp HTTP/1.1\r\nHost: www.xxx.com 

        server web1192.168.1.1:80 cookie server01 check 

        server web2192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2 

Haproxy实现持久化链接

1 调度算法source

haroxy 将用户IP经过hash计算后 指定到固定的真实服务器上(类似于nginx 的IP hash 指令)

配置指令       balance source

2 cookie 识别 

haproxy 将WEB服务端发送给客户端的cookie中插入(或添加加前缀)haproxy定义的后端的服务器COOKIE ID。

配置指令例举  cookie SESSION_COOKIE  insert indirect nocache

服务器定义  server s1 192.168.1.168:7003cookieA checkinter 1500 rise 3 fall 3 weight10

3 session 识别 

haproxy 将后端服务器产生的session和后端服务器标识存在haproxy中的一张表里。客户端请求时先查询这张表。然后根据session分配后端server。

配置指令:appsession len timeout

 

Haproxy日志

vi /etc/sysconfig/syslog把SYSLOGD_OPTIONS="-m0" 改成 SYSLOGD_OPTIONS="-r -m 0"让syslogd接受远程的日志输出/etc/init.d/syslog restart然后就可以看到日志输出了

redhat6.0为/etc/rsyslog.conf

 

 

 

 

 

keepalied和haproxy的部署及配置