42y54 发表于 2014-5-3 17:48:12

haproxy+keeaplived

一、HAProxy简介

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
————百度百科
HAProxy的特点是:1、HAProxy是工作在网络7层之上。2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作3、支持url检测后端的服务器出问题的检测会有很好的帮助。4、更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现5、单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。6、HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议,是一种容错协议。该协议通过把几台路由设备联合组成一台虚拟的路由设备,使用一定的机制保证当主机的下一跳交换机出现故障时,及时将业务切换到其它交换机,从而保持通讯的连续性和可靠性。
以下是与VRRP协议相关的基本概念:VRRP 交换机(VRRP Router):运行VRRP的设备,它可能属于一个或多个虚拟交换机。虚拟交换机(Virtual Router):由VRRP管理的抽象设备,又称为VRRP备份组,被当作一个共享局域网内主机的缺省网关。它包括了一个虚拟交换机标识符和一组虚拟IP地址。虚拟IP地址(Virtual IP Address):虚拟 交换机的IP地址,一个虚拟交换机可以有一个或多个IP地址,由用户配置。IP地址拥有者(IP Address Owner):如果一个VRRP 交换机将虚拟交换机的IP地址作为真实的接口地址,则该设备是IP地址拥有者。当这台设备正常工作时,它会响应目的地址是虚拟IP地址的报文,如ping、TCP连接等。虚拟MAC地址:是虚拟交换机根据虚拟交换机 ID生成的MAC地址。一个虚拟交换机拥有一个虚拟MAC地址,格式为:00-00-5E-00-01-{VRID}(VRRP);00-00-5E-00-02-{VRID}(VRRP6)。当虚拟交换机回应ARP请求时,使用虚拟MAC地址,而不是接口的真实MAC地址。主IP地址(Primary IP Address):从接口的真实IP地址中选出来的一个主用IP地址,通常选择配置的第一个IP地址。VRRP广播报文使用主IP地址作为IP报文的源地址。Master 交换机(Virtual Router Master):是承担转发报文或者应答ARP请求的VRRP交换机,转发报文都是发送到虚拟IP地址的。如果IP地址拥有者是可用的,通常它将成为Master。Backup 交换机(Virtual Router Backup):一组没有承担转发任务的VRRP 交换机,当Master设备出现故障时,它们将通过竞选成为新的Master。特点:抢占模式:在抢占模式下,如果Backup器的优先级比当前Master的优先级高,将主动将自己升级成Master。主备备份:这是VRRP提供IP地址备份功能的基本方式。主备备份方式需要建立一个虚拟交换机,该虚拟交换机包括一个Master设备和若干Backup设备,这些交换机构成一个备份组。正常情况下,业务全部由Master承担。Master出现故障时,Backup接替工作。VRRP负载分担:负载分担方式是指多台交换机同时承担业务,单个VRRP备份组是不具备负载分担功能的,只有在多台设备上建立两个或更多的备份组,所有备份组均匀分担Master状态,此时就每台设备只承担了部分的业务,从而达到负载分担的作用。VRRP监视接口状态:每个VRRP备份组可以监视所有与此VRRP备份组绑定的接口的状态,从而当接口出现故障时,VRRP通过改变优先级来重新选择主备关系。虚拟IP地址Ping开关:提供了控制Ping通虚拟IP地址的开关命令。VRRP的安全功能:对于安全程度不同的网络环境,可以在报头上设定不同的认证方式和认证字。VRRP快速切换:VRRP通过监视BFD会话状态实现主备快速切换,主备切换时间毫秒级。
实验图1,安装haproxy# yum -y install haproxy
2,安装httpd# yum -y install httpd提供一个测试页# vim index.html
node2.xy.com
在另一个节点同样安装提供一个测试页# vim index.html
node1.xy.com
在55节点上安装nginx提供些图片# find../images./images/3.jpg./images/crystal./images/crystal/spreadsheet.png./images/crystal/audio.png./images/crystal/interactive.png./images/1.jpg./images/icon-pointer-flag.png./images/arrow-pointer-blue.png./images/3.gif./images/2.jpg

