一、基本概念
1.1 名词术语
- NRT(准实时): Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这 个文档能够被搜索到有一个轻微的延迟(通常是1秒)。
- Node(节点):单个的装有ElasticSearch服务并且提供故障转移和扩展的服务器
- Cluster(集群):一个集群就是由一个或多个Node组织在一起共同工作,共同分享整个数据具有负载均衡功能的集群,集群名称是唯一标识,因为一个节点只能通过指定某个集群的名字,来加入这个集群
数据组织
- Document(文档):可以被索引的基本数据单位
- Index(索引):含有相同属性文档的集合
- Type(类型):索引可以定义一个或者多个类型,文档必须属于一个类型
- Field(列):Field是ElasticSearch中最小单位,相当于数据的某一列
Es跟关系型数据库对照如下图:
关系型数据库(Eg. MySQL) | 非关系型数据库(Eg. ElasticSearch) |
---|---|
数据库Database | 索引Index |
表Table | 类型Type |
数据行Row | 文档Dpcument |
数据列Column | 字段Field |
1.2 Node 与 Cluster
Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
1.3 索引Index
Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
下面的命令可以查看当前节点的所有 Index。
$ curl -X GET 'http://localhost:9200/_cat/indices?v'
1.4 文档Document
Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。
Document 使用 JSON 格式表示,下面是一个例子。
{
"user": "张三",
"title": "工程师",
"desc": "数据库管理"
}
同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。
1.5 类型Type
Document 可以分组,比如weather这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。
不同的 Type 应该有相似的结构(schema),举例来说,id字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如products和logs)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。
类比理解:
- 索引:数据库
- 类型:表
- 文档:表中的一行记录
下面的命令可以列出每个 Index 所包含的 Type。
$ curl 'localhost:9200/_mapping?pretty=true'
根据规划,Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。
二、横向扩展与高可用
为什么需要分片和备份? 假设一个索引的数据量很大,就会造成硬盘的存储压力很大,同时搜索速度也会出现瓶颈。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。因此ElasticSearch将索引分成若干份,每个部分就是一个shard。那么,就可以将索引分成多个分片存储,从而分摊压力。分片还允许用户对其进行水平地扩展和拆分,以及分布式的操作,可以提高搜索以及其他操作的效率。
当一个主分片失败或者出现问题时,备份的分片就可以代替工作,从而提高了ES的可用性。备份的分片还可以执行搜索操作,以分摊搜索的压力。当你创建一个索引的时候,你可以使用ES默认在创建索引时会创建5个分片,1份备份,也可以自行指定你想要的分片和备份的数量。
- Shards(分片):每个索引都有多个分片,每个分片是一个Lucene索引。分片的好处就是可以对数据进行水平分割,扩展内容容量,提高查询性能和吞吐量。
- Replicas(备份):是索引的一份或者多份拷贝,用于提供高可用保证。
备注:分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制数量,但是不能改变分片的数量。主要原因在于分片在创建之后,难以在不同节点间迁移。