Elasticsearch京东搜索分析引擎数据库部署与基本使用

  • Elasticsearch 是一个实时的分布式搜索分析引擎, 它能让你以一个之前从未有过的速度和规模,去探索你的数据。 它被用作全文检索、结构化搜索、分析以及这三个功能的组合。

  • Elasticsearch是一个基于Apache Lucene的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。 但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。

  • Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

  • Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

  • Elasticsearch非常适合全文检索。

  • Elasticsrarch 可以灵活的存储不同类型的数据。

应用场景
  • 商城的商品搜索
  • 所有产品的评论
  • 高亮显示搜索内容
  • 收集展示各种日志
数据格式
  • Elasticsearch 使用JavaScript Object Notation 或者JSON作为文档的序列化格式。JSON序列化被大多数编程语言所支持,并且已经成为 NoSQL领域的标准格式。 它简单、简洁、易于阅读。

Elastic术语及概念:

索引词
  • 在elastiasearch中索引词(term)是一个能够被索引的精确值。foo,Foo,FOO几个单词是不同
    的索引词。索引词(term)是可以通过term查询进行准确的搜索。
文本(text)
  • 文本是一段普通的非结构化文字。通常,文本会被分拆成一个个的索引词,存储在elasticsearch
    的索引库中。为了让文本能够进行搜索,文本字段需要事先进行分析了;当对文本中的关键词进
    行查询的时候,搜索引擎应该根据搜索条件搜索出原文本。
分析(analysis)
  • 分析是将文本转换为索引词的过程,分析的结果依赖于分词器。比如:FOO BAR,Foo-Bar和
    foo bar这几个词有可能会被分析成相同的索引词foo和bar,这些索引词存储在Elasticsearch的
    索引库中。
集群(cluster)
  • 集群由一个或多个节点组成,对外提供服务,对外提供索引和搜索功能。在所有节点,一个集群
    有一个唯一的名称默认为“elasticsearch”.此名称是很重要的,因为每个节点只能是集群的一
    部分,当该节点被设置为相同的集群名称时,就会自动加入集群。当需要有多个集群的时候,要
    确保每个集群的名称不能重复,,否则节点可能会加入到错误的集群。请注意,一个节点只能加
    入到一个集群。此外,你还可以拥有多个独立的集群,每个集群都有其不同的集群名称。
节点(node)
  • 一个节点是一个逻辑上独立的服务,它是集群的一部分,可以存储数据,并参与集群的索引和搜索功能。就像集群一样,节点也有唯一的名字,在启动的时候分配。如果你不想要默认名称,你可以定义任何你想要的节点名.这个名字在理中很重要,在Elasticsearch集群通过节点名称进行管理和通信.一个节点可以被配置加入到一个特定的集群。默认情况下,每个节点会加人名为Elasticsearch 的集祥中,这意味着如果你在网热动多个节点,如果网络畅通,他们能彼此发现井自动加人名为Elasticsearch 的一个集群中,你可以拥有多个你想要的节点。当网络没有集祥运行的时候,只要启动一个节点,这个节点会默认生成一个新的集群,这个集群会有一个节点。
分片(shard)
  • 分片是单个Lucene 实例,这是Elasticsearch管理的比较底层的功能。索引是指向主分片和副本分片的逻辑空间。对于使用,只需要指定分片的数量,其他不需要做过多的事情。在开发使用的过程中,我们对应的对象都是索引,Elasticsearch 会自动管理集群中所有的分片,当发生故障的时候,Elasticsearch 会把分片移动到不同的节点或者添加新的节点。
  • 一个索引可以存储很大的数据,这些空间可以超过一个节点的物理存储的限制。例如,十亿个文档占用磁盘空间为1TB。仅从单个节点搜索可能会很慢,还有一台物理机器也不一定能存储这么多的数据。为了解决这一问题,Elasticsearch将索引分解成多个分片。当你创建一个索引,你可以简单地定义你想要的分片数量。每个分片本身是一个全功能的、独立的单元,可以托管在集群中的任何节点。
