返回顶部
首页 > 资讯 > 精选 >elasticsearch集群zendiscovery的Ping机制是什么
  • 921
分享到

elasticsearch集群zendiscovery的Ping机制是什么

2023-06-30 07:06:13 921人浏览 八月长安
摘要

这篇文章主要介绍“elasticsearch集群zendiscovery的Ping机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“elasticsearch集群zendiscovery的Pi

这篇文章主要介绍“elasticsearch集群zendiscovery的Ping机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“elasticsearch集群zendiscovery的Ping机制是什么”文章能帮助大家解决问题。

     zenDiscovery实现机制

    ping是集群发现的基本手段,通过在网络上广播或者指定ping某些节点获取集群信息,从而可以找到集群的master加入集群。zenDiscovery实现了两种ping机制:广播与单播。本篇将详细分析一些这MulticastZenPing机制的实现为后面的集群发现和master选举做好铺垫。

    广播的过程

    首先看一下广播(MulticastZenPing),广播的原理很简单,节点启动后向网络发送广播信息,任何收到的节点只要集群名字相同都应该对此广播信息作出回应。这样该节点就获取了集群的相关信息。它定义了一个action:"internal:discovery/zen/multicast"和广播的信息头:INTERNAL_HEADER 。之前说过NettyTransport是cluster通信的基础,但是广播却没有使它。它使用了java的MulticastSocket。这里简单的介绍一下MulticastSocket的使用。它是一个UDP 机制的socket,用来进行多个数据包的广播。它可以帮到一个ip形成一个group,任何MulticastSocket都可以join进来,组内的socket发送的信息会被订阅了改组的所有机器接收到。elasticsearch对其进行了封装形成了MulticastChannel,有兴趣可以参考相关源码。 

    首先看一下MulticastZenPing的几个辅助内部类:

    elasticsearch集群zendiscovery的Ping机制是什么

    它总共定义了4个内部类,这些内部类和它一起完成广播功能。FinalizingPinGCollection是一pingresponse的容器,所有的响应都用它来存储。MulticastPingResponseRequestHandler它是response处理类,类似于之前所说的nettytransportHandler,它虽然使用的不是netty,但是它也定义了一个messageReceived的方法,当收到请求时直接返回一个response。

    MulticastPingResponse就不用细说了,它就是一个响应类。最后要着重说一下Receiver类,因为广播并不是使用NettyTransport,因此对于消息处理逻辑都在Receiver中。在初始化MulticastZenPing时会将receiver注册进去。

    protected void doStart() throws ElasticsearchException {        try {            ....            multicastChannel = MulticastChannel.getChannel(nodeName(), shared,                    new MulticastChannel.Config(port, group, bufferSize, ttl, networkService.resolvePublishHostAddress(address)),                    new Receiver());//将receiver注册到channel中        } catch (Throwable t) {          ....        }    }

    Receiver类基础了Listener,实现了3个方法,消息经过onMessage方法区分,如果是内部ping则使用handleNodePingRequest方法处理,否则使用handleExternalPingRequest处理,区分方法很简单,就是读取信息都看它是否符合所定义的INTERNAL_HEADER 信息头。

    nodeping处理代码

    private void handleNodePingRequest(int id, DiscoveryNode requestingNodeX, ClusterName requestClusterName) {           ....            final DiscoveryNodes discoveryNodes = contextProvider.nodes();            final DiscoveryNode requestingNode = requestingNodeX;            if (requestingNode.id().equals(discoveryNodes.localNodeId())) {                // 自身发出的ping,忽略                return;            }        //只接受本集群ping            if (!requestClusterName.equals(clusterName)) {            ...return;            }            // 两个client间不需要ping            if (!discoveryNodes.localNode().shouldConnectTo(requestingNode)) {return;            }        //新建一个response            final MulticastPingResponse multicastPingResponse = new MulticastPingResponse();            multicastPingResponse.id = id;            multicastPingResponse.pingResponse = new PingResponse(discoveryNodes.localNode(), discoveryNodes.masterNode(), clusterName, contextProvider.nodeHasJoinedClusterOnce());        //无法连接的情况            if (!transportService.nodeConnected(requestingNode)) {                // do the connect and send on a thread pool                threadPool.generic().execute(new Runnable() {                    @Override                    public void run() {                        // connect to the node if possible                        try {                            transportService.connectToNode(requestingNode);                            transportService.sendRequest(requestingNode, ACTION_NAME, multicastPingResponse, new EmptyTransportResponseHandler(ThreadPool.Names.SAME) {                                @Override                                public void handleException(TransportException exp) {                                    logger.warn("failed to receive confirmation on sent ping response to [{}]", exp, requestingNode);                                }                            });                        } catch (Exception e) {                            if (lifecycle.started()) {                                logger.warn("failed to connect to requesting node {}", e, requestingNode);                            }                        }                    }                });            } else {                transportService.sendRequest(requestingNode, ACTION_NAME, multicastPingResponse, new EmptyTransportResponseHandler(ThreadPool.Names.SAME) {                    @Override                    public void handleException(TransportException exp) {                        if (lifecycle.started()) {                            logger.warn("failed to receive confirmation on sent ping response to [{}]", exp, requestingNode);                        }                    }                });            }        }    }

    另外的一个方法是处理外部ping信息,处理过程是返回cluster的信息(这种外部ping的具体作用没有研究不是太清楚)。以上是响应MulticastZenPing的过程,收到其它节点的响应信息后它会把本节点及集群的master节点相关信息返回给广播节点。这样广播节点就获知了集群的相关信息。在MulticastZenPing类中还有一个类 MulticastPingResponseRequestHandler,它的作用是广播节点对其它节点对广播信息响应的回应,广播节点的第二次发送信息的过程。它跟其它TransportRequestHandler一样它有messageReceived方法,在启动时注册到transportserver中,只处理一类action:"internal:discovery/zen/multicast"。

    ping请求的发送策略

    代码如下:

    public void ping(final PingListener listener, final TimeValue timeout) {       ....    //产生一个id        final int id = pingIdGenerator.incrementAndGet();        try {            receivedResponses.put(id, new PingCollection());            sendPingRequest(id);//第一次发送ping请求            // 等待时间的1/2后再次发送一个请求            threadPool.schedule(TimeValue.timeValueMillis(timeout.millis() / 2), ThreadPool.Names.GENERIC, new AbstractRunnable() {                @Override                public void onFailure(Throwable t) {                    logger.warn("[{}] failed to send second ping request", t, id);                    finalizePingCycle(id, listener);                }                @Override                public void doRun() {                    sendPingRequest(id);            //再过1/2时间再次发送一个请求                    threadPool.schedule(TimeValue.timeValueMillis(timeout.millis() / 2), ThreadPool.Names.GENERIC, new AbstractRunnable() {                        @Override                        public void onFailure(Throwable t) {                            logger.warn("[{}] failed to send third ping request", t, id);                            finalizePingCycle(id, listener);                        }                        @Override                        public void doRun() {                            // make one last ping, but finalize as soon as all nodes have responded or a timeout has past                            PingCollection collection = receivedResponses.get(id);                            FinalizingPingCollection finalizingPingCollection = new FinalizingPingCollection(id, collection, collection.size(), listener);                            receivedResponses.put(id, finalizingPingCollection);                            logger.trace("[{}] sending last pings", id);                            sendPingRequest(id);                //最后一次发送请求,超时的1/4后                            threadPool.schedule(TimeValue.timeValueMillis(timeout.millis() / 4), ThreadPool.Names.GENERIC, new AbstractRunnable() {                                @Override                                public void onFailure(Throwable t) {                                    logger.warn("[{}] failed to finalize ping", t, id);                                }                                @Override                                protected void doRun() throws Exception {                                    finalizePingCycle(id, listener);                                }                            });                        }                    });                }            });        } catch (Exception e) {            logger.warn("failed to ping", e);            finalizePingCycle(id, listener);        }    }

    发送过程主要是调用sendPingRequest(id)方法,在该方法中会将id,信息头,版本,本地节点信息一起写入到BytesStreamOutput中然后将其进行广播,这个广播信息会被其它机器上的Receiver接收并处理,并且响应该ping请求。另外一个需要关注的是以上加说明的部分,它通过链时的定期发送请求,在等待时间内可能会发出4次请求,这种发送方式会造成大量的ping请求重复,幸好ping的资源消耗小,但是好处是可以尽可能保证在timeout这个时间段内集群的新增节点都能收到这个ping信息。在单播中也采用了该策略。

    关于“elasticsearch集群zendiscovery的Ping机制是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

    --结束END--

    本文标题: elasticsearch集群zendiscovery的Ping机制是什么

    本文链接: https://lsjlt.com/news/327770.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • elasticsearch集群zendiscovery的Ping机制是什么
      这篇文章主要介绍“elasticsearch集群zendiscovery的Ping机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“elasticsearch集群zendiscovery的Pi...
      99+
      2023-06-30
    • elasticsearch集群发现zendiscovery的Ping机制分析
      目录 zenDiscovery实现机制广播的过程nodeping处理代码ping请求的发送策略总结 zenDiscovery实现机制 ping是集群发现的基本手段...
      99+
      2024-04-02
    • elasticsearch的zenDiscovery和master选举机制原理分析
      目录前言join的代码findMaster方法总结前言 上一篇通过 ElectMasterService源码,分析了master选举的原理的大部分内容:master候选节点...
      99+
      2024-04-02
    • mongodb集群数据机制是什么
      MongoDB集群数据机制是指在分布式环境下,MongoDB如何管理和复制数据以确保高可用性和容错性。MongoDB通过复制集(re...
      99+
      2023-09-06
      mongodb
    • redis集群选举机制是什么
      Redis集群的选举机制是基于Raft算法的一种实现。在Redis集群中,每个节点都有可能成为领导者(leader),而其他节点则成...
      99+
      2024-04-09
      redis
    • Elasticsearch集群是怎么搭建的
      Elasticsearch集群是怎么搭建的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一:资源集群: gh-cluster节点1:gh-cluster-node-01 &...
      99+
      2023-06-04
    • elasticsearch集群cluster主要功能是什么
      这篇文章主要介绍“elasticsearch集群cluster主要功能是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“elasticsearch集群cluster主要功能是什么”文章能帮助大家解...
      99+
      2023-06-30
    • Elasticsearch节点、集群、分片及副本是什么
      这篇文章主要讲解了“Elasticsearch节点、集群、分片及副本是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Elasticsearch节点、集群、分片及副本是什么”吧!Elast...
      99+
      2023-06-28
    • elasticsearch的master选举机制是什么
      Elasticsearch的主节点选举机制是通过Zen Discovery和Unicast Discovery两个插件来实现的。 Z...
      99+
      2023-10-23
      elasticsearch master
    • Redis Cluster集群数据分片机制是什么
      小编这次要给大家分享的是Redis Cluster集群数据分片机制是什么,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。Redis Cluster数据分片机制Redis...
      99+
      2024-04-02
    • MongoDB中复制集集群的原理是什么
      这篇文章给大家介绍MongoDB中复制集集群的原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。复制集介绍MongoDB中的复制集(也被称为副本)是一组维护相同数据集的mongo...
      99+
      2024-04-02
    • redis集群宕机条件是什么
      Redis集群宕机的条件可能有以下几种:1. 主节点宕机:当Redis集群的主节点宕机时,该主节点上的数据将不可用,客户端无法访问该...
      99+
      2023-08-23
      redis
    • Hive中跨集群复制的概念是什么
      Hive中跨集群复制指的是将一个Hive元数据(包括表结构、分区、数据位置等)从一个Hive集群复制到另一个Hive集群的过程。这种...
      99+
      2024-03-14
      Hive
    • 什么是Redis集群
      Redis集群是一种分布式的Redis数据库架构,它允许用户将数据存储和处理分散在多台服务器上。通过将数据分布在多个节点上,Redi...
      99+
      2024-04-09
      Redis
    • SpringBoot集成ElasticSearch的代码是什么
      这篇“SpringBoot集成ElasticSearch的代码是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Sprin...
      99+
      2023-06-29
    • Redis集群指的是什么
      小编给大家分享一下Redis集群指的是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!本文主要围绕如下几个方面介绍集群集群简介...
      99+
      2024-04-02
    • redis-cluster集群是什么?
      redis-cluster集群是什么?相信大部分人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,话不多说,一起往下看吧。不同于master-salve 或者 哨兵模式 cluster与他们最大的...
      99+
      2024-04-02
    • redis集群的意思是什么
      redis集群的意思是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Redis集群介绍Redis 集群是一个提供在多个Redis间节点间共...
      99+
      2024-04-02
    • Linux集群的原理是什么
      Linux集群的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Linux集群原理Linux集群系统包括集群节点和集群管理器两部分。集群节点有时简称为节点、服务器或...
      99+
      2023-06-13
    • hadoop集群的作用是什么
      Hadoop集群是一个开源的分布式计算框架,用于存储和处理大规模数据集。其作用主要包括以下几个方面: 存储大规模数据:Hadoo...
      99+
      2024-04-09
      hadoop
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作