Cluster 与 Node
Elasticsearch 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elasticsearch 实例。
单个 Elasticsearch 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
节点(node)有一个节点名称(默认随机分配),每个节点属于哪个集群是通过一个配置(集群名称,默认是 elasticsearch)来决定的,所以启动节点节点会默认去加入一个名称为 “elasticsearch” 的集群。当然,一个节点也可以组成一个 elasticsearch 集群。
Index
Elasticsearch 会索引所有字段,经过处理后生成一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elasticsearch 数据管理的顶层单位就叫做 Index(索引)。每个 Index 的名字必须是小写。
查看当前节点的所有 Index:
curl -X GET http://localhost:9200/_cat/indices?v
Document
Document(文档)是 Elasticsearch 中最小的数据单元,一个 Document 可以是一条商品数据,一条订单数据等,通常用 JSON 表示:
商品 Document
{
"product_id": "1",
"product_name": "高露洁牙膏",
"product_desc": "高效美白",
"category_id": "2",
"category_name": "日化用品"
}
Type
Document 可以分组,比如 weather 这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。
不同的 Type 应该有相似的结构(schema),举例来说,id
字段不能在这个组是字符串,在另一个组是数字。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如 products
和 logs
)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。
列出每个 Index 所包含的 Type:
curl -X GET http://localhost:9200/_mapping?pretty=true
根据规划,Elasticsearch 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。
Elasticsearch 核心概念 vs 数据库核心概念
Elasticsearch 数据库
Index 库
Type 表
Document 行
primary shard 主分片
单台机器无法存储大量数据,Elasticsearch 可以将一个索引中的数据切分为多个主分片,分布在多台服务器上存储。有了主分片就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。
replica shard 复制分片
任何一个服务器随时可能故障或宕机,此时主分片可能就会丢失,因此可以为每个主分片创建多个复制分片副本,复制分片可以在主分片故障时提供备用服务,保证数据不丢失(如果主分片不可用,复制分片提升为主分片)。多个复制分片还可以提升搜索操作的吞吐量和性能(get 和 search 请求可以被主分片或者复制分片处理)。
主分片(建立索引时一次设置,不能修改,默认 5 个),默认每个主分片都有一个复制分片,可以动态修改复制分片的数量。
默认每个索引有 10 个分片(5 个主分片,5 个复制分片),永远不要在相同的节点同时存放主分片和复制分片。最小的高可用配置是 2 台服务器。