Elasticsearch安装教程以及核心概念详解

一.  Elasticsearch介绍.

1.为什么我们要用Elasticsearch?

       当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据不可能是根据数据库的字段查询的,那是怎么查询出来的呢,为什么千奇百怪的关键字都可以查询出来呢? ​

        答案就是全文检索服务,Elasticsearch是一个基于Lucene的全文检索服务器,而lucene采用了词元匹配方案。举个例子:北京天安门----Lucene切分词:北京  天安门  等等这些词元,当我们搜索的时候这些词元都可以检索到北京天安门。

2.Elasticsearch介绍.

        Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也是使用Java开发的, 并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基Lucene)。

3.Elasticsearch的使用案例.

  • 2013年初,GitHub抛弃了Solr,采取ElasticSearch 来做PB级的搜索。 “GitHub使用ElasticSearch搜索20TB的数据,包括13亿文件和1300亿行代码”.
  • 维基百科:启动以elasticsearch为基础的核心搜索架构.
  • SoundCloud:“SoundCloud使用ElasticSearch为1.8亿用户提供即时而精准的音乐搜索服务”.
  • 百度:百度目前广泛使用ElasticSearch作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部20多个业务线(包括casio、云分析、网盟、预测、文库、直达号、钱包、风控等),单集群最大100台机器,200个ES节点,每天导入30TB+数据.
  • 新浪使用ES 分析处理32亿条实时日志.
  • 阿里使用ES 构建挖财自己的日志采集和分析体系.

4.Elasticsearch与solr的对比.

  • Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
  • Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
  • Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
  • Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch

5.Elasticsearch的原理与应用.

1.索引结构.

        下图是ElasticSearch的索引结构,右边方框的部分是原始文档,相当于数据库中的数据,以rows的形式存储. 左边方框部分为逻辑结构,逻辑结构也是为了更好的去描述ElasticSearch的工作原理及去使用物理结构中的索引文件。在Elasticsearch中是以documents的方式来存储每行数据,对于这些数据Elasticsearch会生成一个分词列表:

2.倒排索引

ElasticSearch采用倒排索引的结构进行搜索.

1.什么是正排索引?

         比如查字典时从第一页开始查, 直到找到为止(文档---->关键字)    .    

2.什么是倒排索引?

        倒排索引(Inverted index):  也常被称为反向索引 ,  倒排索引是从关键字到文档的映射(已知关键字求文档).

        逻辑结构部分是一个倒排索引表,由三部分组成:

        1、将搜索的文档最终以Document方式存储起来。

        2、将要搜索的文档内容分词,所有不重复的词组成分词列表。

        3、每个分词和docment都有关联

其中分词列表的特点:

        1.分词列表的内容不重复.

        2."的,  地,  得"等语气词不参加分词.

        3.不搜索的field(域)不参加分词.

二.ES相关概念

1.概述

        Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。Elasticsearch比传统关系型数据库如下:

注意:6.0之前的版本有type(类型)概念,type相当于关系数据库的表,ES6.x 版本之后,type概念被弱化ES官方将在ES7.0版本中彻底删除type。  

2.核心概念

1) index索引

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

2)type类型

        在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。 可类比mysql中的表.

3)document文档

        一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式。在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type。 插入索引库以文档为单位,类比与数据库中的一行数据.

4)Filed字段

        相当于是数据表的字段,对文档数据根据不同属性进行的分类标识 。

5)映射mapping

        mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射里面可以设置的,其它就是处理es里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。相当于mysql中的创建表的过程,设置主键外键等等

6)集群cluster

        一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。一个集群由 一个唯一的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集 群的名字,来加入这个集群。

7)节点node

        一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。和集群类似,一 个节点也是由一个名字来标识的,默认情况下,这个名字是随机的名字,这个名字会在启动的 时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对 应于Elasticsearch集群中的哪些节点。
        一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫 做“elasticsearch”的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此, 它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。
        在一个集群里,只要你想,可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何Elasticsearch节点, 这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的集群。

8)分片和复制 shards&replicas

1.为什么要进行分片?

        一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。

怎样创建分片?

        当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。

        分片很重要,主要有两方面的原因:

1)允许你水平分割/扩展你的内容容量。

2)允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量。

        至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于作为用户的你来说,这些都是透明的。

2.为什么要进行分片的复制?

        在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。

        复制之所以重要,有两个主要原因: 在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行。总之,每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。

        分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。
        默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片。

三.安装 ElasticSearch

1.环境要求

        1、jdk必须是jdk1.8.0_131以上版本。

        2、ElasticSearch 需要至少4096 的线程池和 262144字节以上空间的虚拟内存才能正常启动,所以需要为虚拟机分配至少1.5G以上的内存

        3、从5.0开始,ElasticSearch 安全级别提高了,不允许采用root帐号启动

        4、Elasticsearch的插件要求至少centos的内核要3.5以上版本

2.安装ES

1).下载

        ElasticSearch官网免费且开放的搜索:Elasticsearch、ELK 和 Kibana 的开发者 | Elastic

