目录
4.3、刷入 refresh 页缓存的同时,写入 translog
一、ES是什么
-
一个分布式的实时文档存储,每个字段可以被索引与搜索
-
一个分布式实时分析搜索引擎
-
能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
-
基于Lucene,隐藏复杂性,提供简单易用的Restful API接口、Java API接口(还有其他语言的API接口)。ES是一个可高度扩展的全文搜索和分析引擎。它能够快速地、近乎实时地存储、查询和分析大量数据。
二、ES基本结构
2.1、结构图
简单讲解:
- Node相当于服务器,上图就是4个服务器,也叫4个数据节点
- 比如我的商品数据表的index是 es_product ,我可以把数据切割成3份,那么每一份就是一个 Shared(类似于Mysql的table分表),比如上图的index1,有3个主Shared
- 假如我想把不同业务的数据分开存,比如我有外卖的数据,有商超的数据,那么加前缀,waimai_es_product,shangcha_es_product(类似于Mysql的分库)
- R-shared就是副本shared,只负责复制Primary给下来的数据,只有当primary挂了,他才上位。(保证系统稳定性,为什么P-s1和 R-s1不能放在一起,那放一起一起挂了不就完犊子了)
2.2、基本概念
-
集群(cluster)
ES集群由若干节点组成,这些节点在同一个网络内,cluster-name相同
-
节点(node)
一个ES的实例,本质上是一个java进程,生产环境一般建议一台机器上运行一个ES实例。节点可以分布在不同的机房。
-
节点有如下分类:
1、master节点:集群中的一个节点会被选为master节点,它将负责管理集群范畴的变更,例如创建或删除索引,添加节点到集群或从集群删除节点。master节点无需参与文档层面的变更和搜索,这意味着仅有一个master节点并不会因流量增长而成为瓶颈。任意一个节点都可以成为 master 节点。
2、data节点:持有数据和倒排索引。默认情况下,每个节点都可以通过设定配置文件中的node.data属性为true(默认)成为数据节点。如果需要一个专门的主节点,应将其node.data属性设置为false。
3、client节点:如果将node.master属性和node.data属性都设置为false,那么该节点就是一个客户端节点,扮演一个负载均衡的角色,将到来的请求路由到集群中的各个节点。也叫协调节点,这个节点不需要配置的,只要任何一个节点接收到请求,并且请求不需要这个节点处理,只需要他进行转发的场景下,这个节点就被叫做协调节点。 - 上面俩节点通过配置指定:
-
node.master: true/false node.data: true/false
一个节点可以既为Master节点,又为Data节点,但是为什么不推荐?
因为Data节点请求过多,负载过高的时候,可能会导致es假死,也就是可能导致其他节点认为该 Master挂了,另外 Data节点会进行gc 回收,这个过程也可能影响 Master节点的正常响应。所以强烈建议 Master 只做集群管理工作,不参与data的index与query -
索引(index)
文档的容器,一类文档的集合
-
分片(shard)
单个节点由于物理机硬件限制,存储的文档是有限的,如果一个索引包含海量文档,则不能在单个节点存储。ES提供分片机制,同一个索引可以存储在不同分片(数据容器)中,这些分片又可以存储在集群中不同节点上。
分片分为主分片(primary shard) 以及从分片(replica shard)
1、主分片与从分片关系:从分片只是主分片的一个副本,它用于提供数据的冗余副本
2、从分片应用:在硬件故障时提供数据保护,同时服务于搜索和检索这种只读请求
3、是否可变:索引中的主分片的数量在索引创建后就固定下来了,但是从分片的数量可以随时改变
-
文档(document)
可搜索的最小单元 ,json格式保存
2.3、与关系数据库概念的类比
RDBMS |
ES |
---|---|
Table |
Index |
Row |
Document |
Column |
Field |
Schema |
Mapping |
SQL |
DSL |
分片(Shard)在数据库概念映射里面类似于分表(水平拆分)
index、type的初衷
之前es将index、type类比于关系型数据库(例如mysql)中database、table,这么考虑的目的是“方便管理数据之间的关系”。
【本来为了方便管理数据之间的关系,类比database-table 设计了index-type模型】
a. 在关系型数据库中table是独立的(独立存储),但es中同一个index中不同type是存储在同一个索引中的(lucene的索引文件),因此不同type中相同名字的字段的定义(mapping)必须一致。如果是mysql,两个table中的age字段,2个table可以分别定义成int和string,但是es不行,必须一样
b. 不同类型的“记录”存储在同一个index中,会影响lucene的压缩性能。
2.4、数据如何读写
1、所有数据的处理都由 Primary Shared去处理
shard = hash(routing) % number_of_primary_shards
2、假如客户端请求 Node2 写入数据,比如是往spu-record这个index写入数据,此时根据路由字段(一