3,配置haproxy打开配置文件# vim /etc/haproxy/haproxy.cfg1,配置日志 让rsyslog帮忙记录日志    log         127.0.0.1 local2 编辑日志配置文件# vim /etc/rsyslog.conf$ModLoad imudp$UDPServerRun 514local2.*                                                -/var/log/haproxy.log2,defaults段参数   mode                  http   跟客户端建立连接的协议   log                     global   option                  httplog   option                  dontlognull   option http-server-close服务器端关闭   option forwardfor       except 127.0.0.0/8 用于后端记录客户端真实ip 日志格式:%{X-Forwarded-For}i   option                  redispatch保持会话是upstream server挂了,可以给客户端从新挑一个   retries               3 连接upsteran失败次数   timeout http-request    10s等客户端请求超时时长   timeout queue         1m客户端最大排队时长   timeout connect         10s 连接upsteram超时时长   timeout client          1m 客户端非活动超时时长   timeout server          1m   timeout http-keep-alive 10s   timeout check         10s         心跳检测超时时长   maxconn               3000   3,定义状态页和访问控制   listen stats   bind :8009   stats enable   stats uri /xy? haproxy   stats auth centos:redhat   acl statsadmin src 192.168.100.100   tcp-request content accept if statsadmin   tcp-request content reject

4,配置动静分离frontend webs       bind :80,:443   acl url_static       path_beg       -i /static /images /javascript /stylesheets   acl url_static       path_end       -i .jpg .gif .png .css .js
   use_backend static          if url_static   default_backend             appbackend app   balance   roundrobin   cookie SESSION_COOKIE insertnocache   server      node2 192.168.100.6:80 check cookie node2 maxcoon 3000   server      node1 192.168.100.8:80 check cookie node1 maxcoon 3000backend static   balance   roundrobin   servernode55 192.168.100.55:80 check maxconn 30000测试一下
cookie已经插入,来自这个浏览器的请求都会被调度到node2

图片已经成功获取到,并且肯定是来自192.168.100.55,因为其他都没有图片
当图片服务器下线后
当192.168.100.55下线后所有的图片都没了,说以不能只有一台静态服务器haproxy的警告#Message from syslogd@localhost at Apr 21 19:01:45 ...haproxy: backend static has no server available!
acl写法格式:aclacl名字 判断标准 判断条件判断标准有:1,path_beg 表示路径的开始2,path_end表示路径的结束3,path_reg表示对路径做正则匹配4,path表示匹配这个路径一样5,hdr_beg(host) 表示做主机名开头匹配 如:       acl static hdr_beg(host) -i img. download. video. mp3.6,url_beg7,src 源地址
use_backend static          if url_static表示调度到static这一组服务器,如果匹配url_static这个acldefault_backend             app表示没有匹配到的都调度到app这一组服务器
backend static   balance   roundrobin   servernode55 192.168.100.55:80 check maxconn 30000定义一组服务器名字为static,使用的调度算法为roundrobin用server定义一个服务器,node55是自己取的名字 监听地址端口,check表示haproxy对这台服务器做健康状态检测,maxconn 30000表示这台服务器的最大并发backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server
tcp-request content accept if statsadmin   tcp-request content reject   表示做访问控制 如果是statsadmin这个acl就允许,否则都拒接   检查是从上往下匹配
   acl login_page url_beg /login   redirect prefix https:\/\/www.xy.xom if login_page   表示做url重写,prefix表示加前缀,比如:   访问http://www.xy.com/login 就会跳转到       https://www.xy.com/login
