本篇文章,我们来总结一下,在宏观上,ES中的数据是如何分布的,为什么能便捷地进行扩容。
宏观结构
1 集群cluster
集群这个概念从业务层面来看,是聚合了某方面功能的节点的组合,一般由单个或多个节点组成。在ES中,具有相同的cluster.name的节点就为同一个集群, 一个集群就是由一个或多个拥有相同cluster.name的节点组成。
集群也是ES中最顶层的对象,在同一个集群中,ES会将数据均匀地分散到集群中的各个节点,每当由新的节点加入或者删除时,集群会在节点间重新均匀地分配数据,以达到分布式储存的目的。
集群是由节点组成的。
2 节点
一个运行中的ES实例被成为一个节点,一个或多个节点(ES实例)则组成一个集群。
每个集群中会有主节点,ES会自动进行主节点选举,对用户透明。主节点的主要职责是管理集群范围內的数据变更,包括索引的增加/删除 ,节点的增加/删除,监控节点的状态等。并不负责具体的细节变更,比如文档级别的变更或搜索。所以它的工作负荷相对其他节点而言较轻,当集群流量增加时,它不会成为瓶颈。
当集群中有多个节点时,除主节点外,其他为从节点。各个节点能均匀地分摊集群的负载,实现负载均衡,以及数据冗余备份,当某个节点因为硬件故障丢失数据时,其他节点存放的冗余数据可以保证整个集群的数据完整性。
每个节点都可以处理任意请求,每个节点都知道任意文档的存放位置,并能将请求转发到对应文档储存节点,它可以扮演一个数据集散的角色,从各个节点将数据整合后再返回给客户端。
数据分摊到各个节点,同时还会进行冗余备份,每个节点会均匀地处理负载,提升集群的吞吐量。 那么节点又是由什么组成的? 答案是:分片。
3 分片
分片是什么:
分片是一个底层的工作单元每个分片都是一个Lucene实例,每个Lucene实例都是一个独立的搜索引擎每个分片只存放索引全部数据中的一部分
总结一下,一个集群是由一个或多个节点(ES实例)组成,一个节点又是由一个或多个分片(Lucene实例)组成,这里可以稍微地看出一点层次结构了。
分片的本质是Lucene实例,ES通过对这些实例,在一个更高的层次进行数据的包装组合,再加入分布式等特性就实现了功能强大的ES。分片是节点中存储数据的核心单元,每个索引的文档数据是均匀地存放到多个分片中的(默认为5个),这些分片又分散在多个节点中,这样便实现了分布式存储。当集群扩容/缩小时,ES会自动在各个节点中迁移分片,使得数据依然均匀分布。
分片有主分片和副本分片的区别。索引的内容均匀地放到各个主分片中,每个文档都属于某一个主分片。副本分片是主分片的冗余拷贝,和对应的主分片有完全一样的数据,这样就实现了节点间的数据备份。
主分片的数量在索引建立时会被定死,其数量在建立索引时需要根据实际情况考虑,以应对后面数据量的变化,主分片数量过小会限制索引的最终规模,因为分片存放在节点中,而节点总是会有硬件极限,当越过某一个值之后,性能会有很大的减弱,甚至最终无法存放。
而副本分片的数量没有限制,副本分片越多,集群的规模会相应的扩大,海量的检索请求会分散到各个副本上,系统的吞吐量会有成倍的提升。
规模变化
理解了上面的 集群>节点>分片的数据组织方式,就可以发现ES扩容或者缩容会变得很方便,根据相应的节点数量,将分片均匀地移动到各个节点上,便实现规模的变化。
|