HAProxy基于KeepAlived实现Web高可用及动静分离

欢迎关注“高效运维”,以免费参加「运维讲坛」每月一次的线下交流活动;并抢先赏阅干货满满的各种原创文章(详见文末)。

编辑

马哥Linux运维(原创)

徐凯强(文章整理)

作者介绍

马哥Linux运维马哥linux运维专注于linux运维培训近八年,基础课程之外,还涉及hadoop、openstack、python、docker、ELK等众多领域,直接或间接受益学员已逾百万人次。

前言

软件负载均衡一般通过两种方式来实现:

基于操作系统的软负载实现

基于第三方应用的软负载实现

LVS是基于Linux操作系统实现的一种软负载,而HAProxy则是基于第三方应用实现的软负载。

HAProxy相比LVS的使用要简单很多,但跟LVS一样,HAProxy自己并不能实现高可用,一旦HAProxy节点故障,将会影响整个站点。

本文带来的是HAProxy基于KeepAlived实现Web高可用及动静分离。

相关介绍

HAProxy

HAProxy是一款提供高可用性、负载均衡以及基于TCP和HTTP应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。

HAProxy适用于那些负载较大的web站点,这些站点通常又需要会话保持或七层处理。

HAProxy可以支持数以万计的并发连接,并且HAProxy的运行模式使得它可以很简单安全的整合进架构中,同时可以保护web服务器不被暴露到网络上。

KeepAlived

Keepalived采用VRRP(virtual router redundancy protocol,虚拟路由冗余协议)热备份协议,以软件的方式实现linux服务器的多机热备功能。

VRRP是针对路由器的一种备份解决方案——由多台路由器组成一个热备组。

通过共用的虚拟IP地址对外提供服务;每个热备组内同一时刻只有一台主服务器提供服务,其他服务器处于冗余状态,若当前在线的服务器失败,其他服务器会自动接替(优先级决定接替顺序)虚拟IP地址,以继续提供服务。

高可用解决方案

实验拓扑

#系统环境:CentOS6.6 #Static Server:httpd #Dynamic Servicer:LAMP

配置过程

HA集群配置前提

时间同步

基于主机名互相通信

SSH互信

时间同步,可用ntpdate向时间服务器同步

[root@node1 ~]# ntpdate cn.pool.ntp.org

基于主机名互相通信

[root@node1 ~]# vim /etc/hosts 172.16.10.123 node1.scholar.com node1 172.16.10.124 node2.scholar.com node2 [root@node1 ~]# vim /etc/sysconfig/network HOSTNAME=node1.scholar.com [root@node1 ~]# uname -n node1.scholar.com #两个节点都需如上操作

SSH互信

[root@node1 ~]# ssh-keygen -t rsa -P [root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2 [root@node2 ~]# ssh-keygen -t rsa -P [root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1 [root@node1 ~]# date; ssh node2 date #测试 Wed Jun 24 15:58:46 CST 2015 Wed Jun 24 15:58:46 CST 2015

安装所需程序

[root@node1 ~]# yum install keepalived haproxy -y #两个节点都安装

配置KeepAlived

[root@node1 ~]# vim /etc/keepalived/keepalived.conf vrrp_instance VI_1 {#定义VRRP实例,实例名自定义 state MASTER#指定Keepalived的角色,MASTER为主服务器,BACKUP为备用服务器 interface eth0#指定HA监测的接口 virtual_router_id 51#虚拟路由标识(1-255),在一个VRRP实例中主备服务器ID必须一样 priority 100#优先级,数字越大越优先,主服务器优先级必须高于备服务器 advert_int 1#设置主备之间同步检查时间间隔,单位秒 authentication {#设置验证类型和密码 auth_type PASS#验证类型 auth_pass ab007 #设置验证密码,同一实例中主备密码要保持一致 } virtual_ipaddress { #定义虚拟IP地址 192.168.12.21 } } vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 61 priority 99 advert_int 1 authentication { auth_type PASS auth_pass sr200 } virtual_ipaddress { 192.168.12.22 } }

将配置文件同步给另一个节点

[root@node1 ~]# scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/ keepalived.conf100%787 0.8KB/s 00:00

修改另一个节点配置文件

[root@node2 ~]# vim /etc/keepalived/keepalived.conf vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass ab007 } virtual_ipaddress { 192.168.12.21 } } vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 61 priority 100 advert_int 1 authentication { auth_type PASS auth_pass sr200 } virtual_ipaddress { 192.168.12.22 } }

配置HAProxy

