Elasticsearch

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch相关的知识,希望对你有一定的参考价值。

ELK能够做什么?

26 个datanode:

2.4Ghz*8, 42G, 300G *10 RAID5

25种日志,7天,650亿条数据,6万个字段

单日数据8TB,写入峰值19万qps

10个rsyslog/logstash

rsyslog/logstash/kibana都有二次开发

使用人员:故障管理组,客户端开发,服务端开发,运维

日志能够干什么?

    1、找问题

    2、安全审计

    3、监控    

其他日志分析系统:

    splunk  收费,多用在银行、金融、中石油等。土豪系统


一.简介 

ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。支持通过HTTP使用JSON进行数据索引。 

我们建立一个网站或应用程序,并要添加搜索功能,令我们受打击的是:搜索工作是很难的。我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP的索引数据,我们希望我们的搜索服务器始终可用,我们希望能够一台开始并扩展到数百,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。Elasticsearch旨在解决所有这些问题和更多的。

1.基于Lucene构建ES 

怎样在Lucene之上构建一个分布式、高度伸缩、接近实时的搜索引擎呢? 让我们回顾一下在搜索引擎(基于lucene)伸缩性这条路上都做了那些尝试,并且elasticsearch是如何尝试并去解决这些挑战的。 

首先我们了解下最基础的理论知识 building blocks (这些理论基础是构建分布式近实时搜索引擎的基础)。 接着我们研究一下到底哪种才是最佳的分区策略 partitioning (将lucene索引文档分割到多个分布式的分片中去)。 然后我们同样需要决定使用哪种分区复制方式 replication (复制能够保证系统的高可用以及提高搜索的吞吐)。 最后,我们再看一下事务日志 transaction log (事务日志在elasticsearch里面是一个保证数据一致性的非常酷的功能)。

二.ElasticSearch概念

1.Cluster(集群) 

代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举

产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。 

2.Node(节点) 

一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于Elasticsearch 集群中的哪些节点。 

一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。 

在一个集群里,只要你想,可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何Elasticsearch节点,这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的集群。 

3.index(索引) 

一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。 

在一个集群中,如果你想,可以定义任意多的索引。 

索引相当于数据库

4.Type(类型) 

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,

我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。 

类型相当于数据库中的表

5.Document(文档) 

一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以 JSON(javascript Object Notation)格式来表示,而 JSON 是一个到处存在的互联网数据交互格式。 

在一个 index/type 里面,只要你想,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的 type。 

文档相当于表中的一行记录

6.Shards(分片) 

代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。 

7.Replicas(副本分片) 

代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当个某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。 

总之,每个索引可以被分成多个分片。一个索引也可以被复制 0 次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。 

默认情况下,Elasticsearch 中的每个索引被分片 5 个主分片和 1 个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有 5 个主分片和另外 5 个复制分片(1 个完全拷贝),这样的话每个索引总共就有 10 个分片。 


ES集群是通过组播来进行发现的。

GREEN:健康    Y:主分片正常  red:主分片丢失

vi /etc/sysctl.conf

# 增加下面的内容

fs.file-max=65536

vm.max_map_count=262144

#java -version > v1.8

#tar zxf elasticsearch-5.6.2.tar.gz

#ln -s elasticsearch-5.6.2 elasticsearch

elasticsearch.yml 用于配置elasticsearch

log4j2.properties 用于配置elasticsearch的日志。

#sudo vi /path/elasticsearch/config/elasticsearch.yml


# ---------------------------------- Cluster -----------------------------------


cluster.name: elasticsearch


# ------------------------------------ Node ------------------------------------


node.name: yournodename

# ----------------------------------- Memory -----------------------------------


bootstrap.memory_lock: false

bootstrap.system_call_filter: false


# ---------------------------------- Network -----------------------------------


network.host: 172.16.64.94

http.port: 52333


# --------------------------------- Discovery ----------------------------------


discovery.zen.ping.unicast.hosts: ["172.16.64.94", "172.16.64.95", "172.16.64.96"]

#


#vi jvm.options 


-Xms512m        #视环境而调

-Xmx512m        #视环境而调


#root用户

sysctl -w vm.max_map_count=262144

sysctl -a|grep vm.max_map_count


sudo vi /path/elasticsearch/bin/elasticsearch

sudo vi /path/elasticsearch/bin/elasticsearch-plugin


##elasticsearch必须在java1.8及以上,在多个java版本的情况下可在配置文件下指定java版本

export JAVA_HOME=/path/jdk1.8

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/*.jar

export PATH=.:$JAVA_HOME/bin:$PATH

export ES_HOME=/path/elasticsearch


启动:/path/elasticsearch/bin/elasticsearch -d


问题总结:

    1、启动 elasticsearch 如出现异常  can not run elasticsearch as root  

解决方法:创建ES 账户,修改文件夹 文件 所属用户 组

2、启动异常:ERROR: bootstrap checks failed

system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk

问题原因:因为Centos6不支持SecComp,而ES5.2.1默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动。详见 :https://github.com/elastic/elasticsearch/issues/22899

解决方法:在elasticsearch.yml中配置bootstrap.system_call_filter为false,注意要在Memory下面:

bootstrap.memory_lock: false

bootstrap.system_call_filter: false

3、启动后,如果只有本地可以访问,尝试修改配置文件 elasticsearch.yml

中network.host(注意配置文件格式不是以 # 开头的要空一格, : 后要空一格)

为 network.host: 0.0.0.0

默认端口是 9200

注意:关闭防火墙 或者开放9200端口

4、ERROR: bootstrap checks failed

max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]

max number of threads [1024] for user [lishang] likely too low, increase to at least [2048]


解决方法:切换到root用户,编辑limits.conf 添加类似如下内容

vi /etc/security/limits.conf 

添加如下内容:

* soft nofile 65536

* hard nofile 131072

* soft nproc 2048

* hard nproc 4096

5、max number of threads [1024] for user [lish] likely too low, increase to at least [2048]

解决:切换到root用户,进入limits.d目录下修改配置文件。

vi /etc/security/limits.d/90-nproc.conf 

修改如下内容:

* soft nproc 1024

#修改为

* soft nproc 2048

6、max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

解决:切换到root用户修改配置sysctl.conf

vi /etc/sysctl.conf 

添加下面配置:

vm.max_map_count=655360

并执行命令:

sysctl -p

然后,重新启动elasticsearch,即可启动成功。


Elasticsearch交互(CLI交互):

    curl -i -XGET ‘http://172.16.64.94:52333/_count?pretty‘ -d ‘

    {

        "query":{

            "match_all":{}

        }

    }

    ‘


以上是关于Elasticsearch的主要内容,如果未能解决你的问题,请参考以下文章