基于HAProxy+Varnish实现动静分离、负载均衡的高可用集群

拓扑结构介绍

在实际的生产使用过程中,一个基本的能够应对日均百万PV的网络,一般会具有以下几种结构。

这其中每种结构担负了不同的角色。

  • 代理服务器,负责进行请求调度,实现了负载均衡。
  • KeepAlived配置代理服务器实现了高可用。
  • 缓存服务器,实现了资源的缓存,提高了请求的命中率,加快了访问速度。
  • 动静分离,减轻后端服务器压力,提高资源访问速度。
  • 数据库主从复制,读写分离,降低了数据库的压力
  • 运维监控系统,实时监控系统运行状态。
  • 自动化运维控制系统,批量管理大量服务器。
  • 版本控制系统,在应用的迭代过程中有着至关重要的作用。

实验结构介绍

下面,我们来模拟实现一个简单的网络集群结构。下面是这个结构的网络拓扑图。

实验环境介绍

序号 担任角色 主机名 地址 功能描述
A 互联网客户端 windows 172.18.2.22 充当互联网用户进行网络访问
B 代理服务器 haproxy VIP 172.18.3.77;DIP 192.168.22.77 对网络请求进行调度,实现均衡负载
C 缓存服务器 varnish 1 192.168.22.33 针对网络请求进行缓存,同时对后端服务器进行动静分离,并提供均衡负载
D 缓存服务器 varnish 2 192.168.22.44 针对网络请求进行缓存,同时对后端服务器进行动静分离,并提供均衡负载
E 静态web服务器 staticweb1 192.168.22.100 提供静态的网络服务,例如html,js,css之类
F 静态web服务器 staticweb2 192.168.22.101 提供静态的网络服务,例如html,js,css之类
G 动态web服务器 dynamicweb1 192.168.22.200 提供动态的网络服务,例如PHP,jsp等
H 动态web服务器 dynamicweb2 192.168.22.201 提供动态的网络服务,例如PHP,jsp等
I 数据库服务器 database 192.168.22.128 提供数据库服务,供应用程序进行读写操作

实验过程中,首先关闭SELinux和防火墙策略

一、配置HAproxy

在主机A上安装HAProxy,并对其进行配置。

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

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
    
# 指定对外提供网络服务的端口
frontend web 172.18.3.77:80    
    bind 172.18.3.77:9099
    stats enable    
    stats uri /hastats
    stats hide-version
    stats refresh 2s

    use_backend varnish_srvs
    
# 指定后端的Varnish缓存服务器
# 使用的端口是varnish的默认端口,这一点需要在varnish服务器中进行配置
backend varnish_srvs 
    balance	uri
    hash-type	consistent
    server  varnish1 192.168.22.33:6081 weight 1 check
    server  varnish2 192.168.22.44:6081 weight 1 check

将HAProxy配置好以后,重启一下服务。然后在浏览器中输入 http://172.18.3.77:9099/hastats,就可以查看到HAProxy的调度管理界面。 
此时,如果Varnish服务器已经配置成功了的话,就会显示出如下界面。

二、配置Varnish缓存服务器

此时,在配置好HAProxy服务器之后,就可以对varnish缓存服务器进行配置了。主要修改的文件为下面两个。Varnish1 与Varnish2的配置文件一致,将IP修改为自己对应的IP就可以了。

  • /etc/varnish/default.vcl,varnish 的默认配置文件
  • /etc/varnish/varnish.params,varnish 的一些默认参数。

其中/etc/varnish/default.vcl的配置内容,如下。

# new 4.0 format.
vcl 4.0;

#引入负载均衡模块  
import directors;

#静态检测
probe static_probe{ 
    #指定检测URL
    .url="/";
    #探测超时时长
    .timeout=2s;
    #探测次数
    .window=5;
    #探测次数成功多少次才算健康
    .threshold=2;
    #Varnish启动探测后端主机2次健康后加入主机
    .initial=2;
    #探测间隔时长
    .interval=2s;
    #期望状态响应码
    .expected_response=200;
 }
 
 
 #动态监测
 probe dynamic_probe {
   .url="/index.php";
   .timeout=2s;
   .window=5;
   .threshold=2;
   .initial=2;
   .interval=2s;
   .expected_response=200;
 }
   
   #指定后端服务器,并对后端服务器进行动态监测
 backend staticweb1 {
    .host = "192.168.22.100";
    .port = "80";
    .probe = static_probe;
}

