gohangoutgolang 版本的仿 Logstash 应用
golang 版本的 hangout,有效缓解内存问题。
hangout 是一款仿 Logstash 的应用,用 java 实现了 Logstash 的几个常用 input/filter/output,用于提升数据处理效率。
安装
可以从源码编译, 或者是直接下载二进制可执行文件
从源码编译
使用 go module 管理依赖. 直接 make 就可
make
为避免编译后gohangout在docker容器中无法正常启动,推荐使用完整编译命令进行编译,如:
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 make
下载编译后二进制文件
https://github.com/childe/gohangout/releases 直接下载
go get
go get github.com/childe/gohangout
运行
gohangout --config config.yml
日志
日志模块使用 github.com/golang/glog , 几个常用参数如下:
-
-logtostderr 日志打印出标准错误
-
-v 5 设置日志级别. 我这边一般设置到 5 , 数字越大, 日志级别越详细.
pprof debug
-
-pprof=true (默认是不开启 pprof的)
-
-pprof-address 127.0.0.1:8899 pprof 的http地址
多线程处理
默认是一个线程
--worker 4
使用四个线程(goroutine)处理数据. 每个线程拥有自己的filter, output. 比如说translate filter, 每个线程有自己的字典, 他们占用多份内存. elasticsearch output也是一样的, 如果每个 elasticsearch 设置了2并发, 那一共就是8个并发.
进一步说明一下为什么添加了这个配置:
最开始是没有这个配置的, 如果需要多线程并发处理数据, 依赖 Input 里面的配置, 比如说 Kafka 配置 topicname: 2
就是两个线程去消费(需要 Topic 有至少2个Partition, 保证每个线程可以消费到一个 Partition 里面的数据).
但是后面出现一些矛盾, 比如说, Kafka 的 Consumer 个数多的情况下, 给 Kafka 带来更大压力, 可能导致 Rebalance 更频繁等. 所以如果 Kafka 消费数据没有瓶颈的情况下, 希望控制尽量少的 Consumer, 后面多线程的处理这些数据.
开发新的插件
- Filter 插件示例参考 gohangout-filter-title
- Input 插件示例参考 gohangout-input-dot
- Output 插件示例参考 gohangout-output-dash
- Decoder 插件示例参考 gohangout-decode-empty