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 [email protected]
#########node2#######
ssh-keygen -t rsa -P
‘‘
ssh-copy-id-i .ssh/[email protected]
##############
查看时间###########
[[email protected] ~]#date;ssh node2 ‘date‘
#####
为实现同步可使用下面同步#####
crontab-e
*/5* * * *
/usr/sbin/ntpdate172.16.0.1 &<
/dev/nul
Keepalived配置
配置文件说明
global_defs { #
全局配置,这里额外的静态路由并未添加因为它是非必要的,除非我们在当前或特定的主机上生成特殊的静态路由等
notification_email {
#收件人信息
[email protected]
[email protected]
}
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="[email protected]"
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