Elasticsearch,Fluentd和Kibana(EFK)組合允許收集,索引,搜索和可視化日誌數據(visualize log data)。是目前比較主流的日誌中心化,可視化並提供索引,搜索,分析的開軟軟件組合。免費使用,只有當data volumes增加時可能需要一個收費license。
Elasticsearch是一個數據搜索引擎和分佈式NoSQL數據庫的組合,提過日誌的存儲和搜索功能。Fluentd是一個消息採集,轉化,轉發工具,目的是提供中心化的日誌服務。Kibana是一個帶有強大數據整理,分析的web前端,將數據以可視化的方式呈現給用戶。
另一個流行的組合爲Elasticsearch,Logstash和Kibana(ELK)。兩種組合架構完全相同,Logstash和Fluentd的功能也大同小異,目標都是解決日誌中心化的問題。但是兩者的設計出發點稍有不同,造成在解決問題的優先級,重心上可能稍有不同。Logstash強調靈活性和互操作性,而Fluentd更傾向於簡單和魯棒性(Logstash emphasizes flexibility and interoperability whereas Fluentd prioritizes simplicity and robustness.)。兩者的具體差異,以及Elasticsearch和Kibana改天另寫一篇具體分析。本文主要介紹如何在CentOS7上搭建EFK。
數據流入下圖所示:
1. 安裝和配置Elasticsearch
1.1 安裝java
Elasticsearch需要java支持,所以需要首先安裝java。
sudo yum update
sudo yum install java
驗證是否成功安裝
[xingwangc@docker-reg ~]$ java -version
openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)
1.2 安裝Elasticsearch
wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.1.1/elasticsearch-2.1.1.rpm
rpm -ivh elasticsearch-2.1.1.rpm
1.3 Securing Elasticsearch
從版本1.2開始,Elasticsearch默認使能了動態腳本能力,由於我們使用Kibana Dashboard供外網訪問,所以在/etc/elasticsearch/elasticsearch.yml中增加如下行禁能動態腳本。
script.disable_dynamic: true
1.4 啓動Elasticsearch
sudo service elasticsearch start
1.5 設置iptables規則
Elasticsearch默認監聽9200端口,如果想要外部ip也可以訪問到Elasticsearch,則需要設置iptables規則開發9200端口。
sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp -m multiport --dports 9200:9400 -j ACCEPT
1.6 設置開機自動啓動Elasticsearch
sudo systemctl enable elasticsearch
2. 安裝和配置Kibana
2.1 安裝Kibana
curl -L https://download.elastic.co/kibana/kibana/kabana-4.3.1-linux-x64.tar.gz | tar xzf -
sudo cp -r kibana-4.3.1 /usr/share/
2.2 設置iptables規則
Kibana默認監聽5601端口,如果想要外部ip直接訪問Kibana,則需要開放5601端口。
sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp -m multiport --dports 5601 -j ACCEPT
由於我使用的nginx作爲代理服務器,所以可以此處可以不用開放5601端口。
2.3 配置Kibana
有兩處需要配置,一是需要Kibana讀取Elasticsearch的數據,所以需要配置告訴Kibana Elasticsearch的鏈接地址。二是我使用了nginx作爲代理服務器,所以只希望本地的端口轉發到達,或在本機直接訪問,而不希望其他機器直接訪問Kibana,所以將配置文件中“server.host”項設置爲localhost。本例中,配置文件爲/usr/share/kibana-4.3.1/config/kibana.yml。實際安裝中,根據拷貝的的路徑,版本區別路徑可能有不同。修改後的文件截圖爲:
2.4 啓動Kibana
$ sudo nohup /usr/share/kibana-4.3.1/bin/kibana &
3. 安裝和配置Nginx
Nginx作爲代理服務器允許外網訪問Dashboard,並提供登陸驗證,以及SSL驗證機制。本實例並未詳細說明登陸驗證,以及SSL驗證機制,具體方法可以參考上一篇《CentOS7上搭建私有的Docker Registry》中相應部分。
3.1 安裝Nginx
首先在/etc/yum.repos.d/目錄下創建Nginx源文件,並複製粘貼以下內容:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
安裝Nginx
sudo yum update
sudo yum install nginx
3.2 配置Nginx爲Kibana提供代理
檢查nginx配置文件/etc/nginx/nginx.conf,是否include /etc/nginx/conf.d/目錄下的所有配置文件。
include /etc/nginx/conf.d/*.conf;
}
在/etc/nginx/conf.d/目錄下創建kibana.conf文件,或者修改default.conf文件爲如下內容:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
重啓nginx service
$ sudo service nginx restart
3.3 Disable selinux
保證Nginx監聽的80端口能成功代理到Kibana監聽的5601端口,需要disable selinux。
/etc/sysconfig/selinux
否則需要執行下面命令保證Kibana可以正常被訪問到:
sudo setsebool -P httpd_can_network_connect 1
3.4 開啓80端口
<span style="font-family:Helvetica Neue;">sudo iptables -A IN_public_allow -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT</span>
爲確保外部IP能夠訪問到Nginx,必須設定iptables規則,對80端口上的traffic放行。到此即已經可以通過外網IP通過Nginx代理訪問到Kibana了。
4. 安裝和配置fluentd
4.1 安裝fluentd,使用td-agent版本
<span style="font-size:14px;">curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh</span>
如果安裝沒反應,可能是在執行rpm --import key的時候造成的無法import key,直接下載“install-redhat-td-agent2.sh”到本地,並在腳本中找到key的鏈接,有瀏覽器打開key,在local創建key文件,並複製粘貼key的內容,修改腳本文件,直接從local import key
4.2 安裝插件
(1)out_elasticsearch:爲fluentd序列號數據提供給Elasticsearch
(2)outrecordreformer:將數據處理成更有用的格式
sudo apt-get install make libcurl
sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-map(沒有這一步,後面兩個好像無法安裝,報“ Could not find a valid gem”)
sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch
sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-record-reformer
4.3 配置fluentd監聽syslog消息並轉發Elasticsearch
<source>
type syslog
port 5140
tag system
</source>
<match system.*.*>
type record_reformer
tag elasticsearch
facility ${tag_parts[1]}
severity ${tag_parts[2]}
</match>
<match elasticsearch>
type copy
<store>
type stdout
</store>
<store>
type elasticsearch
logstash_format true
flush_interval 5s #debug
</store>
</match>
4.4 啓動fluentd
sudo service td-agent start
5. 轉發rsyslog到fluentd
*.* @127.0.0.1:5140
sudo service rsyslog restart
參考鏈接:
Digitalocean: How To Install Elasticsearch, Logstash, and Kibana(ELK Stack) on CentOS 7)
Digitalocean: Elasticsearch, Fluentd, and Kibana: Open Source Log Search and Visualization