摘要
ELK Stack 是 Elasticsearch、Logstash、Kibana 三个开源软件的组合。在实时数据检索和分析场合,三者通常是配合共用,而且又都先后归于 Elastic.co 公司名下,故有此简称。
ELK Stack 在最近两年迅速崛起,成为机器数据分析,或者说实时日志处理领域,开源界的第一选择。和传统的日志处理方案相比,ELK Stack 具有如下几个优点:
ELKStack简介
ELK Stack 是 Elasticsearch、Logstash、Kibana 三个开源软件的组合。在实时数据检索和分析场合,三者通常是配合共用,而且又都先后归于 Elastic.co
公司名下,故有此简称。
ELK Stack 在最近两年迅速崛起,成为机器数据分析,或者说实时日志处理领域,开源界的第一选择。和传统的日志处理方案相比,ELK Stack 具有如下几个优点:
• 处理方式灵活。Elasticsearch 是实时全文索引,不需要像 storm 那样预先编程才能使用;
• 配置简易上手。Elasticsearch 全部采用 JSON 接口,Logstash 是 Ruby DSL 设计,都是目前业界最通用的配置语法设计;
• 检索性能高效。虽然每次查询都是实时计算,但是优秀的设计和实现基本可以达到全天数据查询的秒级响应;
• 集群线性扩展。不管是 Elasticsearch 集群还是 Logstash 集群都是可以线性扩展的;
• 前端操作炫丽。Kibana 界面上,只需要点击鼠标,就可以完成搜索、聚合功能,生成炫丽的仪表板。
ELK地址:https://www.elastic.co/
Logstash 最佳实践:http://udn.yyuap.com/doc/logstash-best-practice-cn/index.html
Elasticsearch 权威指南:http://www.learnes.net/index.html
ELKStack中文社区:https://kibana.logstash.es/content/
Elasticsearch部署
Elasticsearch首先需要Java环境,所以需要提前安装好JDK,可以直接使用yum安装。也可以从Oracle官网下载JDK进行安装。开始之前要确保JDK正常安装并且环境变量也配置正确:
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17G 3.4G 14G 20% /
devtmpfs 902M 0 902M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 8.7M 904M 1% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 1014M 189M 826M 19% /boot
tmpfs 183M 0 183M 0% /run/user/0
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 1823 407 1092 8 323 1224
Swap: 2047 0 2047
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
安装JDK
[root@localhost ~]# yum install -y java
[root@localhost ~]# java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-b10)
OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode)
配置安装ElasticSearch
可以使用源码,或者yum
一、yum安装
1.下载并安装GPG key
[root@linux-node1 ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
2.添加yum仓库
[root@linux-node1 ~]# cat /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
3.安装elasticsearch
[root@hadoop-node1 ~]# yum install -y elasticsearch
二、源码安装
[root@localhost tmp]# wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.1/elasticsearch-2.3.1.tar.gz
[root@localhost tmp]# tar xf elasticsearch-5.6.2.tar.gz -C /usr/local/
[root@localhost tmp]# cd /usr/local/
三、配置elasticsearch
[root@localhost local]# vim elasticsearch-5.6.2/config/elasticsearch.yml
cluster.name: my-es #ES集群名称
node.name: node-1 #节点名称
path.data: /data/es-date #数据存储的目录(多个目录使用逗号分隔)
path.logs: /var/log/elasticsearch #日志格式
bootstrap.memory_lock: true #锁住es内存,保证内存不分配至交换分区
network.host: 192.168.5.8 #设置本机IP地址
http.port: 9200 #端口默认9200
# 以下是防止脑裂配置部分
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping_timeout: 120s
client.transport.ping_timeout: 60s
discovery.zen.ping.unicast.hosts: ["192.168.5.8","192.168.5.12","192.168.5.20"]
四、设置目录权限
[root@localhost local]# useradd essh
[root@localhost local]# chown -R essh.essh elasticsearch-5.6.2
五、启动异常情况解决
max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
#vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
.conf
vm.max_map_count=655360 #添加此节点
-p
或者执行以下命令
[root@localhost elasticsearch-5.6.2]# sysctl -w vm.max_map_count=655360
本地无法连接,或建立集群失败
[root@localhost elasticsearch-5.6.2]# firewall-cmd --zone=public --add-port=9200/tcp --permanent
[root@localhost elasticsearch-5.6.2]# firewall-cmd --zone=public --add-port=9300/tcp --permanent
[root@localhost elasticsearch-5.6.2]# firewall-cmd --reload
本次环境我们使用3台服务器,这3台服务器的服务搭建可以跟上面的步骤相同即可
[2018-05-12T11:56:44,053][INFO ][o.e.c.s.ClusterService ] [node-3] new_master {node-3}{6VQyU09JRSWdmsZwzoE4VA}{vcb8KHoqTqe44MjOMjkCNQ}{192.168.5.12}{192.168.5.12:9300}, added {{node-1}{KPOE3xR6R-yLaiAtZCStjA}{dp_ZF58RSFCLequPipcgHg}{192.168.5.8}{192.168.5.8:9300},{node-2}{jLXhIqaDTima7Gs0Hu9ZQw}{Ks38BUuCQH2QrXf6w82eUA}{192.168.5.20}{192.168.5.20:9300},}, reason: zen-disco-elected-as-master ([2] nodes joined)[{node-1}{KPOE3xR6R-yLaiAtZCStjA}{dp_ZF58RSFCLequPipcgHg}{192.168.5.8}{192.168.5.8:9300}, {node-2}{jLXhIqaDTima7Gs0Hu9ZQw}{Ks38BUuCQH2QrXf6w82eUA}{192.168.5.20}{192.168.5.20:9300}]
[2018-05-12T11:56:44,794][INFO ][o.e.h.n.Netty4HttpServerTransport] [node-3] publish_address {192.168.5.12:9200}, bound_addresses {192.168.5.12:9200}
[2018-05-12T11:56:44,344][INFO ][o.e.c.s.ClusterService ] [node-2] detected_master {node-3}{6VQyU09JRSWdmsZwzoE4VA}{vcb8KHoqTqe44MjOMjkCNQ}{192.168.5.12}{192.168.5.12:9300}, added {{node-1}{KPOE3xR6R-yLaiAtZCStjA}{dp_ZF58RSFCLequPipcgHg}{192.168.5.8}{192.168.5.8:9300},{node-3}{6VQyU09JRSWdmsZwzoE4VA}{vcb8KHoqTqe44MjOMjkCNQ}{192.168.5.12}{192.168.5.12:9300},}, reason: zen-disco-receive(from master [master {node-3}{6VQyU09JRSWdmsZwzoE4VA}{vcb8KHoqTqe44MjOMjkCNQ}{192.168.5.12}{192.168.5.12:9300} committed version [1]])
此时我们可以在浏览器查看集群状态
http://192.168.5.8:9200/_cluster/health?pretty
以下是各个节点信息
使用curl
进行通讯
[root@localhost ~]# curl -i -XGET 'http://192.168.5.8:9200/_count?'
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
content-length: 71
{"count":0,"_shards":{"total":0,"successful":0,"skipped":0,"failed":0}}[root@localhost ~]#
常用命令
[root@localhost ~]# ps aux | grep java
[root@localhost ~]# netstat -nlpt
[root@localhost ~]# scp elasticsearch-5.6.2.tar.gz root@192.168.5.20:/tmp/
Elasticsearch插件介绍
一、Haed插件
插件作用:主要是做es集群管理的插件
Github下载地址:https://github.com/mobz/elasticsearch-head
Elasticsearch高版本安装head相当方法,以下安装过程仅供参考
[root@localhost tmp]# yum -y install git
[root@localhost tmp]# git clone https://github.com/mobz/elasticsearch-head.git #下载head插件
[root@localhost tmp]# wget https://nodejs.org/dist/v4.6.1/node-v4.6.1-linux-x64.tar.gz #下载nodejs
[root@localhost tmp]# tar zxvf node-v4.6.1-linux-x64.tar.gz #解压
[root@localhost tmp]# vim /etc/profile #添加环境变量
export PATH=/tmp/node-v4.6.1-linux-x64/bin:$PATH
[root@localhost tmp]# source /etc/profile #使环境变量生效
查看当前head插件目录下有无node_modules/grunt目录:
[root@localhost elasticsearch-head]# npm install grunt --sava #没有的情况下执行
[root@localhost elasticsearch-head]# npm install #安装 执行失败或者
[root@localhost elasticsearch-head]# npm install -g cnpm --registry=https://registry.npm.taobao.org #或者安装
[root@localhost elasticsearch-head]# npm install -g grunt-cli #安装grunt
[root@localhost elasticsearch-head]# vim Gruntfile.js #编辑 Gruntfile.js 文件93行options下添加hostname:'0.0.0.0'
检测head根目录下是否存在base文件夹,没有:将_site下的base文件夹及内容复制到head根目录下
[root@localhost elasticsearch-head]# cd _site/
[root@localhost _site]# cp -r base/ ../ #拷贝到上层目录
[root@localhost elasticsearch-head]# grunt server -d #启动grunt
1.访问Elastic 官网 ,https://www.elastic.co/cn/
2.痛点:线上程序出错,日志没法及时拿到,总是找运维去帮我拿日志,分布式程序日志又分散到不同机器,拿日志也是比较麻烦,而且开发找日志,也是不易检索到自己想要的日志,不能及时定位报错日志的关键位置,导致开发解决问题不及时。
3.运维不能把权限给到开发,Log4Net只能把日志写到本地。之前有做过,Log4Net To Mongodb ,但是不是特别好用。
5 运维/开发人员问运维经常要日志,
6 为什么要使用ELK, 标准化,有管理模式,日志量大,难以查询
4.elasticsearch 是基于Lucene 的搜索服务器
任务1:es2.0 介绍与安装
————————————————————————————————————————————————————————
下载 elasticsearch-2.3.1.tar.gz
[root@localhost tmp]# wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.1/elasticsearch-2.3.1.tar.gz
#Java -version 安装前要看下是否安装Java Jdk
#yum -y install Java 安装Java Jdk
#tar zxvf elasticsearch-2.3.1.tar.gz
#cd elasticsearch-2.3.1
#vim config/elasticsearch.yml
cluster.name:scapx
node.name:node-1
network.host:192.168.5.20
# es 不运行在root下运行,创建useradd eser 用户
drwxr-xr-x. 6 root root 116 5月 11 21:25 elasticsearch-2.3.1
-rw-r--r--. 1 root root 27540442 4月 4 2016 elasticsearch-2.3.1.tar.gz
[root@localhost tmp]# chown -R eser.eser elasticsearch-2.3.1 赋予权限
任务2:es2.0 插件安装
—————————————————————————————————————————————————————————
#su eser 切换用户
# ./elasticsearch -d 后台方式启动
#$ history | grep stop 关闭防火墙
#ps aux | grep java
# netstat -anlpt 查看端口
[root@localhost bin]# ./plugin install lmenezes/elasticsearch-kopf #安装kopf插件
访问地址:http://192.168.5.8:9200/_plugin/kopf/
安装head插件
https://github.com/mobz/elasticsearch-head
[root@localhost bin]# ./plugin install mobz/elasticsearch-head #安装head插件
安装完毕head插件,可以访问地址:http://192.168.5.8:9200/_plugin/head/
相关文档地址:https://www.abcdocker.com/abcdocker/2234
任务3:es5.0安装配置
free -g
free -m 查看内存
# mkdir /data/server/ -p 创建文件夹
# ls
# pwd
[root@localhost tmp]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.2.tar.gz 下载elasticsearch-5.6.2.tar.gz版本
#java -version 查看本地是否有Java jdk
#yum -y install java 安装Java jdk
Elasticsearch高版本安装head相当方法,以下安装过程仅供参考
[root@localhost tmp]# yum -y install git
[root@localhost tmp]# git clone https://github.com/mobz/elasticsearch-head.git #下载head插件
[root@localhost tmp]# wget https://nodejs.org/dist/v4.6.1/node-v4.6.1-linux-x64.tar.gz #下载nodejs
[root@localhost tmp]# tar zxvf node-v4.6.1-linux-x64.tar.gz #解压
[root@localhost tmp]# vim /etc/profile #添加环境变量
export PATH=/tmp/node-v4.6.1-linux-x64/bin:$PATH
[root@localhost tmp]# source /etc/profile #使环境变量生效
查看当前head插件目录下有无node_modules/grunt目录:
[root@localhost elasticsearch-head]# npm install grunt --sava #没有的情况下执行
[root@localhost elasticsearch-head]# npm install #安装 执行失败或者
[root@localhost elasticsearch-head]# npm install -g cnpm --registry=https://registry.npm.taobao.org #或者安装
[root@localhost elasticsearch-head]# npm install -g grunt-cli #安装grunt
[root@localhost elasticsearch-head]# vim Gruntfile.js #编辑 Gruntfile.js 文件93行options下添加hostname:'0.0.0.0'
检测head根目录下是否存在base文件夹,没有:将_site下的base文件夹及内容复制到head根目录下
[root@localhost elasticsearch-head]# cd _site/
[root@localhost _site]# cp -r base/ ../ #拷贝到上层目录
[root@localhost elasticsearch-head]# grunt server -d #启动grunt
任务6:logstash详细使用方式
简介
Logstash 可以传输和处理你的日志/事务或其他数据
功能
Logstash 是Elasticsearch的最佳数据管道。
Logstash 是插件式管理模式,在输入/过滤/输出以及编程过程中都可以使用插件进行定制,Logstash社区有超过200种可用插件
工作原理
Logstash 有两个必要元素,input和output ,一个可选元素:filter
这个三个元素,分别代表Logstash事件处理的三个阶段,输入>过滤器>输出
设置
设置文件
logstash.yml: logstash 的默认启动配置文件
jvm.options: logstash 的JVM 配置文件
startup.options(Linux)包含系统安装脚本在/usr/share/logstash/bin 中使用的选项为您的系统构建适当的启动脚本,安装Logstash软件包时,系统安装脚本将在安装过程结束时执行,并使用startup.options中指定的设置来设置用户/组,服务名称和服务描述等选项。
logstash.yml 设置项
参数 描述 默认值
node.name 节点名 机器的主机名
path.data Logstash及其插件用于任何持久性需求的目录 LOGSTASH_HOME/data
pipeline.workers 同时执行管道的过滤器和输出阶段的工作任务数量,如果发现事件正在备份,或CPU未饱和,请考虑增加此数字以更好地利用机器处理能力
pipeline.batch.size 尝试执行过滤器和输出之前,单个工作线程从输入收集的最大事件数量,较大的批量处理大小一般来说效率更高,但是以增加的内存开销为代价,您可能必须通过设置LS_HEAP_SIZE 变量来有效使用该选项来增加JVM堆大小。
pipeline.batch.delay 创建管道事件批处理时,在将一个尺寸过小的批次发送给管道工作任务之前,等待每个事件需要多长时间(毫秒)
log.level 日志级别,有效选项:fatal>error>warn>info>debug>trace
log.format 日志格式,json或plain
path.logs logstash 自身日志的存储路径
path.plugins 在哪里可以找到自定义的插件,您可以多次指定此设置以包含多个路径
启动
bin/logshash -f logstash.conf
其中[options]您可以指定用于控制logstsh执行的命令行标志
在命令行上设置的任何标志都会覆盖Logshash设置文件(logstash.yml)中的相应设置,但设置文件本身不会更改。
创建一个Log文件
mkdir /data/log
touch ng_log.conf
值类型
一个插件可以要求设置的值是一个特定的类型,比如布尔值,列表或哈希值,以下值类型受支持
Array
user=> [{id=> 1 ,name => bob},{id=>2,name=>jene}]
Lists
path=>{"var/log/messages","/var/log/*.log"]
uris=>["http://elastic.co","http://example.net"]
Boolean
ssl_enable=>true
Bytes
my_bytes=>"1123"
my_bytes=>"10MiB"
my_bytes=>"100kib"
my_bytes=>"180 mb"
Codec
codes=>"json"
Hash
match=>{
"field1"=>"value1"
"field2"=>"value2"
}
Number
port=>22
Password
my_password=>"password"
URI
my_uri=>"http://foo:bar@example.net"
Path
my_path=>"/tmp/logshash"
TCP应用
logstash配置
创建logstash-input-tcp.conf
input{
tcp{
port=> 9231
codec=> json_lines
mode=>server
}
}
output{
elasticsearch{ hosts=>["localhost:9200"]}
stdout{codec=>rubydebug}
}
传输文件
logstash 配置
创建logstash-input-file.conf
input{
file{
path=>["/val/log/nginx/access.log"]
type=>"nginx-access-log"
start_position=>"beginning"
}
}
output{
if[type]=="nginx-access-log"{
elasticsearch{
hosts=>["localhost:9200"]
index=>"nginx-access-log"
}
}
}
启动/终止应用
如果你的logstash每次都是通过指定配置文件方式启动,不妨建立一个启动脚本
创建starup.sh
nohup ./logstash -f logstash.conf >> nohup.out 2>&1 &
创建shutdown.sh
PID=`ps -ef| grep logstash | awk '{print $2}'|head -n 1` kill -9 ${PID}
任务7:kibana具体安装及后续使用
安装Kibana 5.6.2
下载解压安装包,一定要装与ES相同的版本
配置
编辑文件config/kibana.yml 配置属性
cd kibana/config/
vim kibana.yml
添加
server.host:"192.168.80.32"
elasticsearch.url:"http://192.168.80.32:9200"
任务8:kiban结合x-pack视图
server.port:5601
server.host:"192.168.5.10"
elasticsearch.url:"http://192.168.5.10:9200"
http://192.168.5.10:5601/status #可以查看状态 账号:elastic和changeme
想要在Kibana 中监控ES则需要安装X-pack插件
X-pack监控组件使您可以通过Kibana轻松地监控Elasticsearch,您可以实时查看集群的健康和性能,以及分析过去的集群,索引和节点度量,此外,您可以监视Kibana本身性能,当你安装X-pack在群集上,监控代理运行在每个检点上收集和指数指标从ElasticSearch,安装在X-pack在Kibana上
Elasticsearch下载X-pack
在Es的根目录(每个几点)运行bin/elasticsearch-plugin进行安装,先进入elasticsearch安装的目录,然后在输入命令
bin/elasticsearch-plugin install x-pack
ES图形化Kibana安装与使用
如果你在Elasticsearch已禁用自动索引的创建,在elasticsearch.yml配置action.auto_create_index允许X-pack创造以下指标
action.auto_create_index:.security,.monnitoring*,.watches,.triggered_watches,.watcher-history*
Kibana下载X-pack
在Kibana根目录运行bin/kibana-plugin进行
先进入kibana的安装目录,然后键入以下命令:bin/kibana-plugin install x-pack
离线安装方法
bin/elasticsearch-plugin install file:////usr/local/x-pack-5.3.2.zip
任务10:收集http
传输文件Logstash配置
创建logstash-input-file.conf
input{
file {
path=>["/val/log/nginx/access.log"]
type=>"nginx-access-log"
start_position=>"beginning"
}
}
filter{
#日志格式拆分
}
output{
if [type]=="nginx-access-log" {
elasticsearch{
hosts=>["localhost:9200"] #地址,可以是多个
index=>"nginx-access-log" #索引 或者 "system-%{+YYYY.MM.dd}"
user=> "elastic" #账号
password=>"changeme" #密码
}
stdout{
codec=> rubydebug
}
}
}
cat acc.log |wc -l 查看日志有多少行
启动Logstash命令
./bin/logstash -f access.conf
[root@localhost tmp]# wget https://artifacts.elastic.co/downloads/logstash/logstash-5.6.3.tar.gz
[root@localhost tmp]# wget https://artifacts.elastic.co/downloads/kibana/kibana-5.6.3-linux-x86_64.tar.gz
grep '^[z-z]' elasticsearch.yml #查看修改了那些ie几点