backend staticweb2 {
    .host = "192.168.22.101";
    .port = "80";
    .probe = static_probe;
}

backend dynamicweb1 {
    .host = "192.168.22.200";
    .port = "80";
    .probe =dynamic_probe;
}

backend dynamicweb2 {
    .host = "192.168.22.201";
    .port = "80";
    .probe =dynamic_probe;
}

# 定义负载均衡的调度算法
sub vcl_init {
    new staticcluster=directors.round_robin();

    staticcluster.add_backend(staticweb1);

    staticcluster.add_backend(staticweb2);

    new dynamiccluster=directors.round_robin();

    dynamiccluster.add_backend(dynamicweb1);

    dynamiccluster.add_backend(dynamicweb2);
}

#定义清理缓存的规则
acl purgers {
    "127.0.0.0"/8;
     "192.168.0.0"/16;
}

# 启用缓存清理
sub vcl_purge{
    return(synth(200,"Purged"));
}

# 定义pipe函数
sub vcl_pipe{
    return(pipe);
}

# 定义miss函数
sub vcl_miss{
    return(fetch);
}
# 定义hash函数
sub vcl_hash{
    hash_data(req.url);
    if(req.http.host){
        hash_data(req.http.host);
    }else{
        hash_data(server.ip);
    }

    if(req.http.Accept-Encoding~"gzip"){

        hash_data("gzip");

    }elseif(req.http.Accept-Encoding~"deflate"){
        hash_data("deflate");
    }
}

# 对接收到的请求进行配置处理
sub vcl_recv {
    # 不符合请求的清理操作被拒绝掉
    if (req.method == "PURGE") {
           if (!client.ip ~ purgers) {
                return(synth(405,"Purging not allowed for " + client.ip));
           }
        return(purge);
     }
    
    #让后端服务器能够看到真实的请求地址
    if (req.restarts == 0) {
        if (req.http.X-Fowarded-For) {
            set req.http.X-Forwarded-For = req.http.X-Forwarded-For + "," + client.ip;
        } else {
            set req.http.X-Forwarded-For = client.ip;
        }
     }   
    
    # 设置动静分离
    set req.http.X-Forward-For=client.ip;

    if(req.url~"(?i)\.(php|asp|aspx|jsp|do|cshtml)($|\?)"){
        set  req.backend_hint = dynamiccluster.backend();
    }
    # 只缓存下列方法中指定的方法
    if (req.method != "GET" &&
       req.method != "HEAD" &&
       req.method != "PUT" &&
       req.method != "POST" &&
       req.method != "TRACE" &&
       req.method != "OPTIONS" &&
       req.method != "DELETE") {
           return (pipe);
    }
    
    #如果请求不是GET或者HEAD,不缓存
    if (req.method != "GET" && req.method != "HEAD") {
         return (pass);
    }
    #如果请求包含Authorization授权或Cookie认证,不缓存
    if (req.http.Authorization || req.http.Cookie) {
        return (pass);
    }

    if(req.http.Accept-Encoding){
            if(req.url~"\.(bmp|png|gif|jpg|jpeg|ico|gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)$"){
                unset   req.http.Accept-Encoding;
            }elseif(req.http.Accept-Encoding~"gzip"){
               set  req.http.Accept-Encoding="gzip";
            }elseif(req.http.Accept-Encoding~"deflate"){
                set req.http.Accept-Encoding="deflate";
            }else{
                unset   req.http.Accept-Encoding;
            }
     }

     return (hash);
}

# 对响应的请求进行处理
sub vcl_backend_response {
    # 这里我们不做配置
}

# 记录缓存的命中状态
sub vcl_deliver {
    if(obj.hits>0){
        set resp.http.X-Cache="HITfrom"+req.http.host;
        set resp.http.X-Cache-Hits=obj.hits;
    }else{
        set resp.http.X-Cache="MISSfrom"+req.http.host;
    }
    unset   resp.http.X-Powered-By;
    unset   resp.http.Server;
    unset   resp.http.Via;
    unset   resp.http.X-Varnish;
    unset   resp.http.Age;
}

