设为首页 收藏本站
查看: 2217|回复: 0

[经验分享] 利用scribe管理log文件

[复制链接]

尚未签到

发表于 2015-11-28 17:14:06 | 显示全部楼层 |阅读模式
  Scribe是Facebook开源的日志收集系统,在Facebook内部已经得到大量的应用。它能够从各种日志源上收集日志,存储到一个中央存储系统(可以是NFS,分布式文件系统等)上,以便于进行集中统计分析处理。它为日志的“分布式收集,统一处理”提供了一个可扩展的,高容错的方案。当中央存储系统的网络或者机器出现故障时,scribe会将日志转存到本地或者另一个位置,当中央存储系统恢复后,scribe会将转存的日志重新传输给中央存储系统。其通常与Hadoop结合使用,scribe用于向HDFS中push日志,而Hadoop通过MapReduce作业进行定期处理。原理如下:


   DSC0000.jpg


  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中)。


  服务器端安装:
  

#!/bin/bash
mkdir scribed && cd scribed
yum -y install gcc gcc-c++ m4 autoconf automake libtool libicu-devel python-devel libevent-devel
/sbin/ldconfig
wget http://jaist.dl.sourceforge.net/project/boost/boost/1.56.0/boost_1_56_0.tar.gz
wget http://archive.apache.org/dist/incubator/thrift/0.5.0-incubating/thrift-0.5.0.tar.gz
git clone https://github.com/facebookarchive/scribe.git
tar zxvf boost_1_56_0.tar.gz
tar zxvf thrift-0.5.0.tar.gz
cd boost_1_56_0
./bootstrap.sh --prefix=/usr/local/boost
./bjam --prefix=/usr/local/boost install
echo "/usr/local/boost/lib" >> /etc/ld.so.conf
/sbin/ldconfig
cd ..
cd thrift-0.5.0
python -c "import distutils.core" || exit 1
./configure --prefix=/usr/local/thrift --with-csharp=no  --with-java=no --with-erlang=no --with-php=no --with-ruby=no --with-py=yes --with-libevent --with-boost=/usr/local/boost
make
make install
echo "/usr/local/thrift/lib" >> /etc/ld.so.conf
/sbin/ldconfig
cd contrib/fb303
./bootstrap.sh --with-boost=/usr/local/boost/
./configure --prefix=/usr/local/fb303 --with-boost=/usr/local/boost --with-thriftpath=/usr/local/thrift
make
make install
cd ../../scribe
./bootstrap.sh --prefix=/usr/local/scribe --with-thriftpath=/usr/local/thrift --with-fb303path=/usr/local/fb303/ --with-boost=/usr/local/boost/
make
make install

  


Scribe的配置文件放在/usr/local/scribe/scribe.conf中,在scribe安装文件下example中有示例,分为全局配置和存储配置两部分:

  

全局配置项






  • port:指示scribe服务器在哪一个端口上监听,默认是0,通过命令行参数选项-P可以指定端口,也能够通过配置文件指定。在源代码中就赋值给变量port。


  • max_msg_per_second:默认值是0,如果这个参数值是0将被忽略。随着最近的改变这个参数很少被关联使用到,max_queue_size参数将被应用到限制每秒最大的消息数。在scribeHandler::throttleDeny被使用。


  • max_queue_size(按字节):接收消息的队列的最大字节,默认是5,000,000字节。在scribeHandler::Log使用。


  • check_interval(秒):用于控制多长时间检查一次存储,默认值是5.


  • new_thread_per_category(是/否):如果为是,将为每一个分类场景创建一个新的线程,否则将创一个单线程为每一个在配置文件中定义的存储。对于前缀存储或默认存储,如果这个参数设置成“否”将导致所有匹配这个分类的消息都由一个单独的存储来处理。否则将为每一个唯一的分类名创建一个新的存储。默认为“是”。


  • num_thrift_server_threads:为接收消息的监听线程数量,默认是3.


  • max_conn:最大的链接数。










存储配置


Scribe服务器决定怎样将日志消息写入是基于在配置中定义的存储类型和相关参数设置,每一个存储都必须指定一个消息分类来处理三种异常。






  • 默认存储:默认分类处理任何不能被其他存储处理的分类,这儿仅仅能够有一个默认存储。


  • 前缀存储:如果指定分类以一个*结尾,这个存储将处理所有以指定前缀开头的分类。


  • 多个类别:在一个存储定义中能够使用‘categories=’创建多个类别。


  • 在上面三种情况下,在文件存储中将为每一个唯一的分类创建一个子目录(除非new_thread_per_category被设置为false)。



