Haproxy+keepalived
原理:
HAProxy介绍及其定位
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。
HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
其支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。
如果说在功能上,能以proxy反向代理方式实现WEB均衡负载,这样的产品有很多。包括 Nginx,ApacheProxy,lighttpd,Cheroke等。
但要明确一点的,Haproxy 并不是 Http 服务器。以上提到所有带反向代理均衡负载的产品,都清一色是 WEB 服务器。简单说,就是他们能自个儿提供静态(html,jpg,gif..)或动态(php,cgi..)文件的传输以及处理。而Haproxy仅仅,而且专门是一款的用于均衡负载的应用代理。其自身并不能提供http服务。
keepalived理论工作原理
keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能。
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web 服务器的状态。 Layer3,4&5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:
Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器
发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。在本文中将采用这种方式。
Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
Layer5:Layer5就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。
vip即虚拟ip,是附在主机网卡上的,即对主机网卡进行虚拟,此IP仍然是占用了此网段的某个IP。
拓扑图
1 安装
cd /mnt/ && http://www.haproxy.org/download/1.6/src/haproxy-1.6.5.tar.gz && tar zxf /mnt/haproxy-1.6.5.gz –C /mnt/
make TARGET=linux2628
make install PREFIX=/usr/local/haproxy
mkdir /usr/loca/conf
2配置
cat >> /usr/local/haproxy/conf/haproxy.cfg<<EOF
global
maxconn 51200
chroot /usr/local/haproxy
uid 99
gid 99
daemon
#quiet
nbproc 1
pidfile /var/run/haproxy.pid
defaults
mode http
#优化选项
retries 3
option redispatch
#option abortonclose
timeout connect 5000ms
timeout client 30000ms
timeout server 30000ms
#timeout check 2000
log 127.0.0.1 local0 info
balance roundrobin
listen admin_stats
bind 0.0.0.0:8888
option httplog
stats refresh 30s
stats uri /stats #监控页面的url
stats realm Haproxy Manager
stats auth admin:admin #监控页面的用户名和密码
stats hide-version
frontend http-in
bind *:8889
mode http
option httplog
log global
default_backend httpserver
backend httpserver
balance roundrobi
#server web1 192.168.0.78:80 cookie 1 weight 1 check inter 2000 rise 2 fall 3
#server web2 192.168.0.28:80 cookie 1 weight 1 check inter 2000 rise 2 fall 3
option httpchk GET /index.html #后端服务器检测
#使用stick-table管理客户端session,保持session会话
stick-table type ip size 5000k expire 5m store conn_cur
stick match src table httpserver
stick on src table httpserver
server s8001 192.168.0.227:800 maxconn 500 weight 10 cookie s8001 check
server s8002 192.168.0.229:800 maxconn 500 weight 10 cookie s8002 check
EOF
3 haproxy日志
sed -i ‘13,14 s/^#//‘ /etc/rsyslog.conf
cat >> /etc/rsyslog.conf <<EOF
local3.* /var/log/haproxy.log
local0.* /var/log/haproxy.log
EOF
service rsyslog restart
4 启动haproxy
cat >>/etc/init.d/haproxy <<EOF
#!/bin/sh
# confit: /usr/local/haproxy/conf/haproxy.cfg
# pidfile: /usr/local/haproxy/logs/haproxy.pid
# source function library.
. /etc/rc.d/init.d/functions
# source networking configuration.
. /etc/sysconfig/network
# check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
config="/usr/local/haproxy/conf/haproxy.cfg"
exec="/usr/local/haproxy/sbin/haproxy"
prog=$(basename $exec)
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
lockfile=/var/lock/subsys/haproxy
check(){
$exec -c -V -f $config
}
start() {
$exec -c -q -f $config
if [ $? -ne 0 ]; then
echo "Errors in configuration file, check with $prog check."
return 1
fi
echo -n $"Starting $prog: "
# start it up here, usually something like "daemon $exec"
daemon $exec -D -f $config -p /var/run/$prog.pid
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
# stop it here, often "killproc $prog"
killproc $prog
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
$exec -c -q -f $config
if [ $? -ne 0 ]; then
echo "Errors in configuration file, check with $prog check."
return 1
fi
stop
start
}
reload() {
$exec -c -q -f $config
if [ $? -ne 0 ]; then
echo "Errors in configuration file, check with $prog check."
return 1
fi
echo -n $"Reloading $prog: "
$exec -D -f $config -p /var/run/$prog.pid -sf $(cat /var/run/$prog.pid)
retval=$?
echo
return $retval
}
force_reload() {
restart
}
fdr_status() {
status $prog
}
case "$1" in
start|stop|restart|reload)
$1
;;
force-reload)
force_reload
;;
checkconfig)
check
;;
status)
fdr_status
;;
condrestart|try-restart)
[ ! -f $lockfile ] || restart
;;
*)
echo $"Usage: $0 {start|stop|status|checkconfig|restart|try-restart|reload|force-reload}"
exit 2
esac
EOF
Service haproxy start
Chkconfig haproxy on
5.keepalived
yum install openssl openssl-devel -y
cd /mnt && wget http://www.keepalived.org/software/keepalived-1.2.20.tar.gz &&tar zxf keepalived-1.2.20.tar.gz -C /mnt
cd keepalived-1.2.20
./configure --prefix=/usr/local/keepalived --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.32-573.22.1.el6.x86_64/
make && make install
ll /usr/local/keepalived/
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
cat >>/etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
notification_email {
[email protected] #设置邮件
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id HAProxy_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
}
vrrp_script check_haproxy {
script "/mnt/shell/check_haproxy.sh"
#interval 2
#weight 2
}
vrrp_instance VI_1 {
state BACKUP #两边state 都为BACKUP
interface eth0
virtual_router_id 78 #id 必须唯一,且不可冲突
priority 100 #优先级不一样,数字越大,优先级越高
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.24
}
track_script {
check_haproxy
}
}
EOF
service keepalived start
chkconfig keepalived on
keepalived 检测haproxy脚本,两种方式取其一:
#!/bin/bash
A=`ps -C haproxy --no-header|wc -l`
if [ $A -eq 0 ];then
/etc/init.d/haproxy start
sleep 3
if [ `ps -C haproxy --no-header|wc -l` -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi
#add new other method
A=`curl -I http://192.168.0.24:8888/stats -u admin:admin|grep HTTP|awk ‘{print $2}‘`
if [ $A -ne 200 ];then
/etc/init.d/haproxy start
sleep 3
if [ `curl -I http://192.168.0.24:8888/stats -u admin:admin|grep HTTP|awk ‘{print $2}‘` -ne 200 ];then
/etc/init.d/keepalived sotp
fi
fi