zoukankan      html  css  js  c++  java
  • 【转】日志收集工具scribe

    转:https://www.xiaomastack.com/2014/11/10/scribe/

    Scribe从各种数据源上收集数据,放到一个共享队列上,然后push到后端的中央存储系统上。当中央存储系统出现故障时,scribe可以暂时把日志写到本地文件中,待中央存储系统恢复性能后,scribe把本地日志续传到中央存储系统上。需要注意的是,各个数据源须通过thrift(由于采用了thrift,客户端可以采用各种语言编写)向scribe传输数据(每条数据记录包含一个分类category和一条信息message),可以在scribe配置文件中配置用于监听端口的thrift线程数(默认3)。
    在后端,scribe可以将不同category的数据存放到不同目录中,以便于进行分别处理。后端的日志存储方式可以是各种各样的store,包括file(文件),buffer(双层存储,一个主储存,一个副存储),network(另一个scribe服务器),bucket(包含多个store,通过hash的将数据存到不同store中),null(忽略数据),thriftfile(写到一个Thrift TFileTransport文件中)和multi(把数据同时存放到不同store中)。
    scribe架构图如下:
    scribe

    1、scribe中常用store存储介绍
    file
    将日志写到文件或者NFS中,支持两种文件格式,即std和hdfs即普通文本文件和HDFS。
    buffer
    最常用的一种store。该store中包含两个子store,其中一个是primary store,另一个是secondary store。日志会优先写到primary store中,如果primary store出现故障,则scribe会将日志暂存到secondary store中,待primary store恢复性能后,再将secondary store中的数据拷贝到primary store中。
    null
    用户可以在配置文件中配置一种叫default的category,如果数据所属的category没有在配置文件中设置相应的存储方式,则该数据会被当做default,如果用户想忽略这样的数据,可以将它放入null store中。

    2、配置文件解析 Scribe的配置文件由全局的section和一个或多个store的section组成,在源码包的examples目录下有多个配置文件实例可以参考。
    1)、全局配置项
    port: (number)
    scribe监听的端口,当然也可以通过命令参数-p指定
    max_msg_per_second: (number) 每秒最大日志并发数,默认为0,0则表示没有限制
    max_queue_site:(byte) 队列最大可以为多少,默认为5,000,000 bytes
    check_interval:(second) 检查存储的频率,默认为5s
    new_thread_per_category:(yes/no) 是否为每个一个分类创建一个线程,为no的话,只创建一个线程为每个存储服务,默认为yes
    num_thrift_server_threads:(number) 接收消息的线程数,默认为3
    比如可以这样配置

    port=1463 
    max_msg_per_second=2000000 
    max_queue_size=10000000 
    check_interval=3
    

    2)、局部配置项,主要是store相关的配置。

    cateogry:  哪些消息由这个category的store处理 
    type:  指定store的类型,如file,buffer,network,bucket,thriftfile,null,multi 
    target_write_size:(byte) 对应category的消息在处理之前,消息队列最大可以为多大,
                             默认为16,384 
    max_batch_size:(byte)  内存存储队列一次性可以处理的消息数量,超过这个大小将调用thrift 
    max_write_interval:(second)  对应category的消息队列在处理消息这些消息之前可以维护多长
                                 时间,默认为1秒 
    must_succeed:(yes/no)  消息是否必须要成功处理,如果一个消息存储失败再重试,如果设置为no,
                           则如果一个消息存储失败,则该条消息会被抛弃,默认为yes。强烈建议使
                           用buffer类型的store去指定一个secondary store去处理失败的消息。
    

    比如这些参数可以这样使用

    <store> 
    category=test_* #所有以"test_"开头的分类category信息由这个store处理 
    type=buffer 
    target_write_size=20480 
    max_write_interval=1 
    buffer_send_rate=2 #从secondary store多少次读取一个组消息发送到primary store 
    retry_interval=30 #写入到primary store失败后,多久时间再次发送到primary store 
    retry_interval_range=10 #重试间隔 
    
      <primary> 
      ... ... ... 
      </primary> 
      <secondary> 
      ... ... ... 
      </secondary> 
    </store>
    

    不同的类型的store配置有区别,上面的配置参数只是一些通用参数。
    a)、file store

    file_path 默认路径是‘/tmp’。 
    base_filename 默认category名称。 
    use_hostname_sub_directory 是否使用server的hostname建立子目录,默认是no。 
    sub_directory 使用指定的名称创建子目录。 
    rotate_period 设置多久创建一个文件,周期可以是“hourly”, “daily”, “never”, or number[suffix]; 
                  “never”是默认值,suffix可以是“s”, “m”, “h”, “d”, “w”,‘s’是默认值。 
    rotate_hour 如果rotate_period是daily,设置每天何时创建新文件,值可以是0-23,默认是1。 
    rotate_minute 如果rotate_period是daily或者hourly,设置一个小时多久后可以创建新文件,
                  值可以是0-59,默认是15。 
    max_size 在轮转一个文件前,该文件可以增长到多大,默认是1,000,000,000 bytes 。
    write_meta 值可以是yes或者其他值,false是默认值,如果文件被轮转,最后一行将包含"scribe_meta",
               跟着就是下一个文件名。 
    fs_type 支持两种类型std和hdfs,默认是std。 
    chunk_size 默认是0,如果一个chunk大小被指定,在文件内没有消息能够跨越chunk的边界,
               除非有消息的大小超过chunk的大小。 
    add_newlines 默认是0,如果是1,则在每行后面加入换行符。 
    create_symlink 默认值是yes,如果是真,则维护一个符号连接到最近被写入的文件。 
    write_stats 是否对每一个store创建一个scribe_stats文件用来跟踪文件的写入轨迹,默认yes。
    max_write_size 当块大小大到max_write_size时,store会将数据刷新到文件系统,max_write_size不能
                   超过max_site.由于target_write_size大小的消息被缓存,file-store会被调用去保存
                   这些缓存中的消息.file-store每次最少会保存max_write_size大小的消息,但file-store
                   最后一次保存消息的大小肯定会小于max_write_size.默认值为1,000,000
    

    比如实际使用中可以这样配置

    <store> 
      category=nginx 
      type=file 
      file_path=/tmp/nginx 
      base_filename=nginx_log 
      max_size=1000000 
      add_newlines=1 
      rotate_period=daily 
      rotate_hour=0 
      rotate_minute=10 
      max_write_size=4096 
    </store>
    

    b)、Network Store network store向其它scribe server发送消息,Scribe保持持久的链接打开以至于它能够发送消息,在正常运行的情况下,scribe会基于当前缓存中存在多少条消息等待发送而分批次的发送。

    remote_host 远程主机的ip或者名称。 
    remote_port 远程主机的端口。 
    timeout     socket超时时间,默认为default_socket_timeout_ms,
                在store.h中设定默认为5000毫秒。 
    use_conn_pool 是否使用连接池代替为每一个远程主机打开的链接,默认是false。
    

    比如实际使用中可以这样配置

    <primary> 
      type=network 
      remote_host=192.168.192.168 
      remote_port=1463
    </primary>
    

    c、Bucket Store
    buffer store中包含两个子store:primary和secondary,日志会先尝试写到primary store中,如果primary store出现故障,则scribe会将日志暂存到secondary store中,待primary store恢复性能后,再将secondary store中的数据拷贝到primary store中(除非replay_buffer=no),其中secondary store仅支持两种store(file和null)。

    buffer_send_rate 默认是1,在check_interval周期内,执行多少次secondary store读出一组消息并且发送到primary store中。 
    retry_interval 默认是300秒,primary store写入失败后,等待多久尝试重新发送primary store。 
    retry_interval_range 默认是60秒,将在retry_interval的区间内随机的选择一个重新发送时间。 
    replay_buffer 默认是yes,如果设置为no,将不会从secondary store迁移消息到primary store。
    

    比如实际使用中可以这样配置

    <store> 
      category=php_* 
      type=buffer 
      target_write_size=1463 
      max_write_interval=1 
      buffer_send_rate=2 
      retry_interval=30 
      retry_interval_range=10 
      
      <primary> 
        type=network 
        remote_host=192.168.192.168 
        remote_port=1463 
      </primary> 
      
      <secondary> 
        type=file 
        fs_type=std 
        file_path=/opt/log/php 
        base_filename=thisisoverwritten 
        max_size=10000000000 
        add_newlines=1 
        rotate_period=daily 
        rotate_hour=0 
        rotate_minute=0 
      </secondary> 
    </store>
    

    d、Bucket Store bucket stores使用消息前缀作为key,将消息hash到多个文件中去(具体我没有用过,不知道效果怎样)。

    num_buckets 默认值是1,hash到buckets的个数,不能被hash进bucket的消息将被放入一个特别的0号bucket。
    bucket_type “key_hash”, “key_modulo”, or “random”。 
    delimiter 值必须是1~255之间的ascii,默认是':',第一次出现在消息前缀中的delimiter在‘hash/modulo’中将被用作key。 
    remove_key 是否移除key的前缀,默认是no。 
    bucket_subdir 如果使用一个单独定义的bucket,则每一个子目录的名称根据bucket的数量编号生成。
    

    配置实例

    <store> 
      category=bucket_me 
      type=bucket 
      num_buckets=5 
      bucket_subdir=bucket 
      bucket_type=key_hash 
      delimiter=58 
      <bucket> 
        type=file 
        fs_type=std 
        file_path=/tmp/scribetest 
        base_filename=bucket_me 
      </bucket> 
    </store>
    

    e、Null Store

    Null store告诉scribe对给定的category,忽略所有的消息。
    

    配置实例

    <store> 
      category=tps_report* 
      type=null 
    </store>
    

    f、Multi Store 一个multi store会将消息转发到多个子stores中去,子store以“store0”, “store1”, “store2”命名。

    report_success 值可以是all或者any,默认是any,是否所有substores或任何substores必须成功地记录消息。
    

    配置实例

    <store> 
      category=default 
      type=multi 
      target_write_size=20480 
      max_write_interval=1 
      <store0> 
        type=file 
        file_path=/tmp/store0 
      </store0> 
      <store1> 
        type=file 
        file_path=/tmp/store1 
      </store1> 
    </store>
    

    关于scribe的资料网上不是很多,可能是用的人少吧,我也是查询了相关资料及结合实际使用经验写下了这篇文章。

  • 相关阅读:
    关于嵌套循环的循环初始化语句问题:
    自己写的小程序
    计算1-1/3+1/5-1/7+···的前n项和
    终于弄好了 homework-09
    现代C++作业2 与 围棋homework-06
    C++11 能好怎?
    黄金点游戏之客户端(homework-05)
    惊艳的随机化方法 -World Search (homework-04)
    GUI、模块化与结对编程(homework-03)
    最大二位子数组和问题(homework-02)
  • 原文地址:https://www.cnblogs.com/uglyliu/p/13170425.html
Copyright © 2011-2022 走看看