使用 Graylog 之前试过很多方案,包括流行的 ELK,也用过 fluentd 搭配各种存储,influxdb, mongodb 等等。但这些方案在日志量大了之后出现性能瓶颈都没有提供解决方案。而 Graylog 作为整合方案,使用 elasticsearch 存储,mongodb 缓存,带流量控制 (throttling),简单易用的查询界面,方便的管理界面,易于扩展。转移到 Graylog 省心了不少。在使用过程中积累了些经验,准备陆续分享出来。
第一篇是关于如何安装 Graylog。
官方提供了自动化和手动安装,以及集群配置的文档。稍微麻烦点的是安装 mongodb 和 elasticsearch 集群,以及配置 graylog 里的各种地址。
Mongodb 在有防火墙保护下,最简单的集群方案是不设置验证,只需要所有节点配置相同的 replSet
就行了
replSet = graylog
然后按照文档初始化一下,注意 _id
要和配置的 replSet
一致。
rs.initiate( {
_id : "graylog",
members: [ { _id : 0, host : "logs1.example.com:27017" } ]
})
rs.add("logs2.example.com")
rs.add("logs3.example.com")
Elasticsearch 类似,配置相同的 cluster name 并列出集群内机器
cluster.name: graylog
discovery.zen.ping.unicast.hosts:
- logs1.example.com
- logs2.example.com
- logs2.example.com
Graylog 只要保证只有一个节点配置成了 master
is_master = true
比较容易出错和混淆的就是各种地址的配置,主要是有些没配置会用另外的选项作为默认值。推荐是显式的配置所有下面四个选项:
rest_listen_uri
用来指定 API 启动时监听的网卡,端口和 API 地址前缀。没什么特殊原因,这个配置成http://0.0.0.0:9000/api/
就行了web_listen_uri
同上,但是是 WEB 资源的 HTTP 服务器,可以和 API 使用相同的端口,一般配置成http://0.0.0.0:9000/
就可以了rest_transport_uri
这个是节点暴露给集群其它节点访问用的 API 地址,一般把rest_listen_uri
中的 IP 换成内网 IP 或者域名就行了,比如http://logs1-internal.example.com:9000/api/
web_endpoint_uri
是暴露给 WEB 界面里的 Javascript 连接用的 API 地址,一般把rest_listen_uri
中的 IP 换成公网 IP 或者域名就行了,比如http://logs1.example.com:9000/api/
。如果设置了负载均衡,或者代理,可以配置成负载均衡和代理的公网地址,也可以通过 HTTP Header 来覆盖该配置,比如 Nginx
proxy_set_header X-Graylog-Server-URL http://logs.example.com/api;
Graylog 成功启动后在 Web 管理界面就能查看节点状态和 elasticsearch 集群状态。Mongodb 可以在 mongo 命令行客户端里执行以下两个命令验证:
rs.conf()
rs.status()