一、索引
- 索引是文档的容器,是一类文档的集合
- 索引提现了逻辑空间的概念,每个索引都有自己的Mapping定义,用于定义包含的文档的字段名和字段类型。
- Shared体现了物理空间的概念,索引的数据分散在Shared上
- 索引的Mapping和Settings
- Mapping 定义字段的类型
- Settings 定义不同的数据分布
二、文档(Document)
- Elasticsearch是面向文档的,文档是所有可搜索数据的最小单位
- 日志文件中的日志项;
- 一部电影的具体信息/一张唱片的详细信息;
- MP3播放器里的一首歌/一篇PDF文档中的具体内容
- 文档会被序列换成JSON格式,保存在Elasticsearch中
- JSON对象由字段组成
- 每个字段都有对应的字段类型(字符串/数值/布尔/日期/二进制/范围类型)
- 每个文档都有一个Unique ID
- 你可以自己指定ID
-
或者通过Elasticsearch自动生成
三、Type
- 7.0之前,一个index可以设置多个Types;
- 6.0开始,Type已经被Deprecated。7.0开始,一个index只能创建一个type,即"_doc"
四、REST API
- Bulk API (批量操作)在一次API调用中,对不同的索引进行操作,支持四种类型操作
- Index
- Create
- Update
- Delete
操作中单条操作失败,不会影响其他操作,返回结果包括每条操作的执行结果
- mget批量读取
- msearch 批量查询
五、节点
节点基本知识
- 节点是一个elasticsearch的实例;
- 本质上是一个JAVA进程
- 一台机器上可以运行多个elasticsearch实例,生产环境建议一台机器启动一个elasticsearch实例
- 每个节点都有名字,通过配置文件配置,或者启动的时候使用 -E node.name=xxx指定;
- 每个节点在启动之后,会分配一个UID,保存在data目录下;
- 每个节点启动之后就是一个Master eligible nodes(Master eligible可以参加选主流程,成为Master节点);
- 可以设置node.master: false 禁止
- 当第一个节点启动的时候,它会将自己选举成Master节点;
- 每个节点都保存了集群的状态,但是只有master节点能够修改集群状态信息(这样做事为了防止集群信息的不一致);
- 所有的节点信息
- 所有的index及其相关的Mapping和Settings信息
- 分片的路由信息
节点类型
- Data node
- 可以保存数据的节点,叫做Data node,用来保存分片数据,在数据扩展上很关键
- Coordinating node
- 负责接受client 的请求,将请求分发到合适的节点上,最终把结果汇聚到一起
- 每个节点都起到了Coordinating node的职责
- Hot &Warm node
- 不同硬件配置的Data node ,用来实现Hot & Warm架构,降低集群部署成本
- Machine Learn node
- 负责跑机器学习的job,用来做异常检测
- Tribe node
-
Tribe node 连接到不同的es集群,并且支持将这些集群当成一个单独的集群处理
-
六、集群及节点颜色状态
ES查询集群健康状态
GET _cluster/health //查询
//返回数据
{
"cluster_name" : "myes",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 2,
"number_of_data_nodes" : 2,
"active_primary_shards" : 3,
"active_shards" : 6,
"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有3种颜色显示健康状态(status)
- Green 主副分片正常分配
- Yellow 主分片分配正常,有副分片分配异常
- Red 有主分片未能分配(例如当磁盘使用达到85%以上时,创建新的索引)
七、分片
- Primary Shared(主分片),用于解决数据水平扩展的问题
通过主分片,可以将数据分布到集群内的所有节点上
- 一个分片是一个运行的lucene实例
- 主分片数在索引创建时指定,后续不允许修改,除非reindex
- Replica Shared(副本),用于解决数据高可用问题,是主分片的拷贝
- 副本分片数,可以动态调整
-
增加副本数,可以在一定程度上提高服务可用性(读取的吞吐量)
- 分片设定
生产环境,需要提前做好容量规划,7.0开始,默认主分片设置成1,解决了over-sharding的问题
(1)分片数设置过小
- 导致后续无法增加节点实现水平扩展
- 单个分片数据量过大,导致数据重新分配耗时
(2) 分片数设置过大
- 相应搜索结果相关性打分,影像统计结果准确性
- 分片过多,导致资源浪费,同时影像性能
八、倒排索引
先上一张图,大概了解下倒排索引的数据结构
倒排索引的两个核心组成
- 单词词典(Term Directory)
- 记录所有文档的单词,记录单词到倒序排列表的关联关系,如果单词体量很大,可以使用B+树或者哈希拉链法实现,以提升插入及检索效率
- 倒序列表(Posting list)
- 倒序排列项(posting)
- 文档ID
- 词频(单词在文档中出现的次数)
- 位置(position)单词在文档中的位置
-
偏移(offset)记录单词开始和结束的位置,实现高亮显示
参考下面这张图
- 倒序排列项(posting)