2).设置虚拟机内存

3).创建用户

从5.0开始,ElasticSearch 安全级别提高了,不允许采用root帐号启动,所以我们要添加一个用户。

1.创建elk 用户组

groupadd elk

2.创建用户admin

useradd admin
passwd admin

3.将admin用户添加到elk组

usermod -G elk admin

4.为用户分配权限

#chown将指定文件的拥有者改为指定的用户或组 -R处理指定目录以及其子目录下的所有文件
chown -R admin:elk /usr/upload
chown -R admin:elk /usr/local

5.切换用户

su admin

4).安装

ES是Java开发的应用,解压即安装:

tar -zxvf elasticsearch-6.2.3.tar.gz -C /usr/local

5).ES目录结构

bin 目录:可执行文件包
config 目录:配置相关目录
lib 目录:ES 需要依赖的 jar 包,ES 自开发的 jar 包
logs 目录:日志文件相关目录
modules 目录:功能模块的存放目录,如aggs、reindex、geoip、xpack、eval
plugins 目录:插件目录包,三方插件或自主开发插件
data 目录:在 ES 启动后,会自动创建的目录,内部保存 ES 运行过程中需要保存的数据。

6).ES的配置文件

ES安装目录config中配置文件如下:

elasticsearch.yml:用于配置Elasticsearch运行参数

jvm.options:用于配置Elasticsearch JVM设置

log4j2.properties:用于配置Elasticsearch日志

配置Elasticsearch.yml:

cluster.name: power_shop
node.name: power_shop_node_1
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["192.168.83.134:9300", "192.168.83.135:9300"]
path.data: /usr/local/elasticsearch-6.2.3/data
path.logs: /usr/local/elasticsearch-6.2.3/logs
http.cors.enabled: true
http.cors.allow-origin: /.*/

常用的配置项解释如下:

cluster.name:
       配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。   
node.name:
      节点名,通常一台物理服务器就是一个节点,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理一个或多个节点组成一个cluster集群,集群是一个逻辑的概念,节点是物理概念,后边章节会详细介绍。
path.data:
       设置索引数据的存储路径,默认是es_home下的data文件夹,可以设置多个存储路径,用逗号隔开。      
path.logs:
       设置日志文件的存储路径,默认是es_home下的logs文件夹         
network.host:  
       设置绑定主机的ip地址,设置为0.0.0.0表示绑定任何ip,允许外网访问,生产环境建议设置为具体的ip。   
http.port: 9200
       设置对外服务的http端口,默认为9200。      
transport.tcp.port: 9300 
       集群结点之间通信端口      
discovery.zen.ping.unicast.hosts:[“host1:port”, “host2:port”, “…”]  
       设置集群中master节点的初始列表。
discovery.zen.ping.timeout: 3s  
       设置ES自动发现节点连接超时的时间,默认为3秒,如果网络延迟高可设置大些。
http.cors.enabled:
	   是否支持跨域,默认为false
http.cors.allow-origin:
	   当设置允许跨域,默认为*,表示支持所有域名

7).ES启动和关闭

1.启动,bin目录下

./elasticsearch   #能看到启动的日志,方便调试
#或
./elasticsearch -d     

2.关闭

ps-ef|grep elasticsearch  #找到当前ES进程ID

kill -9 pid  #杀死进程

3.启动成功,当启动日志中出现如下图显示时表示启动成功

8).ES启动成功后测试

        ES 中只要启动了任意一个 ES 应用就是启动了一个 ES的 cluster 集群。默认的 ES集群命名为 elasticsearch。如果启动了多个应用(可以在多个节点或单一节点上启动多个应用),默认的ES 会自动找集群做加入集群的过程。

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

返回结果如下:

{
  "name" : "power_shop_node_1",  # node name 节点名称。随机分配的节点名称
  "cluster_name" : "power_shop",  # cluster name 集群名称。 默认的集群名称
  "cluster_uuid" : "RqHaIiYjSoOyrTGq3ggCOA",  # 集群唯一 ID
  "version" : { 
    "number" : "6.2.3",  #版本号
    "build_hash" : "c59ff00", 
    "build_date" : "2018-03-13T10:06:29.741383Z", #发布日期
    "build_snapshot" : false, #是否快照版本
    "lucene_version" : "7.2.1", #lucene版本号
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

四.解决启动后的常见问题

1.解决文件创建权限问题

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

报错原因:

Linux 默认来说,一般限制应用最多创建的文件是 4096个。但是 ES 至少需要 65536 的文件创建权限。我们用的是admin用户,而不是root,所以文件权限不足。

解决:

切换到root用户修改配置文件:

vim /etc/security/limits.conf

在文件中追加下面的内容:

* soft nofile 65536
* hard nofile 65536

2.解决虚拟内存问题

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

报错原因:

ES 需要开辟一个 262144字节以上空间的虚拟内存。Linux 默认不允许任何用户和应用直接开辟虚拟内存。

解决:

切换到root用户修改配置文件:

vim /etc/sysctl.conf

在文件中追加下面的内容:

vm.max_map_count=655360   #限制一个进程可以拥有的VMA(虚拟内存区域)的数量.

然后执行命令,让sysctl.conf配置生效:

sysctl  -p

五.ES快速入门

        ES作为一个索引及搜索服务,对外提供丰富的REST接口,快速入门部分的实例使用kibana来测试,目的是对ES的使用方法及流程有个初步的认识。

1.index管理

1).创建index

索引库。包含若干相似结构的 Document 数据,相当于数据库的database。

语法:PUT /index_name

        number_of_shards - 表示一个索引库将拆分成多片分别存储不同的节点,提高了ES的处理能力.

     number_of_replicas - 是为每个 primary shard分配的replica shard数,提高了ES的可用性,如果只有一台机器,设置为0.

效果:

 2).修改index

