haproxy
目前较为成熟的网站架构应该是Web前端采用Nginx/Haproxy+Keepalived 作为负载均衡器,后端采用的MySQL数据库,一主多从并且读写分离,读操作采用LVS+keepalive架构。(当然也可以前端采用LVS的full-nat)
下面稍微介绍一下其他两个负载均衡的优缺点。
Nginx:
优点 1.在第七层做负载均衡,可以根据域名,url等等做流量分流。强大的正则匹配比Haproxy更强大。(这也是广泛流行的原因之一)
2.Nginx对网络的依赖小,能ping通就证明负载均衡可用。而LVS不仅需要VIP还需要根据模型需要(如DR)配置一下后台真实主机的ip。麻烦要死。
3.配置简单,error.log的输出齐全,可以在上面查找各种错误。以备解决。
4.高负载,epoll模型的使用,可以支持很大的并发量。
5.Nginx的反向代理,这个功能很强大。
6.nginx可以通过端口检测服务器内部的故障。
缺点 1.支持的应用场景似乎也就web和mail了。
2.对后端的服务器健康检查,只支持通过端口来检测。不支持URL检测。不支持session保存,但可以使用ip_hash解决
LVS:
Haproxy:
[root@proxy ~]# yum -y install haproxy
配置haproxy。
[root@proxy ~]# rpm -ql haproxy
/etc/haproxy
/etc/haproxy/haproxy.cfg
/etc/logrotate.d/haproxy
/etc/rc.d/init.d/haproxy
其中/etc/haproxy.cfg 是主配置文件
首先修改主配置文件,实现最基本的负载均衡。
global
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
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
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
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main *:80
default_backend app
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin
server app1 192.168.217.14:80 check
server app2 192.168.217.15:80 check
好了,启动haproxy。
[root@proxy haproxy]# service haproxy start
Starting haproxy: [ OK ]
[root@localhost Desktop]# curl 192.168.217.16
node1.example.com
[root@localhost Desktop]# curl 192.168.217.16
node2.example.com
[root@localhost Desktop]# curl 192.168.217.16
node1.example.com
[root@localhost Desktop]# curl 192.168.217.16
node2.example.com
[root@localhost Desktop]# curl 192.168.217.16
node1.example.com
但是有一个问题就是,日志好像并没有啊。
修改日志配置文件/etc/rsyslog.conf
取消注释(开启udp端口)
将日志写到 /var/log/haproxy.log
重启日志服务。
[root@proxy log]# service rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
[root@proxy log]# ls /var/log/haproxy.log -l
-rw-------. 1 root root 486 Mar 18 11:51 /var/log/haproxy.log
[root@proxy log]#
添加如下选项,可以在浏览器打开一个监控页面。
listen status
stats enable
bind *:8080
mode http
option httplog
log global
maxconn 10
stats refresh 3s
stats uri /admin
stats auth admin:admin
stats hide-version
stats admin if TRUE
实现haproxy + keepalived 。
首先安装keepalived。两个调度器都安装keepalive
先安装工具
解压并且编译
将配置文件链接到正确的位置
配置主配置文件/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost#接受报警的邮箱
}
notification_email_from keepalived@dirmaster.example.com#邮件的发送地址
smtp_server 127.0.0.1
smtp_connect_timeout 30#连接smtp的超时时间
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port {
script "/etc/keepalived/check_haproxy.sh"
}
vrrp_instance VI_1 {
state MASTER#备机需要改为BACKUP
interface eth0#HA的检测网络接口
virtual_router_id 51#主和备机的id必须一样,且在0~255
priority 100#主机的优先级,备机应该此值小点
advert_int 1#主备之间的通告时间间隔秒数
authentication {
auth_type PASS#设置验证类型
auth_pass 1111#设置验证密码
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.2.222#VIP
}
}
#vim /etc/keepalived/check_haproxy.sh
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
/etc/init.d/haproxy start
fi
sleep 2
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
/etc/init.d/keepalived stop
fi
改完配置文件就可以直接启动keepalived了,但有时还可能报错,
[root@dirmaster ~]# service keepalived start
/etc/init.d/keepalived: Permission denied
chmod a+x /etc/init.d/keepalived 就好了。
现象:(拥有VIP)
proxy主机关闭。
[root@proxy keepalived]# service keepalived stop
Stopping keepalived: [ OK ]
You have new mail in /var/spool/mail/root
[root@proxy keepalived]#
还是可以正常调度。(因为dirslave启动了)