# ELK安装笔记
刘银
## 什么是ELK
ELK是Elasticsearch、 Logstash、Kibana三个开源软件的组合而成,形成一款强大的实时日志收集、展示系统。
- **Elasticsearch(ES)**:基于Lucene的高性能搜索框架,特点:`高性能`,`分布式`,`restful`
- **Logstash**:日志收集、结构化工具,可以从本地磁盘,网络服务消息队列中收集各种各样
的日志, 然后进行过滤分析, 并将日志输出到Elasticsearch(也可以是其他应用)
- **Kibana**:可视化日志Web展示工具,对Elasticsearch中存储的日志进行展示,还可以生成炫丽的仪表盘。其原理是大量使用了ELasticsearch的聚合功能。
现在,除了ES外,Elastic网站提出了Elastic stack的概念,相当于一个全家桶,其中重要的组件还有**X-Pack** 和 **Beat**
> Logstach是可以脱离ES单独使用的。Kibana不行。
## ES安装(5.2+)
一、环境
1. JDK1.8
2. Linux内核3.5及以上
> 如果不是3.5以上内核,ES启动时会报异常,单机可以忽略。
> 如果是集群,ES启动报异常不会通过,要在ES安装目录的config文件夹下的elasticsearch.yml中配置:`bootstrap.system_call_filter: false`,忽略该异常。
二、单机安装(centos 6.8 64位)
1. 下载 elasticsearch-5.2.2.tar.gz(版本号可选)
2. 解压 `tar zxvf elasticsearch-5.2.2.tar.gz`
3. 执行安装目录下的`./bin/elasticsearch` 启动
三、启动中的问题
1. **不能用root启动**,ES官方直接不允许,必须新创建用户并授予相应的权限
2. 由于ES是一个对多线程要求很高的应用,所以对一些基础的linux系统配置要进行更改:
- 相关系统设置:
- vim /etc/sysctl.conf
- vm.max_map_count= 262144
- sysctl –p
- 系统打开文件数配置:
* vim /etc/security/limits.conf
* hard nofile 65536
* soft nofile 65536
- 修改用户打开的线程数,因为 es 的段要经常打开文件控制索引:
* vim /etc/security/limits.d/90-nproc.conf
* soft nproc 2048
3. 在安装目录的config目录中,有个jvm.options配置文件,其中有初始化jvm的大小。默认2g,官方推荐生产环境4g,我这里的虚拟机环境(单核,1G内存),改成256m:
* -Xms256m
* -Xmx256m
> 通常在启动过程中,有异常报出来,根据异常信息去百度,都会有解决办法。
四、配置文件
在config目录下的`elasticsearch.yml`文件是主要的配置文件,配置参数解释如下:
|名称 | 说明|
|---|---|
|`cluster.name` |集群名称,一个集群的唯一标识|
|`node.name` |节点名称,每个节点唯一|
|`node.rack` |为节点添加自定义属性|
|`path.data` |数据存储路径,可默认|
|`path.logs` |日志存储路径,可默认|
|`bootstrap.memory_lock` |启动过程中是否为内存加锁,`true`/`false`|
|`network.host` |绑定的本机ip|
|`http.port` |自定义http端口,默认9200|
|`discovery.zen.ping.unicast.hosts` |当新节点加入的时候,配置一个初始化主机列表用于节点发现|
|`discovery.zen.minimun_master_nodes` |为了避免发生脑裂的最小节点数,数值为(有主节点资格的节点数量/2 + 1)|
|`gateway.recover_after_nodes` | 如果集群发生重启,要直到多少个节点启动完成,才能开始进行集群初始化恢复动作|
|`action.destructive_requires_name` |删除索引时,需要明确的索引名称|
五、集群配置(以3台为例,3台都可以成主节点)
关键点:
- 集群名称相同
- 节点名称不能相同
- 计算最小主节点数
- 要锁住内存防止异常
配置示例:
* cluster.name: wukong *集群名称,整个集群唯一,集群中的节点要相同*
* node.name: wk-01 *节点名称,每个节点(ES)唯一*
* bootstrap.memory_lock: true *锁住内存,避节点抛异常造成集群不可用*
* newwork.host: 192.168.87.131 *本节点的地址*
* discovery.zen.ping.unicast.host: [“192.168.87.131”,”192.168.87.130”,”192.168.87.129”] *启动时的集群发现*
* discovery.zen.minimum_master_nodes: 2 *最小主节点数*
注意:
在我的centos6.8 环境中,还要执行如下命令来解除锁内存的限制(命令是当时生效,可永久配置)
> ulimit -l unlimited
==由于条件限制,下面的演示都是单节点环境。集群的特有信息,将在以后补充==
当我们启动ES后,在命令行输入
> curl -XGET '192.168.87.131:9200'
出现以下信息,表示启动成功
```javascript
{
"name" : "liuyin-n1", // 节点名称
"cluster_name" : "liuyin", // 集群名称
"cluster_uuid" : "Wn0JKxCKRwK0aTSm8BPZTg", // 节点uuid,唯一,由ES代码生成
"version" : {
"number" : "5.2.2", // es版本号
"build_hash" : "f9d9b74", // hash值
"build_date" : "2017-02-24T17:26:45.835Z", // 创建时间
"build_snapshot" : false, // 是否创建快照
"lucene_version" : "6.4.1" // 底层lucene版本号
},
"tagline" : "You Know, for Search" // 口号
}
```
查看集群基本信息
> curl -XGET '192.168.87.131:9200/_cluster/health?pretty'
```
{
"cluster_name" : "liuyin", // 集群名称
"status" : "yellow", // 集群状态,重要
"timed_out" : false,
"number_of_nodes" : 1, // 节点数,这里可以看出只有一个阶段,是单机环境
"number_of_data_nodes" : 1,
"active_primary_shards" : 23,
"active_shards" : 23,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 23,
"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" : 50.0
}
```
关于status
颜色 | 含义
---|---
green | 所有主要分片和复制分片都可用
yellow | 所有主要分片可用,但不是所有复制分片都可用,**最小保障**
red | 不是所有主分片都可用
>关于ES的命令,不是本章内容,有兴趣可以参看其他相关资料
## 插件安装
### 一、head插件
head插件是一个网页版的ES可视化客户端,简单易用、功能强大。
在ES2.X时代,head作为ES的标准插件来安装,到了ES5.X,官方已经把head移除了(估计是太强大,提供了很多官方其他插件要收费才能使用的功能,而官方强烈推荐的使用x-pack来管理ES,也和head的管理有所冲突,所有head被放弃了),但head也做了变通,依然可以作为一个独立的前端应用,通过node.js来安装。
1、通过node.js来安装head插件
> mkdir head
> cd head
> git clone git://github.com/mobz/elasticsearch-head.git
> cd elasticsearch-head
> npm install
> npm install -g grunt-cli
> grunt server
看到如下信息,表示启动成功
- Running "connect: server" (connect) task
- Waiting forever...
- Started connect web server on http://localhost:9100
可以看到,默认绑定的是9100端口。
2、配置ES允许跨域访问
由于head插件已经不能被ES默认支持,我们还要在ES的配置文件`elasticsearch.yml`中加入下面两个配置后重启,才能访问:
> http.cors.enabled: true
> http.cors.allow-origin: "*"
根据ip地址访问:`192.168.87.131:9100`,如下:
![image](http://omumkhlu9.bkt.clouddn.com/head%E6%8F%92%E4%BB%B6%E7%95%8C%E9%9D%A2.jpg)
至此,head插件的安装就成功了
二、X-Pack安装
1、X-Pack简介
X-Pack是Elastic Stack(可以理解为整个Elastic体系)中一个非常重要的组件,它集如下功能于一身:
![image](http://omumkhlu9.bkt.clouddn.com/X-Pack%E5%8C%85%E6%8B%AC%E7%9A%84%E5%8A%9F%E8%83%BD.jpg)
> 依次为:安全、告警、监控、报告、图表、机器学习(即将支持)
可以说,X-Pack是Elastic家族不可缺少的重要组件。
2、X-Pack安装
X-Pack是一个插件,它必须依赖于主体进行安装。比如依赖于ES、Logstash、Kibana。这里在ES下安装如下:
先停止ES服务
然后再安装目录的bin目录下执行elasticsearch-plugin
> ./bin/elasticsearch-plugin install x-pack
但一个问题是,x-pack有100m+,这种方式直接从国外网站下载插件,是很慢的,所有可以把x-pack下载下来再安装,下载地址:
[https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-5.2.2.zip](https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-5.2.2.zip)
上传到linux中,比如在/luyou/elk/x-pack-5.2.2.zip,执行命令如下:
> bin/elasticsearch-plugin install file:///luyou/elk/x-pack-5.2.2.zip
出来一下信息,最后选择y,安装成功
> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> @ WARNING: plugin requires additional permissions @
> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> * 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 http://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 **这里选择y**
同理,要在kibana、Logstach中安装X-Pack,也类似:
> bin/kibana-plugin install file:///luyou/elk/x-pack-5.2.2.zip
> bin/logstash-plugin install file:///luyou/elk/x-pack-5.2.2.zip
删除X-Pack
> bin/kibana-plugin remove x-pack
3、X-Pack设置
X-Pack安装成功后,默认会启用5个设置
|名称 | 说明|
|---|---|
|xpack.security.enabled | 安全选项,默认true,可在elasticsearch.yml或kibana.yml配置|
|xpack.monitoring.enabled | 监控选项,默认true,可在elasticsearch.yml或kibana.yml配置|
|xpack.graph.enabled | 图表选项,默认true,可在elasticsearch.yml或kibana.yml配置|
|xpack.watcher.enabled | 观察选项,默认true,只能在elasticsearch.yml中配置|
|xpack.reporting.enabled | 报告选项,默认true,只能在kibana.yml中配置|
4、X-Pack用户安全
当X-Pack安装完成,重启ES后,会默认开启一个超级用户,用户名为elastic,密码为changeme,下面先给用户改密码,如改成"123456":
> curl -XPUT -u elastic:changeme '192.168.87.131:9200/_xpack/security/user/elastic/_password' -d
> '{
> “password”:“123456”
> }'
> 在安装了X-Pack后,所有的ES访问操作要加参数`-u 用户名:密码`来执行。
注意:
> 当安装了x-pack后,我们的head插件将不能再访问ES,需要在ES的elasticsearch.yml文件中配置禁用安全选项如下:
> xpack.security.enabled: **false**
> 但这种方式也就弱化了X-Pack的功能,如何取舍要自己衡量。建议生产环境还是不用head。
## Kibana安装
1、Kibana简介
Kibana是一个为ElasticSearch服务的,强大的数据图像化组件(还包括友好的命令行工具),先来感受一下:
![image](http://omumkhlu9.bkt.clouddn.com/Kibana%E5%9B%BE%E7%A4%BA01.jpg)![image](http://omumkhlu9.bkt.clouddn.com/Kibana%E5%9B%BE%E7%A4%BA02.jpg)![image](http://omumkhlu9.bkt.clouddn.com/Kibana%E5%9B%BE%E7%A4%BA03.jpg)
> Kibana的原理其实就是利用了ES提供的强大的**聚合**操作来生成各种图表。
2、Kibana安装
先下载,解压:
> wget https://artifacts.elastic.co/downloads/kibana/kibana-5.2.2-linux-x86_64.tar.gz
> tar -xzf kibana-5.2.2-linux-x86_64.tar.gz
> cd kibana/
由于前边ES安装了X-Pack,我们安装Kibana后,也把X-Pack安装上,可以通过Kibana来进行监控和权限管理等:
> bin/kibana-plugin install file:///luyou/elk/x-pack-5.2.2.zip
配置,在kibana安装目录,config目录下`kibana.yml`
> server.host: "192.168.87.131" kibana主机地址,这里我ES和Kibana都在一台虚拟机上
> elasticsearch.url: "http://192.168.87.131:9200" ES服务器地址
> elasticsearch.username: "elastic" 以什么用户名连接ES,这里是默认超级用户
> elasticsearch.password: "123456" 密码,前面已经从默认的"changme"改成"123456"
Kibana的配置非常多,这里只给出最基本的4个,其他的请自行查阅相关资料
启动:
> bin/kibana
注意有这一句,是kibana的访问地址,默认端口就是5601
> [12:06:27.937] [info][listening] Server running at http://192.168.87.131:5601
下面可以用浏览器访问了。(貌似kibana对ie内核支持不行,请用chrom或firefox)
出现以下界面,则kibana和x-pack都安装成功了:
![image](http://omumkhlu9.bkt.clouddn.com/Kibana%E7%99%BB%E9%99%86%E7%95%8C%E9%9D%A2.jpg)
输入用户名elastic,密码123456,进入kibana主界面 如图:
![image](http://omumkhlu9.bkt.clouddn.com/Kibana%E4%B8%BB%E7%95%8C%E9%9D%A2.jpg)
> 如果没有开启X-Pack,则不需要登陆,Kibana的功能也会少一些。
## Logstash安装
1、简介
Logstash是一个开源的,运行与服务器端的数据(日志文件,网络包等)提取管道,对数据进行提取、转换、存储。它是一个独立的组件,不需要依赖ES,但作为Elastic Stack家族中的重要一员,通常会把提取的数据用ES进行存储。
官方的这张图能很好的表明Logstash的作用:
![image](http://omumkhlu9.bkt.clouddn.com/Logstash%E4%BB%8B%E7%BB%8D%E5%9B%BE.jpg)
数据收集来源:
1. 日志文件
2. 系统指标
3. 网络
4. 数据库(数据流)
5. 传感器
数据输出后可用于:
1. 分析
- ES
- MongoDB、Riak之类的数据库
2. 归档
- HDFS
- S3
Google Cloud Storage
3. 监控
- Nagios
- Ganglia
- Zabbix
- Graphite
- Datadog
- CloudWatch
4. 告警
- Watcher *(with Elasticsearch)*
- Email
- Pagerduty
- HipChat
- IRC
- SNS
2、Logstash工作流程
Logstash工作有3个阶段:
```
graph LR
inputs-->filters
filters-->outputs
```
这里inputs、filters、outputs刚好是Logstash的3大基本插件:
1. **inputs**:负责收集数据(数据从哪里来)
2. **filters**:负责解析、匹配、过滤、完善数据(如何处理)
3. **outputs**:负责将处理好的数据发送出去(数据到哪里去)
此外,Logstash还有一个插件叫**Codec**,它是一个作用于inputs或outputs内的插件,用于对数据进行一些特定格式的转换。如处理成json格式,如multiline将多行转换成一行。
下面是这些插件所支持的应用(非完全统计)。
|Input Plugins | Codec plugins | Filter plugins | Output plugins|
|---|---|---|---|
|beats|avro|aggregate|csv|
|couchdb_changes| cef |anonymize| elasticsearch|
|elasticsearch| collectd| csv |email|
|file| dots| date| file|
|gelf| es_bulk |de_dot |graphite|
|generator| fluent| dissect| http|
|graphite| graphite| dns| kafka|
|heartbeat| json| drop |rabbitmq|
|http| json_lines| fingerprint| redis|
|http_poller |line| geoip| s3|
|jdbc| msgpack |grok| stdout|
|kafka |multiline| json| tcp|
|log4j| plain| kv| udp|
|rabbitmq| rubydebug| mutate ||
|redis|| ruby ||
|s3 || sleep ||
|sqs || split ||
|stdin|| throttle ||
|syslog|| syslog_pri ||
|tcp || translate ||
|twitter || urldecode ||
|udp|| useragent ||
|| | uuid ||
||| xml ||
一个基本的Logstash使用流程如下:
![image](http://omumkhlu9.bkt.clouddn.com/Logstash%E7%AE%80%E5%8D%95%E6%B5%81%E7%A8%8B.jpg)
3、安装Logstash
下载[:官网下载页面](https://www.elastic.co/downloads/logstash),约90M
解压:
> tar zxvf /luyou/elk/logstash-5.2.2.tar.gz
最简单的执行(省去了filters):
> bin/logstash -e 'input { stdin { } } output { stdout {} }'
成功的话,会看到这样一个信息:
- Successfully started Logstash API endpoint {:port=>9600}
上面的命令,使用了标准输入`stdin`和标准输出`stdout`插件,你在命令行的所有输入,都会输出到控制台(再次显示)。
这时候输入一些字符,都会再输出一遍,但是已经默认带上了**时间**和**IP**信息。到这里,安装就算成功了。
4、配置
上边的例子只能是验证是否安装成功,下面来看一下如何配置
> vim config/jvm.options
这里jvm的设置,请根据自己的环境适当调整。
在安装目录创建一个\.conf文件,比如ly.conf,编辑如下:
```
input {
file {
path => "/luyou/elk/logs/test.log"
}
}
filter {
}
output {
elasticsearch {
hosts => ["192.168.87.131:9200"]
user => "elastic"
password => "123456"
}
}
```
执行:
> bin/logstash -f ly.conf
这只是一个简单的例子,而Logstash里面最强大的filter插件并没有涉及。
关于filter,我个人认为是Logstash的亮点所在(也是学习成本最高的),它对进来的数据经过筛选、格式化、重命名、分段、组合、添加,转换成你最终想要的格式,再输出。关于filter的介绍,至少要重新写一个章节。
5、个人看Logstash优缺点
优点 | 缺点
:---:|:---:
不依赖于Elastic的其他组件,可独立使用 |比较笨重,安装包有近90M
适用范围非常广泛,几乎包括了所有常见的应用场景 | 有时候,配置文件会很繁琐
Filter功能强大,满足你的“私人订制” | 学习成本较高
正因为有了Logstash的这些缺点,才有了**Beat**组件的流行
## Beat组件安装
1、Beat简介
上边已经说了,Logstash虽然功能强大,但过于笨重。假如我们有多台服务器,每台服务器都安装Logstash显然不是好主意。于是,有了Beat组件集,你可以把它看成一个filter已经定义成模板的,满足于特定需求的Logstash。
Beat组件尽可能轻量,通过不同的类型来满足不同的需求,在功能上甚至是Logstash的一种补充。官网对Beat组件所做的事情就是:**获取特定格式的数据,然后发送给ES或Logstash(Logstash再对数据进一步处理),并在Kibana上展示出来**
2、Beat分类
官方Beat有如下几种:
- **Filebeat**:获取数据(日志)文件
- **Metricbeat**:获取系统信息
- **Packetbeat**:获取网络包(并分析)
- **Winlogbeat**:获取Windows事件日志
- **Heartbeat**:获取服务器存活信息
下面这张图可以很好理解Beat的作用:
![image](http://omumkhlu9.bkt.clouddn.com/Beat%E5%9F%BA%E6%9C%AC%E6%B5%81%E7%A8%8B.jpg)
> 注意,beat不只是能输出到ES或Logstash,还能输出到**kafka**、**Redis**、**文件**、**控制台**...
下面这张图,通过filebeat让你更好的知道beat的功能:
![image](http://omumkhlu9.bkt.clouddn.com/FileBeat%E5%9F%BA%E6%9C%AC%E6%B5%81%E7%A8%8B.jpg)
更好的消息是,官方结合Beat推出了做好的Kibana **Dashboard**,可以拿来即用。
3、Beat安装(以**Metricbeat**为例)
- 下载合适的版本,我这里是按照centos6.8 选在Linux 64位 [下载页面](https://www.elastic.co/downloads/beats/metricbeat)
- 解压,进入目录
> vim metricbeat.yml
这里我们演示发送到ES的配置。在配置文件最后,提供了ES、Logstash、Logging的配置示例,默认ES是打开的,这里我们修改如下(ES没有安装x-pack可以不配用户密码):
> hosts: ["192.168.87.131:9200"]
> username: "elastic"
> password: "123456"
- 保存、退出
- ES安装metricbeat模板:
> curl -XPUT -u elastic:123456 'http://192.168.87.131:9200/_template/metricbeat' --data-binary @/etc/luyou/metricbeat-5.2.2-linux-x86_64/metricbeat.template.json
- 安装官方提供的Dashboard
1. 切换到Metricbeat安装目录
2. ~~最基本的安装方式为(这里不适合,默认安装ES地址为locahhost:9200,而且没有认证)~~
> ./scripts/import_dashboards
3. 这里这样安装
1. 下载所有的Dashboard到当前目录[ https://artifacts.elastic.co/downloads/beats/beats-dashboards/beats-dashboards-5.2.2.zip]( https://artifacts.elastic.co/downloads/beats/beats-dashboards/beats-dashboards-5.2.2.zip)
2. 通过文件安装,安装到指定的ES,使用用户名和密码
> ./scripts/import_dashboards -file beats-dashboards-5.2.2.zip -es http://192.168.87.131:9200 -user elastic -pass 123456
4. 这样安装就结束了
4、运行Beat(以**Metricbeat**为例),看效果
- 在安装了官方提供的Dashboard后,可以在kibana中看见如下定义好的图表模板
![image](http://omumkhlu9.bkt.clouddn.com/%E5%AE%98%E6%96%B9DashBoard.jpg)
- 启动Metricbeat
> ./metricbeat
- kibana添加索引
![image](http://omumkhlu9.bkt.clouddn.com/kibana%E6%B7%BB%E5%8A%A0%E7%B4%A2%E5%BC%95.jpg)![image](http://omumkhlu9.bkt.clouddn.com/kibana%E6%B7%BB%E5%8A%A0%E7%B4%A2%E5%BC%952.jpg)
- 在这里添加,找几个和系统性能相关的图表,排一下版,可以保存
![image](http://omumkhlu9.bkt.clouddn.com/Dashboard%E6%B7%BB%E5%8A%A0.jpg)
- 你保存的以后可以在这里打开,这里还有一些已经定义好的。
![image](http://omumkhlu9.bkt.clouddn.com/Dashboard%E6%89%93%E5%BC%80.jpg)
- 可以展示了,注意右上角的时间范围和刷新频率
![image](http://omumkhlu9.bkt.clouddn.com/%E7%B3%BB%E7%BB%9F%E7%9B%91%E6%B5%8B%E6%A0%B7%E4%BE%8B.jpg)
先到这里,待续.....