本文主要介绍了Elasticsearches的集群构建和数据分片过程的详细说明。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。
目录
Elasticsearch高级集群构建、数据分片广播模式和单播模式选择主节点。什么是裂脑错误识别?
Elasticsearch高级之集群搭建,数据分片
Es使用两种不同的方法来发现对方:
广播
单播
您也可以同时使用这两种方式,但是默认的广播和单播需要一个已知节点列表才能完成。
广播方式
当es实例启动时,它向地址224.2.2.4:54328发送一个广播ping请求。其他es实例使用相同的集群名称响应了此请求。
一般情况下,默认的集群名称是上述cluster_name对应的elasticsearch。总的来说,广播是一种很好的地方风格。想象一下,广播发现就像你大喊:别说了,你再说话我就红了!那么你听到的一切都会回应你。
但是广播有缺点,过程不可控。
在单独的本地目录下,分别制作elasticsearch文件的另一个副本,并在bin目录下启动启动文件。输入:http://127 . 0 . 0 . 1:9200/_ cluster/health?Pretty可以从number_of_nodes中看到,集群中已经有两个节点。
单播方式
当一个节点的ip(想象一下如果我们的ip地址一直在变)不经常变化,或者es只连接一个特定的节点。单播发现是一种理想的模式。当使用单播时,我们告诉es集群中其他节点的ip和(可选)端口以及端口范围。我们在elasticsearch.yml配置文件中设置:
discovery . Zen . ping . unicast . hosts:[' 10 . 0 . 0 . 1 ',' 10.0.0.3:9300 ',' 10.0.0.6[9300-9400]']
就像交换微信名片一样,大家互传的时候都会加入群。
一般来说,我们不需要关闭单播发现。如果需要广播发现,只需将配置文件中的列表留空即可。
#现在,让我们为这个集群添加一些单播配置,并在每个节点中打开\config\elasticsearch.yml文件。各节点的配置如下(原配置文件已标注,可以理解为空。我已经写好了每个节点的配置,并直接粘贴到其中。如果没有动态标注,出了问题很容易恢复):
#1 elasticsearch2节点,集群名为my_es1,集群端口为9300;该节点的名称是node1,它监听本地端口9200。可以做主节点,读写磁盘(不写的话默认)。
cluster.name: my_es1
节点名:节点1
网络.主机:127.0.0.1
http.port: 9200
transport.tcp.port: 9300
discovery . Zen . ping . unicast . hosts:[' 127 . 0 . 0 . 1:9300 ',' 127.0.0.1:9302 ',' 127.0.0.1:9303 ',' 127.0.0.1:9304']
# 2 elasticsearch3节点,集群名为my_es1,集群端口为9302;该节点的名称是node2,它侦听本地端口9202,并且可以拥有成为主节点和读写磁盘的权限。
cluster.name: my_es1
节点名:节点2
网络.主机:127.0.0.1
http.port: 9202
transport.tcp.port: 9302
node.master: true
node.data: true
discovery . Zen . ping . unicast . hosts:[' 127 . 0 . 0 . 1:9300 ',' 127.0.0.1:9302 ',' 127.0.0.1:9303 ',' 127.0.0.1:9304']
# 3 elasticsearch3节点,集群名为my_es1,集群端口为9303;节点名为node3,监听本地端口9203,可以有权限成为主节点,读写磁盘。
cluster.name: my_es1
节点名:节点3
网络.主机:127.0.0.1
http.port: 9203
transport.tcp.port: 9303
discovery . Zen . ping . unicast . hosts:[' 127 . 0 . 0 . 1:9300 ',' 127.0.0.1:9302 ',' 127.0.0.1:9303 ',' 127.0.0.1:9304']
# 4 elasticsearch4节点,集群名为my_es1,集群端口为9304;节点名为node4,监听本地端口9204,只能读写磁盘,不能选举为主节点。
cluster.name: my_es1
节点名:节点4
网络.主机:127.0.0.1
http.port: 9204
transport.tcp.port: 9304
node.master: false
node.data: true
discovery . Zen . ping . unicast . hosts:[' 127 . 0 . 0 . 1:9300 ',' 127.0.0.1:9302 ',' 127.0.0.1:9303 ',' 127.0.0.1:9304']
从上面例子中的配置可以看出,每个节点都有一个共同的名字my_es1,但是因为是本地环境,所以每个节点的名字不能一致。我们分别启动它们,它们通过单播列表互相介绍,互相发现,然后组成一个my_es1集群。谁是老大要看谁先开始!
选取主节点
无论是广播发现还是单播发现,一旦集群中的节点发生变化,就会协商谁做主节点。elasticsearch认为所有节点都有资格成为主节点。
如果集群中只有一个节点,该节点首先会等待一段时间。如果没有找到其他节点,它将指定自己为主节点。
对于具有少量节点的集群,我们可以设置最小数量的主节点,尽管这个设置看起来像是一个集群可以有多个主节点。
实际上,这个设置告诉集群有多少节点有资格成为主节点。
怎么设置?在配置文件中修改:
discovery . Zen . minimum _ master _ nodes:3
一般规则是集群节点数除以2(向下取整)加1。例如,三个节点的集群应该设置为2。这是为了防止裂脑的问题。
什么是脑裂
裂脑这个词描述了这样一个场景:
(通常在负载较重或网络出现问题时)elasticsearch集群中的一个或多个节点失去与主节点的通信,然后每个节点开始选举新的主节点,继续处理请求。
这时可能会有两个不同的集群相互运行,这就是裂脑一词的由来,因为单个集群会分成两个部分。
为了防止这种情况发生,我们需要设置集群节点的总数。规则是节点总数除以2再加1(超过一半)。这样,当一个或多个节点失去通信时,弟弟们就无法选举新的主节点组成新的簇。因为这些小兄弟达不到规定的数量。
下面我们通过下图来说明如何预防裂脑。例如,现在有这样一个由5个节点组成的集群,它们都有资格成为主节点:
为了防止裂脑,我们为这个集群设置参数:
discovery . Zen . minimum _ master _ nodes:3 # 3=5/2 1
以前,原始集群的主节点是node1。由于网络和负载的原因,原来的集群被分成两个交换机:node1: Node 1和Node 2以及node3、Node 4和Node 5。
因为minimum_master_nodes参数为3,所以节点3、4、5可以组成一个集群,主节点node3当选。
但是node1和Node2因为不满足minimum_master_nodes条件而无法当选,只能不断寻求加入集群(还记得单播列表吗?),要么在网络和负载恢复正常后加入node3 3、4、5组成的集群,要么继续寻找集群,从而防止集群的脑分裂问题。
除了设置minimum_master_nodes参数,有时候还需要设置node_master参数,比如一个集群有两个节点。如果有裂脑问题,那么他们就不能选举自己,因为他们都没有达到一半以上的要求。
这时我们可以指定node_master,让其中一个节点有资格做主节点,另一个节点只能做存储。当然,这是特例。
那么,主节点怎么知道某个节点还活着呢?这是关于误认。
错误识别
实际上,错误识别是指当主节点确定后,建立内部ping机制,以确保集群中的每个节点保持活跃和健康,这就是所谓的错误识别。
主节点ping集群中的其他节点,每个节点ping主节点以确认主节点仍然活着。如果没有响应,则宣布该节点丢失。试想,大哥要看(传阅)小弟们是否还活着,小弟们要看大哥是否还在。如果他不是,他会迅速选出另一个!
但是,你怎么看?失去联系需要多长时间?这些细节是可以设定的。不是一巴掌拍在脑门上说某个小老弟死了!在配置文件中,您可以设置:
discovery . Zen . FD . ping _ interval:1
discovery . Zen . FD . ping _ time out:30
discovery _ Zen . FD . ping _ retries:3
每个节点每隔discovery.zen.fd.ping_interval(默认1秒)发送一次ping请求,等待discovery.zen.fd.ping_timeout(默认30秒),最多尝试discovery.zen.fd.ping_retries(默认3次)。如果没有结果,则该节点被声明为丢失,并在必要时创建一个新节点。
根据开发环境,适当修改这些值。
以上是Elasticsearches的集群构建和数据分片过程的详细内容。更多关于Elasticsearches的集群构造数据分片的信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。