分类目录归档:ElasticStack

Logstash Filebeat 安装配置之使用 Kibana 分析日志数据

什么是 Logstash?

Logstash 是用于管理事件和日志的开源工具。它为数据收集提供实时传递途径。Logstash 将收集你的日志数据,将数据转换为 JSON 文档,并将其存储在 Elasticsearch 中。

本教程的目地是使用Logstash来收集服务器的syslog,并设置Kibana可视化收集的日志。

此次我们需要用到的组件:

Logstash:处理传入日志的的服务器组件
Elasticsearch:存储所有日志。
Kibana:用于搜索和可视化日志的Web界面。
Filebeat:安装在客户端服务器上,利用Filebeat向Logstash搬运日志数据,典型的搬运工。

以上组件都需要用到,确保Elasticsearch、Kibana已经安装好,如未安装,请参阅以下教程:

安装配置 Elasticsearch 搜索引擎集群
ElasticSearch 之 Kibana 二进制安装配置
Elasticsearch Kibana 集群 安装配置 X-pack 扩展包

环境:

Server: CentOS 7 (IP: 10.28.204.65). 16 GB RAM.
&
Logstash/Kibana/Elasticsearch

Client: CentOS 7 (IP: 10.28.204.66). 8 GB RAM.
&
Filebeat

先决条件:

Linux JAVA JDK JRE 环境变量安装与配置

由于Logstash基于Java,请确保您的计算机上安装有OpenJDK或Oracle JDK(暂不支持Java 9)。

安装说明:

ELK 官网对于每种软件提供了多种格式的安装包(zip/tar/rpm/DEB),以 Linux Centos 7 系统为例,如果直接下载 RPM,可以通过 rpm -ivh path_of_your_rpm_file 直接安装成系统 service。以后就可以使用 systemctl 命令启停。比如 systemctl logstash.service start/stop/status。很简单,但缺点也很明显,不能自定义安装目录,相关文件放置比较分散,不易于集中管理。

安装 Logstash

下载地址://www.elastic.co/downloads/logstash

说明:我下面讲述两种安装方式。全程使用超级root用户操作。

二进制压缩包安装方式

1.解压并将其移动到合适的路径:

$ cd /tmp
$ tar zxvf logstash-5.6.3.tar.gz
$ mv logstash-5.6.3 /usr/local
$ cd /usr/local
$ ln -s logstash-5.6.3 logstash
$ mkdir -p /usr/local/logstash/config/conf.d

2.创建用户和组并赋予权限

$ groupadd logstash
$ useradd -g logstash logstash
$ chown -R logstash.logstash logstash*

3.创建systemctl系统单元文件

$ vim /etc/systemd/system/logstash.service

[Unit]
Description=logstash

[Service]
Type=simple
User=logstash
Group=logstash
# Load env vars from /etc/default/ and /etc/sysconfig/ if they exist.
# Prefixing the path with '-' makes it try to load, but if the file doesn't
# exist, it continues onward.
EnvironmentFile=-/usr/local/logstash/config
EnvironmentFile=-/usr/local/logstash/config
ExecStart=/usr/local/logstash/bin/logstash "--path.settings" "/usr/local/logstash/config"
Restart=always
WorkingDirectory=/
Nice=19
LimitNOFILE=16384

[Install]
WantedBy=multi-user.target

安装完成。此种安装方法优势在于配置文件集中,易管理,但安装比较麻烦。

YUM 安装方式

此种安装方式简单快速,耗时较短。

1.下载并安装公共签名密钥:

$ rpm --import //artifacts.elastic.co/GPG-KEY-elasticsearch

如果下载失败,请将服务器DNS修改为 8.8.8.8 重启网卡即可。

2.添加logstash镜像源

$ vim /etc/yum.repos.d/logstash.repo

[logstash-5.x]
name=Elastic repository for 5.x packages
baseurl=//artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=//artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

3.开始安装

$ yum install logstash -y

安装完后会自动生成logstash.service单元文件,无需手动创建。

说明5.x 代表:默认安装最新版的logstash,可根据需求把 x 更改为具体版本号,例如:5.6

YUM安装后的相关配置目录:

/usr/share/logstash - 主程序
/etc/logstash - 配置文件
/var/log/logstash - 日志
/var/lib/logstash - 数据存储

开始配置 Logstash

注意:以下操作,我使用第一种安装方式配置。

Filebeat(Logstash Forwarder)通常安装在客户端服务器上,并使用SSL证书验证Logstash服务器的身份以进行安全通信。

1.生成有效期为365天的自签名SSL证书,使用主机名或IP SAN创建SSL证书。

方法一(主机名):

$ cd /etc/pki/tls/

现在创建SSL证书。将“server.renwolecom.local” 替换为你的logstash服务器主机名。

$ openssl req -x509 -nodes -newkey rsa:2048 -days 365 -keyout private / logstash-forwarder.key -out certs / logstash-forwarder.crt -subj / CN = server.renwolecom.local

