美文网首页
varnish设定多个后端主机和健康监测

varnish设定多个后端主机和健康监测

作者: 任总 | 来源:发表于2018-08-04 00:29 被阅读108次

    一、varnish设定多个后端主机示例

    [root@varnish50 ~]# vim /etc/varnish/default.vcl 
    .....
    # new 4.0 format.
    
    vcl 4.0;
    import directors;#调用模块
    
    .......
    # Default backend definition. Set this to point to your content server.
    backend websrv1 {
        .host = "192.168.1.11";
        .port = "80";
    }
    backend websrv2 {
        .host = "192.168.1.12";
        .port = "80";
    }
    sub vcl_init {   #定义后端服务器组
           new websrvs = directors.round_robin();
           websrvs.add_backend(websrv1);
           websrvs.add_backend(websrv2);
    }
    sub vcl_recv {
        set req.backend_hint = websrvs.backend();#使用服务器组
    
    vcl.load test9 default.vcl
    200        
    VCL compiled.
     vcl.use test9
    200        
    VCL 'test9' now active
    [root@vs ~]# curl -X BAN  http://192.168.1.50/index.html#清理缓存
    
    [root@vs ~]# curl http://192.168.1.50/index.html
    <h1>Backend Server1</h1>#后端服务器1
    [root@vs ~]# curl -X BAN  http://192.168.1.50/index.html#清理缓存
    
    [root@vs ~]# curl http://192.168.1.50/index.html
    <h1>Backend Server2</h1>#后端服务器2
    

    二、不同内容指向不同主机示例:

    [root@varnish50 ~]# vim /etc/varnish/default.vcl 
    ......
        backend imgsrv1 {
            .host = "192.168.10.11";
            .port = "80";
        }
        
        backend imgsrv2 {
            .host = "192.168.10.12";
            .port = "80";
        }   
        
        backend appsrv1 {
            .host = "192.168.10.21";
            .port = "80";
        }
        
        backend appsrv2 {
            .host = "192.168.10.22";
            .port = "80";
        }
        
        sub vcl_init {
            new imgsrvs = directors.random();#图片组
            imgsrvs.add_backend(imgsrv1,10);
            imgsrvs.add_backend(imgsrv2,20);
            
            new staticsrvs = directors.round_robin();#静态资源组
            appsrvs.add_backend(appsrv1);
            appsrvs.add_backend(appsrv2);
            
            new appsrvs = directors.hash();
            appsrvs.add_backend(appsrv1,1);
            appsrvs.add_backend(appsrv2,1);     
        }
        
        sub vcl_recv {
            if (req.url ~ "(?i)\.(css|js)$" {
                set req.backend_hint = staticsrvs.backend();
            }       
            if (req.url ~ "(?i)\.(jpg|jpeg|png|gif)$" {
                set req.backend_hint = imgsrvs.backend();
            } else {        
                set req.backend_hint = appsrvs.backend(req.http.cookie);#其他内容cooki
            }
        }
    

    三、基于cookie的session sticky:

    [root@varnish50 ~]# vim /etc/varnish/default.vcl 
    ......
                    sub vcl_init {
                        new h = directors.hash();
                        h.add_backend(one, 1);   // backend 'one' with weight '1'
                        h.add_backend(two, 1);   // backend 'two' with weight '1'
                    }
    
                    sub vcl_recv {
                        // pick a backend based on the cookie header of the client
                        set req.backend_hint = h.backend(req.http.cookie);
                    }               
    

    四、后端主机的健康监测:

    .probe:定义健康状态检测方法;
    .url:检测时要请求的URL,默认为”/";
    .request:发出的具体请求;
    .request =
    "GET /.healthtest.html HTTP/1.1"
    "Host: www.magedu.com"
    "Connection: close"
    .window:基于最近的多少次检查来判断其健康状态;
    .threshold:最近.window中定义的这么次检查中至有.threshhold定义的次数是成功的;
    .interval:检测频度;
    .timeout:超时时长;
    .expected_response:期望的响应码,默认为200;

    健康状态检测的配置方式:

    格式:
    (1) probe PB_NAME { }
    backend NAME = {
    .probe = PB_NAME;
    ...
    }
    (2) backend NAME {
    .probe = {
    ...
    }
    }
    probe www_probe {
    .url = "/index.html";
    .timeout = 1s;
    .interval = 1s;
    .window = 8;
    .threshold = 5;
    }

    [root@varnish50 ~]# vim /etc/varnish/default.vcl 
    # Default backend definition. Set this to point to your content server.
    backend websrv1 {
        .host = "192.168.1.11";
        .port = "80";
        .probe ={  #方法一:设置监测项目
                .url = "/index.html";
                .timeout = 1s;
                .interval = 1s;
                .window = 8;
                .threshold = 5;
    
    }
    }
    backend websrv2 {
        .host = "192.168.1.12";
        .port = "80";
        .probe =www_probe;#方法二:调用www_probe
    }
    
    [root@varnish50 ~]# varnishadm  -S /etc/varnish/secret -T 127.0.0.1:6082 
    200        
    -----------------------------
    Varnish Cache CLI 1.0
    -----------------------------
    Linux,3.10.0-693.el7.x86_64,x86_64,-sfile,-smalloc,-hcritbit
    varnish-4.0.5 revision 07eff4c29
    
    Type 'help' for command list.
    Type 'quit' to close CLI session.
    
    vcl.load test10 default.vcl#编译
    200        
    VCL compiled.
    vcl.use test10#使用
    200        
    VCL 'test10' now active#活动状态
    backend.list   #查询后端主机状态
    200        
    Backend name                   Refs   Admin      Probe
    default(192.168.1.12,,80)      8      probe      Healthy (no probe)
    websrv1(192.168.1.11,,80)      2      probe      Healthy 8/8#后端1服务器8次监测都成功
    websrv2(192.168.1.12,,80)      2      probe      Healthy 8/8#后端2服务器8次监测都成功
    backend.set_health websrv2 Sick#自定义后端主机健康状态为sick或Healthy
    200        
    
    backend.list#查询后端主机状态
    200        
    Backend name                   Refs   Admin      Probe#后端名称、引用次数、检测状态、检测次数
    default(192.168.1.12,,80)      8      probe      Healthy (no probe)
    websrv1(192.168.1.11,,80)      2      probe      Healthy 8/8
    websrv2(192.168.1.12,,80)      2      sick       Healthy 8/8#后端2服务器健康状态为sick
    

    五varnish 性能调整参数

    1、varnish的运行时参数:

    • 线程模型:
      cache-worker:处理请求
      cache-main:启动
      ban lurker:清理缓存
      acceptor:接受用户请求
      epoll/kqueue:单进程响应n个用户请求
      expire:把过期缓存清空
      backend poll:对后端主机做健康监测

    • 线程相关的参数:
      在线程池内部,其每一个请求由一个线程来处理; 其worker线程的最大数决定了varnish的并发响应能力;

    • thread_pools: 最好小于或等于CPU核心数量;

    • thread_pool_max: 每线程池的最大线程数,默认最大5000个;

    • thread_pool_min:额外意义为“最大空闲线程数”;

    最大并发连接数 =thread_pools 乘以 thread_pool_max
    • thread_pool_timeout:延迟时间,默认300,优化3000秒
    • thread_pool_add_delay:新创建线程延迟时间
    • thread_pool_destroy_delay:销毁线程延迟时间
    • thread_pool_queue_limit:每个线程池后援队列,等待长度
    • thread_pool_fail_delay:创建线程失败后,多长时间再次重试创建

    2、Timer计时器相关的参数:

    服务器端侧:

    connect_timeout:连接后端主机超时时间

    客户端侧:
    • send_timeout:发送响应报文到客户端响应超时时长,默认600秒
    • timeout_idle:客户端保持连接超时时间
    • timeout_req:等待客户端发送请求报文首部超时时间,默认2秒
    • cli_timeout:线程响应超时时间

    设置方式:
    vcl.param
    param.set

    永久有效的方法:
    varnish.params
    DEAMON_OPTS="-p PARAM1=VALUE -p PARAM2=VALUE"

    六、varnish日志区域:

    shared memory log
    计数器
    日志信息

    1、varnishstat - Varnish Cache statistics#查询缓存计数器

    -1:一次性显示所有信息,其中MAIN段重要,查看并计算命中率
    -1 -f FILED_NAME:查看指定的字段对应的值
    -l:可用于-f选项指定的字段名称列表;

    MAIN.cache_hit:命中
    MAIN.cache_miss:未命中

    # varnishstat -1 -f MAIN.cache_hit -f MAIN.cache_miss#查看指定的字段对应的值
    # varnishstat -l -f MAIN -f MEMPOOL#查看menpool相关
    

    2、varnishtop - Varnish log entry ranking#查询日志并排序

    -1 一次性显示区域的所有信息
    -i taglist,可以同时使用多个-i选项,也可以一个选项跟上多个标签(过滤);
    -I <[taglist:]regex>从所有中基于正则表达式过滤列表
    -x taglist:排除列表
    -X <[taglist:]regex>从所有中基于正则表达式排除列表

    # varnishtop -i BereqHeader X-Forwarded-For#过滤发往后端服务有多少
    # varnishtop -i BereqHeader RespStatus#过滤发往后端返回的响应码
    # varnishtop -x BereqHeader,BerespHeader#排除指定多个字段
    

    3、varnishlog:显示Varnish日志,

    #varnislog -i RespStatus #查询日志指定字段信息
    

    4、 varnishncsa :显示NCSA 格式日志

    • 一般varnish不启用ncsa日志,会影响磁盘io,由前端nginx服务器记录。
     #varnishncsa -h #帮助命令
    #systemctl start varnishncsa.service#如果使用日志,启动
    #systemctl enable varnishncsa.service#设置开机启动
    #tail /var/log/varnish/varnishncsa.log#查看日志内容
    

    相关文章

      网友评论

          本文标题:varnish设定多个后端主机和健康监测

          本文链接:https://www.haomeiwen.com/subject/mzokvftx.html