[root@node1 ~]# vim /etc/haproxy/haproxy.cfg global # to have these messages end up in /var/log/haproxy.log you will # need to: #by adding the -r option to the SYSLOGD_OPTIONS in #/etc/sysconfig/syslog # # 2) configure local2 events to go to the /var/log/haproxy.log # file. A line like the following can be added to # /etc/sysconfig/syslog # #local2.* /var/log/haproxy.log log 127.0.0.1 local2#日志将通过rsyslog进行归档记录 chroot/var/lib/haproxy#运行的安装路径 pidfile /var/run/haproxy.pid#pid文件存放的位置 maxconn 4000#最大连接 userhaproxy #运行haproxy的用户 group haproxy #运行haprixy的组 daemon#以后台模式运行haproxy # 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 modehttp#工作模式 log global#记录日志 optionhttplog #详细记录http日志 optiondontlognull #不记录健康检查的日志信息 option http-server-close#启用服务器端主动关闭 option forwardfor except 127.0.0.0/8#传递客户端IP retries 3 #请求重试次数 timeout http-request10s #http请求超时时间 timeout queue 1m#一个请求在队列里的超时时间 timeout connect 10s #连接服务器超时时间 timeout client1m#客户端超时时间 timeout server1m#客户端超时时间 timeout http-keep-alive 10s #持久连接超时时间 timeout check 10s #心跳检测超时时间 maxconn 3000#最大连接数 #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontendproxy *:80 #定义ACL acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js acl url_dynamicpath_end _i .php .jsp use_backend dynamicif url_dynamic #调用后端服务器并检查ACL规则是否被匹配 default_backend static #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- backend static #后端调度 balance source #调度算法 servers1 172.16.10.125:80 inter 1500 rise 2 fall 3check #---------------------------------------- listen statistics mode http #http 7 层模式 bind *:8080 #监听地址 stats enable#启用状态监控 stats auth admin:admin#验证的用户与密码 stats uri /admin?status #访问路径 stats hide-version#隐藏状态页面版本号 stats admin if TRUE #如果验证通过了就允许登录 stats refresh 3s#每3秒刷新一次 acl allow src 192.168.12.0/24 #允许的访问的IP地址 tcp-request content accept if allow #允许的地址段就允许访问 tcp-request content reject#拒绝非法连接 #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend dynamic balance source servers2 172.16.10.12:80 check inter 1500 rise 2 fall 3 #check inter 1500是检测心跳频率 #rise2 2次正确认为服务器可用 #fall3 3次失败认为服务器不可用

将配置文件同步至另一节点

[root@node1 ~]# scp /etc/haproxy/haproxy.cfg node2:/etc/haproxy/ haproxy.cfg 100% 4471 4.4KB/s 00:00

WEB端配置

准备测试页面

#static server [root@scholar ~]# vim /var/www/html/index.html <h1>172.16.10.125</h1> [root@scholar ~]# service httpd start Starting httpd:[OK] #dynamic server [root@scholar ~]# vim /var/www/html/index.php <h1>172.16.10.20</h> <?php $link = mysql_connect(127.0.0.1,root,); if ($link) echo "Success..."; else echo "Failure..."; mysql_close(); phpinfo(); ?> [root@scholar ~]# service httpd start Starting httpd:[OK] [root@scholar ~]# service mysqld start Starting mysqld: [OK]

启动服务

[root@node1 ~]# service haproxy start; ssh node2 service haproxy start Starting haproxy:[OK] Starting haproxy: [OK] [root@node1 ~]# service keepalived start; ssh node2 service keepalived start Starting keepalived: [OK] Starting keepalived: [OK]

动静分离及高可用测试

查看各节点IP情况

静态页面

动态页面

静态页面

动态页面

查看状态页面

模拟一个节点故障

[root@node1 ~]# service haproxy stop Stopping haproxy:[OK] [root@node1 ~]# service keepalived stop Stopping keepalived: [OK]

查看各节点IP信息

VIP转移了,继续访问测试

访问不受任何影响,至此高可用及动静分离目的实现。

HAProxy基于KeepAlived实现Web高可用及动静分离实验就先说到这里了。

本次实验因资源有限只提供了两台web服务器,如有多台可设置轮询实现负载均衡,这里就不做多介绍了。

部署过程遇到问题可留言交流。也可以通过扫描如下二维码,以了解更多精彩文章。

好消息:欢迎加入开放运维联盟

开放运维联盟(OOPSA)成立于2015年10月31日,是运维行业第一个全国性、非盈利的正式组织,由资深运维从业人员联合发起,指导单位为工信部电信研究院数据中心联盟(DCA)。

开放运维联盟旨在融合运维行业最佳实践、推动行业进步,减少公司运维重复投入,建设运维人员共有的家园,让运维不再“苦逼”。

目前会员注册开放中(个人会员免费)。热衷欢迎作为运维同仁的您(无论从业年限),加入我们,共谋发展。OPPSA,已有全国各地大量运维同仁汇聚。关于更多介绍及会员报名办法,详见如下链接:

开放运维联盟(OOPSA),诚邀您的加入

如何一起愉快地发展

“高效运维”(如下二维码)值得您的关注,作为高效运维系列群的唯一官方,每周发表多篇干货满满的原创好文:来自于系列群的讨论精华、运维讲坛线上精彩分享及群友原创。“高效运维”也是互联网专栏《高效运维最佳实践》及运维2.0官方。提示:目前高效运维新群已经建立,欢迎加入。您可添加萧田国个人号 xiaotianguo8 为好友,进行申请,请备注“申请入群”。

重要提示:除非事先获得授权,请在本发布2天后,才能转载本文。尊重知识,请必须全文转载,并包括本行。