主分片
  • 每个文档都存储在一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,然后会复制到不同的副本中。
  • 默认情况下,一个索引有5个主分片。 你可以事先制定分片的数量,当分片一旦建立,则分片的数量不能修改。
副本分片
  • 每一个分片有零个或多个副本。副本主要是主分片的复制,其中有两个目的:
  • 增加高可用性:当主分片失败的时候,可以从副本分片中选择一个作为主分片。
  • 提高性能:当查询的时候可以到主分片或者副本分片中进行查询。默认情況下,一个主分片配有一个副本,但副本的数量可以在后面动态地配置增加。副本分片必部署在不同的节点上,不能部署在和主分片相同的节点上。

分片主要有两个很重要的原因是:

  • 允许水平分割扩展数据。
  • 允许分配和井行操作(可能在多个节点上)从而提高性能和吞吐量。
    这些很强大的功能对用户来说是透明的,你不需要做什么操作,系统会自动处理。
索引(index)
  • 索引是具有相同结构的文档集合。例如,可以有一个客户信息的索引,包括一个产品目录的索引,一个订单数据的索引。 在系统上索引的名字全部小写,通过这个名字可以用来执行索引、搜索、更新和删除操作等。在单个集群中,可以定义多个你想要的索引。
类型(type)
  • 在索引中,可以定义一个或多个类型,类型是索引的逻辑分区。在一般情况下,一种类型被定义为具有一组公共字段的文档。例如,让我们假设你运行一个博客平台,并把所有的数据存储在一个索引中。在这个索引中,你可以定义一种类型为用户数据,一种类型为博客数据,另一种类型为评论数据。
文档(doc)
  • 文档是存储在Elasticsearch中的一个JSON格式的字符串。它就像在关系数据库中表的一行。每个存储在索引中的一个文档都有一个类型和一个ID,每个文档都是一个JSON对象,存储了零个或者多个字段,或者键值对。原始的JSON 文档假存储在一个叫作Sour的字段中。当搜索文档的时候默认返回的就是这个字段。
映射
  • 映射像关系数据库中的表结构,每一个索引都有一个映射,它定义了索引中的每一个字段类型,以
    及一个索引范围内的设置。一个映射可以事先被定义,或者在第一次存储文档的时候自动识别。
字段
  • 文档中包含零个或者多个字段,字段可以是一个简单的值(例如字符串、整数、日期),也可以是一
    个数组或对象的嵌套结构。字段类似于关系数据库中表的列。每个字段都对应一个字段类型,例
    如整数、字符串、对象等。字段还可以指定如何分析该字段的值。
主键
  • ID是一个文件的唯一标识,如果在存库的时候没有提供ID,系统会自动生成一个ID,文档的
    index/type/id必须是唯一的。
复制
  • 复制是一个非常有用的功能,不然会有单点问题。 当网络中的某个节点出现问题的时候,复制可以对故障进行转移,保证系统的高可用。因此,Elasticsearch 允许你创建一个或多个拷贝,你的索引分片就形成了所谓的副本或副本分片。

复制是重要的,主要的原因有:

  • 它提供丁高可用性,当节点失败的时候不受影响。需要注意的是,一个复制的分片不会存储在同一个节点中。

  • 它允许你扩展搜索量,提高并发量,因为搜索可以在所有副本上并行执行。

  • 每个索引可以拆分成多个分片。索引可以复制零个或者多个分片.一旦复制,每个索引就有了主分片和副本分片.分片的数量和副本的数量可以在创建索引时定义.当创建索引后,你可以随时改变副本的数量,但你不能改变分片的数量.

  • 默认情況下,每个索引分配5个分片和一个副本,这意味着你的集群节点至少要有两个节点,你将拥有5个主要的分片和5个副本分片共计10个分片.

  • 每个Elasticsearch分片是一个Lucene 的索引。有文档存储数量限制,你可以在一个单一的Lucene索引中存储的最大值为lucene-5843,极限是2147483519(=integer.max_value-128)个文档。你可以使用cat/shards API监控分片的大小。

CentOS7-rpm安装:

  • 部署单节点Elasticsearch服务。