存储配置变量






  • category:决定哪些消息被这个存储处理。


  • type:存储类型,有file、buffer、network、bucket、thriftfile、null、mutil。


  • target_write_size:默认是16,384字节,决定在这些消息处理之前在给定分类的消息队列可以增长到多大。


  • max_batch_size: 默认1,024,000字节(可能没有被开源),决定在内存存储队列中一次能够被处理的数据的总数,这个(加上缓冲文件旋转的大小)控制多大的一个thrift调用可行。


  • max_write_interval:默认是10秒,决定在这些消息处理之前在给定分类的消息队列可以用多长时间。


  • must_succeed(yes/no):是否必须成功,如果一个存储处理消息失败是否重新进入消息队列排队,如果设置成 ‘no’,且一个存储不能处理这些消息,消息将被丢弃。默认是yes。强烈建议使用缓存来指一个定二级存储来处理失败的日志。



存储类型




file存储配置

File存储写入消息到一个文件。




  • file_path:文件路径,默认是“/tmp”。


  • base_filename:基本文件名称,默认是分类名称。


  • use_hostname_sub_directory(yes/no):使用服务器的主机名创建一个子目录,默认是no。


  • sub_directory:使用指定的名称创建一个子目录。


  • rotate_period:文件创建周期,取值可以是 “hourly”, “daily”, “never”,或者是name[后缀], “never”是默认值,决定多长时间创建一个新文件,特别的后缀“s”, “m”, “h”, “d”, “w”分别代表second(默认)、minutes、hours、days和weeks。


  • rotate_hour:取值0-23,默认是1,如果rotate_period取值是daily,这个就决定每天的什么时候创建新文件。


  • rotate_minute:取值0-59,默认是15,如果rotate_period设置为daily或hourly,这个就决定以一个小时过后多久创建一个新文件。


  • max_size:文件上限大小,默认1,000,000,000多字节,决定在轮流创建一个新文件以前一个文件能够增长到多大。


  • write_meta:取值yes或其他任何,false为默认值,如果文件被旋转,最后一行将包含“scribe_meta”,跟着就是下一个文件名。


  • fs_type:文件类型,支持“std”和“hdfs”两种格式,“std”为默认值。


  • chunk_size:默认值是0,如果一个块大小被指定,在文件内没有消息能够跨越块的边界,除非有消息的大小超过块的大小。


  • add_newlines:取值0或1,默认是0,如果设置为1,以后的每一个消息都写入一个新行。


  • create_symlink:yes或其他任何,默认是yes。如果为yes,将保持一个符号链接指向最近一个被写入的文件。


  • write_stats:yes/no,默认是yes。是否创建一个scribe_stats文件为每一个存储来保持文件写入的轨迹。


  • max_write_size:默认是1000000字节。File存储将尝试按max_write_size字节的块大小刷新数据到文件系统。max_write_size的大小不能超过max_size。由于target_write_size一定数量的消息被缓存。那么文件存储被调用来保持这些消息。File_store以一次性至少max_write_size大小字节的块来保存这些消息。File存储的最后一次写入比max_write_size小;


  • write_category:写入一个分类下面;


  • rotate_on_reopen:循环重新打开。


  • network存储配置


  • Network存储向其他scribe服务器发送消息。Scribe保持持久的链接打开以至于它能够发送消息。(为了错误信息或者如果下游机器过载,它将重新打开一个链接)。在正常运行的情况下,scribe会基于当前缓存中存在多少条消息等待发送而分批次的发送。(如果scribe备份和缓存消息到本地磁盘,scribe会基于缓存文件大小按块发送消息)


  • remote_host:发送消息的远程主机的名称或IP地址。


  • remote_port:在远程主机上的端口。


  • timeout:socket超时,MS为单位,默认是DEFAULT_SOCKET_TIMEOUT_MS, 在store.h中被设置为5000。


  • use_conn_pool:yes或者任何其他,默认是false。是否使用连接池代替为每一个远程主机打开的链接。


  • smc_service:


  • service_options:


  • service_cache_timeout:


  • ignore_network_error:


  • dynamic_config_type:


buffer存储配置

