elk 5.x的部署
前言
elk是由elasticsearch、logstash、kibana三者组成
其中elasticsearch主要负责数据存储与搜索
logstash主要负责收集日志信息以及对日志信息的切片索引等处理
kibana则是一个web界面,负责将信息进行图形展示
一般与上述三者使用的还有filebeat和redis
filebeat为c编写,不象logstash那样为java编写对资源占用高,所以可以替代logstash进行日志信息的收集
而redis作为一个缓存服务器,logstash收集分析的数据可以先在redis中暂存形成队列,同时再经由其它logastash将日志传送于elasticsearch,这也部分符合于elk的去中心化思想。
elk 5.0发布于2016/10/26,相比于2.x,有着一些毁灭性的变更,比如在elasticsearch的data目录下,index不再以logstash中的名称设定命名,而是直接以hash值命名。
同时也增加x-pack、beats、cloud三个插件,其中x-pack可以通过kibana对elasticsearch和kibana进行资源的监控。
更多变更可以查看:
本文安装环境:
centos 7.0
OpenJDK 1.8.0_111
elasticsearch和logstash均为java编写,故对java版本有要求,最低java版本为1.8.0_73,可以通过java -version
查看java版本
同时可以使用filebeat替代logstash进行日志收集与传递,
elasticsearch+logstash+kibana的安装
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.1.rpm
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.1.1.rpm
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.1.1-x86_64.rpm
yum –y localinstall elasticsearch-5.1.1.rpm logstash-5.1.1.rpm kibana-5.1.1-x86_64.rpm
elasticsearch的配置设定
[root@iZ258xanrejZ ~]# grep -v ^# /etc/elasticsearch/elasticsearch.yml
cluster.name: elk ##elk cluster名称
node.name: node-1 ##多节点时nodenama不能相同
path.data: /elk/data ##数据目录路径
path.logs: /elk/logs ##日志目录路径
bootstrap.memory_lock: true ##内存锁设定,一定要打开
network.host: 0.0.0.0 ##监听本机所有地址
http.port: 9200 ##默认端口
同时此配置文件为yml格式,所以设置荐均需要顶格开始,不能留有空格
创建日志与数据路径
mkdir -pv /elk/{data,logs}
chown -R elasticsearch.elasticsearch /elk
在5.x中加强了bootstrap_check,任何与预设不符的均无法正常启动elasticsearch,相关详细要求可以查询>>>官方说明
其中几个重要设置为
- 堆大小检测
vim /etc/elasticsearch/jvm.options
-Xms2g
-Xmx2g
最大堆内存和最小堆内存两者值设定为一至,同时尽可能大,同时不要超过32G,最大堆内存和最小堆内存如果不一致,在启动中的时候会进行内存大小自动调整,可能会出现中断的情况,为了避免此情况的产生,所以heap_check中要求最大内存最小内存相当,本例中设置为2G
2. 内存锁定检测
在/etc/elasticsearch/elasticsearch.yml
中设定,设定bootstrap.memory_lock
的值为true
3. 文件打开数
在/etc/security/limits.conf
增加elasticsearch最大文件打开数为65536
elasticsearch soft nofile 65536
elasticsearch hard nofile 65536
除此之外还有其它几个选项需要更改,但在实际安装中,未出现需求,其它启动检测项次可以查阅上述官网说明
在内存锁定检测,除了在要设定bootstrap.memory_lock
的值为true
之外,在/usr/lib/systemd/system/elasticsearch.service
也需要开打LimitMEMLOCK=infinity
设定,否则会出现内存未锁定的报错,在官方文档中并未找到对应说明,可能为5.1.1版本的一个bug。
启动elasticsearch和查看elasticsearch状态
systemctl start elasticsearch.service
systemctl status elasticsearch.service
通过web访问对应的9200端口,可以查看到对应的节点信息
命令行中查看elasticsearch cluster状态和node状态
logstash的配置
logstash中主要存在三个部分:input,filter,output
input:从哪里取得日志,其中日志文件路径必须为绝对路径,但可以使用*
匹配所有进行递归
filter:对日志作如何过滤,比如增加字段,删减字段等
output:将日志切片后输出到哪去
logstash的标准输入输出检测
/usr/share/logstash/bin/logstash -e "input {stdin{}} output{stdout{ codec=>"rubydebug"}}"
然后输入任意值时会发现屏幕区域会输出对应相同的值,如下图,说明logstash输入输出ok
本文中举例对nginx的访问日志进行收集,可以使用grok通过正则表达式对nginx进行过滤切片,但会对性能产生一定的影响,所以将nginx的日志格式设置成json格式,可减少对资源的占用
nginx的日志格式设定如下:
log_format json
'{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"status":"$status"}';
access_log /var/log/nginx/access.log json;
对应nginx的日志内容如下:
{"@timestamp":"2016-12-28T14:40:37+08:00","host":"123.56.189.18","clientip":"101.226.99.195","size":3700,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"123.56.189.18","url":"/index.html","domain":"123.56.189.18","xff":"-","referer":"-","status":"200"}
该日志是否符合json格式可通过进行验证>>点我
logstash对nginx的日志输入输出配置文件如下
[root@iZ258xanrejZ ~]# cat /etc/logstash/conf.d/system.conf
input {
file {
type => "tomcatlog" ##type名称,可自行命令
path => "/var/log/tomcat/localhost_access_log.*.txt" ##日志文件的绝对路径,可以使用*代表所有
start_position => "beginning" ##文件读取位置,beginning意思第一次读取时从最开始处读取
}
file {
type => "nginxlog"
path => "/var/log/nginx/access.log"
start_position => "beginning"
codec => "json"
}
}
filter {
if [type] == "nginxlog" { ##过滤类型
geoip {
source => "clientip" ##过滤内容来源
target => "geoip" ##属性设定值
database => "/etc/logstash/GeoLite2-City.mmdb" ##地图加载路径
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ] ##字段增加纬度
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ] ##字段增加经度
}
mutate {
convert => [ "[geoip][coordinates]", "float"] ##将经度纬度信息转变为坐标,类型为float型
}
}
}
output {
if [type] == "tomcatlog" { ##type类型与input中保持一致
elasticsearch {
hosts => ["localhost:9200"] ##output的es主机
index => "logstash-tomcat-messages-%{+YYYY.MM.dd}"
##index命令,需要带上时间格式,同时要使用geoip时进行tile map制图时index命名必须以logstash-开头,否则会出现找不到geoip type的错误
user => marility ##在安装x-pack后需要验证的用户密码,不安装x-pack可不用
password => chunlanyy
}}
else if [type] == "nginxlog" { ##多个type时使用else进行匹配即可
elasticsearch {
hosts => ["localhost:9200"]
index => "logstash-nginx-messages-%{+YYYY.MM.dd}"
user => marility
password => chunlanyy
}}
}
logstash配置文件的检查
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/system.conf -t
logstash的启动命令
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/system.conf
启动后可以在elasticsearch的data目录下看到一些文件的出现,即为存储的数据
kibana的配置设置
[root@iZ258xanrejZ ~]# grep -v ^# /etc/kibana/kibana.yml | grep -v ^$
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://localhost:9200"
其中elasticsearch.url的值必须设定,为elasticsearch的主机ip
访问kibana:
在浏览器中输入http://kibana服务器ip:5601
elk5.x查看index名称的方法
由于elasticsearch5.x的index名称命名为hash命名方式,故无法在elasticsearch的data目录中查看,如下图
此hash值的index无法在kibana中添加
可使用curl http://localhost:9200/_cat/shards?pretty
查看
然后再在kibana中添加,下图中的星号可点击,即为进入kibana时显示的默认index
复制查看到的shards名称在如下位置添加即可
在index中按所需查找
制作统计ip访问次数的图表
可以依图中步骤进行选择,可作的图表除了直方图还有饼图等,可以依图标进行自己选择,所操作方式一致。
同时除了ip的访问等,还可以统计其它field内容,比如http状态码
制作ip地图分布
此需要使用到geoip地图数据库,同时elk 5.x需要使用最新的地图数据信息,2.x中的数据库不适用于5.x
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
gunzip GeoLite2-City.mmdb.gz
geoip工作原理:通过对input的type进行filter,通过地图ip数据库,进行解析,同时将其解析得到的geoip信息添加到index中,以便后续进行统计。
解释一下在output中的index不以logstash-开头会出现在kibana中能看到geoip的相关信息,但是field显示为unknown的原因。
因为index格式为[nginx-access-]YYYY-MM的日志文件由logstash输出到Elasticsearch;在elasticsearch 中,所有的数据都有一个类型,什么样的类型,就可以在其上做一些对应类型的特殊操作。geo信息中的location字段是经纬度,我们需要使用经纬度来定位地理位置;在 elasticsearch 中,对于经纬度来说,要想使用 elasticsearch 提供的地理位置查询相关的功能,就需要构造一个结构,并且将其类型属性设置为geo_point,此错误明显是由于我们的geo的location字段类型不是geo_point。
我们可以查看elasticsearch中对logstash的预设模板信息
[root@iZ258xanrejZ logstash]# curl -umarility http://localhost:9200/_template/logstash?pretty
Enter host password for user 'marility':
{
"logstash" : {
"order" : 0,
"version" : 50001,
"template" : "logstash-*",
"settings" : {
"index" : {
"refresh_interval" : "5s"
}
},
"mappings" : {
"_default_" : {
"dynamic_templates" : [
{
"message_field" : {
"path_match" : "message",
"mapping" : {
"norms" : false,
"type" : "text"
},
"match_mapping_type" : "string"
}
},
{
"string_fields" : {
"mapping" : {
"norms" : false,
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
},
"match_mapping_type" : "string",
"match" : "*"
}
}
],
"_all" : {
"norms" : false,
"enabled" : true
},
"properties" : {
"@timestamp" : {
"include_in_all" : false,
"type" : "date"
},
"geoip" : {
"dynamic" : true,
"properties" : {
"ip" : {
"type" : "ip"
},
"latitude" : {
"type" : "half_float"
},
"location" : {
"type" : "geo_point"
},
"longitude" : {
"type" : "half_float"
}
}
},
"@version" : {
"include_in_all" : false,
"type" : "keyword"
}
}
}
},
"aliases" : { }
}
}
在其中我们可以看到预设中对location的type设定为geo_point类型。
但我们可以看到index格式为[nginx-access-]YYYY-MM时,其映射信息
使用curl -umarility http://localhost:9200/nginx-messages-2016.12.25/_mapping?pretty
来查看,(index名称因人而异)可以查到其中location的type类型实际上为double类型。而不是geoip类型,故在使用tile map的时候会出现找不到geoip字段的错误,虽然你可以在index中找到geoip等字段。
然后有人就很奇怪,为什么elasticsearch中对logstash的模块设定location类型是geoip,之前说过的可以在对应字段进行任性的修改等,但是为什么index格式为[nginx-access-]YYYY-MM时不按模块来进行字段类型的转化呢?这是因为字段修改在es中默认设定只对logstash-开头的格式index进行修改转化。所以我们如果要使用geoip,我们必须将index格式设定为logstash-*
geoip的地图显示
kibana > visualize > tile map
Geo Coordinates > Geohash >Field > geoip.location
x-pack插件的安装
x-pack的相当于是对2.x版本中使用较多的head、bigdesk、watcher、sheild等插件的一次整体封装,主要提供对elk nodes和cluster的状态监控和安全防护等。
x-pack的安装
elasticsearch和kibana均需要安装
安装命令
/usr/share/elasticsearch/bin/elasticsearch-plugin install x-pack
/usr/share/kibana/bin/kibana-plugin install x-pack
插件安装后需要对elasticsearch
和kibana
重启。
x-pack安装完之后,再次登陆kibana web页面或者使用curl命令查看elasticsearch信息时需要验证,其中curl 命令使用验证可以查看之前的截图
初始账户:elastic
初始密码:changeme
x-pack用户验证的添加与修改
对x-pack用户和角色操作可以通过role api或者直接在kibana的web页面进行操作
以下为api的添加role和user
对应代码:
curl -XPOST -u elastic 'localhost:9200/_xpack/security/role/chunlanyy--role' -d '{
"indices" : [
{
"names" : [ "all" ],
"privileges" : [ "all" ]
},
{
"names" : [ "all" ],
"privileges" : [ "manage", "read", "index" ]
}
]
}'
对应代码:
curl -XPOST -u elastic 'localhost:9200/_xpack/security/user/chunlanyy-user' -d '{
"password" : "marility",
"full_name" : "marilty",
"email" : "chunlanyy@gmail",
"roles" : [ "all" ]
}'
通过web页面,可以查看到user和role的生成,
修改chunlanyy-user用户的密码:
curl -XPUT -u elastic 'localhost:9200/_xpack/security/user/chunlanyy-user/_password' -d '{
"password" : "123456"
}'
这些均为通过api进行操作,当然也可以直接在kibana的web页面进行操作,如上截图,可在Management中进行点击添加以及修改
加入了x-pack的验证功能时,在logstash的配置中,output中务必要添加对应的用户和密码,否则会出现无法传递日志信息给elasticsearchr的错误,相关添加方法可以翻阅之前的logstash配置
elk 5.x的部署的更多相关文章
- ELk架构解析和部署
目录 一.什么是elk. 1 二.ELK 常用架构及使用场景介绍... 2 1.最简单架构... 2 2.以Logstash 作为日志搜集器... 2 3.以Beats 作为日志搜集器... 3 4. ...
- ELK + filebeat集群部署
ELK + filebeat集群部署 一.ELK简介 1. Elasticsearch Elasticsearch是一个实时的分布式搜索分析引擎, 它能让你以一个之前从未有过的速度和规模,去探索你的数 ...
- ELK日志收集平台部署
需求背景 由于公司的后台服务有三台,每当后台服务运行异常,需要看日志排查错误的时候,都必须开启3个ssh窗口进行查看,研发们觉得很不方便,于是便有了统一日志收集与查看的需求. 这里,我用ELK集群,通 ...
- 亿级 ELK 日志平台构建部署实践
本篇主要讲工作中的真实经历,我们怎么打造亿级日志平台,同时手把手教大家建立起这样一套亿级 ELK 系统.日志平台具体发展历程可以参考上篇 「从 ELK 到 EFK 演进」 废话不多说,老司机们座好了, ...
- ELK (Elasticsearch+Logstash+Kibana)部署
部署机器: 服务端:dev-server X.X.X.X ( logstash-1.5.4,elasticsearch-1.7.1,kibana-4.1.1 ) 客户端:dev-cli ...
- 万字长文:ELK(V7)部署与架构分析
ELK(7版本)部署与架构分析 1.ELK的背景介绍与应用场景 在项目应用运行的过程中,往往会产生大量的日志,我们往往需要根据日志来定位分析我们的服务器项目运行情况与BUG产生位置.一般情况下直接在日 ...
- ELK文档-安装部署
一.ELK简介 请参考:http://www.cnblogs.com/aresxin/p/8035137.html 二.ElasticSearch安装部署 请参考:http://blog.51cto. ...
- ELK(V7)部署与架构分析
1.ELK的背景介绍与应用场景 在项目应用运行的过程中,往往会产生大量的日志,我们往往需要根据日志来定位分析我们的服务器项目运行情况与BUG产生位置.一般情况下直接在日志文件中tailf. grep. ...
- ELK日志分析系统部署
======================================================================================= 操作系统 IP地址 主机 ...
随机推荐
- CLR基础与术语
CLR(Common Language Runtime):一个可由多种编程语言使用的"运行时". CLR的核心功能(内存管理,程序集加载,安全性,异常处理,线程同步等)可由面向CL ...
- JS性能优化之怎么加载JS文件
IE8+等实行并行下载,各JS下载不受影响,但仍阻塞其他资源下载 如: 图片 所以首要规则就是:将JS放在body底部(推荐) 加载100kb的单个文件比4个25kb的文件快(减少外链文件数量)(脚本 ...
- php中引用&的一个小实例
在百度知道上碰到一段关于php的引用符&的代码,对于初学都来说还是很考验理解分析能力的,把代码和自己的分析贴上来作一个备份,也与大家共勉. 代码片段: $arr =array(1,2,3,4) ...
- java中的注解总结
1. 什么是注解 注解是java5引入的特性,在代码中插入一种注释化的信息,用于对代码进行说明,可以对包.类.接口.字段.方法参数.局部变量等进行注解.注解也叫元数据(meta data).这些注解信 ...
- 自己动手写一个自动登录脚本gg
1.下载一个sshpass工具 2.安装sshpass,安装到tools文件夹 3.把tools文件夹的路径加入到/etc/bashrc vim /etc/bashrc 最后一行 : expor ...
- windows环境下,怎么解决无法使用ping命令
基本都是因为"环境变量"导致的,查看环境变量path在"Path"中追加"C:\Windows\System32"
- LODOP之票据连续套打笔记<一>
之前项目中需要使用套打,费了半天劲,最后找到LODOP,整体感觉还是不错,简单,满足大多数web套打 这是我项目中需要打印的票据 该票据每张做多显示6条数据,数据超过6条的时候需要进行分页打印,当时做 ...
- 【Android Developers Training】 19. 序言:通过Fragments构建动态UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- angularJS 源码阅读之一:toDebugString
简介: 这个函数返回调试字符串: number,boolean,string,null,undefined,都会转为字符串. function 中括号前面有空格的,会去除函数体,没空格的,会输出函数的 ...
- poj1083,基本互斥问题
题意:南北两侧各有200个房间,两侧房间之间有一个走廊 现在需要把桌子从这400个房间之中搬进搬出,每一张桌子需要10分钟时间,如果走廊因为有桌子搬运而占用,则需等待,求共需多少时间(分钟)将桌子搬完 ...