Elasticsearch 向外扩展
一、向Elasticsearch集群加入节点
新增节点前后集群状态变化向集群增加一个节点前,test索引的主分片全部分配到节点Node1,而副本分片分配没有地方分配。在这种情况下,集群是黄色的,因为所有的主分片有了安家之处,但是副本分片没有。一旦第二个节点加入,尚未分配的副本分片就会分配到新的节点Node2处,这使得集群变为了绿色的状态。
当另一个节点加入的时候,Elasticsearch会自动地尝试将分片在所有节点上进行均匀分配。如果更多的节点加入集群,Elasticsearch将试图在所有的节点上均匀配置分片数量,这样每个新加入的节点都能通过部分数据(以分片的形式)来分担负载。将节点加入Elasticsearch集群带来了大量的好处,主要的收益是高可用性和性能的提升。当副本分片是激活状态时,如果无法找到主分片,Elasticsearch会自动地将一个对应的副本分片升级为主分片。这样,及时失去了索引主分片所在的节点,仍然可以访问副本分片上的数据。数据分布在多个节点上同样提升了性能,原因是主分片和副本分片都可以处理搜索和获取结果的请求。如此扩展还未整体集群增加了更多的内存,所以如果过于消耗内存的搜索和聚集运行了太长时间或致使集群耗尽了内存,那么加入更多的节点总是一个处理更多更复杂操作的便捷方式。
二、发现其他Elasticsearch节点
通过广播来发现
广播模式发现集群中其他节点通过单播来发现
单播模式发现集群中其他节点选举主节点和识别错误
一旦集群中的节点发现了彼此,他们会协商谁将成为主节点。主节点负责管理集群的状态,也就是当前的设置和集群中分片、索引以及节点的状态。在主节点被选举出来之后,它会建立内部的ping记住来确保每个节点在集群中保持活跃和健康,这被成为错误识别。Elasticsearch认为所有节点都有资格成为主节点。当集群只有一个节点的时候, 该节点先等待一段时间,如果没有发现任何其他集群的节点,它就将自己选为主节点。
对于节点数量稀少的生产集群,设置主节点的最小数量 是个不错的主意。尽管这个设置可能使得Elasticsearch看上去可以拥有多个主节点,实际上它是告诉Elasticsearch在集群成为健康的状态前,集群中多少个节点有资格成为主节点。设置可成为主节点之节点的最小数量,可以帮助你确保集群在没有其全局状态的情况下,避免尝试执行存在危险的操作。如果节点数量不会随着时间而变化,可以将最小数量设置为集群的总节点数,或者遵循一个常用的规则:将其设滋味集群节点数/2 + 1。将minimum_master_nodes设置为高于1的数量,可以预防集群脑裂。
什么是脑裂?
(通常是在重负荷或网络存在问题的情况下)Elasticsearch集群中一个或多个节点失去了主节点的通讯,开始选举新的主节点,并且继续处理请求。这个时候,可能有两个不同的Elasticsearch集群相互独立地运行着,这就是脑裂。通过设置minimum_master_nodes的值可以预防脑裂,因为这意味着如果一个或多个节点失去了和其他节点的通信,他们无法选举新的主节点来形成新集群,因为对于他们不能获得所需的节点(可能成为主节点的节点)数量(超过一半)。
获取节点的信息三、删除集群中的节点
如果Elasticsearch集群中的一个节点掉线了或者被停机了?
Elasticsearch可以选择人一个副本分片并将其转变为主分片,副本分片变为主分片后,集群会变成黄色的状态,这意味着某些副本分片尚未分配到某个节点。Elasticsearch下一步需要创建更多的副本分片来保持索引的高可用性。一旦副本分片被重新创建,并用于弥补损失的节点,那么集群将重新回归绿色的状态,全部的主分片及其副本分片都分配到了某个节点。
在这段时间内,整个集群都是可用于搜索和索引的,因为实际上没有数据丢失。如果失去的节点多余1个,或者某个没有副本分片丢失了,那么集群就会变成红色状态,这意味着某些数据永远地丢失了,你需要让集群重连拥有丢失数据的节点,或者对丢失的数据重新建立索引。
停用节点:告诉集群不要再分配任何分片到某个或一组节点上。一旦运行了这个命令,Elasticsearch将待停用节点上的全部分片开始转移到集群中的其他节点上。
四、升级Elasticsearch节点
轮流重启是一种重启集群的方式,它是为了在不牺牲数据可用性的前提下,升级一个节点或进行非动态的配置修改。每次关闭一个节点,而无需关闭整个集群。
五、扩展策略
通常来说,规划生产环境的Elasticsearch集群至少有三件事情需要考虑:过度分片、将数据切分为索引和分片、最大化吞吐量
1.过度分片
over-sharding是指你有意地为索引创建大量分片,用于未来增加节点的过程。Elasticsearch管理每个分片都隐含着额外的开销,每个分片都是完整的Lucene索引,它需要为索引的每个分段创建一些文件描述符,增加相应的内存开销。如果为索引创建了过多的分片,可能会占用了本来支撑性能的内存吗,或者触及机器文件描述符或内存的极限。Elasticsearch选择的默认设置是5个分片。
2.将数据切分为索引和分片
现在并没有方法让我们增加或减少某个索引中的主分片数量,但是可以对数据进行规划,让其横跨多个索引。当创建索引的时候,不要忘记由于每个索引有自己的分片,你的操作仍然会导致创建分片的负载,所以请确保不要使用过多的索引来创建过多的分片,不要占用处理请求的资源。
3.最大化吞吐量
加速索引的一个方法是临时地减少集群中副本文件的数量。索引数据的时候,默认情况下,在数据更新到主分片和所有副本分片之前,请求是不会完成的。所以在索引的阶段将副本分片的数量减少到1甚至是0是有利的,然后在集中索引阶段结束后将这个数量重新增加为1或者多个。搜索的时候,通过加入更多的副本分片,搜索可以更快,这是因为无论是主分片还是副本分片都可以用于搜索。
额外的副本分片会处理搜索和聚集六、路由
文档时如何通过分片形式来定位的,这个过程被称为路由。当Elasticsearch散列文档的ID时就会发生文档的路由,来决定文档应该索引到那个分片中,这可以由你指定也可以让Elasticsearch生成。路由也可以不使用文档的ID,而使定制的数值进行散列。
为什么使用路由?如果你根本就不使用路由,Elasticsearch将确保你的文档以均衡的方式分布在所有不同的分片中,那为什么还需要使用路由?定制路由允许你将分享同一个路由值的多篇文档归集到单个分片中,而一旦这些文档放入到同一个索引,就可以路由某些查询,让他们可以在索引分片的子集中执行。
路由策略需要在两个方面下功夫:在你索引文档的时候挑选合适的路由值,以及在执行查询的时候重用这些值。