一、首先必须要掌握以下4个数据结构的基本概念。
1、索引(index)
我们已经有了关系型数据库的基础,现在可以用类比理解。elasticsearch的索引,你就可以理解为是一张表。记住这里的‘索引’是名词。后续我们操作的时候,比如我们把一条数据索引起来,就是指动词。
2、文档(document)
同样用类比理解,文档是传统关系型数据表中的一条记录。也就是elasticsearch存储的主要实体。
3、文档类型
就是指这条记录,也即这个文档是什么类型的。比如 User类型、Order类型。这里的类型是指业务类型。毕竟你存的都是业务上面的数据实体。同一个索引里面可以包含不同的文档类型,比如下面这里的post帖子,user用户,就是存储在一个索引里面的两种类型。post和user两种类型的字段个数可以不相同,但是如果两种类型里面含有相同的字段名称,比如name,那么这个name的字段类型必须一致,即都必须为string类型。
1. {
2. "mappings":{
3. "post":{
4. "properties":{
5. "id":{"type":"long","store":"yes"},
6. "name":{"type":"string","store":"yes"},
7. "content":{"type":"string","store":"no"}
8. }
9. },
10. "user":{
11. "properties":{
12. "id":{"type":"long","store":"yes"},
13. "name":{"type":"string","store":"yes"},
14. "age":{"type":"integer","store":"no"}
15. }
16. }
17. }
18. }
4、映射(mapping)
就是数据结构,比如创建传统关系型数据库表的时候,要有一份表结构描述的文本。就是指这个。映射能够让elasticsearch知道如何处理文档。例如上面的mapping描述,告诉es要如何对待这些文档。
二、其次,再掌握elasticsearch集群相关的基本概念
1、节点(node)
就是指集群(cluster)中的每个独立的服务器。
2、分片(shard)
一个索引的数据,散落在不同的分片上。这些分片分别在不同的节点上。数据量大,处理能力不足,无法快速响应客户端的请求,一个节点不够,就会涉及到分片。
3、副本(replica)
一个分片的精确复制。每个分片可以有零个或多个副本。副本,或者叫做副本分片,那么也就对应有一个主分片,主分片负责索引的操作。
1. "settings": {
2. "number_of_shards": "32",
3. "number_of_replicas": "1"
4. },
上面这段定义,代表有32个分片,每个分片有1个副本。如下图:
另外集群中Index TPS,Search TPS与副本数的关系,如下:
集群写入文档TPS与副本数正相关,查询TPS与副本数无关。
举例:
1分钟向集群写入1000个文档:
当索引有0个副本:集群写入文档次数为1000,Index TPS为1000/60.
当索引有1个副本:集群写入文档次数为2000,Index TPS为2000/60.
当索引有2个副本:集群写入文档次数为3000,Index TPS为3000/60.
1分钟查询1000次:
当索引有0个副本:search TPS为 1000/60.
当索引有1个副本:search TPS为 1000/60.
副本的数量(number_of_replicas)在创建索引之后,在集群里面是可以调整的。只要你愿意,同时资源又充足的条件下,你可以删除和添加副本。但是分片的数量(number_of_shards),就不能这样来操作了。一旦创建好索引,再想更改分片数量,只有一个办法,那就是创建另一个索引,并重新索引数据。