暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

elasticsearch 原理&安装

原创 逆风飞翔 2022-10-29
324

数据总体分为两类:

· 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。

· 非机构化数据:指不定场或无固定格式的数据,入邮件,worf文档等磁盘上的文件

 

elasticsearch安装

1.下载elasticsearch

官网可以直接下载,可以选择最新版本,也可以下载历史版本(箭头所示为历史版本),本案例中选择的是6.2.4版本

2.安装elasticsearch

2.1.上传压缩包并解压

tar zxvf  elasticsearch-6.2.4.tar.gz

目录重命名:mv elasticsearch-6.2.4  elasticsearch

2.2.创建ES用户

默认ES 6.X 是不允许root用户运行的,否则ES运行的时候会报错,所以我们需要创建新的用户

命令:useradd es

命令:passwd es(设置密码)

修改权限 : chown -R es:es elasticsearch-6.2.4

切换用户:su  es

2.3.修改配置

 进入config目录,有两个配置文件需要修改:

2.3.1 修改jvm.options

命令:vi  jvm.options

默认配置:

-Xms1g

-Xmx1g

修改配置:内存占用太多,可以调小一点

-Xms512m

-Xmx512m

2.3.2 修改elasticsearch.yml

命令:vi  elasticsearch.yml

修改数据和日志目录:

path.data: /opt/elasticsearch/data # 数据目录位置

path.logs: /opt/elasticsearch/logs # 日志目录位置

修改绑定的ip:

network.host: 0.0.0.0 # 绑定到0.0.0.0,允许任何ip来访问(默认是只有本机访问)

2.3.3 创建data目录

刚才我们修改配置,把data和logs目录修改指向了elasticsearch的安装目录。但是data目录并不存在,因此我们需要创建出来:

mkdir /opt/elasticsearch/data

修改配置

进入到es安装目录下的config文件夹中,修改elasticsearch.yml 文件

#配置es的集群名称,同一个集群中的多个节点使用相同的标识(单机版可不配置)

#如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。

cluster.name: my-es

#节点名称

node.name: node-1

#初始化,master节点名

cluster.initial_master_nodes: node-1

#数据存储路径

path.data: usr/local/elasticsearch-7.4.0/data

#日志存储路径

path.logs: usr/local/elasticsearch-7.4.0/logs

#节点所绑定的IP地址,并且该节点会被通知到集群中的其他节点

#通过指定相同网段的其他节点会加入该集群中 0.0.0.0任意IP都可以访问elasticsearch

network.host: 0.0.0.0

#对外提供服务的http端口,默认为9200

http.port: 9200

#设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点

discovery.seed_hosts: ["127.0.0.1:9200"]

#ES默认开启了内存地址锁定,为了避免内存交换提高性能。但是Centos6不支持SecComp功能,启动会报错,所以需要将其设置为false

bootstrap.memory_lock: false

# 是否支持跨域

http.cors.enabled: true

# *表示支持所有域名

http.cors.allow-origin: "*"

2.4 运行

进入elasticsearch/bin目录,执行命令:

./bin/elasticsearch -d

发现报错了,有以下几个错误,逐个解决:

 错误1:内核过低

我们使用的是centos6,其linux内核版本为2.6。而Elasticsearch的插件要求至少3.5以上版本。禁用插件即可

修改elasticsearch.yml文件,在最下面添加如下配置:

bootstrap.system_call_filter: false

错误2:文件权限不足

先切换到root用户,然后再修改如下配置:

vi /etc/security/limits.conf

添加配置如下:

* soft nofile 65536

* hard nofile 65536

* soft nproc 4096

* hard nproc 4096

错误3:线程不够

继续修改配置:vi /etc/security/limits.d/90-nproc.conf

* soft nproc 1024 修改为 * soft nproc 4096

错误4:elasticsearch用户拥有的内存权限太小

继续修改配置:vi /etc/sysctl.conf

添加内容:vm.max_map_count=655360

然后执行命令:sysctl -p

所有错误修改完毕,一定要重启你的 Xshell终端,否则配置无效。

es启动报错bootstrap checks failed如何解决

编辑 /etc/security/limits.conf,追加以下内容;

* soft nofile 65536

* hard nofile 65536

此文件修改后需要重新登录用户,才会生效

[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

编辑 /etc/sysctl.conf,追加以下内容:

vm.max_map_count=655360

保存后,执行:

sysctl -p

再次启动运行,成功了

2.5 解决浏览器访问不到的问题

启动之后可以看到绑定了两个端口:

9300:集群节点间通讯接口

9200:客户端访问接口

浏览器访问:http://192.168.39.4:9200

如果访问不到,需要关闭防火墙或添加端口号9200

再次访问可以看到如下效果:

三、设置开机自启动

1. 在/etc/init.d目录下新建文件elasticsearch,配置如下内容:

#!/bin/sh

#chkconfig: 2345 80 05

#description: elasticsearch

export JAVA_HOME=/opt/jdk1.8.0_231

export JAVA_BIN=/opt/jdk1.8.0_231/bin

export PATH=$PATH:$JAVA_HOME/bin

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME JAVA_BIN PATH CLASSPATH

case "$1" in

start)

    su es<<!

    cd /opt/elasticsearch

    ./bin/elasticsearch -d

!

    echo "elasticsearch startup"

    ;;

stop)

    es_pid=`ps aux|grep elasticsearch | grep -v 'grep elasticsearch' | awk '{print $2}'`

    kill -9 $es_pid

    echo "elasticsearch stopped"

    ;;

restart)

    es_pid=`ps aux|grep elasticsearch | grep -v 'grep elasticsearch' | awk '{print $2}'`

    kill -9 $es_pid

    echo "elasticsearch stopped"

    su es<<!

    cd /home/yinlian/elasticsearch

    ./bin/elasticsearch -d

!

    echo "elasticsearch startup"

    ;;

*)

    echo "start|stop|restart"

    ;;

esac

exit $

 

Or-------------------------------------------------------------------------------------------------------------------

(c)编写启动脚本

#!/bin/bash

#chkconfig: 345 63 37

#description: elasticsearch

#processname: elasticsearch-5.4.0

export ES_HOME=/opt/elasticsearch     #这个目录是你Es所在文件夹的目录

case $1 in

        start)

                su elk<<!        #es 这个是启动es的账户,如果你的不是这个记得调整

                cd $ES_HOME

                ./bin/elasticsearch -d -p pid

                exit

!

                echo "elasticsearch is started"

                ;;

        stop)

                pid=`cat $ES_HOME/pid`

                kill -9 $pid

                echo "elasticsearch is stopped"

                ;;

        restart)

                pid=`cat $ES_HOME/pid`

                kill -9 $pid

                echo "elasticsearch is stopped"

                sleep 1

                su elk<<!     #es 这个是启动es的账户,如果你的不是这个记得调整

                cd $ES_HOME

                ./bin/elasticsearch -d -p pid

                exit

!

                echo "elasticsearch is started"

        ;

    *)

        echo "start|stop|restart"

        ;;

esac

exit 0

2. 保存退出,赋予执行权限

chmod +x /etc/init.d/elasticsearch

3. 添加开机自启动

chkconfig --add /etc/init.d/elasticsearch

chkconfig --list

systemctl list-unit-files |grep elasticsearch

四、安装ik分词器

Lucene的IK分词器早在2012年已经没有维护了,现在我们要使用的是在其基础上维护升级的版本,并且开发为Elasticsearch的集成插件了,与Elasticsearch一起维护升级,版本也保持一致:6.2.4

elasticsearch-analysis-ik 分词器下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

1.上传ik分词器,将ik分词器压缩包上传到elasticsearch目录的plugins中

2.使用unzip命令解压压缩包:unzip elasticsearch-analysis-ik-6.2.4.zip,得到一个elasticsearch 文件目录

3.修改文件名:mv elasticsearch ik-analyzer

4.重启elasticsearch

五、Kibana安装

1. 下载kibana,官网即可下载,版本跟elasticsearch保持一致

2. 上传压缩包并解压:tar -zxvf kibana-6.2.4-linux-x86_64.tar.gz

3. 修改文件名:mv kibana-6.2.4-linux-x86_64 kibana

4. 修改kibana.yml配置文件:

#主机名,改为服务器地址

server.host: "192.168.39.4"

#es地址

elasticsearch.url: "http://192.168.39.4:9200"

5. 启动服务:./bin/kibana

浏览器访问,进入kibana界面,效果如下:

http://192.168.39.4:5601

配置文件

在启动运行前,我们介绍下?Elasticsearch 配置文件,即?config/elasticsearch.yml。这里我们需要在配置中增加以下配置,为了允许?elasticsearch-head 运行时的跨域:

# allow origin

http.cors.enabled: true

http.cors.allow-origin: "*"

 

 

安装 logstash

4.1 简单介绍

Logstash 是一个具有实时管道的开源数据收集引擎。可以动态地统一不同来源的数据,并将数据归到不同目的地。也是一个管理事件和日志工具。你可以用它来收集日志,分析它们,并将它们储存起来以供以后使用。

 

Logstash 通常都是和 Kibana 以及 Elasticsearch 一起使用,但是在 ELK 中,Logstash 不是必须安装的。

 

4.2 第一步:上传解压

依然是上传压缩包到/opt 路径下,然后解压缩:

 

//解压缩

 

tar -zxvf logstash-6.2.4.tar.gz

 

//重命名

 

mv logstash-6.2.4 logstash

 

4.3 第二步:修改配置

logstash 最关键的就在于配置上,打开/opt/logstash/config/目录,然后根据自己的需求创建一个配置文件。

 

比如,我的需求是利用 logstash 读取一个.json 文件,然后将其内容发送给 Elasticsearch,那么我要创建一个配置文件:logstash.conf(名称随意)

 

文件内容如下:

 

#读取json文件

 

input {

 

  file {

 

    #设置json文件路径,多个文件路径可设置成数组[],模糊匹配用*

 

    #指定单一文件

 

    path => "/opt/suricataFile/eve.json"

 

    #指定数组文件

 

    #path => ["/data/es/jsonstash-5.6.1/files/test-1.json","/data/es/jsonstash-5.6.1/files/test-2.json"]

 

    #指定同级目录模糊匹配

 

    #path => "/data/es/jsonstash-5.6.1/files/test*.json"

 

    #指定多级目录模糊匹配

 

    #path => "/data/es/jsonstash-5.6.1/files/**/test*.json"

 

 

 

    start_position => "beginning"

 

 

 

    #设置编码

 

    codec => json {charset => "UTF-8"}

 

 

 

    #当存在多个文件的时候可使用type指定输入输出路径

 

    type => "json_index"

 

 

 

    # 删除之前发送过的数据,每次从头解析读取

 

    sincedb_path => "/dev/null"

 

  }

 

}

 

 

 

#2.过滤格式化数据阶段

 

filter {

 

 

 

    mutate{

 

        #删除无效的字段

 

        remove_field => ["@version","message","host","path"]

 

    }

 

 

 

    #新增timestamp字段,将@timestamp时间增加8小时

 

    ruby { code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)" }

 

 

 

}

 

 

 

#3.数据输出到ES阶段

 

output {

 

 

 

    #日志输出格式,json_lines;rubydebug等

 

    stdout {

 

        codec => rubydebug

 

    }

 

 

 

    # 输出到es

 

    if[type] == "json_index"{

 

 

 

        #无法解析的json不记录到elasticsearch中

 

        if "_jsonparsefailure" not in [tags] {

 

            elasticsearch {

 

                #es地址ip端口

 

                hosts => "127.0.0.1:9200"

 

                #索引

 

                index => "json_index"

 

                #类型

 

                document_type => "json_index"

 

 

 

                #覆盖模板,不需要可注释掉,通用模板下载:https://download.csdn.net/download/alan_liuyue/11241484

 

                #template_overwrite=>true

 

                #template=>"/data/es/logstash-5.6.1/template/logstash.json"

 

 

 

            }

 

        }

 

    }

 

 

 

}

 

配置文件主要内容是:读取"/opt/suricataFile/eve.json"文件内容,然后经过过滤后,发送给 Elasticsearch 的索引 json_index,如果没有索引,则要创建该索引。

 

上面的注释介绍的很详细,具体不再多说。

 

4.4 第三步:启动 logstash

运行命令如下:

 

/opt/logstash/bin/logstash -f /opt/logstash/config/logstash.conf

 

运行命令中要指定配置文件(第二步中创建的)。

 

4.5 遇到问题

4.5.1 卡在:Successfully started Logstash API endpoint {:port=>9600}

 

 

如上图所示,就是卡在这里了,我一开始以为这是成功了,但是去查询索引,没有任何增加和导入,不知道是哪里的问题,各种更改配置文件。

 

最后参考下面两个博客解决问题:

 

logstash 导入数据到 Elasticsearch 踩过的坑详解(https://blog.csdn.net/LJFPHP/article/details/89340807)

 

配置 sincedb_path 让 logstash 每次都从头读取文件(https://www.4spaces.org/sincedb-path-logstash/)

 

出现该问题的原因是一开始 logstash 读取 eve.json 文件时,全部读取完了,但是并没有发送(可能出现了某个 bug,暂时不知道),这时生成了一个 sincedb 文件,以后每次读取 eve.json 文件都是从最后开始读取,导致读取不出来。

 

需要增加 sincedb_path => "/dev/null",这是第一个博客获得的信息,但是并没有说增加在哪里?

 

第二个博客上知道了在哪里增加,于是顺利解决问题。

 

4.5.2 配置文件中需不需要写用户和密码

在解决第一个问题的时候,看了很多 logstash 的配置文件,发现有一部分博客中提到要在配置文件中写明 Elasticsearch 所在主机的用户名和密码。

 

但是,最后解决上面后,重新在 root 用户运行(配置文件中并没有写用户和密码),发现依然可以运行,说明并不需要

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论