添加主机名解析:
[root@db01 ~]# echo '172.18.1.76 db01' >> /etc/hosts
安装JDK1.8:
[root@db01 ~]# yum install java-1.8.0-openjdk -y
[root@db01 ~]# java -version

openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
配置内核参数:
  • max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量。虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。调优这个值将限制进程可拥有VMA的数量。限制一个进程拥有VMA的总数可能导致应用程序出错,因为当进程达到了VMA上线但又只能释放少量的内存给其他的内核进程使用时,操作系统会抛出内存不足的错误。如果你的操作系统在NORMAL区域仅占用少量的内存,那么调低这个值可以帮助释放内存给内核用。
[root@db01 ~]# echo 'vm.max_map_count = 655360' >> /etc/sysctl.conf
[root@db01 ~]# sysctl -p /etc/sysctl.conf
vm.max_map_count = 655360
下载并安装软件包:
[root@db01 ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.rpm
[root@db01 ~]# rpm -ivh elasticsearch-6.6.0.rpm
配置ES参数:
#修改es配置文件
[root@elk-01 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml

# cluster.name: es-cluster                # 集群名称(单机节点ES需要注释,多节点需要打开。区别:日志文件不同)
node.name: db01                         # 节点名称
node.master: true                       # 当前节点为集群master
node.data: true                         # 当前为数据节点
path.data: /var/lib/elasticsearch       # 数据存放位置
path.logs: /var/log/elasticsearch       # 日志存放位置
bootstrap.memory_lock: true             # 内存空间锁定(固定分配给ES的内存空间)
network.host: 172.18.1.76               # 监听的IP地址
http.port: 9200                         # 监听的端口
discovery.zen.ping.unicast.hosts: ["172.18.1.76"]    # 节点监测的主机名或IP地址
http.cors.enabled: true                 # 当前及以下一行都放在文件最后一行
http.cors.allow-origin: "*"             # 支持跨域访问
开放ES可用内存:
  • 在[Service]标签下加入以下参数(对内存使用是无穷大)
[root@db01 ~]# vim /usr/lib/systemd/system/elasticsearch.service

[Service]
LimitMEMLOCK=infinity
设置ES可用内存:
  • 当前设置为最大与最小都是 512Mb内存。官方说明最大不要超过32G,超过32G性能反而会下降。
# 默认就是 1G
[root@db01 ~]# vim /etc/elasticsearch/jvm.options +22

-Xms512m
-Xmx512m
启动ES服务:
[root@db01 ~]# systemctl daemon-reload
[root@db01 ~]# systemctl start elasticsearch.service
[root@db01 ~]# systemctl enable elasticsearch.service
[root@db01 ~]# netstat -tunpl |grep java
tcp6       0      0 172.18.1.76:9200        :::*                    LISTEN      6050/java           
tcp6       0      0 172.18.1.76:9300        :::*                    LISTEN      6050/java
验证elasticsearch状态:
[root@db01 ~]# curl 172.18.1.76:9200/_cluster/health?pretty
{
  "cluster_name" : "elasticsearch",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "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
}

安装Es-head插件:

  • 使用 nodejs编译安装 elasticsearch-head
安装依赖及插件:
[root@db01 ~]# yum install -y nodejs npm openssl screen git
[root@db01 ~]# node -v
v6.17.1
[root@db01 ~]# npm -v
3.10.10
[root@db01 ~]# npm install -g cnpm --registry=https://registry.npm.taobao.org
下载安装并启动:
[root@db01 ~]# cd /opt
[root@db01 opt]# git clone git://github.com/mobz/elasticsearch-head.git
[root@db01 opt]# cd elasticsearch-head/
[root@db01 elasticsearch-head]# cnpm install
[root@db01 elasticsearch-head]# nohup cnpm run start &
配置ES支持跨域:
  • 添加一下参数到配置文件末尾。

  • 默认 5 分片 1 副本

[root@db01 ~]# vim /etc/elasticsearch/elasticsearch.yml +$
http.cors.enabled: true
http.cors.allow-origin: "*"

[root@db01 ~]# systemctl restart elasticsearch.service
浏览器使用:

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论