1.文档 (document )
- ES是面向文档的,文档是所有数据可搜索数据的最小单位,类似数据表里面的一条记录。下面的例子都是文档。
- 日志文件的日志项
- 一篇PDF文档的具体内容
- 文档会被序列化为JSON格式,保存在ES里面。
- JSON对象由字段组成。
- 每个字段都有具体的类型,如字符串,数值,布尔,日期,
范围
类型。字段的类型,可以自己指定,也可以由ES自动推算出来。数据支持数组,支持嵌套。
- 每个文档都有一个唯一的id
- 可以自己指定
- 也可以由ES生成
1.1 文档的元数据
用于标注文档的相关信息
- _index:文档所属的
索引
名 - _type: 文档所属的
类型
名,7.0之后只能有一个type,_doc
- _id:文档的唯一id
- _source:文档的原始json数据
_all:整合所有内容到该字段- _version:文档的版本信息
- _score:相关性打分。
2.索引(index)
- 类相似文档的集合,是一类文档的集合, 索引体现了逻辑的概念。
- shard(分片)是物理空间的概念,索引里面的数据分散放在shard的上面。
- 索引的mapping,用于定义文档的字段和类型。
- 索引的setting,用于定义数据的分布。
- 索引和关系型数据库的对比
RDBMS | ES |
---|---|
table(表) | index(索引) |
row (一条记录) | document(文档) |
column (列) | field(一个字段) |
schema(创建语句) | Mapping(字段和类型定义配置) |
sql (查询语言) | DSL(查询语言) |
支持事务,JOIN操作 | 查询,搜索,评分关联计算。 |
3.分布式系统的可用性与扩展性
- 高可用性
- 服务可用性,允许有节点停止服务
- 数据可用性 - 部分节点丢失,不会丢失数据
- 可扩展性
- 请求量提升/数据的不断增长的时候将数据分布到不同的节点上。
ES的分布式架构
- 不同的集群通过不同的名字区分,默认名字『elasticsearch』
- 通过修改配置文件,或者在命令运行
-E cluster.name=xxx
进行设定 - 一个集群可以有多个节点。
4. 节点
- 一个ES的实例
- 是一个java进程
- 一台机器上可以运行多个ES,但是生成环境一个机器上最好只运行一个。
- 节点有自己的名字,可以修改配置文件或者启动的时候
-E node.name=xxx
指定 - 每一个节点启动后,会分配一个UID,保存在data目录下。
4.1 Master-eligible Node和Master Node
- 每个节点启动后,默认就是Master-eligible节点
- 可以设置
node.master:false
禁止
- 可以设置
- Master-eligible节点可以参选主流程,成为Master节点。
- 当第一个节点启动的时候,会将自己选举成为Master节点,只有Master节点才能修改集群状态信息
- 集群状态指的是维护一个集群必要的信息,比如所有节点的信息,所有的索引和其相关的mapping和settting设置, 分配的路由信息。
- 这样的设定是为了避免信息导致数据的不一致性。
4.2 data node和coordinating node
data node:保存数据,负责保存分配数据,对数据扩展起到非常强大的作用。
coordinating node:负责接收客户端请求,将请求分发到合适节点,最终汇总结果。每一个节点默认都起到 coordinating node这个作用。
4.3其他节点
- Hot & Warm Node:不同硬件配置node,用来实现冷热架构,降低集群的部署成本。
- Machine Learning Node:负责跑机器学习的Job,做异常检测处理,
4.4 配置节点的类型
- 开发环境一个节点可承担多个角色
- 生成环境中,应该设置单一的角色节点。
节点类型 | 配置参数 | 默认值 |
---|---|---|
master eligible | node.master | true |
data | node.data | true |
ingest | node.ingest | true |
coordinating only | 无 | 默认是开启,需要仅仅启动,把其他的全部设置为false |
machine learning | node.ml | true (enable x-pack) |
5分片
- 主分片(Primary Shard)解决数据水平扩展的问题,通过主分片,将数据分布到集群内的所有节点上面。
- 一个分片是一个运行的Lucene的实例
- 主分片数在索引创建的时候指定,以后不可以改,除非重新索引。
- 副本分片(Replica Shard),解决数据的高可用问题,是主分片的拷贝。
- 副本分配数,可以动态的调整。
- 增加副本数,可以提高读取的吞吐量,提高服务可用性。
5.1分配的设定
生产环境提前做好容量规划
- 分片数设置过小
- 后续无法增加节点实现水平扩展
- 单个分片数据量过大,数据重新分配耗时。
- 分片数设置过大,(7.0默认主分片设置为1,解决了over-shading问题)
- 影响搜索结果的相关性打分,影响统计结果的准确性。
- 单个节点上过多的分配,导致资源浪费,影响性能。
5.2查看集群状况
GET _cluster/health
- Green:主分片和副本都正常工作。
- Yellow:主分片全部正常,有副本分配未这个词分配
- Red:有主分片未能分配。(磁盘量不足的时候创建索引)
settting.png