haproxy+keepalived实现高可用。
在写这篇博客之前通过自己的实验实现了双机高可用,在实验的过程中遇到了一些麻烦。而这些麻烦现在感觉都有些莫名其妙,不过现在已经解决,现在把自己的操作与各位分享下。下面开始正题。
网络拓扑如下:
地址分配介绍:
C1:192.168.5.100
ha1:192.168.5.1
ha2:192.168.5.10
rs1:192.168.5.11
rs2:192.168.5.12
开始配置:
在ha1和ha2上做keepalived。
声明:作者在虚拟机上实验:(redhat 6.4)
mount /dev/cdrom media
cd /media/Packages
rpm –ivh haproxy****.rpm
rpm –ivh keepalived***.rpm
也可以自己现在二进制自己编译安装
①rsyslog修改
vi /etc/sysconfig/rsyslog
# Options for rsyslogd
# Syslogd options aredeprecated since rsyslog v3.
# If you want to use them,switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for moredetails
SYSLOGD_OPTIONS="-c 2-r"
vi /etc/rsyslog.conf
添加
local2.* /var/log/haproxy.log
servicersyslog restart
②haproxy配置文件的修改
vi /etc/haproxy/haproxy.cfg
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen stats
mode http
bind 0.0.0.0:1080
stats enable
stats hide-version
stats uri /admin
stats realm Haproxy Statistics
stats auth admin:admin
stats admin if TRUE
frontend web
bind *:80
mode http
logglobal
option httpclose
option logasap
option dontlognull
capture request header Host len20
capture request header Refererlen 60
default_backend servers
frontend healthcheck
bind :1099
mode http
option httpclose
option forwardfor
default_backend servers
backend servers
balance roundrobin
server websrv1 192.168.5.11:80 check inter 2000 rise 1 fall 2 maxconn 2000
server websrv2 192.168.5.12:80 check inter 2000 rise 1 fall 2 maxconn 2000
note:backupend需要添加好RealServer的地址就好,其余的参数自己按照需求进行配置即可。
③keepalived的配置
vi /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost //接受keepalived发送的邮件
}
notification_email_from keepalived@localhost //定义当keepalived邮件的发送者
smtp_server 127.0.0.1 //mail-server地址
smtp_connect_timeout 30
router_id LVS_DEVEL
}
#vrrp_script chk_haproxy {
# script "/usr/local/haproxy.sh"
# interval 1 //这是一个监控的脚本。最后附件说明
# weight -10
# fall 2
# rise 1
#}
vrrp_script chk_haproxy {
script "[ -e /etc/keepalived/down ] && exit 1 || exit0" //这行监测的脚本
interval 1 //执行的间隔
weight -10 //当检测到异常之后,优先级减10
rise 1 //重新上线需要检查一次
fall 2 //下线需要检查两次
}
vrrp_instanceVI_1 { //定义vrrp实例
state MASTER //vrrp状态,从为BACKUP
interface eth0 //监听的物理接口
virtual_router_id 51 //虚拟路由器ID,两边需要一致,不用更改
priority 101 //优先级,master的优先级高于backup,当发生故障加上监控脚本里面的weight时候需要小于backup的优先级
advert_int 1 //master和backup之间用于通信的间隔
authentication {
auth_type PASS //认证的方式为pass,为明文,密文为HA认证
auth_pass 1111 //认证他的密码,两边需要一致
}
track_interface {
eth0 //监控的接口
}
track_script {
chk_haproxy //用于监测的脚本名称
}
virtual_ipaddress {
192.168.5.111 dev eth0 label eth0:0 //虚拟的地址VIP
}
}
virtual_server192.168.5.111 80 { //提供服务的套接字
}
virtual_server192.168.5.111 80 {
delay_loop 6 //检查RealServer状态的间隔
nat_mask 255.255.255.0 //掩码
#persistence_timeout 50 //一直连接的超时时间。在动态的访问中可用来共享session。
protocol TCP
real_server 192.168.5.11 80 { //提供服务器的realserver的套接字
weight 1
HTTP_GET { //利用HTTP_GET的方法获取跟路径的信息,如果状态码为200,则说明RealServer正常。可以获取多个路径,并且status_code可以利用digest来代替。
url {
path /
status_code 200
}
connect_timeout 3 //超时时间
nb_get_retry 3 //重试的次数
delay_before_retry 3 //重试的时间间隔
}
}
real_server192.168.5.12 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
}
}
}
好了配置完成。可以用来启动keepalived了。
note:在vrrp_script中给注释的脚本,在实验的过程中效果不是特别的明显。
#!/bin/bash
#
status1=`psaux|grep haproxy|grep -v grep|grep -v /bin/bash|wc -l`
[ $status1-eq 0 ] && service haproxy start|| :
status2=`psaux|grep haproxy|grep -v grep|grep -v /bin/bash |wc -l`
[ $status2-eq 0 ] && service haproxy stop|| :
上面是所写的脚本。在haproxy发生故障的过程中,首先要判断haproxy的进程是不是还存在没如果已经不存在了,那么就需要重新启动下。如果重新启动还是启动不起来的话,那么就直接将服务关闭。在本实验中,关闭haproxy之后,想要实现VIP的切换,刚刚stop服务之后,脚本执行,就又启动了服务。所以我们利用一个文件的是否存在的方法来实现。这个我们可以在相应的目录下进行touch和rm操作来实现VIP地址的切换,这样效果更明显。(此方法仅限于实验)
③RealServer需要做的是开启web服务,并且更改配置文件。让配置文件能够记录真实的客户端IP地址就好了。
实验的过程中,要时时刻刻的看日志,查看VIP的漂移过程。作者在实验的过程中,出现了很多问题。比如VIP不能被访问的情况,脚本不生效的情况。但是最终解决掉了,VIP不能被访问后来重启了网卡就好了,到现在都很郁闷,不知道为什么会这样子。另外脚本不生效,在配置keepalived的过程中需要注意的是,keepalived.conf文件的差错能力很弱。它并不像别的配置文件如果出现错误的话会有提示或者启动服务根本启动不起来。但是这个服务却是这个样子的。很烦啊。所以在配置的过程中还有多加用心,不要出现拼写的错误等。好了就到这里了。有什么问题欢迎大家和我交流。。。。。