2.如果你计划使用IP地址而不是主机名,请按照以下步骤为IP SAN创建SSL证书。

方法二(IP地址):

要创建IP SAN证书,你需要在OpenSSL配置文件中的SubjectAltName中添加一个logstash服务器的IP地址。

$ vim /etc/pki/tls/openssl.cnf

查找 “[v3_ca]” 部分,在此字段下方添加logstash服务器的IP,例如:

subjectAltName = IP:10.28.204.65

$ cd /etc/pki/tls/
$ openssl req -x509 -days 365 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

本文采用后者。

配置 logstash.conf

Logstash配置可以在/etc/logstash(YUN安装方式)中找到。由于我是二进制安装,所以需要在 /usr/local/logstash/config 目录下创建conf.d文件夹(已创建)。

logstash配置文件由三部分组成,分别是:输入、过滤、输出; 你可以在 /usr/local/logstash/config/conf.d 下分别创建三个配置文件,也可以将这三个部分放在一个配置文件中。

1.我建议你使用单个文件并放置输入、过滤、输出部分。

$ vim /usr/local/logstash/config/conf.d/logstash.conf

2.在输入部分,我将配置Logstash通信端口以及添加SSL证书,从而进行安全通信。

input {
 beats {
   port => 5044
   ssl => true
   ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
   ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

3.在过滤器部分,我们将使用Grok来解析这些日志,然后将其发送到Elasticsearch。以下grok过滤器将查找“syslog”标记的日志,并尝试解析它们,以生成结构化索引。

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

4.在输出部分,我们将定义要存储的日志位置; 这个很显然是Elasticsearch服务器。

output {
 elasticsearch {
  hosts => [ "10.28.204.65:9200" ]
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
 user => elastic
 password => changeme
       }
stdout {
    codec => rubydebug
       }
}

5.完整配置内容如下:

$ cat /usr/local/logstash/config/conf.d/logstash.conf

input {
 beats {
   port => 5044
   ssl => true
   ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
   ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}
filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}
output {
 elasticsearch {
  hosts => [ "10.28.204.65:9200" ]
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
 user => elastic
 password => changeme
       }
stdout {
    codec => rubydebug
       }
}

修改 logstash.yml 主配置文件

修改完成后的内容如下:

$ egrep -v "(^#|^$)" /usr/local/logstash/config/logstash.yml

path.config: /usr/local/logstash/config/conf.d
path.logs: /usr/local/logstash/logs

主要是上面路径。

启动 logstash 并加入开机自启

$ systemctl start logstash
$ systemctl enable logstash

启动后你可以通过如下命令查看日志状态,从而解决任何可能出现的问题。

YUM安装查看日志:

$ cat /var/log/logstash/logstash-plain.log

二进制安装查看日志:

$ cat /usr/local/logstash/logs/logstash-plain.log

请根据自己的实际路径查看操作。

在客户端服务器上安装 Filebeat

1.有5个Beats客户端可用,分别是:

Filebeat – 实时洞察日志数据。
Packetbeat – 分析网络数据包数据。
Metricbeat – 采集服务的各项性能指标。
Winlogbeat – 轻量级的Windows事件日志。
Heartbeat – 主动探测来监控其可用性的服务。

2.要分析客户端计算机的系统日志(例如:10.28.204.66),我们需要安装filebeat。使用以下命令进行安装:

$ curl -L -O //artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.6.3-x86_64.rpm
$ rpm -vi filebeat-5.6.3-x86_64.rpm

配置 Filebeat

现在是时候将filebeat与Logstash连接起来,按照下面的步骤来获得配置ELK Stack的filebeat。

1.Filebeat(beats)使用SSL证书验证logstash服务器身份,因此将logstash-forwarder.crt从logstash服务器复制到客户端。

$ scp -pr root@10.28.204.65:/etc/pki/tls/certs/logstash-forwarder.crt /etc/ssl/certs/

2.打开filebeat配置文件

$ vim /etc/filebeat/filebeat.yml

3.我们将配置filebeat来发送 /var/log/messages 日志内容到Logstash服务器。因此请在路径部分下修改现有的配置。请注释掉– /var/log/*.log,以避免将该目录中所有.log文件发送到Logstash。

...
paths:

- /var/log/messages
# - /var/log/*.log
...

4.注释掉“output.elasticsearch”部分。因为我们不会直接将日志存储到Elasticsearch

...
#output.elasticsearch:
...

5.现在,找到 “output.logstash” 行。并修改如下所示的内容:

本节定义filebeat将日志发送到logstash服务器“10.28.204.65:5044”。并修改SSL证书所在的路径。

...
output.logstash:
  # The Logstash hosts
  #hosts: ["localhost:5044"]
  hosts: ["103.28.204.65:5044"]

  # Optional SSL. By default is off.
  # List of root certificates for HTTPS server verifications
  ssl.certificate_authorities: ["/etc/ssl/certs/logstash-forwarder.crt"]
...

保存并退出。
重要:Filebeat的配置文件采用YAML格式,这意味着缩进非常重要!请务必使用与这些说明相同数量的空格。

重新启动 Filebeat 服务

$ systemctl restart filebeat
$ cat /var/log/filebeat/filebeat

Firewall 防火墙设置

$ firewall-cmd --permanent --zone=public --add-port=5044/tcp
$ firewall-cmd --reload

测试数据是否正常存储

在你的 Elasticsearch 服务器上,通过使用以下命令,验证 Elasticsearch 是否接收到 Filebeat>logstash 数据:

$ curl -u elastic -XGET '//10.28.204.65:9200/filebeat-*/_search?pretty'

回车后输入你的认证密码,你应该看到一堆如下的输出:

...
{
"_index" : "filebeat-2017.11.1",
"_type" : "log",
"_id" : "AV8Zh29HaTuC0RmgtzyM",
"_score" : 1.0,
"_source" : {
"@timestamp" : "2017-11-1T06:16:34.719Z",
"offset" : 39467692,
"@version" : "1",
"beat" : {
"name" : "204",
"hostname" : "204",
"version" : "5.6.3"
},
"input_type" : "log",
"host" : "204",
"source" : "/var/log/messages",
"message" : "Nov 11 19:06:37 204 logstash: at org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.java:182)",
"type" : "log",
"tags" : [
"beats_input_codec_plain_applied"
]
}
...

如果你的输出显示为 0,那么你应该排查logstash与Elasticsearch的通信是否正常,通过可以通过查看启动日志得出结论。如果你获得了预期的输出,则进行下一步。

连接到 Kibana

1.使用以下URL访问Kibana:

//10.28.204.65:5601/

2.在你的第一次登录时,你必须映射filebeat索引。

在索引名称或模式框中键入以下内容:

filebeat-*

选择 @timestamp 然后单击创建。

3.还可以登录 logstash
依次打开:

Management >> Index Patterns >> Create Index Pattern

输入:

filebeat-*

选择:

@timestamp

其他默认,点击:Create

4.创建完成后点击:

Discover >> filebeat-*

此时你可以在右侧查看客户端 10.28.204.66 的系统日志。

ELK Stack Logstash 的安装配置与结合使用到目前为止已经完成,Kibana不仅仅局限于此,他还有更强大的功能,值得深入研究。

Elasticsearch Analysis Ik 中文分词模块安装

Elasticsearch本身内置了很多分词器,但中文词库 chinese 效果不佳,所以需要安装三方 ik 插件实现生产需求。

什么是 IK Analyzer?

IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。

先决条件:

安装配置 Elasticsearch 搜索引擎集群

1.安装 Ik

登录到ES服务器,进入Bin目录开始安装

$ cd /usr/local/elasticsearch
$ bin/elasticsearch-plugin install //github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.3/elasticsearch-analysis-ik-5.6.3.zip
-> Downloading //github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.3/elasticsearch-analysis-ik-5.6.3.zip
[=================================================] 100%
-> Installed analysis-ik

安装成功。

2.如果卸载,请执行如下命令

$ bin/elasticsearch-plugin remove analysis-ik

3.重启ES服务

$ systemctl restart elasticsearch

4.查看启动日志

$ cat /usr/local/elasticsearch/logs/my-apprenwole.log

其中elasticsearch在启动中加载模块的时会生成以下日志记录,说明analysis-ik中文分词插件已经可以使用。

[INFO ][o.e.p.PluginsService ] [renwolenode-1] loaded plugin [analysis-ik]

5.创建一个名为index的索引

$ curl -u elastic -XPUT //10.28.204.65:9200/index
Enter host password for user 'elastic':
{"acknowledged":true,"shards_acknowledged":true,"index":"index"}

说明:

-u 是用户名
回车后会让你输入密码,默认是用户名是:elastic 密码是:changeme

6.创建一个映射

curl -u elastic -XPUT //10.28.204.65:9200/index/fulltext/_mapping -d'
{
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
}'

7.创建测试数据

curl -u elastic -XPUT //10.28.204.65:9200/index/fulltext/1 -d'
{"content":"元芳和你先后跟随于我,总共有十多年了吧,除了危险我没有给过你们什么"}
'

curl -u elastic -XPUT //10.28.204.65:9200/index/fulltext/2 -d'
{"content":"还记得吗,元芳总是开玩笑说:吃上我一顿真是不容易"}
'

curl -u elastic -XPUT //10.28.204.65:9200/index/fulltext/3 -d'
{"content":"可现在我真想把我身上所有的钱都拿出来请他吃上一顿"}
'

curl -u elastic -XPUT //10.28.204.65:9200/index/fulltext/4 -d'
{"content":"元芳总是叫我大人,可我知道,其实在他心中将我当成了父辈"}
'

curl -u elastic -XPUT //10.28.204.65:9200/index/fulltext/5 -d'
{"content":"可是我这个父辈又为他做了什么呢。生与死,我总是让他选择后者"}
'

curl -u elastic -XPUT //10.28.204.65:9200/index/fulltext/6 -d'
{"content":"幽州是这样、湖州是这样、崇州也是这样,这一次他终于没有回来,我能说什么呢,我还能说什么呢"}
'

curl -u elastic -XPUT //10.28.204.65:9200/index/fulltext/7 -d'
{"content":"元芳是为了国家,为社稷,为黎明百姓献出了生命"}
'

curl -u elastic -XPUT //10.28.204.65:9200/index/fulltext/8 -d'
{"content":"如果说此刻我心中还有一丝欣慰,那就是替元芳感到自豪"}
'

curl -u elastic -XPUT //10.28.204.65:9200/index/fulltext/9 -d'
{"content":"如果说此刻我心中还有什么比悲伤更加强烈,那就是仇恨"}
'

8.查询数据

curl -u elastic -XPOST //10.28.204.65:9200/index/fulltext/_search -d'
{
"query" : { "match" : { "content" : "如果" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
'

9.查询返回的数据

{
"took": 21,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.43353066,
"hits": [
{
"_index": "index",
"_type": "fulltext",
"_id": "8",
"_score": 0.43353066,
"_source": {
"content": "如果说此刻我心中还有一丝欣慰,那就是替元芳感到自豪"
},
"highlight": {
"content": [
"<tag1>如果</tag1>说此刻我心中还有一丝欣慰,那就是替元芳感到自豪"
]
}
},
{
"_index": "index",
"_type": "fulltext",
"_id": "9",
"_score": 0.43353066,
"_source": {
"content": "如果说此刻我心中还有什么比悲伤更加强烈,那就是仇恨"
},
"highlight": {
"content": [
"<tag1>如果</tag1>说此刻我心中还有什么比悲伤更加强烈,那就是仇恨"
]
}
}
]
}
}

结语:

建议通过 //10.28.204.65:5601 中的 Dev Tools 开发工具管理,kibana可视化管理真的很方便。

参考:

//github.com/medcl/elasticsearch-analysis-ik

Elasticsearch Kibana 集群 安装配置 X-pack 扩展包

X-pack概述:

X-pack 是一种 Elastic Stack 扩展包,它将安全性、警报、监视、报告和图形功能打包成一个易于安装的包。X-pack可以无缝协同ElasticSearch、 Kibana工作,它可以很好的启用或禁用您要使用的功能。

Elasticsearch 5.0之前,您必须单独安装Shield,Watcher和Marvel插件才能获得在X-Pack中所有的功能。随着X-Pack出现您不再需要担心是否拥有每个插件的正确版本,只需安装您正在运行的Elasticsearch、Kibana版本的X-Pack就可以了。

X-pack安装相对简单很多,下面我将详细介绍。

先决条件:

安装配置 Elasticsearch 搜索引擎集群
ElasticSearch 之 Kibana 二进制安装配置

:您必须运行和ElasticSearch、Kibana版本相匹配的X-Pack版本。

说明:

由于我是集群分布式,所以需要在每台Kibana、ElasticSearch集群服务器上安装X-pack。如果你是单机模式,只需要在单台服务器安装X-pack即可。另外我采用的是网络安装。

1.在 Kibana 服务器安装 X-Pack

全程自动完成安装无需配置,在kibana中安装X-pack时间较久,慢慢等待吧。

直接进入kibana安装目录执行以下命令:

$ cd /usr/local/kibana
$ bin/kibana-plugin install x-pack
Found previous install attempt. Deleting...
Attempting to transfer from x-pack
Attempting to transfer from //artifacts.elastic.co/downloads/kibana-plugins/x-pack/x-pack-5.6.3.zip
Transferring 119526941 bytes....................
Transfer complete
Retrieving metadata from plugin archive
Extracting plugin archive
Extraction complete
Optimizing and caching browser bundles...
Plugin installation complete

安装完成。

2.如果卸载请执行以下命令

$ bin/kibana-plugin remove x-pack

3.在 Elasticsearch 服务器安装 X-Pack

全程自动完成安装也无需配置,这个速度很快。

进入elasticsearch安装目录执行以下命令开始安装:
$ cd /usr/local/elasticsearch
$ bin/elasticsearch-plugin install x-pack
-> Downloading x-pack from elastic
[=================================================] 100%
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: plugin requires additional permissions @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.io.FilePermission \\.\pipe\* read,write
* java.lang.RuntimePermission accessClassInPackage.com.sun.activation.registries
* java.lang.RuntimePermission getClassLoader
* java.lang.RuntimePermission setContextClassLoader
* java.lang.RuntimePermission setFactory
* java.security.SecurityPermission createPolicy.JavaPolicy
* java.security.SecurityPermission getPolicy
* java.security.SecurityPermission putProviderProperty.BC
* java.security.SecurityPermission setPolicy
* java.util.PropertyPermission * read,write
* java.util.PropertyPermission sun.nio.ch.bugLevel write
* javax.net.ssl.SSLPermission setHostnameVerifier
See //docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissions allow and the associated risks.

Continue with installation? [y/N]y
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: plugin forks a native controller @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
This plugin launches a native controller that is not subject to the Java
security manager nor to system call filters.

Continue with installation? [y/N]y
-> Installed x-pack

注意:中途会让你输入两次 Y 表示确认安装。

最后安装完成。

4.如果卸载请执行如下命令

$ bin/elasticsearch-plugin remove x-pack

5.重启服务

$ systemctl restart elasticsearch
$ systemctl restart kibana

重启完成后你就可以通过 //10.28.204.65:5601 进行管理。默认登录账号是:elastic 密码是:changeme

登录后点击 Monitoring 可查看 Elasticsearch 和 Kibana 集群信息,再进一步可以查看监控图表信息。此外还可以进行账户设置等,我就不上图了。

6.许可证管理

初次安装X-Pack提供30天的试用许可证,允许使用X-Pack所有功能。但试用期结束后,将禁用其所有功能,所以我们需要申请订阅免费的许可证(当然你也可以购买企业许可证)。

7.更新许可证

申请完许可证后会通过邮箱发你一封邮件,下载对应的 json 文件即可,许可证作为您使用 API 安装的JSON文件提供license,你可以将其上传到服务器/tmp目录。

然后执行以下命令:

$ curl -XPUT -u elastic '//10.28.204.65:9200/_xpack/license?acknowledge=true' -H "Content-Type: application/json" -d @/tmp/license.json

许可证更新成功后是1年有效期,在订阅的时候有说明。

接下来你就愉快的玩耍吧。

ElasticSearch 之 Kibana 二进制安装配置

介绍:

Kibana 是一个开源分析数据可视化平台。你可以使用 Kibana 对数据进行高效的搜索、可视化、分析,还可以与 Elasticsearch 搜索引擎之中的数据进行交互。

Kibana 可以轻松掌握大量的数据。 其基于浏览器的界面使您能够快速创建共享动态仪表板,实时监控 ElasticSearch 的查询与更改。

先决条件:

安装配置 Elasticsearch 搜索引擎集群

要求:Kibana 与 Elasticsearch 的版本必须一致。

1.创建用户和组

$ groupadd kibana
$ useradd -g kibana kibana

2.安装 Kibana

下载地址://www.elastic.co/products

解压创建软连接:

$ cd /tmp
$ sha1sum kibana-5.6.3-linux-x86_64.tar.gz
$ tar zxvf kibana-5.6.3-linux-x86_64.tar.gz
$ mv kibana-5.6.3-linux-x86_64 /usr/local
$ cd /usr/local
$ ln -s kibana-5.6.3-linux-x86_64 kibana

3.配置 kibana

配置完成后的内容如下:

$ egrep -v "^$|^#|^;" /usr/local/kibana/config/kibana.yml

server.port: 5601
server.host: "10.28.204.65"
server.name: "10.28.204.65"
elasticsearch.url: "//10.28.204.65:9200"
elasticsearch.preserveHost: true
elasticsearch.pingTimeout: 1500
elasticsearch.requestTimeout: 30000
pid.file: /usr/local/kibana/kibana.pid

更多配置请参阅配置 Kibana

4.赋予 Kibana 目录权限

$ cd /usr/local
$ chown -R kibana.kibana kibana*

5.启动 kibana

$ cd /usr/local/kibana/bin
$ ./kibana
log [02:01:19.285] [info][status][plugin:kibana@5.6.3] Status changed from uninitialized to green - Ready
log [02:01:19.819] [info][status][plugin:elasticsearch@5.6.3] Status changed from uninitialized to yellow - Waiting for Elasticsearch
log [02:01:20.078] [info][status][plugin:console@5.6.3] Status changed from uninitialized to green - Ready
log [02:01:20.288] [info][status][plugin:metrics@5.6.3] Status changed from uninitialized to green - Ready
log [02:01:21.263] [info][status][plugin:timelion@5.6.3] Status changed from uninitialized to green - Ready
log [02:01:21.306] [info][listening] Server running at //10.28.204.65:5601
log [02:01:21.315] [info][status][ui settings] Status changed from uninitialized to yellow - Elasticsearch plugin is yellow
log [02:01:25.304] [info][status][plugin:elasticsearch@5.6.3] Status changed from yellow to yellow - No existing Kibana index found
log [02:01:29.992] [info][status][plugin:elasticsearch@5.6.3] Status changed from yellow to green - Kibana index ready
log [02:01:30.008] [info][status][ui settings] Status changed from yellow to green - Ready

打印出了启动状态,已经启动成功。

现在你可以使用 //10.28.204.65:5601 进行访问配置即可。

6.创建 systemctl 系统 Kibana 单元文件

我们需要创建单元服务文件,目的是为了便于管理:

$ vim /usr/lib/systemd/system/kibana.service

添加以下内容:

[Unit]
Description=Kibana

[Service]
Type=simple
User=kibana
Group=kibana
# Load env vars from /etc/default/ and /etc/sysconfig/ if they exist.
# Prefixing the path with '-' makes it try to load, but if the file doesn't
# exist, it continues onward.
EnvironmentFile=-/usr/local/kibana/config
EnvironmentFile=-/etc/sysconfig/kibana
ExecStart=/usr/local/kibana/bin/kibana "-c /usr/local/kibana/config/kibana.yml"
Restart=always
WorkingDirectory=/

[Install]
WantedBy=multi-user.target

7.启动并加入开机启动

$ systemctl restart kibana
$ systemctl enable kibana

8.设置防火墙

$ firewall-cmd --permanent --zone=public --add-port=5601/tcp
$ firewall-cmd --reload

到目前为止 Kibana 已经安装完成,并可以正常使用。

安装配置 Elasticsearch 搜索引擎集群

Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎。它允许您快速,实时地存储,搜索和分析大量数据。它通常用作为具有复杂的搜索功能和要求的应用程序提供的底层引擎技术。

Elasticsearch 安装方式如同Tomcat,开箱即用,无需安装复杂的依赖包。

先决条件:

Elasticsearch至少需要Java 8版本。以下是安装文档,所以我们在这里不再赘述。

Linux JAVA JDK JRE 环境变量安装与配置

集群部署环境及设备配置:

/台/16G/8核/500G

10.28.204.62
10.28.204.63
10.28.204.64
10.28.204.65

Elasticsearch 5.6.3
CentOS Linux release 7.4.1708 (Core)
Kernel: Linux 3.10.0-693.2.2.el7.x86_64

说明:以下安装步骤,我在 10.28.204.65 服务器操作,其他机器均相同,我会标注集群重点部分。

1.创建用户及组并设置密码

$ groupadd es
$ useradd -g es es
$ passwd es

2.安装 Elasticsearch

下载地址 //www.elastic.co/downloads/elasticsearch#ga-release

解压:

$ cd /tmp
$ tar zxvf elasticsearch-5.6.3.tar.gz

移动目录并创建软连接:

$ mv elasticsearch-5.6.3 /usr/local
$ cd /usr/local
$ ln -s elasticsearch-5.6.3 elasticsearch

设置目录用户权限:

$ chown -R es.es elasticsearch*

3.配置  jvm.options

Elasticsearch默认堆内存为2 GB,无法满足需求,需要将以下文件中的2个Xms、Xmx修改为8G即可,其他默认。

$ vim /usr/local/elasticsearch/config/jvm.options
...
-Xms8g
-Xmx8g
...

注意:建议分配机器物理内存一半大小,最大不要超过32GB。

4.配置 elasticsearch.yml

配置后的内容如下:

$ egrep -v "(^#|^$)" /usr/local/elasticsearch/config/elasticsearch.yml
cluster.name: my-apprenwole
#集群名称,任意。ES启动后会将具有相同集群名字的节点放到一个集群下。

node.name: renwolenode-1
#节点名称 任意 唯一值。

bootstrap.memory_lock: false
#关闭锁定内存。

network.host: 10.28.204.65
#本机IP地址,每个节点都要修改。

http.port: 9200
#http访问端口为了安全建议修改。

discovery.zen.ping.unicast.hosts: ["10.28.204.62","10.28.204.63", "10.28.204.64","10.28.204.65"]
#当新节点启动时,传递主机的初始列表以执行发现。如果端口不是默认,需加上端口。

discovery.zen.minimum_master_nodes: 3
#指定集群节点中有几个有master资格的节点。如果是多个集群可以写3个以上。

client.transport.ping_timeout: 120s
#等待来自节点的ping响应的时间。默认为60s。

discovery.zen.ping_timeout: 120s
#允许选举时间处理速度慢或拥塞网络的情况下的调整(较高的值保证故障少的几率)。

http.cors.enabled: true
#启用或禁用跨原始资源共享,即;另一来源上的浏览器是否可以针对Elasticsearch执行请求。

http.cors.allow-origin: "*"
#默认为不允许来源。如果您预先添加并附/加到该值,则将其视为正则表达式,允许您支持HTTP和HTTP。例如使用/https?:\/\/localhost(:[0-9]+)?/将在两种情况下适当返回请求头。*是一个有效的值,但被认为是一个安全风险,因为您的弹性搜索实例可以从任何地方交叉发起请求。

说明:Elasticsearch默认值配置具有良好设置,并且需要很少的配置,默认经过少许配置即可用于生产。

更多配置信息,请参阅 Elasticsearch modules

注:其他三台机器除以下参数不同,其他均为相同:

node.name
network.host

5.Memlock设置

在该文件中添加以下内容:

$ vim /etc/security/limits.conf

es soft memlock unlimited
es hard memlock unlimited
es - nofile 65536

如果不添加,启动的时候会报警告信息:

Unable to lock JVM Memory: error=12, reason=Cannot allocate memory
This can result in part of the JVM being swapped out.
Increase RLIMIT_MEMLOCK, soft limit: 65536, hard limit: 65536
These can be adjusted by modifying /etc/security/limits.conf, for example:
# allow user 'es' mlockall
es soft memlock unlimited
es hard memlock unlimited

以上错误信息还给出了解决方案。

6.服务器内存设置

$ vim /etc/sysctl.conf

vm.max_map_count=262144

$ sysctl -p

7.启动 Elasticsearch

由于ES默认不允许root直接启动,这是为了安全起见,下面切换为 es 账号启动:

[root@102820465 ~]# su es
[es@102820465 ~]$ cd /usr/local/elasticsearch/bin
[es@102820465 bin]$ ./elasticsearch
[INFO ][o.e.n.Node ] [renwolenode-1] initializing ...
[INFO ][o.e.e.NodeEnvironment ] [renwolenode-1] using [1] data paths, mounts [[/ (rootfs)]], net usable_space [4021.3mb], net total_space [15.9gb], spins? [unknown], types [rootfs]
[INFO ][o.e.e.NodeEnvironment ] [renwolenode-1] heap size [7.9gb], compressed ordinary object pointers [true]
[INFO ][o.e.n.Node ] [renwolenode-1] node name [renwolenode-1], node ID [vkixu3LZTPq82SAWWXyNcg]
[INFO ][o.e.n.Node ] [renwolenode-1] version[5.6.3], pid[21425], build[667b497/2017-10-18T19:22:05.189Z], OS[Linux/3.10.0-514.el7.x86_64/amd64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_144/25.144-b01]
[INFO ][o.e.n.Node ] [renwolenode-1] JVM arguments [-Xms8g, -Xmx8g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -Djdk.io.permissionsUseCanonicalPath=true, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Dlog4j.skipJansi=true, -XX:+HeapDumpOnOutOfMemoryError, -Des.path.home=/usr/local/elasticsearch]
[INFO ][o.e.p.PluginsService ] [renwolenode-1] loaded module [aggs-matrix-stats]
[INFO ][o.e.p.PluginsService ] [renwolenode-1] loaded module [ingest-common]
[INFO ][o.e.p.PluginsService ] [renwolenode-1] loaded module [lang-expression]
[INFO ][o.e.p.PluginsService ] [renwolenode-1] loaded module [lang-groovy]
[INFO ][o.e.p.PluginsService ] [renwolenode-1] loaded module [lang-mustache]
[INFO ][o.e.p.PluginsService ] [renwolenode-1] loaded module [lang-painless]
[INFO ][o.e.p.PluginsService ] [renwolenode-1] loaded module [parent-join]
[INFO ][o.e.p.PluginsService ] [renwolenode-1] loaded module [percolator]
[INFO ][o.e.p.PluginsService ] [renwolenode-1] loaded module [reindex]
[INFO ][o.e.p.PluginsService ] [renwolenode-1] loaded module [transport-netty3]
[INFO ][o.e.p.PluginsService ] [renwolenode-1] loaded module [transport-netty4]
[INFO ][o.e.p.PluginsService ] [renwolenode-1] no plugins loaded
[INFO ][o.e.d.DiscoveryModule ] [renwolenode-1] using discovery type [zen]
[INFO ][o.e.n.Node ] [renwolenode-1] initialized
[INFO ][o.e.n.Node ] [renwolenode-1] starting ...
[INFO ][o.e.t.TransportService ] [renwolenode-1] publish_address {10.28.204.65:9300}, bound_addresses {10.28.204.65:9300}
[INFO ][o.e.b.BootstrapChecks ] [renwolenode-1] bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks
[WARN ][o.e.n.Node ] [renwolenode-1] timed out while waiting for initial discovery state - timeout: 30s
[INFO ][o.e.h.n.Netty4HttpServerTransport] [renwolenode-1] publish_address {10.28.204.65:9200}, bound_addresses {10.28.204.65:9200}
[INFO ][o.e.n.Node ] [renwolenode-1] started

节点成功启动,状态:started 启动后当前终端会一直显示 ElasticSearch 状态信息。

假如启动失败,会显示详细错误说明,根据报错解决即可。

如果退出按 Ctrl + c 同时 ElasticSearch 也会停止。

8.重开一个终端访问ES

$ curl //10.28.204.65:9200/

{
"name" : "renwolenode-1",
"cluster_name" : "my-apprenwole",
"cluster_uuid" : "Xf_ZdW0XQum4rycQA40PfQ",
"version" : {
"number" : "5.6.3",
"build_hash" : "667b497",
"build_date" : "2017-10-18T19:22:05.189Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}

返回ES的部分信息,说明ES可以正常使用。

9.创建 systemd 单元服务文件

事实上我们在生产环境中,管理ES的时候,不可能来回切换账号用 ./elasticsearch 方式启动。若Elasticsearch服务器宕机恢复时无法随机启动,就会给运维人员带来不必要的麻烦。

因此创建开机自启动文件:

$ vim /usr/lib/systemd/system/elasticsearch.service

添加以下内容:

[Service]
Environment=ES_HOME=/usr/local/elasticsearch
Environment=CONF_DIR=/usr/local/elasticsearch/config
Environment=DATA_DIR=/usr/local/elasticsearch/data
Environment=LOG_DIR=/usr/local/elasticsearch/logs
Environment=PID_DIR=/usr/local/elasticsearch
EnvironmentFile=-/usr/local/elasticsearch/config

WorkingDirectory=/usr/local/elasticsearch

User=es
Group=es

ExecStartPre=/usr/local/elasticsearch/bin/elasticsearch-systemd-pre-exec

ExecStart=/usr/local/elasticsearch/bin/elasticsearch \
-p ${PID_DIR}/elasticsearch.pid \
--quiet \
-Edefault.path.logs=${LOG_DIR} \
-Edefault.path.data=${DATA_DIR} \
-Edefault.path.conf=${CONF_DIR}

# StandardOutput is configured to redirect to journalctl since
# some error messages may be logged in standard output before
# elasticsearch logging system is initialized. Elasticsearch
# stores its logs in /var/log/elasticsearch and does not use
# journalctl by default. If you also want to enable journalctl
# logging, you can simply remove the "quiet" option from ExecStart.
StandardOutput=journal
StandardError=inherit

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Specifies the maximum number of processes
LimitNPROC=2048

# Specifies the maximum size of virtual memory
LimitAS=infinity

# Specifies the maximum file size
LimitFSIZE=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=0

# SIGTERM signal is used to stop the Java process
KillSignal=SIGTERM

# Send the signal only to the JVM rather than its control group
KillMode=process

# Java process is never killed
SendSIGKILL=no

# When a JVM receives a SIGTERM signal it exits with code 143
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

# Built for distribution-5.6.3 (distribution)

10.重启 elasticsearch

$ systemctl restart elasticsearch

注:重启ES后不会立即运行,它有一个启动过程,约1min左右,即可通过 ss -ntlp 查看 9200、9300是否运行,运行后再查看集群状态。

11.设置 Firewalld 防火墙

$ firewall-cmd --permanent --add-port={9200/tcp,9300/tcp}
$ firewall-cmd --reload
$ firewall-cmd --list-all

12.查看集群状态

在集群中输入以下URL即可获取集群健康状态信息:

$ curl //10.28.204.65:9200/_cluster/health?pretty

{
"cluster_name" : "my-apprenwole", //集群名称
"status" : "green", //集群的状态分为:红/绿/灯,绿:健康,黄:亚健康,红:病态
"timed_out" : false,
"number_of_nodes" : 4, //节点数
"number_of_data_nodes" : 4, //数据节点
"active_primary_shards" : 6, //主分片总数
"active_shards" : 22, //集群内所有索引的分片总数
"relocating_shards" : 0, //正在迁移中的分片数
"initializing_shards" : 0, //正在初始化的分片数
"unassigned_shards" : 0, //未分配到具体节点上的分片数
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0 //活动碎片百分比
}

我们采用4台ES实例,所以集群也显示了具体数据,说明集群运行正常。

ES集群已经安装完成。此文为原创内容,可直接用于生产。ES有很多插件,后期我会写一些相关文档,例如:Kibana、Logstash、X-Pack 这些插件都是官方插件,相当实用。

Nginx 反向代理实现 Kibana 登录认证功能

Kibana 5.5 版后,已不支持认证功能,也就是说,直接打开页面就能管理,想想都不安全,不过官方提供了 X-Pack 认证,但有时间限制。毕竟X-Pack是商业版。

下面我将操作如何使用Nginx反向代理实现kibana的认证功能。

先决条件:

Centos 7 源码编译安装 Nginx

1.安装 Apache Httpd 密码生成工具

$ yum install httpd-tools -y

2.生成Kibana认证密码

$ mkdir -p /usr/local/nginx/conf/passwd
$ htpasswd -c -b /usr/local/nginx/conf/passwd/kibana.passwd Userrenwolecom GN5SKorJ
Adding password for user Userrenwolecom

3.配置Nginx反向代理

在Nginx配置文件中添加如下内容(或新建配置文件包含):

$ vim /usr/local/nginx/conf/nginx.conf

server {
listen 10.28.204.65:5601;
auth_basic "Restricted Access";
auth_basic_user_file /usr/local/nginx/conf/passwd/kibana.passwd;
location / {
proxy_pass //10.28.204.65: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; 
}
}

4.配置Kibana

取消下面注释:

$ vim /usr/local/kibana/config/kibana.yml

server.host: "10.28.204.65"

5.重启 Kibana 及 Nginx 服务使配置生效

$ systemctl restart kibana.service
$ systemctl restart nginx.service

接下来浏览器访问 //103.28.204.65:5601/ 会提示验证弹窗,输入以上生成的用户密码登录即可。