背景:
计划使用elasticsearch作为搜索引擎,当数据量太大,会导致单节点无法满足容量和查询。所以需要集群来提升整体容量和查询容量。
elasticsearch自动的分布所有数据和查询负载到所有的可用节点。 无需改造应用,elasticsearch知道如何平衡多个节点以提供扩展性和高可用。
文档->分片->节点
索引其实是一个逻辑上的概念,包括了一个或多个物理的分片,每一个物理的分片是一个独立的索引。通过将一个索引中的文档分布到多个分片中,将这些物理分片又分布到各个节点。
es既保证了数据冗余,又保证了增加查询容量,数据冗余保护了硬件失效,将一个节点加入到集群中可以增加查询容量。
elasticsearch自动迁移分片以重新平衡整个集群。分片有两种类型:主分片和副本分片。 一个索引中的每一个文档属于一个主分片。副本分片是主分片的复制。副本分片提供了冗余,不仅保护了硬件失效带来的数据丢失,而且增加了读请求的容量。
当索引被创建时候,主分片的个数就已经被确定下来,而副本分片的数量可以在不中断索引或查询操作的情况下进行随时更改。
分片的大小和数量,是需要进行权衡取舍的。分片的数量越多,维护这些分片的开销就越大。分片的大小越大,在集群重平衡时候迁移时间就越长。
查询多个小一些的分片可以在处理每一个分片更快,但是越多的查询就意味着更多的开销,所以查询小数量的分片也可以更快。所以这是一个矛盾和取舍。
为了保持平均的分片大小,范围在几个GB到几十GB。对于基于时间的数据,一般是每个分片为20GB至40GB。
避免很多个分片的问题,一个节点中的分片个数在可用的堆空间中是相对的。 作为一个通用的规则,堆空间内的每个GB数据的分片个数应小于20。
https://www.elastic.co/cn/elasticon/conf/2016/sf/quantitative-cluster-sizing
一个集群中的各个节点需要好的且可靠的连接。为了提供更好的连接,可以将一个数据中心或多个相近的数据中心合并为一处。为了维持高可靠,避免单点故障。
当一个地区停电等事件发生,在另外的地区需要有能接管的能力。如何做呢?使用跨集群复制技术(Cross-cluster replication,CCR)。CCR提供一种方式自动从一个主的集群同步索引到另外一个从的远处的集群,可以作为主集群的一个热备。如果主集群失败,从集群可以接管。也可以使用CCR技术为临近的地理空间提高读请求,同时为用户提供服务。
跨集群复制是主从模式。在主集群中的索引是主要的索引,处理着写请求。通过CCR复制到从集群的索引都仅仅是只读的。
总结:
elasticsearch和redis有一些不同,redis集群是使用插槽来进行分配数据的,一共有16384个。
当redis增加或者减少节点,需要手动进行迁移数据,且无法自动分布所有数据,会有偏移或者倾斜,过多数据集中在一个节点上。
而elasticsearch却是自动迁移数据,且自动的分布所有数据和查询负载到所有的可用节点。



