KirsT
KirsT定义KirsT 最初的版本是根据Kirtore量身定制的log收集程序,其log内容结构符合Kirtore系统行为规范1.07v标准,下图为一个log信息的范例
e,01/07/2005 03:51:24,KirinReplication,Get Partition node configuration from Coordinator,SrcFile="kirscooandhandler.cpp" SrcFunc="KirsReplicitionNodeViewRequest::OnSentMessageComplete" SrcLine="455" Pid="1288" Tid="1152"
KirsT格式一条log最大长度为4096字节,以逗号作为分隔符,一般包括以下信息1 log type:其内容为一个字节,表示log的类型信息,根据log信息的种类和级别不同,产生不同类型的log type信息。常见的log type主要包含以下几种
Log type
Log type informations
e
err log which is always launch by core dump, The most horrible log of the MSRA
w
Warning log ,which is should be detected by the dev team , the log should not happened
i
Information log which show the information of the software running ,from the information, the user could know the progress of the software
p
Pack log ,which is show by the pack transformation
z
Zero log , when the software quit with successful a zero log launch
t
time log ,when the DFS do the time allot process ,it will show
c
Customer log , which is defined by the customers
b
Binary program launch it
d
Debug log ,the dev do UTing, should not leave it alone
s
System log
针对kisT的需求来说,主要针对的是error log 和warning log的收集。2 Log time:Log time主要记录为这一条log的发生时间,其格式为 MM/DD/YYYY HH:MM:SS, 作为krirn分布式系统的一个特点为:krirn 分布式系统的所有节点可能分布在与隶属于不同时区的机房中,每一台节点的时间均为当地时间,这就给krirnAT 造成了一个很大的麻烦即,如果需要将属于不同时区的节点的log信息进行汇总的话,同一时间产生的Log 可能会被分开处理和收集,最终会导致一个生成一个错误的结果,给进行分析造成不必要的麻烦。3 产生Log的模块名KirsT,由一台Master (DM)、数台Shadow Master(可选)和多台数据节点机(chunk server)以及运行于应用程序处的DFS客户端库(dfsapi)、DPF Agent以及DFS实用工具子系统(如DFS监控子系统、DFS目录树浏览子系统、文件目录复制子系统、数据导入等)等组成。DM及Shadow DM用来保存整个DFS的元数据(metadata),chunk server用来保存文件内容,dfsapi lib提供DFS到应用程序的接口。每个文件被分成固定大小的块(即chunk),每个chunk被复制后保存在多台chunk server上(缺省为3台)。通过DFS的客户端库(dfsapi),应用程序的多个客户端可以并发地读写文件内容其完成的主要功能是:
文件/目录的创建、删除、移动、改名
文件的打开、关闭、读出、追加、写入(overwrite)
文件属性设置和修改(内容拷贝数,用户权限,压缩方法,stream or structure content…)
多个客户端并发读同一个文件
多个客户端并发追加同一个文件(无额外锁机制)
同一文件的读出和追加可同时进行
客户端的每个单一操作都是原子操作
只要DM及Shadow DM中超过半数在线,则系统可用
单一DM宕机重启后系统可正常工作
少于chunk拷贝数的任意台chunk server下线时该文件仍然可用
单一机架/房间所有chunk server下线时系统仍然可用(假设系统包含至少两个机架/房间且机架/房间的机器容量网络配置大致相当)
经过配置的新chunk server机器自动加入系统
不论增加还是减少chunk server,系统都能在一段时间后达到所有chunk server的负载平衡
文件和目录的快照(snapshot)功能
DM和Shadow DM的在线checkpoint功能
Chunk server对其上的chunk数据进行校验
文件的chunk拷贝数可增加或减少
未及时更新的chunk拷贝(因chunk server离线等)能被发现并剔除
每个chunk server同时是一个客户端。
针对不同的需求,存在着不同的模块,kirin-AT所收集的log 也主要有这些模块产生
4 log body
主要指的是krirn的log内容,符合微软KirinStore系统行为规范1.07v标准,大小不超过2048字节,其内容主要包括
1)编译二进制信息,由dev设计并输入代码中
2)SrcFile:二进制文件源文件名
3)SrcFunc:所调用函数名和类名
4)SrcLine:log所在行号
5)Pid:进程名
6)Tid:线程名
在krirnAT的设计中,为了金大程度上增加其的兼容性,和可配置型,本工具需要对不同格式的Log兼容,例如,在前文中提到的KirinStore系统行为规范1.07v标准的格式顺序为:Log type ,Log time,Log info,和log body四部分组成。但是在MSTD的log格式标准为:log type, log info 和 log decryptions 三部分组成.所以,在kirinAT中,需要设计一种算法,来自动的匹配不同种类的log格式。
kirinAT中处理此任务的模块是LogReader,,其完成的功能是,从上游模块Seeker中取得log文件,读取log文件,对log文件内容进行类型识别和匹配,导出符合标准kirinAT标准的log格式,将结果传递给下一个模块 Parser
实现方法
设计一个类LogForKirin
主要包含以下成员变量:
char logType //Log type
char logTime[40] //Log time
char logInfo[2048] // Log info
char logBody[2048] //log body
主要包含以下方法
private setValue(char * ,char *,char *,char *)给LogForKirin变量赋值
public putIntoLogForKirin(Log *)外部调用
private moduleSeek()识别为符合kirinAT要求的格式
public outputValue()输出
实现逻辑如下
1 首先读取配置文件reader.config,其文件的格式如下
divide symbol ,
Log type 1
Log time 2
Log info 3
log body 5
divide symbol所对应的字符为该log文件的分隔符,log文件的每一行按照分隔符来划分成n份,其中,log type 为第一份(即第一个逗号以前的文件内容),log time为第二份,log info为第三份,log body为第五份,以此类推。
2将配置项读取后,开始读取log文件,调用putIntoLogForKirin方法,将所有log文件的log信息导入到类LogForKirin中,该方法会根据配置文件,查找输入的log信息的分隔符,将其进行统计,利用所罗门倒排算法,将所需要的log信息过滤出来,调用setValue方法输入到类的实例中,一条log输入完成后继续输入其余的log信息,最终得出一个LogForKirin实例的数组。将结果输出到Parser模块中。
意义:在分布式系统中,运行着大量的应用程序和后台程序,这些应用程序的log格式并不相同。之前并没有一个工具能够实时的监控并抓取各个程序产生的log信息,这给开发和测试人员发现程序可能存在的问题增加了很大的麻烦,KirsT的出现,彻底的解决了这个问题,目前的应用不仅仅是监控系统产生的日志文件,对于很多分布式应用程序来讲,KirsT只需要经过简单的配置上的修改,就能有针对性的收集各种分布式系统程序所产生的不同的log并生成报告