开始之前先了解一下什么是ELK
ELK:大型分布式日志分析系统ELK elasticsearch(存储日志)+logstash(收集日志)+kibana(展示数据)
Elasticsearch:
Elasticsearch (ES)是一个基于Lucene构建的开源、分布式、RESTful 接口全文
搜索引擎。Elasticsearch 还是一个分布式文档数据库,其中每个字段均是被索引的数据且可被搜索,它能够扩展至数以百计的服务器存储以及处理PB级的数据。它可以在很短的时间内在储、搜索和分析大量的数据。它通常作为具有复杂搜索场景情况下的核心发动机。
横向可扩展性:只需要增加台服务器,做一点儿配置,启动一下Elasticsearch就可以并入集群。
分片机制提供更好的分布性:同一个索引分成多个分片(sharding), 这点类似于HDFS的块机制;分而治之的方式可提升处理效率。
高可用:提供复制( replica) 机制,一个分片可以设置多个复制,使得某台服务器在宕机的情况下,集群仍旧可以照常运行,并会把服务器宕机丢失的数据信息复制恢复到其他可用节点上。
口使用简单:只需一条命令就可以下载文件,然后很快就能搭建一个站内搜索引擎。
Elasticsearch应用场景
大型
电商商品搜索系统、网盘搜索引擎等。
logstash
官网:
https://www.elastic.co/guide/en/logstash/current/index.
htmllogstash就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端;与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供里很多功能强大的滤网以满足你的各种应用场景。
Logstash常用于日志关系系统中做日志采集设备;
系统结构
Logstash的事件(logstash将数据流中等每一条数据称之为一个event)处理流水线有三个主要角色完成:inputs –> filters –> outputs:
inpust:必须,负责产生事件(Inputs generate events),常用:File、syslog、
redis、beats(如:Filebeats)
filters:可选,负责数据处理与转换(filters modify them),常用:grok、mutate、drop、clone、geoip
outpus:必须,负责数据输出(outputs ship them elsewhere),常用:elasticsearch、file、graphite、statsd
其中inputs和outputs支持codecs(coder&decoder)在1.3.0 版之前,logstash 只支持纯文本形式输入,然后以过滤器处理它。但现在,我们可以在输入 期处理不同类型的数据,所以完整的数据流程应该是:input | decode | filter | encode | output;codec 的引入,使得 logstash 可以更好更方便地与其他有自定义数据格式的运维产品共存,比如:graphite、fluent、netflow、collectd,以及使用 msgpack、json、edn 等通用数据格式的其他产品等.
Kibana介绍
Kibana是一个开源的分析与可视化平台,
设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观地展示数据,从而达到高级的数据分析与可视化的目的。
实现Es集群+日志收集原理:
我们这边三台本地虚拟机服务器:
192.168.85.187
192.168.85.188
192.168.85.180
安装一台其他克隆就可搞定:
Elasticsearch linux 安装
1、 安装JDK环境变量
export JAVA_HOME=/usr/local/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile
2、 下载elasticsearch安装包
下载elasticsearch安装包
官方文档
https://www.elastic.co/downloads/elasticsearch
注意:linux安装
内存建议1g内存以上
3、 上传elasticsearch安装包
4、 解压elasticsearch
tar -zxvf elasticsearch-6.4.3.tar.gz
5、 修改elasticsearch.yml
network.host: 192.168.85.180
http.port: 9200
6、 启动elasticsearch报错
cd /opt/elasticsearch-6.4.3/bin
./elasticsearch
can not run elasticsearch as root
解决方案:
因为安全问题elasticsearch
不让用root用户直接运行,所以要创建新用户
第一步:liunx创建新用户 adduser XXX 然后给创建的用户加密码 passwd XXX 输入两次密码。
第二步:切换刚才创建的用户 su XXX 然后执行elasticsearch 会显示Permission denied 权限不足。
第三步:给新建的XXX赋权限,chmod 777 * 这个不行,因为这个用户本身就没有权限,肯定自己不能给自己付权限。所以要用root用户登录付权限。
第四步:root给XXX赋权限,chown -R XXX /你的elasticsearch安装目录。
然后执行成功。
创建一个分组
groupadd esyang
useradd esyang -g esyang -p 123456
chown -R esyang:esyang elasticsearch-6.4.3
su esyang 切换用户
继续报错
bootstrap checks failed max virtual memory areas vm.max_map_count [65530] is
vi /etc/sysctl.conf
vm.max_map_count=655360
sysctl p
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
重启服务器即可
下面是各种问题的汇总,我们要做凌驾于bug之上的人:
报错了不要慌分析日志:
我们看看很明显没有给权限给yang这个用户启动日志不能写的操作就报错:
chown -R yang:yang /opt/elasticsearch/logs/*
搞定在启动
你以为你启动成功了不,由于你做了集群配置,所以你的单台是启动成功了但是还有两台没有启动起来,有时候会报节点没有集群。
来访问:访问不了。这个问题怎么解决很简单,出现访问不了只有三种情况:
1,端口不通
2,防火墙没有关闭
3,安全组策略(这种一般忽略掉)
解决方案:
1,看看ip (一般linux能连ip是没有问题的)
2,看看端口是否开放:
telnet> telnet 192.168.85.180 9200
2,curl 192.168.85.180:9200
3,wget 192.168.85.180:9200
这里2和3的方式都可以分析出原因了,什么原因?防火墙没有关闭,所以这个问题,记得一定要关闭。
systemctl stop firewalld.service
关闭在启动:
还是报错这是什么问题?很明显我们的es做了集群如果断开网络连接,nodes会有缓存,那么切换root用户直接清除。
在启动端口占用:
查找进程直接杀掉:
netstat -tunlp | grep 9200
继续启动:
访问:
启动另外2台es,这边克隆过来修改集群配置即可:
##ip一定要保持一致
discovery.zen.ping.unicast.hosts: ["192.168.85.187", "192.168.85.188","192.168.85.180"]
discovery.zen.minimum_master_nodes: 1
node.name: node-clster02 ##可以不一样
cluster.name: my-yang ##三台必须一样
http.port: 9200
启动成功另外两台:
我们访问节点信息
http://192.168.85.180:9200/_cat/nodes?pretty
如果节点信息不同步请删除 data目录的nodes节点就可以啦。
Kibana环境安装
tar -zxvf kibana-6.4.3-linux-x86_64.tar.gz
vim config/kibana.yml
# 将默认配置改成如下:
server.port: 5601
server.host: "192.168.85.180"
elasticsearch.url: "http:// 192.168.85.180:9200
卑微的感到电脑卡得不行了好启动
./bin/kibana
访问:
索引的操作我就不细说了,很简单。
我们把配置复制到Logstash
input {
# 从文件读取日志信息 输送到控制台
file {
path => "/opt/elasticsearch/logs/my-yang.log"
codec => "json" ## 以JSON格式读取日志
type => "elasticsearch"
start_position => "beginning"
}
}
#可以多个input output
# filter {
#
# }
output {
# 标准输出
# stdout {}
# 输出进行格式化,采用Ruby库来解析日志
stdout { codec => rubydebug }
elasticsearch {
hosts => ["192.168.85.185:9200"]
index => "es-%{+YYYY.MM.dd}"
}
}
启动
启动成功后就是这样。我的电脑卡分屏啦,es还是很吃电脑内存的。
这边的es停掉过后Kiabana 这边会报错,意思先启动es在启动Kiabana
启动成功后自动同步es日志。到这一步基本上就成功了。logstash通过把日志转换成json的方式输出到es索引里面,索引不会丢失做了集群,这样就可以做日志收集啦,是不是很nice
我们通过Kiabana查询索引这个就是我们日志自动生成的索引,已经可以搜索日志了大功告成!!
下面给大家演示一个es高可用
我停掉一个es,然后剩下2台
192.168.85.188为主180为从
我们可以看到es走的取模算法的方式把不通的索引文档放在不通的集群节点的机器里面,保证了高可用。
直到最后一台es:
我们可以还是查询到数据
es高可用原理:
总结:
1,es集群会出现的问题,节点数据不同步。
删除data/nodes节点信息
2,Logstash日志收集可能出现不同步问题。
日志目录不对,权限没有指定到用户组用户信息。
3,其他问题
创作不易感谢大家支持,侵权必究。欢迎指正讨论,你的支持是我的动力。