ES索引和分片

ES是基于Lucene分布式搜索服务,可以存储整个对象或文档,分布式的实时文件存储,每个字段都被索引并可被搜索,分布式的实时分析搜索引擎,可以扩展到上百台服务器,处理PB级结构化或非结构化数据。

数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。

shard介绍

假设 IndexA 有2个分片,向 IndexA 中插入10条数据 (10个文档),那么这10条数据会尽可能平均地分为5条存储在第一个分片,剩下的5条会存储在另一个分片中。

数据分片(shard),一个分片是一个底层的工作单元 ,这和主流关系型数据库的表分区的概念有点类似,保存了全部数据中的一部分,一个分片是一个Lucene的实例,它本身就是一个完整的搜索引擎。

我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。

引入shard的原因

如果我们的索引数据量很大,超过硬件存放单个文件的限制,就会影响查询请求的速度,ES引入了分片技术。

一个分片本身就是一个完成的搜索引擎,文档存储在分片中,而分片会被分配到集群中的各个节点中,随着集群的扩大和缩小,ES会自动的将分片在节点之间进行迁移,以保证集群能保持一种平衡。

shard分片的特点

1、ES的一个索引可以包含多个分片(shard)

2、每一个分片(shard)都是一个最小的工作单元,承载部分数据

3、每个shard都是一个lucene实例,有完整的简历索引和处理请求的能力

4、增减节点时,shard 会自动在 nodes 中负载均衡

5、一个文档只能完整的存放在一个shard上(主节点)

6、一个索引中含有shard的数量,默认值为5,在索引创建后这个值是不能被更改的。

7、优点:水平分割和扩展我们存放的内容索引;分发和并行跨碎片操作提高性能/吞吐量;

8、每一个shard关联的副本分片(replica shard)的数量,默认值为1,这个设置在任何时候都可以修改。

9、primary shard 和对应的 replica shard 不能同时存在于同一个节点,所以最低的可用配置是两个节点,互为主备。

10、primary shard是可读可写的,而replica shard是只读的。

主副分片的概念

主分片(primary shard):在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改,索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。

副分片(replica shard):一个副本分片只是一个主分片的拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。

ES的重平衡reblance

利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。

当你的集群规模扩大或者缩小时,ES会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。

如何创建多分片索引?

  1. 创建索引时不提交分片参数默认是创建一个主分片和一个副本分片(要创建副本分片至少两台节点)

  2. 指定参数规定分为几个主分片和副本

  3. 创建索引时定义主分片数量后以后无法更改,但是副本数量可以更改

路由计算和分片控制

既然数据是被分别存储在不同的分片中,那么ES是如何定位数据到底存放在哪个分片的呢?这涉及到路由计算。

公式:hash(<文档id>) % <主分片数量>(如果有3个分片,最终结果必然=0、1、2)

分片策略

合理设置分片数,一个分片底层即为一个Lucene索引,会消耗一定的文件句柄、内存、CPU

索引创建的时候分片就已经被设定好了,后期无法动态改变。

控制每个分片占用硬盘容量不超过ES最大JVM堆空间设置

遵循公式:节点数 <= 主分片数 * (副本分片数 + 1)

http命令查询

查询分片信息,另外 index doc 等,都可以查

GET http://127.0.0.1:9200/_cat/shards?v

唠嗑广场

看到网上几个做过制造业的人谈制造业。

需要和各类人和政府组织打交道,包括:工商,质检,环评,消防,派出所,税务,稽查,街道等等,也常常有突击检查、公司被封、电脑被搬、仓库被封、人被带走等各类情况。

还有联合执法,街道办事处都可以执法。

还有同行恶意举报,还有广告法出来突然袭击。

民营企业难度很高,真正状态是做大找死、做小等死。

我对民营企业家表示尊敬。