注意:索引一旦创建,primary shard 数量不可变化,可以改变replica shard 数量。

语法:PUT /index_name/_settings

修改replica shard 数量:

PUT java2203/_settings
{
  "number_of_replicas": 1
}

注意:  ES 中对 shard 的分布是有要求的,有其内置的特殊算法:

        Replica shard 会保证不和他的那个 primary shard 分配在同一个节点上;如果只有一个节点,则此案例执行后索引的状态一定是yellow。

效果:

3).删除index

DELETE /java2203

2.mapping管理

映射,创建映射就是向索引库中创建field(类型、是否索引、是否存储等特性)的过程.

1).创建mapping

语法:POST /index_name/type_name/_mapping

POST java2203/class/_mapping
{
  "properties": {
    "name": {
        "type": "text"
     },
     "description": {
        "type": "text"
     },
     "studymodel": {
        "type": "keyword"
     }
  }
}

效果:

 2).查询所有索引的映射

GET java2203/class/_mapping

结果:

 3).更新mapping

映射创建成功可以添加新字段,已有字段不允许更新。

4).删除mapping

通过删除索引来删除映射。

DELETE java2203

3.document管理

1).创建document.

ES中的文档相当于MySQL数据库表中的记录。

POST语法:

        此操作为 ES 自动生成 id 的新增 Document 方式。

        语法:POST /index_name/type_name

POST java2203/class
{
  "name":"python从入门到放弃",
  "description":"人生苦短,我用Python",
  "studymodel":"201002"
}

结果:

 使用指定的id:

语法:POST /index_name/type_name/id

POST java2203/class/1
{
  "name":".net从入门到放弃222",
  "description":".net程序员谁都不服",
  "studymodel":"201003"
}

结果:

 结果的说明:

{
  "_index": "test_index",     #新增的 document 在什么 index 中,
  "_type": "my_type",    #新增的 document 在 index 中的哪一个 type 中。
  "_id": "1",    #指定的 id 是多少
  "_version": 1,    #document 的版本是多少,版本从 1 开始递增,每次写操作都会+1
  "result": "created",    #本次操作的结果,created 创建,updated 修改,deleted 删除
  "_shards": {    #分片信息
      "total": 2,    #分片数量只提示 primary shard
      "successful": 1,    #数据 document 一定只存放在 index 中的某一个 primary shard 中
      "failed": 0
  },
  "_seq_no": 0, 
  "_primary_term": 1
}

通过head查看数据:

 2).查询document

语法:

GET /index_name/type_name/id

GET /index_name/type_name/_search?q=field_name:field_value

如:根据班级id查询文档

GET java2203/class/1

如:查询所有记录

GET java2203/class/_search

如:查询名称中包括python关键字的的记录

GET java2203/class/_search?q=name:python

3).删除document

        ES 中执行删除操作时,ES先标记Document为deleted状态,而不是直接物理删除。当ES 存储空间不足或工作空闲时,才会执行物理删除操作,标记为deleted状态的数据不会被查询搜索到(ES 中删除 index ,也是标记。后续才会执行物理删除。所有的标记动作都是为了NRT(近实时)实现)

语法:

DELETE /index_name/type_name/id

如:

DELETE java2203/class/1

结果:

4.ES读写过程 

1.documnet routing(数据路由)

        当客户端创建document的时候,es需要确定这个document放在该index哪个shard上,这个过程就是document routing。

路由过程:

    路由算法:shard = hash(id) %number_of_primary_shards

    id:document的_id,可能是手动指定,也可能是自动生成,决定一个document在哪个shard上.

    number_of_primary_shards主分片数量。

2.为什么primary shard数量不可变?

        原因:假如我们的集群在初始化的时候有5个primary shard,我们往里边加入一个document id=5,假如hash(5)=23,这时该document 将被加入 (shard=23%5=3)P3这个分片上。如果随后我们给es集群添加一个primary shard ,此时就有6个primary shard,当我们GET id=5 ,这条数据的时候,es会计算该请求的路由信息找到存储他的 primary shard(shard=23%6=5) ,根据计算结果定位到P5分片上。而我们的数据在P3上。所以es集群无法添加primary shard,但是可以扩展replicas shard。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值