在Graylog上构建一个大规模的日志收集环境
必需文件
-
- クライアント数は、約2000ノード
-
- 各ノードから秒間1~2件のログ (5000件/秒程度)
- ログの保存期間は2週間
应用程序/中间件
-
- Glaylog Server 2.1.1
-
- MongoDB (v3.0.4を使用)
-
- Java 1.8.0
-
- ロードバランサー(lvs, haproxy, nginx等)
-
- Elasticsearch 2.4.1 (Graylog2.1から2.4系に対応)
- Graylog Collector 0.5.0 (0.4系は非対応)
硬件
-
- MongoDB …. 3台
-
- バランサ用サーバ … 1台
-
- Graylog server … 10台 (12GB memory / 300GB HDD)
- Elasticsearch … 200台 (96G memory / 700GB SSD)
构成
各中间件的部署如下所示。官方文档也可以作为参考。以前存在名为Graylog Web interface的GUI,但自从Graylog2开始,已被集成到Graylog Server中。GUI被重写为基于JavaScript,并在客户端上运行(数据本身从API获取)。
关于Mongodb,虽然不需要非常高配的服务器,但是如果Mongo节点出问题,Graylog也会停止运行,所以建议使用推荐的三台配置。
对于Graylog Server和Elasticsesrch,根据请求量每秒和存储期限的不同,需要相应数量的服务器进行扩展。
Graylog服务器的主节点只能设置一台。即使主节点停止,仍然可以接收日志,但无法进行输入添加或其他配置更改。
日志保存数量
由于每秒需要处理的记录数为5000条,每天有86400秒,日志需要保留14天,因此,每一代日志的上限乘以代数必须超过这个数量。
elasticsearch_max_docs_per_index … 每个索引的日志上限
elasticsearch_max_number_of_indices … 最大索引数
此值可以在安装后通过图形用户界面进行更改。
建立ElasticSearch
本次存在200个Elasticsearch节点,考虑冗余性,每个节点最多有2个分片,并且每个分片有2个副本。大约计算出需要120个分片是合适的。 200 * 2 > 120 * 1(主分片) + 120 * 2(副本分片)。
我计划单独撰写一篇关于这个话题的文章。
Graylog 的安装
基本上只需要展开tar文件并修改配置。
让我们来看一下配置文件的每一行。
is_master = true
# マスターノードか否か。マルチノードの場合、1台だけtrueに設定する
password_secret = xxxxx
# mkpasswd などで生成する
root_password_sha2 = xxxx
# echo -n "password" | sha256sum などで生成
rest_listen_uri = http://xxx.xxx.xxx.xxx:9000/api/
web_listen_uri = http://xxx.xxx.xxx.xxx:9000/
web_endpoint_uri = /api/
# ListenするIPを書く。0.0.0.0ではなく、IPアドレスを指定する。
# GUIとRestAPIのポートは分けても良いし、同じにしてもよいですが、同じ場合は、URLで分けるため、`web_endpoint_uri` を設定する。
elasticsearch_max_docs_per_index = 30000000
elasticsearch_max_number_of_indices = 20
# 1インデックスあたりのログ上限と、インデックスの世代数を設定(GUIからも変更可能)
elasticsearch_shards = 120
elasticsearch_replicas = 2
elasticsearch_index_prefix = graylog
# シャードとレプリカの数の設定
elasticsearch_discovery_zen_ping_unicast_hosts = xxx.xxx.xxx.xxx:9300, xxx.xxx.xxx.xxx:9300, xxx.xxx.xxx.xxx:9300
# elasticsearchのマスターノードの一覧を設定
elasticsearch_node_master = false
elasticsearch_node_data = false
# Graylogは、内部でElasticSearchのクライアントノードとして動作して、クラスタにJOINするので、両方Falseにする
elasticsearch_transport_tcp_port = 9300
elasticsearch_network_host = 0.0.0.0
# クライアントノードとして動作する場合、外からの通信も受け入れなくてはいけないので、127.0.0.1ではなく、グローバルでListernする
mongodb_uri = mongodb://xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx/graylog
# MongoDB 3台分のURL。ポート番号27017は省略可能。
负载均衡器 (fù qì)
中国的翻译:在使用负载均衡器时,建议使用Nginx、HAProxy或LVS。但是,如果需要在UDP上进行负载均衡(例如,需要收集Syslog日志),目前来说,除了LVS之外没有其他选择。理想情况下,负载均衡器本身也应该使用Keepalived等实现冗余备份,但本次只采用了单机配置。
每个Graylog服务器都有一个健康检查内容(/api/system/lbstatus),需要在负载均衡器上进行配置。
如果是使用HAProxy,可以采取以下方式。
Backend web-ui-backend
option httpchk GET /system/lbstatus
server webui-001 192.168.100.100:9000 check
server webui-002 192.168.100.101:9000 check
server webui-003 192.168.100.102:9000 check
如果将GUI和API的端口分开,可以按照以下方式进行。
Backend web-ui-backend
option httpchk GET /system/lbstatus
server webui-001 192.168.100.100:9000 check port 12900
server webui-002 192.168.100.101:9000 check port 12900
server webui-003 192.168.100.102:9000 check port 12900
总结
通过以上的配置,我们确认可以接收每秒数万条日志。客户端节点数量可以正常运行直到数千个节点。
在此过程中需要注意的是,虽然每条日志的大小也会影响,但它会成为网络流量。实际上,当达到网络上限时,Graylog端的日志会留下索引失败的日志。