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

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

编辑

  • 马哥Linux运维(原创)php

  • 徐凯强(文章整理)css

做者介绍

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

前言

软件负载均衡通常经过两种方式来实现:java

  • 基于操做系统的软负载实现node

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

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

HAProxy相比LVS的使用要简单不少,但跟LVS同样,HAProxy本身并不能实现高可用,一旦HAProxy节点故障,将会影响整个站点。linux

本文带来的是HAProxy基于KeepAlived实现Web高可用及动静分离。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地址,以继续提供服务。

高可用解决方案

实验拓扑
9813a18e8281a8d5e5097dd8f45e3e48.jpeg

#系统环境: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.conf                                        100%  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                  #最大链接
    user        haproxy               #运行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
    mode                    http                #工做模式
    log                     global              #记录日志
    option                  httplog             #详细记录http日志
    option                  dontlognull         #不记录健康检查的日志信息
    option http-server-close                    #启用服务器端主动关闭
    option forwardfor       except 127.0.0.0/8  #传递客户端IP
    retries                 3                   #请求重试次数
    timeout http-request    10s                 #http请求超时时间
    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  proxy *: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_dynamic      path_end       _i .php .jsp
    use_backend dynamic          if url_dynamic   #调用后端服务器并检查ACL规则是否被匹配
    default_backend             static
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static           #后端调度
    balance     source   #调度算法
    server      s1 172.16.10.125:80 inter 1500 rise 2 fall 3  check 
#----------------------------------------
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
    server      s2 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状况

b8a02886a5c8df7ecd52e103448b30aa.jpeg

bb4c9572bd7045e08d0f62d8b5387b34.jpeg

静态页面

42f330b6a6ace7b8f58a39b88de050e0.jpeg

动态页面

0a1781ec7ee0c6461ca894c6c2dfcdaa.jpeg

静态页面

c99f79f190c681c96a21e8953e9ad03f.jpeg

动态页面

1c01a70f51395a64cafaff8cf18f4b1d.jpeg

查看状态页面

a2d6205faf8ed04ad6470ddabe8901ee.jpeg

模拟一个节点故障

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

查看各节点IP信息

4b26331ad3f1305801c0510c97d797bc.jpeg

f24ef858523fa3fab3b990219ad782d8.jpeg

VIP转移了,继续访问测试

ab7e37d3401d1d384bab5452afdac6e3.jpeg

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

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

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

部署过程遇到问题可留言交流。也能够经过扫描以下二维码,以了解更多精彩文章。
c34426db1187d24e7617d16698a21462.jpeg

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

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

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

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

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

如何一块儿愉快地发展

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

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

相关文章
相关标签/搜索