一、背景
Elasticsearch是一个实时分布式搜索和分析引擎。它让你以前所未有的速度处理大数据成为可能。本文主要介绍实现分布式搜索和分析的基础–存储,好的存储设计在根本上决定了查询的性能。
es的存储本质上是采用了lucene全文索引,在其基础上实现了分布式功能。
几个基本概念:
Cluster:集群,一个或多个节点的集合,通过名字唯一标识
Node:节点,组成集群的服务单元,保存数据并具有索引和搜索的能力,通过名字唯一标识
Shards: 分片 ,将索引分为多个块,每块叫做一个分片。索引定义时需要指定分片数且不能更改,每个分片都是一个功能完整的Index,分片带来规模上(数据水平切分)和性能上(并行执行)的提升
Replicas:复制分片,对主分片的复制称为复制分片,索引定义时需指定复制分片数(大于等于0)且可以更改,复制分片可以提供节点失败时的高可用能力,同时能够提升搜索时的并发性能(搜索可以在全部分片上并行执行)
Index:索引,具有相似特点的文档的集合,可以对应为关系型数据库中的数据库,通过名字在集群内唯一标识(必须全部小写)
Type:类别,索引内部的逻辑分类/分区,可以对应为关系型数据库中的表,通过名字在Index内唯一标识
Document:文档,能够被索引的最小单位,JSON格式,属于一个索引的某个类别中,从属关系为: Index -> Type -> Document,通过id 在Type 内唯一标识
二、分布式实现
2.1分布式算法
shard = hash(routing) % number_of_primary_shards
以上是路由文档到分片的算法,routing值是一个任意字符串,它默认是_id但也可以自定义。这个routing字符串通过哈希函数生成一个数字,然后除以主切片的数量得到一个余数(remainder),余数的范围永远是0到number_of_primary_shards - 1,这个数字就是特定文档所在的分片。
这也解释了为什么主分片的数量只能在创建索引时定义且不能修改:如果主分片的数量在未来改变了,所有先前的路由值就失效了,文档也就永远找不到了。