1 概述
2.文档(document)
- Elasticsearch是面向文档的,文档是所有可搜索数据的最小单元
- 日志文件中的日志项
- 一本电影的具体信息/一张唱片的详细信息
- MP3播放器里的一首歌/一片PDF文档中的具体内容
- 文档会被序列化成JSON格式,保存在Elasticsearch中
- JSON对象由字段组成
- 每个字段都有对应的字段类型(字符串、数值、布尔、日期、二进制、范围类型)
- 每个文档都有一个Unique ID
- 你可以自己制定ID
- 或者通过Elasticsearch自动生成
2.1 JSON文档
- 一篇文档包含了一系列的字段。类似数据库表中的一条记录
- JSON文档,格式灵活,不需要预先定义格式
- 字段的类型可以指定或者通过Elasticsearch自动推算
- 支持数组、支持嵌套
2.2 文档的元数据
{
"_index":"movies", //_index 文档所属的索引名
"_type" :"_doc", //文档所属的类型名
”_id":"1", // 文档唯一ID
“_score":14.59 //相关性打分
“_source":{ // 文档的原始Json数据
"year":1995,
"@version":"1",
"genre":[
"adventure",
"animation",
"childre"],
"id":"1",
"title":"Toy Story"
}
}
2.3 索引
index(索引)
是文档的容器,是一类文档的结合。
index
体现了逻辑空间的概念:每个索引都有自己的mapping定义,用于定义包含的文档的字段名和字段类型。
Shard
体现了物理空间的概念:索引中的数据分散在Shard之上
Mapping
定义文档字段的类型
Setting
定义不同的数据分布
2.3.1 索引的不同语义
- 名词:一个Elasticsearch 集群中,可以创建很多个不同的索引
- 动词:保存一个文档到Elasticsearch的过程也叫索引(indexing)
- ES中,创建一个倒排索引的过程
B树索引
倒排索引
可以参考 Elasticsearch倒排索引结构
2.4 抽象与类比
- 在7.0之前,一个Index可以设置多个Types 但7.0之后一个索引只能创建一个Type 即
"_doc"
type:
每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type;在ES6.x版本之后,一个index只有一个type了- 传统关系型数据库和Elasticsearch的区别
Elasticsearch:Schemaless 相关性高、高性能全文检索
RDMS:事务性、Join
3 REST API
REST API很容易被各种语言调用
3.1 demo
以下命令可以在kibana中输入 数据是加载的样例数据
//查看索引相关信息
GET kibana_sample_data_ecommerce
//查看索引的文档总数
GET kibana_sample_data_ecommerce/_count
//查看前10条文档,了解文档格式
POST kibana_sample_data_ecommerce/_search
{
}
//_cat indices API
//查看indices
GET /_cat/indices/kibana*?v&s=index
//查看状态为绿的索引
GET /_cat/indices?v&health=green
//按照文档个数排序
GET /_cat/indices?v&s=docs.count:desc
//查看具体的字段
GET /_cat/indices/kibana*?pri&v&h=health,index,pri,rep,docs.count,mt
//How much memory is used per index?
GET /_cat/indices?v&h=i,tm&s=tm:desc
4 集群
4.1 分布式特性
- Elasticsearch的分布式架构的好处
- 存储的水平扩容
- 提高系统的可用性,部分节点停止服务,整个集群的服务不受影响
- Elasticsearch的分布式架构
- 不同的集群通过不同的名字来区分,默认名字是“elasticsearch"
- 通过配置文件修改,或者在命令行中 -E cluster.name=clustername 进行设定
- 一个集群可以有一个或者多个节点
5 节点
- 节点是一个Elasticsearch的实例
- 本质上是一个JAVA进程
- 一台机器上可以运行多个Elasticsearch进程,但是生产环境一般建议一台机器上只运行一个Elasticsearch实例
- 每一个节点都有名字,通过配置文件配置,或者启动的时候 -E node.name=node1指定
- 每一个节点再启动之后,会分配一个UID,保存在data目录下
5.1 Master-eligible nodes 和 Master Node
1.每个节点启动后,默认就是一个
Master-eligible
节点 但是可以设置node.master:false
来禁止
2.Master-eligible
节点可以参加选主流程,称为Master节点
3.当第一个节点启动时候,它会将自己选举成Master节点。
4.每个节点上都保存了集群的状态,只有Master节点才能修改集群的状态信息。任意节点都能修改信息会导致数据的不一致性。
集群状态(Cluster State),维护了一个集群中,必要的信息
- 所有的节点信息
- 所有的索引和其相关的Mapping与Setting信息
- 分片的路由信息
5.2 Data Node 和 Coordinating Node
Data Node
可以保存数据的节点,叫做Data Node。负责保存分片数据。在数据扩展上起到了至关重要的作用
Coordinating Node
负责接受Client的请求,将请求分发到合适的节点,最终把结果汇集到一起。
每个节点都起到了Coordinating Node的职责
5.3其他的节点类型
Hot & Warm Node
不同硬件配置的Data Node,用来实现Hot & Warm 架构,降低集群部署的成本
Machine Learning Node
负责跑机器学习的Job 用来做异常检测
5.4配置节点类型
- 开发环境中一个节点可以承担多种角色
- 生产环境中,应该设置单一的角色的节点
6.分片
6.1 主分片(Primary Shard)
主分片
,用以解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上。
一个分片是一个运行的Lucene实例
主分片数在索引创建时指定,后续不允许修改,除非Reindex
6.2 副本(Replica Shard)
副本
用以解决数据高可用的问题。分片是主分片的拷贝
副本分片数可以动态调整
增加副本数,还可以在一定程度上提高服务的可用性(读取的吞吐)
6.3 分布
一个三节点的集群中,blogs索引的分片分布情况
6.4分片的设定
对于生产环境中分片的设定,需要提前做好容量规划
- 分片数设置过小
- 导致后续无法增加节点实现水平扩展
- 单个分片的数据量过大,导致数据重新分配耗时
- 分片数设置过大,7.0开始,默认主分片设置为1,解决了over-sharding的问题
- 影响搜索结果的相关性打分,影响统计结果的准确性
- 单个节点上过多的分片,会导致资源浪费,同事也会影响性能
6.5 查看集群状态
6.6 demo
get _cat/nodes?v
GET /_nodes/es7_01,es7_02
GET /_cat/nodes?v
GET /_cat/nodes?v&h=id,ip,port,v,m
GET _cluster/health
GET _cluster/health?level=shards
GET /_cluster/health/kibana_sample_data_ecommerce,kibana_sample_data_flights
GET /_cluster/health/kibana_sample_data_flights?level=shards
#### cluster state
The cluster state API allows access to metadata representing the state of the whole cluster. This includes information such as
GET /_cluster/state
//cluster get settings
GET /_cluster/settings
GET /_cluster/settings?include_defaults=true
GET _cat/shards
GET _cat/shards?h=index,shard,prirep,state,unassigned.reason
CAT Nodes API https://www.elastic.co/guide/en/elasticsearch/reference/7.1/cat-nodes.html
Cluster API https://www.elastic.co/guide/en/elasticsearch/reference/7.1/cluster.html
CAT Shards API https://www.elastic.co/guide/en/elasticsearch/reference/7.1/cat-shards.html