生产环境中使用StarRocks一般都是多节点,3个fe3个be已经是很小的规模了,出现问题需要查日志的话,6个节点上找日志是比较费劲的,我们希望能够将日志都收集到es,查找方便而且支持搜索,提升排查问题的效率。
我们知道StarRocks集群有两种节点类型,fe和be,对应有fe.log和be.log,细分其实还有warn、info、error日志,但是warn和error比较少,这里合并到一起收集。另外,StarRocks是个数据库,所以sql日志也非常重要。所以我们有三种日志需要收集,
fe.log、be.info、audit.log
ELK + Kafka
日志收集比较流行的解决方案是ELK,但是logstash功能越来越多导致资源占用比较大,在性能要求比较高的场景中使用不太合适,这里使用更轻量的Filebeat来做收集。Filebeat的数据可以直接发给logstash,公司logstash是运维维护,不太方便直接把日志丢过去,就走kafka中转一下。同时es里一般只保留最近几天的数据,如果希望日志能保留的时间长一些,kafka直接对接到数仓也比较方便。
Filebeat配置
我们使用的阿里的E-mapreduce,sr日志目录如下
filebeat.inputs:
- type: log
id: ali-starrocks02-be02
enabled: true
symlinks: true
paths:
- /opt/apps/STARROCKS/starrocks-current/be/log/be.INFO
multiline.pattern: '^I(\d{4}) (\d{2}):(\d{2}):(\d{2}).(\d{6})'
multiline.negate: true
multiline.match: after
fields:
logtype: belog
processors:
- add_host_metadata:
- drop_fields:
fields: ["log","agent","ecs","input","@metadata"]
ignore_missing: false
output.kafka:
enabled: true
hosts: ["xxx.xxx.xxx.xxx:9092","xxx.xxx.xxx.xxx:9092","xxx.xxx.xxx.xxx:9092"]
topic: 'starrocks_be_source_log'
partition.round_robin:
reachable_only: false
required_acks: 1
compression: gzip
max_message_bytes: 1000000
{
"@timestamp": "2023-05-01T05:45:01.345Z",
"@metadata": {
"beat": "filebeat",
"type": "_doc",
"version": "8.5.0"
},
"fields": {
"logtype": "sqllog"
},
"host": {
"os": {
"name": "CentOS Linux",
"kernel": "3.10.0-957.21.3.el7.x86_64",
"codename": "Core",
"type": "linux",
"platform": "centos",
"version": "7 (Core)",
"family": "redhat"
},
"name": "sr01",
"id": "363114529432776998",
"containerized": false,
"ip": ["10.0.0.1"],
"mac": ["CE-16-AF-DS-21-7E"],
"hostname": "sr01",
"architecture": "x86_64"
},
"message": "2023-05-01 13:45:01,345 [query] |Client=10.0.0.84:40624|User=default_cluster:test|Db=default_cluster:sr_test|State=OK|Time=51|ScanBytes=0|ScanRows=0|ReturnRows=0|StmtId=770|QueryId=a04c6e49-7481-6frw-9409-12854e0e118e|IsQuery=false|feIp=10.0.0.123|Stmt=select 1"
}
处理之后
{
"@timestamp": "2023-05-01T05:45:01.345Z",
"logtype": "sqllog",
"message": "2023-05-01 13:45:01,345 [query] |Client=10.0.0.84:40624|User=default_cluster:test|Db=default_cluster:sr_test|State=OK|Time=51|ScanBytes=0|ScanRows=0|ReturnRows=0|StmtId=770|QueryId=a04c6e49-7481-6frw-9409-12854e0e118e|IsQuery=false|feIp=10.0.0.123|Stmt=select 1",
"hostname": "sr-01",
"ip": "10.0.0.1"
}
audit日志比较复杂,处理成上面的格式之后,其实想分析sql日志,还需要对message再做处理,把message字段拆分成kv结构,方法很多,这里就不说细节了。
之前说过收集好的日志需要经过logstash再写到es,那logstash的处理规则是什么样的
fe日志logstash处理规则,fe上有两种日志,但是我们只安装了一个Filebeat,所以收集的时候日志加了hostname、ip和日志类型
filter {
mutate {
add_field => {"hostname" => "%{[host][name]}"
"ip" => "%{[host][ip][0]}"
"logtype" => "%{[fields][logtype]}"}
remove_field => ["tags", "beats_input_codec_plain_applied", "@version","host","fields"]
}
}
output {
if [logtype] == "sqllog" {
kafka {
codec => json
bootstrap_servers => "xxx.xxx.xxx.xxx:9092"
topic_id => "starrocks_audit_log"
}
} else {
elasticsearch {
hosts => "hostname"
data_stream => "true"
}
}
}
be配置
filter {
mutate {
add_field => {"hostname" => "%{[host][name]}"
"ip" => "%{[host][ip][0]}"
"logtype" => "%{[fields][logtype]}"}
remove_field => ["tags", "beats_input_codec_plain_applied", "@version","host","fields"]
}
}
output {
elasticsearch {
hosts => "hostname"
data_stream => "true"
}
}
1.Filebeat多行日志合并
Filebeat默认收集日志是一行一条,如果一条日志打成了多行,收集的时候就会拆开,多行sql和java的异常日志都会有这种问题,multiline插件可以通过正则匹配日志开头,然后配合其他参数合并多行日志
2.Filebeat(8.x)不支持输出到多个output
sr机器上有多重日志(audit、fe.info、warn),audit日志是kv结构,和其他日志的处理方式不同,
需要走不同的处理流程,但是不支持多输出就只能在下游去处理(比如logstash)
3.Filebeat采集符号链接默认是false
需要手动配置symlinks为true,不然日志输出配置为软连接的日志收集不到
4.BE日志时间格式不标准
默认的be日志开头并不是一个标准的时间格式(2023-05-01 12:03:42)是自定义的格式(I0501 06:43:13.84650),收集时需要修改对应的正则
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。