zoukankan      html  css  js  c++  java
  • Elasticsearch部分节点不能发现集群(脑裂)问题处理

          

    **现象描述**

    es1,es2,es3三台es组成一个集群,集群状态正常,
    当es1 服务器重启后,es1不能加到集群中,自己选举自己为master,这就产生了es集群中所谓的“脑裂”
    , 把es1的es服务重启后,es1则能正常发现集群并加入。
    当重启es2服务器后,es2不能加到集群中,自己选举自己为master,也产生了es集群中所谓的“脑裂”,当
    重启es服务后,还是不能发现集群。
    当重启es3服务器后,es3能加到集群中。正常。


    **分析**

    三台es服务器es服务,插件的版本均一样,配置除了节点名不同也一样。
    查看es服务的启动日志发现:

        [2015-07-22 16:48:24,628][INFO ][cluster.service  ] [Es_node_10_0_31_2] new_master 
        [Es_node_10_0_31_2][fDJA3kUtTHC7eJuS4h78FA][localhost][inet[/10.0.31.2:9300]]{rack=rack2, 
        master=true}, reason: zen-disco-join (elected_as_master)

    服务启动过程中,由于未能发现集群,自己选举自己为master导致该问题有可能网络原因。因为discovery.zen(es 中一个集群的服务)超时了还没有找到集群则选举自己为master。
    修改设置 discovery.zen.ping_timeout: 30s,原来10s 重启es1发现正常了。用同样的方法修改es2,发
    现不凑效
    修改es2的设置如下:

        discovery.zen.ping.multicast.enabled: false
        discovery.zen.ping_timeout: 120s
        discovery.zen.minimum_master_nodes: 2 #至少要发现集群可做master的候选节点数,
        client.transport.ping_timeout: 60s
        discovery.zen.ping.unicast.hosts: ["10.0.31.2", "10.0.33.2"]


    指明集群中其它可能为master的节点ip,以防找不到
    用该方法后,重启es2服务器能正常发现集群,服务正常。


    **实验后三台es服务的配置均加了

        discovery.zen.ping.multicast.enabled: false
        discovery.zen.ping_timeout: 120s
        discovery.zen.minimum_master_nodes: 2 
        client.transport.ping_timeout: 60s
        discovery.zen.ping.unicast.hosts: ["10.0.31.2", "10.0.33.2"] 


    只是ip,及超时时间略有不同,es2的超时时间设得最长。
    es2的服务虽然正常了,但启动日志中会有个异常,如下:
        [2015-07-22 21:43:29,012][WARN ][transport.netty  ] [Es_node_10_0_32_2] exception 
        
        caught on transport layer [[id: 0x5c87285c]], closing connection
        java.net.NoRouteToHostException: No route to host
        at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
        at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
        at org.elasticsearch.common.netty.channel.socket.nio.NioClientBoss.connect
        
        (NioClientBoss.java:152)
        at org.elasticsearch.common.netty.channel.socket.nio.NioClientBoss.processSelectedKeys
        
        (NioClientBoss.java:105)
        at org.elasticsearch.common.netty.channel.socket.nio.NioClientBoss.process
        
        (NioClientBoss.java:79)
        at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioSelector.run
        
        (AbstractNioSelector.java:318)
        at org.elasticsearch.common.netty.channel.socket.nio.NioClientBoss.run
        
        (NioClientBoss.java:42)
        at org.elasticsearch.common.netty.util.ThreadRenamingRunnable.run
        
        (ThreadRenamingRunnable.java:108)
        at org.elasticsearch.common.netty.util.internal.DeadLockProofWorker$1.run
        
        (DeadLockProofWorker.java:42)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
        [2015-07-22 21:43:55,839][WARN ][discovery    
    怀疑跟网络有关系,虽然不影响服务。



    ## 如何避免脑裂问题 ##

    **避免脑裂现象**

    用到的一个参数是:discovery.zen.minimum_master_nodes。这个参数决定了要选举一个Master需要多少个节点(最少候选节点数)。默认值是1。根据一般经验这个一般设置成 N/2 + 1,N是集群中节点的数量,例如一个有3个节点的集群,minimum_master_nodes 应该被设置成 3/2 + 1 = 2(向下取整)。

    用到的另外一个参数是:discovery.zen.ping.timeout,等待ping响应的超时时间,默认值是3秒。如果网络缓慢或拥塞,建议略微调大这个值。这个参数不仅仅适应更高的网络延迟,也适用于在一个由于超负荷而响应缓慢的节点的情况。

    如果您刚开始使用elasticsearch,建议搭建拥有3个节点的集群,这种方式可以把discovery.zen.minimum_master_nodes设置成2,这样就限制了发生脑裂现象的可能,且保持着高度的可用性:如果你设置了副本,在丢失一个节点的情况下,集群仍可运行。

    **如何确定脑裂现象**

    在您的集群里面尽快识别这个问题非常重要。一个比较容易的方法是定时获取每一个节点/_nodes响应,它返回了集群中所有节点的状态报告,如果两个节点返回的集群状态不一样,就是一个脑裂情况发生的警示信号。

        curl GET http://10.10.2.111:9200/_nodes

  • 相关阅读:
    centos 7 端口
    linux yum
    linux RPM包管理
    linux 进程
    linux 显示系统执行的进程
    linux 任务调度
    linux 组管理
    linux 压缩和解压缩
    linux 文件目录类的指令 包含查找
    PHP指定字段的多维数组排序方法
  • 原文地址:https://www.cnblogs.com/kongr15/p/7243789.html
Copyright © 2011-2022 走看看