ELKstack基础入门

ELKstack基础入门

ELK简介

通俗来讲,ELK是由Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体,这三个软件当中,每个软件用于完成不同的功能,ELK 又称为ELK stack,官方域名为elastic.co,ELK stack的主要优点有如下几个:

  • 1.处理方式灵活: elasticsearch是实时全文索引,具有强大的搜索功能
  • 2.配置相对简单:elasticsearch全部使用JSON 接口,logstash使用模块配置,
  • kibana的配置文件部分更简单。
  • 3.检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。
  • 4.集群线性扩展:elasticsearch和logstash都可以灵活线性扩展
  • 5.前端操作绚丽:kibana的前端设计比较绚丽,而且操作简单

日志收集软件

  • ELKstack
  • flume
  • 日志易

什么是elasticsearch

存储日志
数据库:是一个高度可扩展的开源全文搜索和分析引擎,它可实现数据的实时全文搜索搜索、支持分布式可实现高可用、提供API接口,可以处理大规模日志数据,比如Nginx、Tomcat、系统日志等功能。

什么是logstash(filebeat)

收集日志,转发日志
可以通过插件实现日志收集和转发,支持日志过滤,支持普通log、自定义json格式的日志解析。

什么是kibana

主要是通过接口调用elasticsearch的数据,并进行前端数据可视化的展现。web图形化日志展示

部署ES

环境准备

主机名 外网IP 内网IP 角色 应用
ELKstack01 10.0.0.81 172.16.1.81 ES日志存储数据库 JDK、elasticsearch
ELKstack02 10.0.0.82 172.16.1.82 ES日志存储数据库 JDK、elasticsearch

安装es

# 1.更换es官方源
[root@elkstack02 ~]# vim /etc/yum.repos.d/es.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

# 2.安装es
[root@elkstack02 ~]# yum install -y elasticsearch