配置keepalived,实现高可用安装keepalived# yum -y install keepalived备份一下配置文件主haproxy# cp keepalived.conf keepalived.conf.bak
# vim keepalived.conf! Configuration File for keepalived
global_defs {notification_email {    acassen@firewall.loc    failover@firewall.loc    sysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVEL}
vrrp_script haproxy { script "killall -0 haproxy"    检查haproxy健康状态 interval 1 每秒检查 weight -2 脚本执行失败时优先级减2
}vrrp_instance VI_1 {   state MASTER 主的   interface eth0   virtual_router_id 51       id:虚拟mac的最后一位   priority 100优先级   advert_int 1   authentication {       auth_type PASS 认证类型       auth_pass 1111 认证密钥   }   virtual_ipaddress {       192.168.100.16/24 虚拟流动ip   }   track_script { 调用健康检测脚本   haproxy}# notify_master "/etc/keepalived/notify.sh master"   当状态发生改变时执行的脚本# notify_backup "/etc/keepalived/notify.sh backup" 当状态发生改变时执行的脚本# notify_fault "/etc/keepalived/notify.sh fault" 当状态发生改变时执行的脚本}
备haproxy# vim keepalived.conf
! Configuration File for keepalived
global_defs {notification_email {    acassen@firewall.loc    failover@firewall.loc    sysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVEL}
vrrp_instance VI_1 {   state BACKUP   interface eth0   virtual_router_id 51   这个也要一样,mac地址   priority 99   这个要小1   advert_int 1   authentication {       auth_type PASS   这个要一样       auth_pass 1111   这个要一样   }   virtual_ipaddress {       192.168.100.16/24   这个肯定要一样   } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault"}~    通知脚本# vim notify.sh
#
vip=192.168.100.20contact='root@localhost'
notify() {   mailsubject="`hostname` to be $1: $vip floating"   mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"   echo $mailbody | mail -s "$mailsubject" $contact}
case "$1" in   master)       notify master       /etc/rc.d/init.d/haproxy start       exit 0   ;;   backup)       notify backup       /etc/rc.d/init.d/haproxy stop       exit 0   ;;   fault)       notify fault       /etc/rc.d/init.d/haproxy stop       exit 0   ;;   *)       echo 'Usage: `basename $0` {master|backup|fault}'       exit 1   ;;esac
测试在主的上停止haproxy# service haproxy stopStopping haproxy:                                          主的日志May1 06:45:09 node1 Keepalived_vrrp: VRRP_Script(haproxy) failedMay1 06:45:10 node1 Keepalived_vrrp: VRRP_Instance(VI_1) Received higher prio advertMay1 06:45:10 node1 Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATEMay1 06:45:10 node1 Keepalived_vrrp: VRRP_Instance(VI_1) removing protocol VIPs.May1 06:45:10 node1 Keepalived_healthcheckers: Netlink reflector reports IP 192.168.100.16 removed
从的日志May1 14:43:41 node2 Keepalived_vrrp: VRRP_Instance(VI_1) forcing a new MASTER electionMay1 14:43:42 node2 Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATEMay1 14:43:43 node2 Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATEMay1 14:43:43 node2 Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.May1 14:43:43 node2 Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.16May1 14:43:43 node2 Keepalived_healthcheckers: Netlink reflector reports IP 192.168.100.16 addedMay1 14:43:48 node2 Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.16查看服务是否启动# ss -anlp|grep haproxyLISTEN   0      128                     *:80                     *:*      users:(("haproxy",37270,4))LISTEN   0      128                     *:443                      *:*      users:(("haproxy",37270,5))LISTEN   0      128                     *:8009                     *:*      users:(("haproxy",37270,7))
当主的haproxy重新上线时# service haproxy startStarting haproxy:                                          
主的日志May1 06:46:56 node1 Keepalived_vrrp: VRRP_Script(haproxy) succeededMay1 06:46:58 node1 Keepalived_vrrp: VRRP_Instance(VI_1) forcing a new MASTER electionMay1 06:46:59 node1 Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATEMay1 06:47:00 node1 Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATEMay1 06:47:00 node1 Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.May1 06:47:00 node1 Keepalived_healthcheckers: Netlink reflector reports IP 192.168.100.16 addedMay1 06:47:00 node1 Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.16May1 06:47:05 node1 Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.16
从的日志May1 14:49:00 node2 Keepalived_vrrp: VRRP_Instance(VI_1) Received higher prio advertMay1 14:49:00 node2 Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATEMay1 14:49:00 node2 Keepalived_vrrp: VRRP_Instance(VI_1) removing protocol VIPs.May1 14:49:00 node2 Keepalived_healthcheckers: Netlink reflector reports IP 192.168.100.16 removed
页: [1]
查看完整版本: haproxy+keeaplived