一、ElasticSearch的核心概念
1、Near Realtime(NRT):近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒),基于es执行搜索和分析可以达到秒级。
2、Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常。
3、Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群。
4、Document & field:文档,es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。
product document
{
"product_id": "1",
"product_name": "高露洁牙膏",
"product_desc": "高效美白",
"category_id": "2",
"category_name": "日化用品"
}
5、Index:索引,包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。
6、Type:类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。
7、shard:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index。
8、replica:任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器。
- ElasticSearch核心概念 vs. 数据库核心概念:
| Elasticsearch | 数据库 |
|---|---|
| Document | 行 |
| Type | 表 |
| Index | 库 |
-
mapping映射是定义一个文档以及其所包含的字段如何被存储和索引的方法。mapping非常类似于静态语言中的数据类型:声明一个变量为int类型的变量, 以后这个变量都只能存储int类型的数据。
副本分片:
副本分片的主要目的就是为了故障转移,如果持有主分片的节点挂掉了,一个副本分片就会晋升为主分片的角色。在索引写入时,副本分片做着与主分片相同的工作。新文档首先被索引进主分片然后再同步到其它所有的副本分片。增加副本数并不会增加索引容量。副本分片可以服务于读请求,如果你的索引也如常见的那样是偏向查询使用的,那你可以通过增加副本的数目来提升查询性能,但也要为此 增加额外的硬件资源。
假设你有一个100个分片的索引。当一个请求在集群上执行时会发生什么呢?
- 这个搜索的请求会被发送到一个节点
- 接收到这个请求的节点,将这个查询广播到这个索引的每个分片上(可能是主分片,也可能是复制分片)
- 每个分片执行这个搜索查询并返回结果
- 结果在通道节点上合并、排序并返回给用户
分片(shard)与副本(replica)的数量?
ElasticSearch在创建索引数据时,最好指定相关的shards数量和replicas,否则会使用服务器中的默认配置参数shards=5,replicas=1。
index.number_of_shards: 5
index.number_of_replicas: 1
对于一个索引来说,number_of_shards只能设置一次,而number_of_replicas可以使用索引更新设置API在任何时候被增加或者减少。
那么如何确定分片和副本的数量呢?
依照经验,最理想的分片数量应该依赖于节点的数量。假设索引index配置了10个分片,1个副本,那么总共的分片数应该是20个,10 *(1+1),那么最大的Elasticsearch节点数应该就是20。
节点最大数 = 分片数 * (副本数 + 1)
调整分片和副本原则:
A:索引不存在时,可以自定义副本和分片数
B:索引存在,则只能修改副本
curl -H "Content-Type: application/json" -XPUT 'http://192.168.77.130:9200/goods/' -d'{"settings":{"number_of_shards":3,"number_of_replicas":0}}'
curl -H "Content-Type: application/json" -XPUT 'http://192.168.77.130:9200/blog' -d'{"settings": {"number_of_shards":3,"number_of_replicas":2}}';
curl -H "Content-Type: application/json" -XPUT 'http://192.168.77.130:9200/test4/_settings' -d'{"index":{"number_of_replicas":3}}
参考文档:
https://www.elastic.co/guide/cn/elasticsearch/guide/current/foreword_id.html