# 3.修改es配置文件
[root@elkstack02 ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: elkstack
node.name: es02
path.data: /data/es/data
path.logs: /data/es/logs
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.81", "10.0.0.82"]

# 4.修改启动脚本
[root@elkstack01 ~]# vim/usr/lib/systemd/system/elasticsearch.service
#修改内存限制(去掉此行注释)
LimitMEMLOCK=infinity

# 5.创建日志和数据目录
[root@elkstack02 ~]# mkdir -p /data/es/{logs,data}

# 6.授权
[root@elkstack02 ~]# chown -R elasticsearch.elasticsearch /data/

# 7.优化文件描述符
[root@elkstack01 ~]# vim /etc/security/limits.conf
* soft memlock unlimited
* hard memlock unlimited
* soft nofile 131072
* hard nofile 131072

# 8.修改jvm
[root@elkstack02 ~]# vim /etc/elasticsearch/jvm.options
-Xms1g
-Xmx1g

打开浏览器访问:http://10.0.0.82:9200/

安装es的head插件

# 1.安装npm
[root@elkstack01 ~]# yum install -y npm 

# 2.拉代码
[root@elkstack01 ~]# git clone https://github.com/mobz/elasticsearch-head.git

# 3.下载代码zip包
[root@elkstack01 ~]# ll
-rw-r--r--  1 root root   1357536 Sep  6 10:36 elasticsearch-head-master.zip

# 4.解压
[root@elkstack01 ~]# unzip elasticsearch-head-master.zip

# 5.构建前端代码
[root@elkstack01 elasticsearch-head-master]# npm install grunt -save

# 6.启动前端
[root@elkstack01 elasticsearch-head-master]# npm run start &

报错

报错原因:缺少bzip2解压命令
解决方案:yum install -y bzip2

打开浏览器访问:http://10.0.0.81:9100/

# 连接不上集群,给es做跨域访问配置
[root@elkstack01 ~]# vim /etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@elkstack01 ~]# systemctl restart elasticsearch

ES的副本分片

副本分片的主要目的就是为了故障转移,如果持有主分片的节点挂掉了,一个副本分片就会晋升为主分片的角色。
在索引写入时,副本分片做着与主分片相同的工作。新文档首先被索引进主分片然后再同步到其它所有的副本分片。
增加副本数并不会增加索引容量。
无论如何,副本分片可以服务于读请求,如果你的索引也如常见的那样是偏向查询使用的,那你可以通过增加副本的数目来提升查询性能,但也要为此,增加额外的硬件资源。

ES的工作机制

逆向索引

与传统的数据库不同,在Elasticsearch中,每个字段里面的每个单词都是可以被搜索的。如teacher:“zls,bgx,lidao,oldboy,alex”我们在搜索关键字oldboy时,所有包含oldboy的文档都会被匹配到Elasticsearch的这个特性也叫做全文搜索。
为了支持这个特性,Elasticsearch中会维护一个叫做“invertedindex”(也叫逆向索引)的表,表内包含了所有文档中出现的所有单词,同时记录了这个单词在哪个文档中出现过。

例:

当前有4个文档

txt1:“zls,bgx,lidao” txt2:“zls,oldboy,alex” txt3:“bgx,lidao,oldboy” txt4:“oldboy,alex”
那么Elasticsearch会维护下面一个数据结构表:

Term txt1 txt2 txt2 txt4
zls y y
bgx y y
lidao y y
oldboy y y y
alex y y

随意搜索任意一个单词,Elasticsearch只要遍历一下这个表,就可以知道有些文档被匹配到了。
逆向索引里面不止记录了单词与文档的对应关系,它还维护了很多其他有用的数据。如:每个文档一共包含了多少个单词,单词在不同文档中的出现频率,每个文档的长度,所有文档的总长度等等。这些数据用来给搜索结果进行打分,如搜索zls时,那么出现zls这个单词次数最多的文档会被优先返回,因为它匹配的次数最多,和我们的搜索条件关联性最大,因此得分也最多。

逆向索引是不可更改的,一旦它被建立了,里面的数据就不会再进行更改。这样做就带来了以下几个好处:

  • 1.没有必要给逆向索引加锁,因为不允许被更改,只有读操作,所以就不用考虑多线程导致互斥等问题。
  • 2.索引一旦被加载到了缓存中,大部分访问操作都是对内存的读操作,省去了访问磁盘带来的io开销。
  • 3.因为逆向索引的不可变性,所有基于该索引而产生的缓存也不需要更改,因为没有数据变更。
  • 4.使用逆向索引可以压缩数据,减少磁盘io及对内存的消耗

segment

作用:主要就是为了解决逆向索引是不可变的
既然逆向索引是不可更改的,那么如何添加新的数据,删除数据以及更新数据?为了解决这个问题,lucene将一个大
的逆向索引拆分成了多个小的段segment。每个segment本质上就是一个逆向索引。在lucene中,同时还会维护一个文件commit point,用来记录当前所有可用的segment,当我们在这个commit point上进行搜索时,就相当于在它下面的segment中进行搜索,每个segment返回自己的搜索结果,然后进行汇总返回给用户。
引入了segment和commit point的概念之后,数据的更新流程如下图:


  • 1.新增的文档首先会被存放在内存的缓存中
  • 2.当文档数足够多或者到达一定时间点时,就会对缓存进行commit
    a. 生成一个新的segment,并写入磁盘
    b. 生成一个新的commit point,记录当前所有可用的segment
    c. 等待所有数据都已写入磁盘
  • 3.打开新增的segment,这样我们就可以对新增的文档进行搜索了
  • 4.清空缓存,准备接收新的文档

副本分片如何配置

大多数ElasticSearch用户在创建索引时通用会考虑一个重要问题是:我需要创建多少个分片?
分片分配是个很重要的概念, 很多用户对如何分片都有所疑惑, 当然是为了让分配更合理. 在生产环境中, 随着数据集的增长, 不合理的分配策略可能会给系统的扩展带来严重的问题。
同时, 这方面的文档介绍也非常少。很多用户只想要明确的答案而不仅仅一个数字范围, 甚至都不关心随意的设置可能带来的问题。
首先,我们需要了解ES中以下几个名词,是做什么的:
集群(cluster):由一个或多个节点组成, 并通过集群名称与其他集群进行区分
节点(node):单个ElasticSearch实例. 通常一个节点运行在一个隔离的容器或虚拟机中
索引(index):在ES中, 索引是一组文档的集合(就是我们所说的一个日志)
分片(shard):因为ES是个分布式的搜索引擎, 所以索引通常都会分解成不同部分, 而这些分布在不同节点的数据就是分片. ES自动管理和组织分片, 并在必要的时候对分片数据进行再平衡分配, 所以用户基本上不用担心分片的处理细节,一个分片默认最大文档数量是20亿.

副本(replica):ES默认为一个索引创建5个主分片, 并分别为其创建一个副本分片. 也就是说每个索引都由5个主分片成
本, 而每个主分片都相应的有一个copy.
对于分布式搜索引擎来说, 分片及副本的分配将是高可用及快速搜索响应的设计核心.主分片与副本都能处理查询请求,
它们的唯一区别在于只有主分片才能处理索引请求.

大规模的数据场景进行分片

如果真的担心数据的快速增长, 我们建议你多关心这条限制: ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 我们推荐你最多分配7到8个分片.

总之, 不要现在就为你可能在三年后才能达到的10TB数据做过多分配. 如果真到那一天, 你也会很早感知到性能变化的.

尽管本部分并未详细讨论副本分片, 但我们推荐你保持适度的副本数并随时可做相应的增加. 如果你正在部署一个新的环境, 也许你可以参考我们的基于副本的集群的设计.这个集群有三个节点组成, 每个分片只分配了副本. 不过随着需求
变化, 你可以轻易的调整副本数量.

对大数据集, 我们非常鼓励你为索引多分配些分片--当然也要在合理范围内. 上面讲到的每个分片最好不超过30GB的原则依然使用.

不过, 你最好还是能描述出每个节点上只放一个索引分片的必要性. 在开始阶段, 一个好的方案是根据你的节点数量按照1.5~3倍的原则来创建分片. 例如:如果你有3个节点, 则推荐你创建的分片数最多不超过9(3x3)个.

随着数据量的增加,如果你通过集群状态API发现了问题,或者遭遇了性能退化,则只需要增加额外的节点即可. ES会自动帮你完成分片在不同节点上的分布平衡.

再强调一次, 虽然这里我们暂未涉及副本节点的介绍, 但上面的指导原则依然使用: 是否有必要在每个节点上只分配一个索引的分片. 另外, 如果给每个分片分配1个副本, 你所需的节点数将加倍. 如果需要为每个分片分配2个副本, 则需要3倍的节点数

总结

再次声明, 数据分片也是要有相应资源消耗,并且需要持续投入.
当索引拥有较多分片时, 为了组装查询结果, ES必须单独查询每个分片(当然并行的方式)并对结果进行合并. 所以高性能IO设备(SSDs)和多核处理器无疑对分片性能会有巨大帮助. 尽管如此, 你还是要多关心数据本身的大小,更新频率以及未来的状态. 在分片分配上并没有绝对的答案, 只希望大家能从本博客中受益.

分片实战

模拟数据


# 修改副本分片接口

curl -XPUT -d'
{ "template": "*",
"settings": {
"index": {
"number_of_shards": 6,
"number_of_replicas": 1
}
}
}' http://10.0.0.81:9200/_template/my_template




集群健康值颜色

  • 绿色:正常健康集群(没有分片丢失)
  • 黄色:非正常集群(副本分片丢失)
  • 红色:非正常集群(副本分片和主分片都丢失)

监控es集群状态

vim es.py
#!/usr/bin/env python
#coding:utf-8
#Author:_DriverZeng_
#Date:2017.02.12
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
import subprocess
body = ""
false = "false"
clusterip = "10.0.0.81"
obj = subprocess.Popen(("curl -sXGET http://"+clusterip+":9200/_cluster/health?
pretty=true"),shell=True, stdout=subprocess.PIPE)
data = obj.stdout.read()
data1 = eval(data)
status = data1.get("status")
if status == "green":
	print "\033[1;32m 0 \033[0m"
elif status == "yellow":
	print "\033[1;33m 1 \033[0m"
else:
	print "\033[1;31m 2 \033[0m"
	
## 集群健康状态的API
curl -s -XGET http://10.0.0.81:9200/_cluster/health?pretty=true

posted @ 2022-09-06 17:42  Gabydawei  阅读(356)  评论(0编辑  收藏  举报