注:本篇的es基于7.5.1版本
目录
Elasticsearch是什么?
ElasticSearch的环境搭建
ElasticSearch的名词
ElasticSearch查询出的数据格式
ElasticSearch中9200&9300端口
ElasticSearch的架构
ElasticSearch索引模板
ElasticSearch数据持久化到磁盘的过程
ElasticSearch的倒排索引
ElasticSearch集群相关
ElasticSearch中的节点种类
ElasticSearch集群搭建
Elasticsearch是什么?
Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,Restful接口和无模式JSON文档。Elasticsearch是用Java开发的,并在Apache许可证下作为开源软件发布。 -------维基百科
说白了就是一个分布式的高性能全文搜索引擎,提供非常牛逼的模糊搜索。
ElasticSearch的环境搭建
知道干啥的了,就先跑起来。
先说一下ES是需要JDK环境的。低版本的ES需要我们下载JDK然后运行,高版本直接内置了JDK 可以直接设置成环境变量不用单独下载了。
但是!!!我下面是用docker 跑的哈哈哈 不需要考虑这些东西。
docker pull elasticsearch:7.5.1
docker run --name esSingle -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -v /home/zy/docker/es/node1/config:/usr/share/elasticsearch/config -v /home/zy/docker/es/node1/data:/usr/share/elasticsearch/data -v /home/zy/docker/es/node1/logs:/usr/share/elasticsearch/logs elasticsearch:7.5.1
curl 127.0.0.1:9200 有ES的结果就安装成功了。 参数discovery.type是发现模块的参数,设置一下ES为单节点。 上面映射了三个目录,看名就知道是干啥的了。
ElasticSearch的名词
索引(index):相当于关系型数据库中的一个库。
类型(type):相当于关系型数据库的一个表。
文档:相当于一条数据。一个文档被一个index+type+id唯一标识。
分片(shard):一个index分成物理分片存储在集群中的不同节点(一个节点可以包括多个分片),分片分为主分片和副本分片。
节点(node):一个ES实例、
倒排索引:是ES快速搜索到一个文档的数据结构。
分析:将全文转化成术语(词)的过程 FoO ---> foo
集群:多个node节点组成。node节点的cluster.name 必须相同。每个集群自动选择一个master节点。master节点down掉重新选
Translog: 提供所有还没有被刷到磁盘的操作的一个持久化记录(CRUD)。
Segment: lucene把每次生成的倒排索引叫做一个 segment
ElasticSearch查询出的数据格式
ES是分布式的。当文档创建、更新、删除等写操作时,新版本的文档必须复制到集群中的其他节点。ES是异步和并发的,ES使用_seq_no和_primary_term来确保旧版本不会覆盖新版本,唯一标识一个版本。进行乐观锁并发控制。
version用于计算文档更新的请求(bulk批操作的文档的_version相同)
seq_no用于计算索引上发生的操作数(bulk批操作的文档seq递增)
每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1
可以使用bulk操作来验证version与seq_no
ElasticSearch中9200&9300端口
9200作为Http协议,主要用于外部通讯
9300作为Tcp协议,client之间就是通过tcp协议通讯,es集群之间是通过9300进行通讯。
ElasticSearch的架构
Gateway是ES用来存储索引的文件系统,支持多种类型。
Gateway的上层是一个分布式的lucene框架。
Lucene之上是ES的模块,包括:索引模块、搜索模块、映射解析模块等ES模块之上是 Discovery、Scripting和第三方插件。
Discovery是ES的节点发现模块,不同机器上的ES节点要组成集群需要进行消息通信,集群内部需要选举master节点,这些工作都是由Discovery模块完成。支持多种发现机制,如 Zen 、EC2、gce、Azure。
Scripting用来支持在查询语句中插入javascript、python等脚本语言,scripting模块负责解析这些脚本,使用脚本语句性能稍低。
ES也支持多种第三方插件。
再上层是ES的传输模块和JMX.传输模块支持多种传输协议,如 Thrift、memecached、http,默认使用http。
JMX是java的管理框架,用来管理ES应用。
最上层是ES提供给用户的接口,可以通过RESTful接口和ES集群进行交互。
ElasticSearch基本操作就不再描述了。去官网上学吧。那最全!
ElasticSearch索引模板
索引模板是一个比较有用的东西。他能让你创建索引省去很多重复性的劳动,比如日志索引,可以复用一个索引模板。这样可以配合filebeat/logstash自动创建好你的日志索引的格式。
索引模板主要拆分成如下几个部分
{
"order": 0, // 模板优先级order数字越大, 模板优先级越高。
"template": "logs-*", // 模板匹配的名称方式
"settings": {...}, // 索引设置, 字段拆分
"mappings": {...}, // 索引中各字段的映射定义
"aliases": {...} // 索引的别名.零停机的情况下从旧索引迁移到新索引。
}
其中settings 部分设置一些解析相关。
"settings": {
"index": {
"analysis": {
“char_filter”: { ... }, // 用户自定义字符过滤器,字符串替换
“tokenizer”: { ... }, // 用户自定义分词器,字符串拆分
“filter”: { ... }, // 用户自定义标记过滤器,字符串去除
"analyzer": { ... } // 用户自定义分析器
},
"number_of_shards": "32", // 主分片的个数
"number_of_replicas": "1", // 主分片的拷贝分片个数
"refresh_interval": "5s" // 刷新时间 往文件系统缓存中刷segment
}
}
mapping设置字段相关的,分为动态映射以及自定义字段。
"mappings": {
"my_type": {
"dynamic_templates": [
{
"string_fields": { // 字段映射模板的名称,一般为"类型_fields"的命名方式
"match": "*", // 匹配的字段名为所有
"match_mapping_type": "string", // 限制匹配的字段类型,只能是 string 类型
"mapping": {
"fielddata": { "format": "disabled" }, // fielddata 不可用,对于分析字段,其默认值是可用
"analyzer": "only_words_analyzer", // 字段采用的分析器名,默认值为 standard 分析器
"index": "analyzed", // 索引方式定义为索引,默认值是分析
"omit_norms": true, // omit_norms 为真表示考虑字段的加权,可分析字段默认值 false
"type": "string", // 字段类型限定为 string
"fields": { // 定义一个嵌套字段,将该字段应用于不分析的场景
"raw": {
"ignore_above": 256, // 忽略字段对应的值长度大于256的字段
"index": "not_analyzed", // 索引方式为不分析
"type": "string", // 字段的类型为 string
"doc_values": true // 对于不分析字段,doc_values 对应的是一种列式存储结构,默认false
}
}
}
}
}
],
"properties": {
"user_city": { // 字段名
"analyzer": "lowercase_analyzer", // 字段分析器
"index": "analyzed", // 字段索引方式定义索引
"type": "string", // 字段数据类型定义为 string
"fields": { // 定义一个名为 user_city.raw 的嵌入的不分析字段
"raw": {
"ignore_above": 512,
"index": "not_analyzed",
"type": "string"
}
}
}
}
}
}
ElasticSearch数据持久化到磁盘的过程
1、Refresh: 将segment刷到文件系统缓存的步骤叫做refresh 刷到文件系统缓存之后可供用户搜索。
2、参数refresh_interval:1s 设置刷segment的频率。每个索引的settings中设置。可以主动调用refresh的API刷、
3、Flush: Segment持久化到磁盘的步骤叫flush
4、当segment被刷到磁盘中后commit提交点会更新,对应的translog文件会被清空、
5、Translog文件每5秒或每次请求操作接收前会强制刷到磁盘。防止translog文件丢失。
6、Segment是单个的倒排索引,这么维护特别费劲,因此segment会进行合并。
7、当归并segment完成,commit文件会删除小的segment,改成大的segment
8、segment合并可以通过自定义策略。还可以通过forcemergeAPI强制合并
9、合并结束,老segment会被删除
ElasticSearch的倒排索引
倒排索引是ES比较厉害的一个数据结构。每个字段有自己的倒排索引。
Term index: 一棵字典树Trie tree,用来存储前缀来帮助快速搜索词。(女/男) 减少磁盘的随机读取操作。
Term dictionary: 排序的词序列。排序之后时间复杂度就从O(n)àO(logn)存储篮球,足球这种词。
Posting List: 按照字段划分。比如play 篮球[1,2] 排球[3] 会记录每个字段相关的id
ElasticSearch集群相关
如图所示是一个集群的分布。 图中有三个node节点也就是三个ES实例。P代表Primary shard 主分片,R代表replica副本分片。一个索引创建时可以主动指定分片的数量且主分片指定后不允许改变。
带有master字样的node是整个集群的主节点。它有权限控制整个集群,比如资源的分配、节点的修改等等
ES路由&副本分片
shard = hash(routing) % number_of_primary_shards
routing是一个可变值。默认是文档的 _id,路由依赖索引分片的数量,所以创建索引时要确定好主分片的数量。并且不修改这个数量、如果数量变化了,所有之前的值都丢失了。
1.请求打到node1的主分片P1,node1节点通过路由计算得到数据存储在P0分片上,通过cluster state 发现P0在node3节点node1将请求转发给node3
2.node3完成请求后,存入P0,然后并行转发数据给有P0的副本分片R0的node1和node2
3.当收到任一节点返回副本分片写入成功,node3返回给node1结果,node1返回给客户端。
ElasticSearch中的节点种类
Elasticsearch.yml文件中可以配置node.master、node.data、node.ingest、以及tribe.*
1.Master节点、主节点。当一个节点配置node.master: true(默认)的时候他就有资格被选作主节点,控制整个集群。
2.Data节点、数据节点。node.data: true(默认) 该节点保存数据和执行数据相关的操作。CRUD,聚合等等
3.Ingest节点、提取节点。node.ingest: true(默认) 该节点可以通过ingest pipeline 对文档执行预处理操作,以便在索引文档之前对文档进行转换。filebeat等都是可以配置管道将文件发送到指定管道来执行预处理操作。
4.Tribe节点、部落节点。当一个节点配置tribe.* 的时候。可以连多个集群,在所有集群上执行搜索和操作。
5.Client节点、当主节点和数据节点的配置都是false时,该节点只能处理路由请求,处理搜索分发索引操作等。
ElasticSearch集群搭建
下面是基于docker-compose.yml文件搭建的两个节点的ES集群。啥也没映射。创建一个docker-compose.yml文件。内容把下面复制进去,然后docker-compose up -d 等会就起来了、
version: '2.2'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.5.1
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms256m -Xmx256m"
ulimits:
memlock:
soft: -1
hard: -1
ports:
- 9200:9200
networks:
- elastic
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.5.1
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms256m -Xmx256m"
ulimits:
memlock:
soft: -1
hard: -1
networks:
- elastic
networks:
elastic:
driver: bridge
参考:
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
(
官文
)
https://zh.wikipedia.org/wiki/Elasticsearch
https://zhuanlan.zhihu.com/p/33671444
(
倒排索引
)
https://
www.jianshu.com/p/5b88e95a9e80
http://
arganzheng.life/elasticsearch-node-types.html
https://blog.csdn.net/a992795427/article/details/86611650
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)