• varnish集群


    #在前篇varnish安装与配置中,配置了一个后端服务器。

    ######################################
    backend default {
    .host = “192.168.0.12″;
    .port = “8080″;
    }

    #现在添加一个新的backend服务器

    backend test {
    .host = “192.168.0.12″;
    .port = “8000″;
    }

    #要定义特殊的url被发送到哪里

    sub vcl_recv {
    if (req.url ~ “^/abcd/”) {
    set req.backend = test;
    } else {
    set req.backend = default;
    }
    }
    #########################################

    Directors

    可以把多台 backends 聚合成一个组,这些组被叫做 directors。这样可以增强性能和弹力。您可以定义多个backends和多个group在同一个directors。

    ###################################
    backend server1 {
    .host = “192.168.0.12″ ;
    .port = “8080″ ;
    }

    backend server2 {
    .host = “127.0.0.1″ ;
    .port = “8080″ ;
    }

    director myvarnish round-robin {
    { .backend = server1; }
    { .backend = server2; }
    }

    #但要记得在vcl_recv中设置bachend = myvarnish。

    sub vcl_recv
    {
    if (req.http.host !~ “www\.myvarnish\.com$”)
    { error 404 “Unknown HostName!”; }
    set req.backend = myvarnish;
    }
    ##########################################

    Health checks
    在之前的两个后端服务器上加上健康检查。

    ########################################
    backend server1 {
    .host = “192.168.0.12″ ;
    .port = “8000″ ;
    .probe = {
    .url = “/”;           #哪个 url需要varnish请求。
    .interval = 5s;     #检查的间隔时间。
    .timeout = 1 s;   #等待多长时间探针超时。
    .window = 5;      #维持5个sliding window的结果。
    .threshold = 3;   #至少有三次window是成功的,就宣告bachend健康。
    }
    }

    backend server2 {
    .host = “127.0.0.1″ ;
    .port = “8080″ ;
    .probe = {
    .url = “/”;
    .interval = 5s;
    .timeout = 1 s;
    .window = 5;
    .threshold = 3;
    }
    }
    ############################################
    以上红色部分为Health checks配置。如果一个backend down掉了,varnish将不会发送流量给这个后端。

    grace mode

    如果后端需要很长时间来生成一个对象,这里有一个线程堆积的风险。为了避免这 种情况,你可以使用 Grace。他可以让 varnish 提供一个存在的版本,然后从后端生成新 的目标版本。
    当同时有多个请求过来的时候,varnish只发送一个请求到后端服务器,在“set beresp.grace = 30m; ”时间内复制旧的请求结果给客户端。

    vcl_fetch

    如果您的服务每秒有数千万的点击率,那么这个队列是庞大的,没有用户喜欢等待服务器响应。为了使用过期的 cache 给用户提供服务,我们需要增加他们的 TTL,保存所有cache 中的内容在 TTL过期以后30 分钟内不删除,使用以下VCL:

    sub vcl_fetch {
    set beresp.grace = 30m;
    }

    vcl_recv

    Varnish 还不会使用过期的目标给用户提供服务,所以我们需要配置以下代码,在cache过期后的15 秒内,使用旧的内容提供服务:

    sub vcl_recv {
    set req.grace = 15s;
    }
    为什么要多保存过去的内容 30 分钟?当然,如果你使用了健康检查,你可以通过健康状态设置保存的时间:

    if (! req.backend.healthy) {
    set req.grace = 5m;
    } else {
    set req.grace = 15s;
    }

  • 相关阅读:
    KMP算法代码实现记录
    冒泡,插入,希尔,快速,归并,桶排序,堆排序算法汇总实现
    回溯法个人理解记录(C#八皇后)
    C#创建初始化链表的方式(个人目前写出3种创建的方式)
    算法汇总代表性学习记录
    C#集合去重
    C#获取数组/字符串的k个字符的全部组合
    pl/sql简单执行记录个人学习记录
    oracle为什么尽量不要使用外键的最好理解
    PickerController 添加照片---iOS
  • 原文地址:https://www.cnblogs.com/derekchen/p/2692432.html
Copyright © 2020-2023  润新知