美文网首页
一图看懂Elasticsearch基本原理

一图看懂Elasticsearch基本原理

作者: sknfie | 来源:发表于2021-06-18 15:26 被阅读0次

概述

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。

全文检索、倒排索引和Lucene

1.全文检索

全文检索是指全文数据中检索单个文档或文档集合的搜索技术,而 Elasticserach 从这个方面来说也可以理解为是一个全文数据库。数据存储时,经行分词建立term索引库。

2.倒排索引

倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。

3.Lucene

就是一个jar包,里面封装了全文检索的引擎、搜索的算法代码。开发时,引入lucen的jar包,通过api开发搜索相关业务。底层会在磁盘建立索引库。

Elasticsearch功能

  • 分布式的搜索引擎和数据分析引擎
    搜索:互联网搜索、电商网站站内搜索、 OA系统查询;
    数据分析:电商网站查询近一周哪些品类的图书销售前十;
    新闻网站,最近3天阅读量最高的十个关键词,舆情分析。
  • 全文检索,结构化检索,数据分析
    全文检索:搜索商品名称包含java的图书select * from books where book_name like "%java%"。
    结构化检索:搜索商品分类为spring的图书都有哪些, select * from books where category_id='spring'
    数据分析:分析每一个分类下有多少种图书, select category_id,count(*) from books group by category_id对海量数据进行近实时的处理
  • 分布式:
    ES自动可以将海量数据分散到多台服务器上去存储和检索,经行并行查询,提高搜索效率。相对的, Lucene是单机应用。
  • 近实时:
    数据库上亿条数据查询,搜索一次耗时几个小时,是批处理(batch-processing)。而es只需秒级即可查询海量数据,所以叫近实时,秒级。

应用案例

  • 百度搜索,第一次查询,使用es。
  • OA、 ERP系统站内搜索。
  • 维基百科
    类似百度百科, “网络七层协议”的维基百科,全文检索,高亮,搜索推荐Stack Overflow(国外的程序讨论论坛),相当于程序员的贴吧。遇到it问题去上面发帖,热心网友下面回帖解答。
  • GitHub(开源代码管理),搜索上千亿行代码。
  • 电商网站,检索商品
  • 日志数据分析, logstash采集日志, ES进行复杂的数据分析(ELK技术, elasticsearch+logstash+kibana)
  • 商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅《编程思想》的监控,如果价格低于20块钱,就通知我去买。
  • BI系统,商业智能(Business Intelligence)。大型连锁超市,分析全国网点传回的数据,分析各个商品在什么季节的销售量最好、利润最高。成本管理,店面租金、员工工资、负债等信息进行分析。从而部署下一个阶段的战略目标。

架构特性

  • 可拓展性:大型分布式集群(数百台服务器)技术,处理PB级数据,大公司可以使用。小公司数据量小,也可以部署在单机。大数据领域使用广泛。
  • 技术整合:将全文检索、数据分析、分布式相关技术整合在一起: lucene(全文检索),商用的数据分析软件(BI软件),分布式数据库(mycat)
  • 部署简单:开箱即用,很多默认配置不需关心,解压完成直接运行即可。拓展时,只需多部署几个实例即可,负载均衡、分片迁移集群内部自己实施。
  • 接口简单:使用restful api经行交互,跨语言。
  • 功能强大: Elasticsearch作为传统数据库的一个补充,提供了数据库所不不能提供的很多功能,如全文检索,同义词处理,相关度排名。

elasticsearch基本概念

1. NRT(Near Realtime):近实时

两方面:
写入数据时,过1 秒才会被搜索到,因为内部在分词、录入索引。
es搜索时:搜索和分析数据只需要秒级出结果。

2. Cluster:集群

包含一个或多个启动着es实例的机器群。
通常一台机器起一个es实例。
同一网络下,集名一样的多个es实例自动组成
集群,自动均衡分片等行为。默认集群名为“elasticsearch”。

3. Node:节点

每个es实例称为一个节点。节点名自动分配,也可以手动配置。

4. Index:索引

包含一堆有相似结构的文档数据。
索引创建规则:

仅限小写字母
不能包含\、 /、 *、 ?、 "、 <、 >、 | 、 #以及空格符等特殊符号
从7.0版本开始不再包含冒号
不能以-、 _或+开头
不能超过255个字节(注意它是字节,因此多字节字符将计入255个限制)

5. Document:文档

es中的最小数据单元。一个document就像数据库中的一条记录。通常以json格式显示。多个document存储于一个索引(Index)中。

book document
{
"book_i d": "1",
"book_name": "编程思想",
"book_desc": "从基础语法到最高级特性 ",
"category_i d": "2",
"category_name": "code"
}

6. Field:字段

就像数据库中的列(Columns),定义每个document应该有的字段。

7. Type:类型

每个索引里都可以有一个或多个type, type是index中的一个逻辑数据分类,一个type下的document,都有相同的field。
注意: 6.0之前的版本有type(类型)概念, type相当于关系数据库的表, ES官方将在ES9.0版本中彻底删除type。这里type都为_doc。

8. shard:分片

index数据过大时,将index里面的数据,分为多个shard,分布式的存储在各个服务器上面。可以支持海量数据和高并发,提升性能和吞吐量,充分利用多台机器的cpu。

9. replica:副本

在分布式环境下,任何一台机器都会随时宕机,如果宕机, index的一个分片没有,导致此index不能搜索。所以,为了保证数据的安全,我们会将每个index的分片经行备份,存储在另外的机器上。保证少数机器宕机es集群仍可以搜索。
能正常提供查询和插入的分片我们叫做主分片(primary shard),其余的我们就管他们叫做备份的分片(replica shard)。
es6默认新建索引时, 5分片, 2副本,也就是一主一备,共10个分片。所以, es集群最小规模为两台。

与数据库的区别

ES与DB的区别

安装部署

1.前置准备

  • 修改文件限制
vi /etc/security/limits.conf
* hard nofile 65536
* soft nproc 2048
* hard nproc 4096
* soft memlock unlimited
* hard memlock unlimited

reboot
  • 调整进程数
vi /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     4096
root       soft    nproc     unlimited
  • 调整虚拟机内存&最大并发连接
vi /etc/sysctl.conf
vm.max_map_count=655360
fs.file-max=655360

sysctl -p

若之前未有过ElasticSearch的安装,在安装集群版之前,建议先了解一下单机版创建。集群版无非就是拷贝了几套单机版的安装包,配置稍加改


集群配置
  • 集群环境准备


    集群节点

2.下载安装包

官方下载地址: https://www.elastic.co/cn/downloads/elasticsearch
以7.10.2为例:
命令下载

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-linuxx86_64.tar.gz

3. 创建集群目录

每一台服务器都需要设置。

#创建集群存储主目 录
mkdir /soft/elk
#解压到集群目录下
tar -xzvf elasticsearch-7.10.2-linux-x86_64.tar.gz -C /soft/elk
#切换到目 录下
cd /soft/elk
#修改解压后的文件名为 elasticsearch, (为了方便区分根据节点名)
ln -s elasticsearch-7.10.2/ elasticsearch
# 创建数据存储目录
mkdir -p /soft/elk/data
# 创建日 志存储目录
mkdir -p /soft/elk/logs

注:这里为了区分是es的多个节点:
第1台的目录文件夹为 elasticsearch-a
第2台的目录文件夹为 elasticsearch-b
第3台的目录文件夹为 elasticsearch-c

注:安装包不用下载多次可以使用SCP命令传输到另外两台示例:

scp -r elasticsearch-7.4.0-linux-x86_64.tar.gz root@192.168.2.192:/soft/elk

4. 节点node-a配置

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

#配置es的集群名称,同一个集群中的多个节点使用相同的标识
#如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
cluster.name: my-es-cluster
#节点名称
node.name: node-a
#是不是有资格竞选主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 3
#数据存储路径
path.data: /soft/elk/data
#日志存储路径
path.logs: /soft/elk/logs
#节点所绑定的IP地址,并且该节点会被通知到集群中的其他节点
#通过指定相同网段的其他节点会加入该集群中0.0.0.0任意IP都可以访问elasticsearch
network.host: 192.168.2.191
#对外提供服务的http端口,默认为9200
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
#es7.x之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["192.168.2.191:9301","192.168.2.192:9301","192.168.2.193:9301"]
#es7.x之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node-a","node-b","node-c"]
#ES默认开启了内存地址锁定,为了避免内存交换提高性能。但是Centos6不支持SecComp功能,启动会报错,所以需要将
其设置为false
bootstrap.memory_lock: false
#是否支持跨域
http.cors.enabled: true
#*表示支持所有域名
http.cors.allow-origin: "*"

5. 节点node-b配置

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

#配置es的集群名称,同一个集群中的多个节点使用相同的标识
#如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
cluster.name: my-es-cluster
#节点名称
node.name: node-b
#是不是有资格竞选主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 3
#数据存储路径
path.data: /soft/elk/data
#日志存储路径
path.logs: /soft/elk/logs
#节点所绑定的IP地址,并且该节点会被通知到集群中的其他节点
#通过指定相同网段的其他节点会加入该集群中0.0.0.0任意IP都可以访问elasticsearch
network.host: 192.168.2.192
#对外提供服务的http端口,默认为9200
http.port: 9201
#内部节点之间沟通端口
transport.tcp.port: 9301
#es7.x之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["192.168.2.191:9301","192.168.2.192:9301","192.168.2.193:9301"]
#es7.x之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node-a","node-b","node-c"]
#ES默认开启了内存地址锁定,为了避免内存交换提高性能。但是Centos6不支持SecComp功能,启动会报错,所以需要将其设置为false
bootstrap.memory_lock: false
#是否支持跨域
http.cors.enabled: true
#*表示支持所有域名
http.cors.allow-origin: "*"

6. 节点node-c配置

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

#配置es的集群名称,同一个集群中的多个节点使用相同的标识
#如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
cluster.name: my-es-cluster
#节点名称
node.name: node-c
#是不是有资格竞选主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 3
#数据存储路径
path.data: /soft/elk/data
#日志存储路径
path.logs: /soft/elk/log
#节点所绑定的IP地址,并且该节点会被通知到集群中的其他节点
#通过指定相同网段的其他节点会加入该集群中0.0.0.0任意IP都可以访问elasticsearch
network.host: 192.168.2.193
#对外提供服务的http端口,默认为9200
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
#es7.x之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["192.168.2.191:9301","192.168.2.192:9301","192.168.2.193:9301"]
#es7.x之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node-a","node-b","node-c"]
#ES默认开启了内存地址锁定,为了避免内存交换提高性能。但是Centos6不支持SecComp功能,启动会报错,所以需要将其设置为false
bootstrap.memory_lock: false
#是否支持跨域
http.cors.enabled: true
#*表示支持所有域名
http.cors.allow-origin: "*"

7. 启动用户与赋权

由于ES限制不能使用root 用户启动,这里与单机版安装时使用了相同的elasticsearch用户创建用户: elasticsearch

adduser elk

设置用户密码,需要输入两次

passwd elk

注:由于是伪集群,都在同一台服务器,所以3个节点目录都需要赋权,多台服务器的话,都需要操作

chown -R elk:elk /soft/elk/elasticsearch
chown -R elk:elk /soft/elk/elasticsearch-7.10.2
chown -R elk:elk /soft/elk/data
chown -R elk:elk /soft/elk/logs

8.启动集群环境

启动之前,建议针对实际使用场景,设置合适的JVM内存,详见附录

#切换到用户
su elk
#切换到a节点
cd /soft/elk/elasticsearch/bin
#控制台启动命令
. /elasticsearch
#后台启动命令
#./elasticsearch -d

同启动a节点一致,分别再次启动 b节点、 C节点

注:启动小妙招,先不要着急后台启动,直接使用 ./elasticsearch 启动看一下是否报错。若出现报错,可以到前一篇文章单机版ES搭建中找下,列举出来了常见的几种启动问题。

访问网址:http://192.168.2.191:9200/

{
  "name" : "node-a",
  "cluster_name" : "my-es-cluster",
  "cluster_uuid" : "lUrx9FBDTty_ZqQaWBwZSQ",
  "version" : {
    "number" : "7.10.2",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "747e1cc71def077253878a59143c1f785afa92b9",
    "build_date" : "2021-01-13T00:42:12.435326Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

相关文章

网友评论

      本文标题:一图看懂Elasticsearch基本原理

      本文链接:https://www.haomeiwen.com/subject/yoekyltx.html