对varnish的参数文件进行修改。这样便于让代理服务器知道应该将请求调度给谁。

# 6081 是varnish的默认监听端口 ,在HAProxy中需要对这个端口进行监听。
VARNISH_LISTEN_ADDRESS=192.168.22.33
VARNISH_LISTEN_PORT=6081

在上面的配置完成之后,在varnishadm控制台界面调用backend.list命令就能够查看,后端服务器的健康状态了。

backend.list
200        
Backend name                   Refs   Admin      Probe
staticweb1(192.168.22.100,,80) 1      probe       Sick 0/5
staticweb2(192.168.22.101,,80) 1      probe       Sick 0/5
dynamicweb1(192.168.22.200,,80) 1      probe      Sick 0/5
dynamicweb2(192.168.22.201,,80) 1      probe      Sick 0/5

因为我们的后端服务器还没有进行配置,所以四个服务器都是处于宕机状态。

三、在静态服务器上安装HTTPD,并添加一些静态资源

使用yum来安装Httpd软件包就可以。安装之后,启动服务,确保80端口已经打开。此时再在Varnish服务器上调用backend.list命令就可以查看到已经又两个服务器处于Healthy状态了。

backend.list
200        
Backend name                   Refs   Admin      Probe
staticweb1(192.168.22.100,,80) 1      probe      Healthy 5/5
staticweb2(192.168.22.101,,80) 1      probe      Healthy 4/5
dynamicweb1(192.168.22.200,,80) 1      probe      Sick 0/5
dynamicweb2(192.168.22.201,,80) 1      probe      Sick 0/5

四、安装数据库

在数据库服务器上,安装数据库服务,同时建立给WordPress应用程序使用的数据库表和用户。

create database wpdb;
grant all on wpdb.* to ‘wpuser‘@‘192.168.22.%‘ identified by "123456";

五、在动态服务器上安装HTTPD,php等相关内容

安装 httpd php php-mysql

# CentOS 6:
yum install httpd  php php-mysql
service httpd start

# CentOS 7:
yum install httpd  php  php-mysql
systemctl start httpd.service

安装wordpress,将wordpress 解压到http默认路径下,并修改WordPress的数据库配置文件。

修改目录权限

setfacl -R -m u:apache:rwx wordpress

创建varnish健康性检查页面

backend.list
200        
Backend name                   Refs   Admin      Probe
staticweb1(192.168.22.100,,80) 1      probe      Healthy 5/5
staticweb2(192.168.22.101,,80) 1      probe      Healthy 5/5
dynamicweb1(192.168.22.200,,80) 1      probe      Healthy 5/5
dynamicweb2(192.168.22.201,,80) 1      probe      Healthy 5/5

在浏览器地址栏输入 http://172.18.3.77/wordpress/index.php,此时站点访问成功。

总结

1、架构优点

  • HAProxy为缓存服务器提供了负载均衡,使用了uri调度算法,保证了同样路径的请求能够被调度到同样的主机上,提高了缓存的命中率。
  • HAProxy提供了web管理界面,能够更直观的进行调度管理和管控
  • Varnish的缓存机制,以及动静分离等技术,提高了web服务器的负载能力,从而使系统能够应对高并发量的请求
  • 数据库的主从复制,也是企业实际生产应用中使用较多的生产策略,这样能够实现网络请求的频繁读写,对降低了数据库服务器的压力。

2、尚且不足

  • 用户上传的静态资源如何存储到静态服务器中,文件的分布式存储与数据同步是这个结构需要解决的一个重要问题
  • HAproxy做负载均衡,没有冗余能力,容易出现单点故障,最好配合KeepAlived实现高可用。
  • 如果用户在访问过程中,建立了Session会话,会话行为应该如何保持
时间: 2024-10-06 02:27:47

基于HAProxy+Varnish实现动静分离、负载均衡的高可用集群的相关文章

Nginx负载均衡+Keepalived高可用集群

一.搭建环境及软件版本 负载均衡:Nginx 高可用:Keepalived Linux:Centos 6.5 Nginx:nginx-1.6.2 Keepalived:keepalived-1.2.13 LB-00:Nginx+Keepalived 192.168.174.40 LB-01:Nginx+Keepalived 192.168.174.41 Web1:LNMP 192.168.174.20 Web2:LAMP 192.168.174.30 二.负载均衡搭建 ①解压编译安装Nginx

