熟悉HDFS的同学可能经常会使用到audit log文件做问题的tracking。说起audit log,它的作用可不小,它按照时间顺序精确地记录了每次的请求操作。通过这些精确的记录,我们得以精确定位到问题发生时间点,哪个用户,执行了什么命令,请求来自哪个IP等等有用的信息,以此进一步帮助我们做问题的分析。当然,我们还能将audit log进行汇总分析,这样我们能知道总体RPC请求的一个分布情况和趋势。但是HDFS在对audit log的分析上并没有提供现有的工具,只是提供现成的hdfs-audit.log的文件。好在aduit log格式统一,我们常规的做法是将audit log进行文件读取解析,然后load到db表内进行二次分析。所以如果这里系统能够提供一个额外工具能方便我们进行audit log load到db的操作,无疑这会提升audit log的易用性,因为后续的分析完全就可以基于db query来做了。Ozone作为对象存储系统,它在此方面就实现了一个audit log的parser tool,本文笔者来聊聊此工具的使用。
在Ozone的主服务中,OM/SCM服务有其各自的audit log文件,但它们遵从一致的audit格式,以下为两者服务对应的audit log记录:
OM audit log:
2019-12-07 07:11:17,264 | INFO | OMAudit | user=yiqlin | ip=xx.xx.xx.xx | op=ALLOCATE_KEY {volume=testvolume1, bucket=testbucket1, key=testfile2, dataSize=12, replicationType=RATIS, replicationFactor=THREE, keyLocationInfo=null} | ret=SUCCESS |
SCM audit log:
2019-12-07 07:30:37,338 | INFO | SCMAudit | user=hdfs | ip=xx.xx.xx.xx | op=SEND_HEARTBEAT {datanodeUUID=da6703ec-903e-42bb-9af3-2a1e1759dca1, command=[]} | ret=SUCCESS |
上面audit log中,Ozone将关于请求操作更加详细的信息都放在了op列内,然后其它列为基本信息列。
为了方便做audit log的分析,Ozone内部实现了audit log的parser tool,不仅支持方便导入audit log到db的操作,还能进行自定义的query分析。
我们在使用此工具的时候,首先需要执行的是audit log load到db的操作,以om的audit log命令为例:
[hdfs@lyq ~]$ ~/ozone/bin/ozone auditparser ~/om_audit.db load ~/ozone/logs/om-audit-xx.xx.xx.xx.log
/home/hdfs/ozone/logs/om-audit-xx.xx.xx.xx.log has been loaded successfully
然后我们可以看到load成功的输出,然后在hdfs目录下会生成一个db文件。
通过比较audit log的记录条数和db中的记录条数,数据的确是完全被load的。
[hdfs@lyq ~]$ wc -l ~/ozone/logs/om-audit-xx.xx.xx.xx.log
6 /home/hdfs/ozone/logs/om-audit-xx.xx.xx.xx.log
[hdfs@lyq ~]$ ~/ozone/bin/ozone auditparser ~/om_audit.db query ‘select count(*) from audit’
6
load到db的audit表的表信息如下:
CREATE TABLE IF NOT EXISTS audit (
datetime text,
level varchar(7),
logger varchar(7),
user text,
ip text,
op text,
params text,
result varchar(7),
exception text,
UNIQUE(datetime,level,logger,user,ip,op,params,result))
然后后面我们就可以在上面做query操作了。
Ozone audit log parser支持两种模式的query:
比如下面的自定义query为例,
[hdfs@lyq logs]$ ozone auditparser ~/scm_audit.db query “select * from audit limit 5”
2019-12-06 06:06:22,203 INFO SCMAudit hdfs xx.xx.xx.xx SEND_HEARTBEAT {datanodeUUID=dab225c6-404b-420d-8aab-e6a6c5718d4e, command=[]} SUCCESS
2019-12-06 06:06:26,099 INFO SCMAudit hdfs xx.xx.xx.xx SEND_HEARTBEAT {datanodeUUID=5b3d0cab-4ca2-4269-9a39-39df721d404f, command=[]} SUCCESS
2019-12-06 06:06:32,592 INFO SCMAudit hdfs xx.xx.xx.xx SEND_HEARTBEAT {datanodeUUID=56a13816-8a2c-4f42-a56d-6f59f7049dd5, command=[]} SUCCESS
2019-12-06 06:06:35,986 INFO SCMAudit hdfs xx.xx.xx.xx SEND_HEARTBEAT {datanodeUUID=da6703ec-903e-42bb-9af3-2a1e1759dca1, command=[]} SUCCESS
2019-12-06 06:06:52,202 INFO SCMAudit hdfs xx.xx.xx.xx SEND_HEARTBEAT {datanodeUUID=dab225c6-404b-420d-8aab-e6a6c5718d4e, command=[]} SUCCESS
我们同样可以做常见的用户汇总分析,类似如下查询,
[hdfs@lyq ~]$ ~/ozone/bin/ozone auditparser ~/om_audit.db query ‘select user,count(user) from audit group by user’
hdfs 4
yiqlin 2
audit paser tool提供了下面3个常用的模板查询,
Template Name | Description | SQL |
---|---|---|
top5users | Top 5 users | select user,count(*) as total from audit group by user order by total DESC limit 5 |
top5cmds | Top 5 commands | select op,count(*) as total from audit group by op order by total DESC limit 5 |
top5activetimebyseconds | Top 5 active times, grouped by seconds | select substr(datetime,1,charindex(’,’,datetime)-1) as dt,count(*) as thecount from audit group by dt order by thecount DESC limit 5 |
比如我们以top5users为例,它将查到得到同上的查询结果
[hdfs@lyq ~]$ ~/ozone/bin/ozone auditparser ~/om_audit.db template top5users
hdfs 4
yiqlin 2
ozone audit pasrser工具的主要命令就是如上所描述的,但是笔者个人认为目前usage里信息还是有点少,不如官方文档描述地详细:
Usage: ozone auditparser [-hV] [--verbose] [-D=<String=String>]... <database>
[COMMAND]
Shell parser for Ozone Audit Logs
<database> Existing or new .db file
--verbose More verbose output. Show the stack trace of the errors.
-D, --set=<String=String>
-h, --help Show this help message and exit.
-V, --version Print version information and exit.
Commands:
load, l Load ozone audit log files
template, t Execute template query
query, q Execute custom query
不过总体来说,Ozone提供的这个auditlog parser tool还是十分易用的,能够让管理员做本地的快速分析。不过如果我们想做区间时间段内的整体分析的话,还是得需要将audit log解析存到额外的db进行存储。
[1]. https://issues.apache.org/jira/browse/HDDS-393 . Audit Parser tool for processing ozone audit logs