跳转至

01-日志平台-Elasticsearch

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/

对于日志来说,最常见的需求就是收集、存储、查询、展示,开源社区正好有相对应的开源项目:logstash(收集)、elasticsearch(存储+搜索)、kibana(展示),我们将这三个组合起来的技术称之为ELKStack,所以说ELKStack指的是Elasticsearch(java)、Logstash(jruby)、Kibana技术栈的结合,一个通 用的架构如下图所示:

image-20211101160843532

图片解释:elk 前面主要靠logstash来进行收集日志,logstash将日志上传到broker上,后面还有一个logstash用来读取broker中的日志,在将日志存储到es里面,最后用kibana练到es上进行展示

**提示:**我们可以将Elasticsearch简称为es

Elasticsearch介绍

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

Elasticsearch部署

Elasticsearch首先需要Java环境,所以需要提前安装好JDK,可以直接使用yum安装。也可以从Oracle官网下载JDK进行安装。开始之前要确保JDK正常安装并且环境变量也配置正确:

环境介绍

[root@abcdocker ~]# 
[root@abcdocker ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        20G  2.4G   18G  12% /
devtmpfs        903M     0  903M   0% /dev
tmpfs           912M     0  912M   0% /dev/shm
tmpfs           912M  8.6M  904M   1% /run
tmpfs           912M     0  912M   0% /sys/fs/cgroup
tmpfs           183M     0  183M   0% /run/user/0
[root@abcdocker ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1823         328        1113           8         381        1322
Swap:             0           0           0
[root@abcdocker ~]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 

本次使用2台服务器来进行模拟集群,所以请准备2台服务器

安装JDK

[root@linux-node1 ~]# yum install -y java
[root@linux-node1 ~]# java -version
openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)

源码安装JDK

下载安装http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

配置Java环境
# tar zxf jdk-8u91-linux-x64.tar.gz -C /usr/local/
# ln –s /usr/local/jdk1.8.0_91 /usr/local/jdk

# vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
# source /etc/profile

看到如下信息,java环境配置成功
# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, 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@CentOS6 home]# wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.2.tar.gz   #下载elasticsearch

[root@CentOS6 home]# tar xf elasticsearch-1.7.2.tar.gz -C /usr/local/    #解压elasticsearch
[root@CentOS6 home]# ln -s /usr/local/elasticsearch-1.7.2 /usr/local/elasticsearch    #创建软连接

配置elasticsearch

修改配置文件
[root@abcdocker ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: myes             #ES集群名称
node.name: abcdocker-node-1   #节点名称
path.data: /data/es-date       #数据存储的目录(多个目录使用逗号分隔)
path.logs: /var/log/elasticsearch #日志格式
bootstrap.memory_lock: true   #锁住es内存,保证内存不分配至交换分区
network.host: 192.168.56.11   #设置本机IP地址
http.port: 9200            #端口默认9200

设置数据目录权限

[root@abcdocker ~]# chown -R elasticsearch:elasticsearch /data/es-date/
#这个是我们存放数据的目录,手动创建

es默认发现有组播和单播,组播就是都加入到一个组里面,单播就是一对一通信

提示: yum安装时会少了许多配置,如果编译安装就会产生很多。

**启动服务 **

启动es
[root@abcdocker ~]# systemctl start elasticsearch.service
[root@abcdocker ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      532/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      724/master          
tcp6       0      0 192.168.56.11:9200      :::*                    LISTEN      2125/java           
tcp6       0      0 192.168.56.11:9300      :::*                    LISTEN      2125/java           
tcp6       0      0 :::22                   :::*                    LISTEN      532/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      724/master   

端口默认:9200

本次环境我们使用2台服务器,这2台服务器的服务搭建可以跟上面的步骤相同即可

访问测试:http://IP:9200

image-20211101161256490

ElasticSearch插件

Elasticsearch提供了非常多的插件,还可以使用curl进行通讯

我们可以使用curl来查看es里面有什么内容

[root@abcdocker ~]# curl  -i -XGET 'http://192.168.56.11:9200/_count?'
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 59

{"count":0,"_shards":{"total":0,"successful":0,"failed":0}}[
解释:
返回头部200,执行成功0个,返回0个

Elasticsearch有很多插件,但是有的插件好用但是收费

Haed插件

插件作用:主要是做es集群管理的插件

Github下载地址:https://github.com/mobz/elasticsearch-head

下载方式:
[root@abcdocker ~]# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head

-> Installing mobz/elasticsearch-head...
Trying https://github.com/mobz/elasticsearch-head/archive/master.zip ...
Downloading ...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................DONE
Verifying https://github.com/mobz/elasticsearch-head/archive/master.zip checksums if available ...
NOTE: Unable to verify checksum for downloaded plugin (unable to find .sha1 or .md5 file to verify)
Installed head into /usr/share/elasticsearch/plugins/head

下载完会在/usr/share/elasticsearch/plugins/目录下产生插件目录

访问:http://ip地址:9200/_plugin/head/

image-20211101161430794

Bigdesk插件

插件作用:性能监控

Github下载:https://github.com/lukas-vlcek/bigdesk

提示:因为我们使用yum安装的最新版本,bigdesk暂时不支持最新版本

[root@abcdocker ~]# /usr/share/elasticsearch/bin/elasticsearch -V
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Version: 2.4.4, Build: fcbb46d/2017-01-03T11:33:16Z, JVM: 1.8.0_121

image-20211101161459706

正常访问地址:http://localhost:9200/_plugin/bigdesk/

Bigdesk 1.x

image-20211101161516111

Bigdesk 2.X

image-20211101161528367

Kopf插件

插件作用:kopf是一个简单的网络管理工具

Kopf不再维护。已经开发了替代品(cerebro),目前维护在https://github.com/lmenezes/cerebro。在这一点上,cerebro应该有相当于kopf的功能,顶部有一些新的功能。

Github地址:https://github.com/lmenezes/elasticsearch-kopf

安装
[root@abcdocker ~]# /usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf
-> Installing lmenezes/elasticsearch-kopf...
Trying https://github.com/lmenezes/elasticsearch-kopf/archive/master.zip ...
Downloading ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................DONE
Verifying https://github.com/lmenezes/elasticsearch-kopf/archive/master.zip checksums if available ...
NOTE: Unable to verify checksum for downloaded plugin (unable to find .sha1 or .md5 file to verify)
Installed kopf into /usr/share/elasticsearch/plugins/kopf

访问地址:http://192.168.56.11:9200/_plugin/kopf/

image-20211101161601663

ElasticSearch插件使用

现在我们已经将插件安装完成,这时候里面还没有数据。我们现在往里面写一些数据

image-20211101161642794

点击提交

image-20211101161653551

_index:创建了一个索引index-demo

_type:创建了一个类型test

total:分片2个

Successful:成功1个

Failed:失败0个

Created:状态成功

我们点击概览,点击连接

image-20211101161707402

​ 我们写一篇文档会帮我们分成5片(0-4,可以修改成多个),粗线代表主分片细线代表副本分片(可以理解为一主一备)正常情况下会将主分片和副本分片放在2台机器上

集群健康值介绍:

黄色代表没有主分片数据丢失,但是现在不是健康的状态(警告)应该有10个分片,现在只有5个。

红色代表有数据丢失

绿色代表正常

提示:es支持一个类似于快照的功能,方便我们用于数据备份

Es索引信息

image-20211101161721329

这里索引信息是open代表我们可以将它给关闭掉,这样就不会继续使用这个索引进行

image-20211101161734554

关闭索引

image-20211101161745171

除了支持关闭和开启索引,同样也支持删除

image-20211101161757040

提示:删除之后索引数据是无法恢复的

Head插件小缺点: 当我们索引特别多的时候,打开head至少需要五分钟。因为它要把所有的索引都扫描一遍进行展示,这时候打开使用的带宽也会特别大(不会出现超时,一直等待就可以)

kopf插件使用介绍

访问地址:http://192.168.56.11:9200/_plugin/kopf/

image-20211101161826558

我们可以看到索引、分片、文档数量、大小以及jvm使用情况、disk、cpu、load等

image-20211101161838985

我们点击节点,就可以看到更详细的硬件信息(实时变化)

image-20211101161849354

同样kopf也支持head的插件,支持请求

(生产场景这个信息主要给开发使用)

image-20211101161901881

提示:es是有自己的查询语言,可以写的很复杂。

其他功能

image-20211101161913392

▲ Create index: 创建索引:

▲ Cluster settings: 集群设置:

▲ Aliases: 别名:

▲ Analysis: 分析:

▲ Percolator: 过滤器:

▲ Snapshot: 快照

▲ Index templates: 索引模板:

▲ Cat apis: api

▲ Hot threads: 热线程:

ElasticSearch集群介绍

在一个集群中2个节点需要选举,有一个节点会被选为主节点(master节点)主节点负责管理集群中的状态。对于用户来说这个ES主节点是谁都是无所谓的,我们只要连接到其中一台就可以的(我们所有操作都可以连接到任意一个节点上)

ES默认使用组播的方式进行通讯,当我们将另外一台服务器配置完成后它就会去找其他节点

我们只需要将cluster.name:ES集群名字设置相同即可

[root@abcdocker ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 
cluster.name: myes
node.name: abcdocker-node-2
path.data: /data/es-date
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 192.168.56.12
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.56.11", "192.168.56.12"]

提示: 在一个集群中2个节点需要选举,有一个节点会被选为主节点(master节点)主节点负责管理集群中的状态。对于用户来说这个ES主节点是谁都是无所谓的,我们只要连接到其中一台就可以的(我们所有操作都可以连接到任意一个节点上)

我们的数据是不要通过主节点进行转发的,主节点不像是proxy这样节点.当我们在2节点上写数据,2节点会将数据同步到其它节点。主节点主要管理分片、比如分片多少个,哪个分片是主,哪个是备等。


提示: 虚拟机是NAT模式,可能会对组播有影响。我们可以手动将组播修改成单播

[root@abcdocker ~]# vim /etc/elasticsearch/elasticsearch.yml
discovery.zen.ping.unicast.hosts: ["192.168.56.11", "192.168.56.12"]
[root@abcdocker ~]# systemctl restart elasticsearch.service
或者使用
/etc/init.d/elasticsearch restart

单播后面可以添加端口(不修改端口默认就是9200) 我们只需要在第二台服务器上进行修改

image-20211101162055072

我们在进入head插件中,点击连接。这时候我们会看到集群的状态,一个主,一个备。集群的状态也发生变化

提示: 这个状态是主节点展示,主节点会掌握整个集群的状态,来给我们显示集群健康值状态。主节点还会检查这些分片,那个分片丢了,主节点会在复制一个分片出来。

ELKStack相关问题

1.问题:如果在正常工作的情况下,节点丢失怎么办?

答: 此时主节点会看故障节点有哪些分片丢失掉了,主节点就会从剩余的分片副本上去选举一个当做主分片,在进行复制一份。

提示:如果我们想让某个节点只存放数据不进行选举可以在配置文件进行修改

无论我们查询数据连接那个节点,es会把所有数据汇聚在一台节点发送给我们。例如我们请求abcdocker1节点,但是abcdocker1上的节点有一些数据在abcdocker2上。这时abcdocker1节点回去同步abcdocker2节点上的数据。然后返回给客户端

2.监控

如果我们想监控es集群状态可以使用api的方式

[root@abcdocker ~]# curl -XGET 'http://192.168.56.11:9200/_cluster/health?pretty=true'
{
  "cluster_name" : "myes",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 5,
  "active_shards" : 10,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "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" : 100.0
}
然后我们通过脚本的方式可以进行判断,是否为true以及状态是否为green等

关于zabbix监控es可以继续关注我博客zabbix模块,近期会进行添加。关于更多监控可以查看官方文档

管理监控和部署

https://www.elastic.co/guide/en/elasticsearch/guide/current/administration.html

https://www.elastic.co/guide/en/elasticsearch/guide/current/_cat_api.html

elastic官方文档

https://www.elastic.co/guide/en/elasticsearch/guide/

关于线上服务器硬件介绍

https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html

3.启动报错

es启动报错

image-20211101162201881

es日志显示如下

image-20211101162212596

marvel plugin requires the license plugin to be installed,于是想到那个插件没有安装成功,去plugin目录下面把marvel-agent目录移除了,重启就正常了

错误提示: es错误几种,首先是端口被占用,其次是es数据权限不足。