这是最常用的一种store。该store中包含两个子store,其中一个是primary store,另一个是secondary store。日志会优先写到primary store中,如果primary store出现故障,则scribe会将日志暂存到secondary store中,待primary store恢复性能后,再将secondary store中的数据拷贝到primary store中。其中,secondary store仅支持两种store,一个是file,另一个是null。




  • max_queue_length:默认2,000,000条消息。如果在队列中的消息数量超过了这个值,buffer存储将切换写入secondary store。


  • 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,默认是yes。如果设置为 ‘no’,buffer存储不能从secondary store移除消息并且发送到primary store中去。


bucket存储配置

Bucket存储使用每个带前缀的消息作为key写入到多个文件中去。能够定义一个隐藏的或明确的bucket。定义隐藏的bucket必须要有一个名称是 “bucket” 子bucket,这个子bucket可以是file存储、network存储或者thriftfile存储。




  • num_buckets:hash进入的bucket个数,默认是1。不能被hash进入任何bucket的消息将被放入一个特别的0号bucket。


  • bucket_type: 取值是“key_hash”, “key_modulo”, 或者 “random”。


  • delimiter:必须是1-255之间的ascii代码,否则默认是 ‘:’。第一次出现在消息前缀中的delimiter在‘hash/modulo’中将被用作key。Random不使用这个delimiter。


  • remove_key:取值yes/no,默认是是no。是否从消息中移除key前缀。


  • bucket_subdir:如果使用的是一个单独定义的bucket,每一个子目录的名称根据bucket的数量编号生成。


null存储配置

忽略被给分类的所有消息。没有参数。

mutil存储配置

一个mutil存储是将所有消息转发到子存储中去的一个存储。一个mutil存储可能有多个名叫“store0”, “store1”, “store2”等等的子存储。




  • report_success:取值 “all” or “any”, 默认是 “all”。是否所有substores或任何substores必须成功地记录消息,以报告为成功的消息记录在日志消息


thriftfile存储配置

Thriftfile存储类似于file存储,出了thriftfile存储是用Thrift TFileTransport file存储消息。




  • file_path:文件路径,默认是“/tmp”。


  • base_filename:基本文件名称,默认是分类名称。


  • rotate_period:文件创建周期,取值可以是 “hourly”, “daily”, “never”,或者是name[后缀], “never”是默认值,决定多长时间创建一个新文件,特别的后缀“s”, “m”, “h”, “d”, “w”分别代表second(默认)、minutes、hours、days和weeks。


  • rotate_hour:取值0-23,默认是1,如果rotate_period取值是daily,这个就决定每天的什么时候创建新文件。


  • rotate_minute:取值0-59,默认是15,如果rotate_period设置为daily或hourly,这个就决定以一个小时过后多久创建一个新文件。


  • max_size:文件上限大小,默认1,000,000,000多字节,决定在轮流创建一个新文件以前一个文件能够增长到多大。


  • fs_type:文件类型,当前只支持“std”,“std”为默认值。


  • chunk_size:默认值是0,如果一个块大小被指定,在文件内没有消息能够跨越块的边界,除非有消息的大小超过块的大小。


  • create_symlink:yes或其他任何,默认是yes。如果为yes,将保持一个符号链接指向最近一个被写入的文件。


  • flush_frequency_ms:毫秒单位,如果没有指定就使用默认300的 TFileTransport。决定一步到thrift file磁盘时间的频率。


  • msg_buffer_size:以字节为单位,如果没有指定将使用默认为0的TFileTransport。如果非零,将拒绝写入比这个值大的。

  设置打开文件数量的限制用ulimite来设置:

ulimit -n 100000 ## 观察几个log服opened file峰值在5~6w浮动
screen -R scribe ## 新建screen,在screen中启动scribed
scribed -c log.conf
  
  
  客户端安装:
  

sudo pip install scribe_logger thrift
  客户端使用:
  

from config import *
from scribe_logger.logger import ScribeWriter
scribe_writer = ScribeWriter(config.SERVER_LOG, config.SERVER_LOG_PORT, default_category='')
def scribewrite(category, *argv):
scribe_writer.write(category, '\t'.join([str(v) for v in argv]))
scribewrite("debug", logName, user_id, themeid)
  


  


其中ScribeWriter前两个参数分别是中央存储系统的IP和端口,IP也可以是‘localhost’,保存在配置文件config.py中. logName user_id themeid为具体的string类型值。运行客户端程序,会在服务器端相关文件夹(在配置文件scribe.conf中的file_path中定义)中找到相应的log文件。
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144450-1-1.html 上篇帖子: 互联网网站架构升级----消息中间件的实现方案 下篇帖子: 用java端,通过log4j 把日志写入scribe 日志系统
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表