搭建haproxy负载均衡keepalived高可用集群

自己的服务器到期,转移自己博客内容至此. haproxy官网:www.haproxy.orgkeepalived官网:www.keepalived.org 本站下载:haproxy-1.8.3.tar.gz本站下载:keepalived-1.4.0.tar.gz本站下载:keepalived启动服务文件 环境:web01: 10.8.8.51   centos7web02: 10.8.8.52   centos7haproxy_master:10.8.8.53   centos7    vip:

CentOS7Linux中服务器LVS负载均衡、高可用集群搭建(NAT、DR)

目录 集群 声明 集群概念 集群特性 Web服务器并发相应瓶颈 集群的分类 LB实现方法: LVS集群 负载调度器 服务器池 共享存储 LVS负载均衡的三种模式 负载均衡 集群 声明 文档不断更新中... 集群概念 一组相互独立又相互依赖的,通过网络连接的由计算机组,以单一的模式进行管理,为对方提供服务,对于用户来说,用户会认为对方是一个服务. DIP:用来和后端服务器进行数据交互的IP CIP:客户端的IP VIP:是域名解析的IP,是集群对外的公网IP RIP:真实服务器的IP 节点:一组计

Linux高可用集群方案之配置heartbeat v2基于crm+hb_gui接口,配置http+msyql+nfs高可用集群

  基于crm+hb_gui接口配置http+mysql+nfs高可用集群    基于crm+hb_gui接口配置ipvs高可用集群    基于crm+hb_gui+ldirectored接口配置ipvs高可用集群 

基于云端虚拟机的LVS/DR+Keepalived+nginx的高可用集群架构配置

最近,公司要我部署一个集群架构,选来选取还是选择了大家都很熟悉的基于DR的LVS+Keepalived做负载分发,然后使用轻量级的nginx做中间代理层,这里呢先暂时实现一个简单web应用功能,对于代理功能和后续的web层部署.数据层安排将择机更新! 首先看一下集群框架:   下面开始我们的集群搭建行程: 一.IP规划: 做一件事情需要想想怎么去做既简单又有条理,我们做项目也应该如此.所以这里一定先做一个简单的规划,对于你后续测试的时候出现不能分发的情况有所解决. 负载均衡层          

Keepalived负载均衡与高可用

1.keepalived服务介绍Keepalived的项目实现的主要目标是简化LVS项目的配置并增强其稳定性,即Keepalived是对LVS项目的扩展增强.Keepalived为Linux系统和基于Linux 的架构提供了负载均衡和高可用能力,其负载均衡功能主要源自集成在Linux内核中的LVS项目模块IPVS( IP Virtual Server ),基于IPVS提供的4 层TCP/IP协议负载均衡, Keepalived也具备负载均衡的功能,此外, Keepalived还实现了基于多层TC

基于HAproxy的web动静分离及输出状态检测页面

一.简介 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代 理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理.HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接.并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上. HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数.多进程或多线程模型受

用haproxy结合keepalived实现基于LNMP的负载均衡和高可用

今天我们讲haproxy结合keepalived实现LNMP的负载均衡和高可用,现在的公司大部分都基于haproxy实现负载均衡.下面以一个事例去给大家详细讲解如何去实现: 一.用haproxy结合keepalived实现基于lnmp的负载均衡和高可用服务,要求: (1)实现动静分离,图片和css,js都分离到专门的静态服务器上 (2)只允许172.17网段用户访问 (3)对于动态请求,要求实现基于cookie的会话保持 整体架构如下: 1.实验前需要关闭防火墙和selinux,以及同步时间.

Nginx提供代理服务(网站代理),nginx实现负载均衡集群和高可用集群、nginx实现网站动静页面分离

静态页面:用静态编程语言编写的页面为静态页面,支持静态页面的语言为,css html  xml,不手动改变源代码,页面就不会改变. 动态页面:用动态编程语言编写的页面为动态页面,支持动态页面的语言有,java php .net,根据用户访问的时间和用户的不同显示不同的页面. nginx网站服务代理 实验(一)实验目的:nginx实现反向代理代替公网用户访问私网的web页面. 实验环境: 内网web服务器: IP地址 :192.168.1.1  主机名:fanlj nginx代理服务器:IP地址: