一、基础概念
Elasticsearch | 关系型数据库 | |
index-索引 | 包含了相关文档数据的集合 | database |
type-类型 | 在6.x版本之前,一个Index中可以有多个type,6.x版本一个Index中只能有一个type,7.x版本Type被弃用,每个索引只能有一个type,即" _doc"。8.x版本之后完全不支持Type。 | table |
mapping-映射 | 是对索引库中的索引字段及其数据类型进行定义 | 表结构 |
Document-文档 | 一条数据 | row |
Field-字段 | 存在于文档中,字段是包含数据的键值对 | column |
二、倒排索引
1、基本概念
词条(term):索引里面最小的存储和查询单元,对于英文来说是一个词,对于中文来说一般指分词后的一个词。
词典(Term Dictionary):也叫字典,是词条的组合。搜索引擎的通常索引单位是单词,单词词典是文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向倒排所有的指针。
倒排表(Post list):一个文档通常由多个词组成,倒排表记录的是某个词在哪些文档里出现过及出现的位置。每个记录称为一个倒排项(Posting),倒排表记录的不单单是文档编号,还记录了词频等信息。
倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件被称之为倒排文件,倒排文件是存储倒排索引的物理文件。
2、什么是倒排索引?
es将文档内容分词后,形成一个term集合,列出每个term所属的文档,这种通过属性值来确定记录位置的结构叫做倒排索引。
三、es集群
3.1 cluster
代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。
es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
3.2 shard
分片,将一个索引中的数据分成多个部分存储在不同节点上,默认一个索引5个分片
3.4 replica
副本,分片的备份,默认是一个
四、脑裂现象
1、什么是脑裂?
如果发生网络中断或者服务器宕机,那么集群会有可能被划分为两个部分,各自有自己的master来管理,那么这就是脑裂。
2、es集群有可能会出现脑裂问题,原因主要有两个:
如果集群中节点不在同一个网段有可能是网络延迟造成的
如果集群中的节点在同一个网段,有可能是主节点负载太大造成的
3、解决方案主要有两种:
(1)把主从节点的职责分离,设置三个储备主节点:
node.master=true
node.data=false,
从节点只存储数据:
node.master=false
node.data=true
(2)增加延迟时间:将储备主节点数最小设为n/2+1个
五、常见问题解决
1、elasticsearch集群或节点内存占用过高
解决方案:
(1)修改elasticsearch节点jvm的堆内存:
修改elasticsearch的config/jvm.options文件,设置
-Xms8g
-Xmx8g
官方推荐-Xms和-Xmx最大设置为服务器内存的一半
查看节点jvm设置:
GET _nodes/_all/jvm
(2)设置合理的分片和副本,分片和副本过多会导致多余的索引被加载到内存
2、集群中存在未分配的分片
查看集群健康状态GET _cluster/health
"unassigned_shards"的数量大于0
解决办法:
(1)查看未分配原因
GET _cluster/allocation/explain
(2)查看未分配分片
GET /_cat/shards?h=index,shard,prirep,state,unassigned.reason| grep UNASSIGNED
(3)若是磁盘空间不够,删除无用的分片
(4)重新分片
POST _cluster/reroute?retry_failed=true