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。
数据流入下图所示:
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)
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.2开始,Elasticsearch默认使能了动态脚本能力,由于我们使用Kibana Dashboard供外网访问,所以在/etc/elasticsearch/elasticsearch.yml中增加如下行禁能动态脚本。
script.disable_dynamic: true
sudo service elasticsearch start
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
sudo systemctl enable elasticsearch
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/
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端口。
有两处需要配置,一是需要Kibana读取Elasticsearch的数据,所以需要配置告诉Kibana Elasticsearch的链接地址。二是我使用了nginx作为代理服务器,所以只希望本地的端口转发到达,或在本机直接访问,而不希望其他机器直接访问Kibana,所以将配置文件中“server.host”项设置为localhost。本例中,配置文件为/usr/share/kibana-4.3.1/config/kibana.yml。实际安装中,根据拷贝的的路径,版本区别路径可能有不同。修改后的文件截图为:
$ sudo nohup /usr/share/kibana-4.3.1/bin/kibana &
Nginx作为代理服务器允许外网访问Dashboard,并提供登陆验证,以及SSL验证机制。本实例并未详细说明登陆验证,以及SSL验证机制,具体方法可以参考上一篇《CentOS7上搭建私有的Docker Registry》中相应部分。
首先在/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
检查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
保证Nginx监听的80端口能成功代理到Kibana监听的5601端口,需要disable selinux。
/etc/sysconfig/selinux
否则需要执行下面命令保证Kibana可以正常被访问到:
sudo setsebool -P httpd_can_network_connect 1
<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了。
<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
(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
<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>
sudo service td-agent start
*.* @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