精华内容
下载资源
问答
  • Eclipse ERMaster插件

    2016-04-27 14:46:50
    Eclipse ERMaster 安装方法 : 1 . 解压下载的ERMaster.zip文件 2 . 打开Eclipse -> Help -> Install New Software -> Add 在Add Repository 弹出框的Name中输入 ERMaster , 然后点击 local(注意:是local) , 选中...
  • 仿 nrf master control panel的开源BLE调试程序,项目地址见https://git.oschina.net/vonchenchen/BLE_Assitant.git
  • bootstrap-fileinput-master上传插件(中文版)

    千次下载 热门讨论 2015-03-27 17:42:26
    bootstrap上传插件,可预览,可批量
  • VRRP——Master选举

    千次阅读 2020-04-29 22:30:37
    11.3.3 Master路由器的“选举” 在一个VRRP组中,正常情况下只能存在一台Master路由器。VRRP根据优先级和 IP地址来决定哪台路由器充当Master。优先级的范围是0^255,优先级的值越大,则路 由器越有可能成为Master,...

    Master路由器选举原理

    在一个VRRP组中,正常情况下只能存在一台Master路由器。VRRP根据优先级和IP地址来决定哪台路由器充当Master。

    1. VRRP优先级的范围是0~255,优先级的值越大,则路由器越有可能成为Master,其中0及255是两个特殊的优先级,不能被直接配置。
    2. 当路由器的接口IP地址与VRRP虚拟IP地址相同时,它的优先级将自动变成最大值255,此时该路由器被称为IP地址拥有者(IP Address Owner),该路由器自动升级为master路由器。0是另一个特殊的优先级,它会出现在Master路由器主动放弃Master角色时,比如当接口的VRRP配置被手工删掉时,该Master路由器会立即发送一个优先级为0的VRRP报文,用来通知网络中的Backup路由器。

    Master路由器选举过程

    1. 当一个激活了VRRP的接口Up之后,如果接口的VRRP优先级为255,那么其VRRP状态将直接从Initialize切换到Master,而如果接口的VRRP优先级不为255,则首先切换到Backup状态,然后再视竞争结果决定是否能够切换到Master状态。
    2. 如果在同一个广播域的同一个VRRP组内出现了两台Master路由器,那么它们收到对方发送的VRRP通告报文之后,将比较自己与对方的优先级,优先级的值更大的设备胜出,继续保持Master状态,而竞争失败的路由器则切换到Backup状态。如果这两台Master路由器的优先级相等,那么接口IP地址更大的路由器接口将会保持Master状态,而另一台设备则切换到Backup状态。
    3. 一个网络在稳定运行时,同一个VRRP组内不会同时出现两台Master路由器。

    Master、Backup路由器行为

    1. 处于Master状态的路由器会周期性地发送VRRP通告报文,并在报文中描述自己的VRRP优先级、IP地址等信息。
    2. 同一个广播域中、同一个VRRP组的Backup路由器会侦听这些报文。
    3. 如果此时网络中新出现了一台Backup路由器(其优先级高于当前Master路由器),激活了抢占功能,那么它会忽略收到的VRRP报文,并且切换到Master状态,同时发送自己的VRRP报文并在报文中描述其优先级等信息,而此前的Master路由器在收到了该VRRP报文后,则切换到Backup状态。

    Master路由器选举示例

    如下图所示,PC、R1、R2连接在同一台交换机上,它们都处于同一个广播域中。
    在这里插入图片描述

    链路正常时,流量通过R1转发

    (1)若R1率先启动,其GE0/0/0接口的VRRP首先进入Initialize状态,当接口UP后,其VRRP状态将从Initialize切换到Backup,并且在Master_Down_Timer定时器超时后,自动切换到Master状态,R1将成为Master路由器:

    • R1会立即发送一个免费ARP广播报文,PC在收到这个ARP报文后,就获悉了虚拟IP地址(192.168.27.254 )与虚拟MAC地址(0000-5e00-011b)的对应关系,
    • 其次交换机也会学习到关于该虚拟MAC地址的MAC表项,
    • 之后R1将以1秒为间隔,周期性地发送VRRP通告报文(携带VRRP优先级和VRRP接口地址)。

    (2)R2开始工作后,它的GE0/0/0接口将从Initialize状态切换到Backup状态,并且会收到R1所发送的VRRP报文,从这些报文中,它能够知道对方的VRRP优先级,比较之后,发现自己的优先级小于对方的优先级,因此它将其VRRP状态保持在Backup。

    (3)现在PC要发送数据给外部网络,由于目的IP地址并不在本地网段中,因此它将数据包发往自己的默认网关,也就是192.168.27.254。-- 先查询ARP表后,它发现网关的IP地址对应的MAC地址为000-5e00-011b,于是为报文封装以太网帧头,该数据帧的目的MAC地址是0000-5e00-011b。

    • 然后将数据帧被发往交换机,交换机查询MAC表后,将该帧从相应的接口转发给R1。
    • 最后R1收到数据包,查询路由表后将数据转发到外部网络。

    链路故障时,流量通过R2转发

    (4)当R1与交换机的互联链路发生故障时:

    • R2将无法再收到前者发送的VRRP报文,在Master_Down_Timer超时后,R2将VRRP状态切换到Master,它会成为了新的Master路由器
    • R2会立刻从GE0/0/0接口发送一个免费ARP报文,交换机收到报文之后,会刷新交换机的MAC地址表,VRRP虚拟MAC地址000 -5e00-011b的表项会关联到新的接口上,后续PC发往该目的MAC地址的数据帧将被引导至R2。整个过程对于PC而言是无感知的。

    链路恢复正常时,流量继续通过R1转发

    (5)接下来,R1及其与交换机的互联链路从故障中恢复:

    • R1的GE0/0/0接口的VRRP状态将从Initialize切换到Backup,
    • R1将收到R2发送的VRRP报文,并发现对方的优先级比自己更低,此时如果R1激活了抢占功能,那么它会忽略R2所发送的VRRP报文,并且将VRRP状态切换到Master。(缺省情况下VRRP的抢占功能就处于激活状态,而且抢占的延迟时间为0秒,也就是立即执行抢占)
    • 并且从GE0/0/0接口发送一个免费ARP报文(用于刷新交换机的MAC地址表项),并开始从GE0/0/0接口发送VRRP报文。(经过上述过程后,R1成为新的Master路由器。当然,如果R1没有激活抢占功能,那么它将保持Backup 状态。)

    (6)R2在收到R1发送的VRRP报文后,发现自己的优先级比对方更低,因此它从Master状态切换到Backup状态。

    引入问题1

    如下图所示的网络拓扑,R1的GE0/0/1接口或者该接口所连接的上行链路发生故障的话,缺省时VRRP是无法感知的,因此R1的GE0/0/0接口依然在该VRRP组中处于Master状态,PC到达外部网络的上行数据还是会被牵引至R1,但是此时R1己经丢失了与外部网络的连通性,数据包将在这里被丢弃。
    在这里插入图片描述

    解决方法

    在R1上部署VRRP监视(Track)功能,通过这个功能来监视上行接口GE0/0/1,当R1感知到这个接口的状态切换到Down时,会自动将VRRP的优先级减去一个值,从而“退位让贤”。

    示例

    1. 比如在R1上部署的配置中,vrrp vrid 1 track interface GigabitEthernet0/0/1 reduced 30命令用于配置监视功能,这条命令被配置后,R1将会监视其GE0/0/1接口,如果该接口的状态变为Down(无论是协议状态还是物理状态),那么VRRP优先级将被立即减去30,变为
      90。
    2. R1将在其从GE0/0/0接口发送出去的VRRP报文中携带这个新的VRRP优先级。
    3. 当R2收到R1发送的VRRP报文后,它意识到自己的优先级(100)比对方更高,由于抢占功能缺省已激活,因此它将自动切换到Master状态,成为新的Master路由器并发送自己的VRRP报文,而R1则会在收到R2发送的VRRP报文后切换到Backup状态。

    引入问题2

    还是上图所示的网络拓扑,正常情况下从PC到达外部网络的数据始终被发往Master路由器R1,在R1发生故障之前,Backup路由器R2始终不承担数据转发任务,交换机与R2之间的这段链路也不会承载业务数据,这就造成了设备资源和链路带宽的浪费。

    在某些网络中,网关路由器或者交换机的性能以及链路的带宽足以承载所有的业务流量,这种一主一备的VRRP工作方式确实能够满足需求,但是当业务流量特别大而路由器或者交换机的性能及链路带宽又存在瓶颈时,就不得不考虑让另一台路由器或者交换机也参与到业务流量转发的工作中来。

    网络期望行为

    如下图所示,交换机SW连接着两个用户VLAN,它们分别是VLAN 10及VLAN20。SW同时还连接着两台路由器:R1及R2,这两台路由器将充当PC的默认网关,它们连接着外部网络。

    该网络的需求是:正常情况下,VLAN 10内的PC通过R1到达外部网络,而当R1发生故障时,这些PC访问外部网络的上行流量需自动切换到R2;VLAN20内的PC则通过R2到达外部网络,当R2发生故障时,这些PC访问外部网络的上行流量需自动切换到R1。

    解决方法

    • 以R1为例,其GE0/0/0接口需处理VLAN10、VLAN20的标记帧,因此我们要在该接口上创建两个子接口,分别对应这两个VLAN,R2同理。
    • 为了实现VLAN10、VLAN20的网关冗余,还需在R1及R2的两个子接口上各部署一组VRRP,并且对优先级进行合理把控,优先级分配部署如下图所示:
      在这里插入图片描述

    就VLAN10的网关而言,R1子接口的VRRP优先级高于属于同一组的R2子接口的优先级,二者选举后,R1会成为为VALN10广播域内VRRP的Master路由器,R2做为Backup路由器。

    就VLAN20的网关而言,R2子接口的VRRP优先级高于属于同一组的R1子接口的优先级,二者选举后,R2会成为为VALN20广播域内VRRP的Master路由器,R1做为Backup路由器。

    VRRP相关表项信息

    1. 使用display vrrp查看设备VRRP的状态
      在这里插入图片描述

    2. 使用display vrrp brief命令:查看设备VRRP的运行状态
      在这里插入图片描述

    展开全文
  • 5)ScrumMaster要用于引导团队和产品负责人之间的交流,哪个技术是一个有效的方法? A)教产品负责人学习Sprint中用到的技术 B)引导他们之间的协作式会议 C)教团队在谈话中使用业务需求和目标的术语 D)...

    CSM 笔试常见的题目(这里是16年的版本,后期应该有较大改动),题目较简单,目的主要是让大家把两天培训的内容复习一遍。可自行选择英语、汉语,但汉语的翻译有时候比较难懂,建议还是使用英文,也便于根据答案进行推敲。这里只是摘录部分我做过的题目,有些答案忘记了得自己琢磨。

     

    1)推荐Sprint周期最长不超过?

    A)30天

    B)60天

    C)90天

    D)满足交付潜在可交付产品增量的需要

    2)CEO要求团队在当前Sprint中增加一个故事。团队该怎么办?

    A)把故事加入下一个Sprint。

    B)尊重CEO的职权,不做任何调整直接把故事加入当前Sprint。

    C)把故事加入到当前Sprint,并丢弃一个相同大小的故事。

    D)通知产品负责人让他/她和CEO一起处理此事。

    展开全文
  • es怎么实现master选举

    万次阅读 多人点赞 2019-02-21 10:30:30
    当node.master为true时,其表示这个node是一个master的候选节点,可以参与选举,在ES的文档中常被称作master-eligible node,类似于MasterCandidate。ES正常运行时只能有一个master(即leader),多于1个时会发生脑裂...

    Elasticsearch分布式一致性原理剖析(一)-节点篇

    王怀远

    王怀远

    阿里云分布式NoSQL开发

    23 人赞了该文章

    前言

    “Elasticsearch分布式一致性原理剖析”系列将会对Elasticsearch的分布式一致性原理进行详细的剖析,介绍其实现方式、原理以及其存在的问题等(基于6.2版本)。

    ES目前是最流行的分布式搜索引擎系统,其使用Lucene作为单机存储引擎并提供强大的搜索查询能力。学习其搜索原理,则必须了解Lucene,而学习ES的架构,就必须了解其分布式如何实现,而一致性是分布式系统的核心之一。

    本篇将介绍ES的集群组成、节点发现与Master选举,错误检测与扩缩容相关的内容。ES在处理节点发现与Master选举等方面没有选择Zookeeper等外部组件,而是自己实现的一套,本文会介绍ES的这套机制是如何工作的,存在什么问题。本文的主要内容如下:

    1. ES集群构成
    2. 节点发现
    3. Master选举
    4. 错误检测
    5. 集群扩缩容
    6. 与Zookeeper、raft等实现方式的比较
    7. 小结

    ES集群构成

    首先,一个Elasticsearch集群(下面简称ES集群)是由许多节点(Node)构成的,Node可以有不同的类型,通过以下配置,可以产生四种不同类型的Node:

    conf/elasticsearch.yml:
        node.master: true/false
        node.data: true/false
    

    四种不同类型的Node是一个node.master和node.data的true/false的两两组合。当然还有其他类型的Node,比如IngestNode(用于数据预处理等),不在本文讨论范围内。

    当node.master为true时,其表示这个node是一个master的候选节点,可以参与选举,在ES的文档中常被称作master-eligible node,类似于MasterCandidate。ES正常运行时只能有一个master(即leader),多于1个时会发生脑裂。

    当node.data为true时,这个节点作为一个数据节点,会存储分配在该node上的shard的数据并负责这些shard的写入、查询等。

    此外,任何一个集群内的node都可以执行任何请求,其会负责将请求转发给对应的node进行处理,所以当node.master和node.data都为false时,这个节点可以作为一个类似proxy的节点,接受请求并进行转发、结果聚合等。

     

    上图是一个ES集群的示意图,其中NodeA是当前集群的Master,NodeB和NodeC是Master的候选节点,其中NodeA和NodeB同时也是数据节点(DataNode),此外,NodeD是一个单纯的数据节点,Node_E是一个proxy节点。每个Node会跟其他所有Node建立连接。

    到这里,我们提一个问题,供读者思考:一个ES集群应当配置多少个master-eligible node,当集群的存储或者计算资源不足,需要扩容时,新扩上去的节点应该设置为何种类型?

    节点发现

    ZenDiscovery是ES自己实现的一套用于节点发现和选主等功能的模块,没有依赖Zookeeper等工具,官方文档:

    https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-zen.html

    简单来说,节点发现依赖以下配置:

    conf/elasticsearch.yml:
        discovery.zen.ping.unicast.hosts: [1.1.1.1, 1.1.1.2, 1.1.1.3]
    

    这个配置可以看作是,在本节点到每个hosts中的节点建立一条边,当整个集群所有的node形成一个联通图时,所有节点都可以知道集群中有哪些节点,不会形成孤岛。

    官方推荐这里设置为所有的master-eligible node,读者可以想想这样有何好处:

    It is recommended that the unicast hosts list be maintained as the list of master-eligible nodes in the cluster.
    

    Master选举

    上面提到,集群中可能会有多个master-eligible node,此时就要进行master选举,保证只有一个当选master。如果有多个node当选为master,则集群会出现脑裂,脑裂会破坏数据的一致性,导致集群行为不可控,产生各种非预期的影响。

    为了避免产生脑裂,ES采用了常见的分布式系统思路,保证选举出的master被多数派(quorum)的master-eligible node认可,以此来保证只有一个master。这个quorum通过以下配置进行配置:

    conf/elasticsearch.yml:
        discovery.zen.minimum_master_nodes: 2
    

    这个配置对于整个集群非常重要。

    1 master选举谁发起,什么时候发起?

    master选举当然是由master-eligible节点发起,当一个master-eligible节点发现满足以下条件时发起选举:

    1. 该master-eligible节点的当前状态不是master。
    2. 该master-eligible节点通过ZenDiscovery模块的ping操作询问其已知的集群其他节点,没有任何节点连接到master。
    3. 包括本节点在内,当前已有超过minimum_master_nodes个节点没有连接到master。

    总结一句话,即当一个节点发现包括自己在内的多数派的master-eligible节点认为集群没有master时,就可以发起master选举。

    2 当需要选举master时,选举谁?

    首先是选举谁的问题,如下面源码所示,选举的是排序后的第一个MasterCandidate(即master-eligible node)。

    public MasterCandidate electMaster(Collection<MasterCandidate> candidates) {
            assert hasEnoughCandidates(candidates);
            List<MasterCandidate> sortedCandidates = new ArrayList<>(candidates);
            sortedCandidates.sort(MasterCandidate::compare);
            return sortedCandidates.get(0);
    }
    

    那么是按照什么排序的?

    public static int compare(MasterCandidate c1, MasterCandidate c2) {
        // we explicitly swap c1 and c2 here. the code expects "better" is lower in a sorted
        // list, so if c2 has a higher cluster state version, it needs to come first.
        int ret = Long.compare(c2.clusterStateVersion, c1.clusterStateVersion);
        if (ret == 0) {
            ret = compareNodes(c1.getNode(), c2.getNode());
        }
        return ret;
    }
    

    如上面源码所示,先根据节点的clusterStateVersion比较,clusterStateVersion越大,优先级越高。clusterStateVersion相同时,进入compareNodes,其内部按照节点的Id比较(Id为节点第一次启动时随机生成)。

    总结一下:

    1. 当clusterStateVersion越大,优先级越高。这是为了保证新Master拥有最新的clusterState(即集群的meta),避免已经commit的meta变更丢失。因为Master当选后,就会以这个版本的clusterState为基础进行更新。(一个例外是集群全部重启,所有节点都没有meta,需要先选出一个master,然后master再通过持久化的数据进行meta恢复,再进行meta同步)。
    2. 当clusterStateVersion相同时,节点的Id越小,优先级越高。即总是倾向于选择Id小的Node,这个Id是节点第一次启动时生成的一个随机字符串。之所以这么设计,应该是为了让选举结果尽可能稳定,不要出现都想当master而选不出来的情况。

    3 什么时候选举成功?

    当一个master-eligible node(我们假设为Node_A)发起一次选举时,它会按照上述排序策略选出一个它认为的master。

    • 假设Node_A选Node_B当Master:

    Node_A会向Node_B发送join请求,那么此时:

    (1) 如果Node_B已经成为Master,Node_B就会把Node_A加入到集群中,然后发布最新的cluster_state, 最新的cluster_state就会包含Node_A的信息。相当于一次正常情况的新节点加入。对于Node_A,等新的cluster_state发布到Node_A的时候,Node_A也就完成join了。

    (2) 如果Node_B在竞选Master,那么Node_B会把这次join当作一张选票。对于这种情况,Node_A会等待一段时间,看Node_B是否能成为真正的Master,直到超时或者有别的Master选成功。

    (3) 如果Node_B认为自己不是Master(现在不是,将来也选不上),那么Node_B会拒绝这次join。对于这种情况,Node_A会开启下一轮选举。

    • 假设Node_A选自己当Master:

    此时NodeA会等别的node来join,即等待别的node的选票,当收集到超过半数的选票时,认为自己成为master,然后变更cluster_state中的master node为自己,并向集群发布这一消息。

    有兴趣的同学可以看看下面这段源码:

    if (transportService.getLocalNode().equals(masterNode)) {
                final int requiredJoins = Math.max(0, electMaster.minimumMasterNodes() - 1); // we count as one
                logger.debug("elected as master, waiting for incoming joins ([{}] needed)", requiredJoins);
                nodeJoinController.waitToBeElectedAsMaster(requiredJoins, masterElectionWaitForJoinsTimeout,
                        new NodeJoinController.ElectionCallback() {
                            @Override
                            public void onElectedAsMaster(ClusterState state) {
                                synchronized (stateMutex) {
                                    joinThreadControl.markThreadAsDone(currentThread);
                                }
                            }
    
                            @Override
                            public void onFailure(Throwable t) {
                                logger.trace("failed while waiting for nodes to join, rejoining", t);
                                synchronized (stateMutex) {
                                    joinThreadControl.markThreadAsDoneAndStartNew(currentThread);
                                }
                            }
                        }
    
                );
            } else {
                // process any incoming joins (they will fail because we are not the master)
                nodeJoinController.stopElectionContext(masterNode + " elected");
    
                // send join request
                final boolean success = joinElectedMaster(masterNode);
    
                synchronized (stateMutex) {
                    if (success) {
                        DiscoveryNode currentMasterNode = this.clusterState().getNodes().getMasterNode();
                        if (currentMasterNode == null) {
                            // Post 1.3.0, the master should publish a new cluster state before acking our join request. we now should have
                            // a valid master.
                            logger.debug("no master node is set, despite of join request completing. retrying pings.");
                            joinThreadControl.markThreadAsDoneAndStartNew(currentThread);
                        } else if (currentMasterNode.equals(masterNode) == false) {
                            // update cluster state
                            joinThreadControl.stopRunningThreadAndRejoin("master_switched_while_finalizing_join");
                        }
    
                        joinThreadControl.markThreadAsDone(currentThread);
                    } else {
                        // failed to join. Try again...
                        joinThreadControl.markThreadAsDoneAndStartNew(currentThread);
                    }
                }
            }
    

    按照上述流程,我们描述一个简单的场景来帮助大家理解:

    假如集群中有3个master-eligible node,分别为Node_A、 Node_B、 Node_C, 选举优先级也分别为Node_A、Node_B、Node_C。三个node都认为当前没有master,于是都各自发起选举,选举结果都为Node_A(因为选举时按照优先级排序,如上文所述)。于是Node_A开始等join(选票),Node_B、Node_C都向Node_A发送join,当Node_A接收到一次join时,加上它自己的一票,就获得了两票了(超过半数),于是Node_A成为Master。此时cluster_state(集群状态)中包含两个节点,当Node_A再收到另一个节点的join时,cluster_state包含全部三个节点。

    4 选举怎么保证不脑裂?

    基本原则还是多数派的策略,如果必须得到多数派的认可才能成为Master,那么显然不可能有两个Master都得到多数派的认可。

    上述流程中,master候选人需要等待多数派节点进行join后才能真正成为master,就是为了保证这个master得到了多数派的认可。但是我这里想说的是,上述流程在绝大部份场景下没问题,听上去也非常合理,但是却是有bug的。

    因为上述流程并没有限制在选举过程中,一个Node只能投一票,那么什么场景下会投两票呢?比如NodeB投NodeA一票,但是NodeA迟迟不成为Master,NodeB等不及了发起了下一轮选主,这时候发现集群里多了个Node0,Node0优先级比NodeA还高,那NodeB肯定就改投Node0了。假设Node0和NodeA都处在等选票的环节,那显然这时候NodeB其实发挥了两票的作用,而且投给了不同的人。

    那么这种问题应该怎么解决呢,比如raft算法中就引入了选举周期(term)的概念,保证了每个选举周期中每个成员只能投一票,如果需要再投就会进入下一个选举周期,term+1。假如最后出现两个节点都认为自己是master,那么肯定有一个term要大于另一个的term,而且因为两个term都收集到了多数派的选票,所以多数节点的term是较大的那个,保证了term小的master不可能commit任何状态变更(commit需要多数派节点先持久化日志成功,由于有term检测,不可能达到多数派持久化条件)。这就保证了集群的状态变更总是一致的。

    而ES目前(6.2版本)并没有解决这个问题,构造类似场景的测试case可以看到会选出两个master,两个node都认为自己是master,向全集群发布状态变更,这个发布也是两阶段的,先保证多数派节点“接受”这次变更,然后再要求全部节点commit这次变更。很不幸,目前两个master可能都完成第一个阶段,进入commit阶段,导致节点间状态出现不一致,而在raft中这是不可能的。那么为什么都能完成第一个阶段呢,因为第一个阶段ES只是将新的cluster_state做简单的检查后放入内存队列,如果当前cluster_state的master为空,不会对新的clusterstate中的master做检查,即在接受了NodeA成为master的cluster_state后(还未commit),还可以继续接受NodeB成为master的cluster_state。这就使NodeA和NodeB都能达到commit条件,发起commit命令,从而将集群状态引向不一致。当然,这种脑裂很快会自动恢复,因为不一致发生后某个master再次发布cluster_state时就会发现无法达到多数派条件,或者是发现它的follower并不构成多数派而自动降级为candidate等。

    这里要表达的是,ES的ZenDiscovery模块与成熟的一致性方案相比,在某些特殊场景下存在缺陷,下一篇文章讲ES的meta变更流程时也会分析其他的ES无法满足一致性的场景。

    错误检测

    1. MasterFaultDetection与NodesFaultDetection

    这里的错误检测可以理解为类似心跳的机制,有两类错误检测,一类是Master定期检测集群内其他的Node,另一类是集群内其他的Node定期检测当前集群的Master。检查的方法就是定期执行ping请求。ES文档:

    There are two fault detection processes running. The first is by the master, to ping all the other nodes in the cluster and verify that they are alive. And on the other end, each node pings to master to verify if its still alive or an election process needs to be initiated.
    

    如果Master检测到某个Node连不上了,会执行removeNode的操作,将节点从cluste_state中移除,并发布新的cluster_state。当各个模块apply新的cluster_state时,就会执行一些恢复操作,比如选择新的primaryShard或者replica,执行数据复制等。

    如果某个Node发现Master连不上了,会清空pending在内存中还未commit的new cluster_state,然后发起rejoin,重新加入集群(如果达到选举条件则触发新master选举)。

    2. rejoin

    除了上述两种情况,还有一种情况是Master发现自己已经不满足多数派条件(>=minimumMasterNodes)了,需要主动退出master状态(退出master状态并执行rejoin)以避免脑裂的发生,那么master如何发现自己需要rejoin呢?

    • 上面提到,当有节点连不上时,会执行removeNode。在执行removeNode时判断剩余的Node是否满足多数派条件,如果不满足,则执行rejoin。
             if (electMasterService.hasEnoughMasterNodes(remainingNodesClusterState.nodes()) == false) {
                    final int masterNodes = electMasterService.countMasterNodes(remainingNodesClusterState.nodes());
                    rejoin.accept(LoggerMessageFormat.format("not enough master nodes (has [{}], but needed [{}])",
                                                             masterNodes, electMasterService.minimumMasterNodes()));
                    return resultBuilder.build(currentState);
                } else {
                    return resultBuilder.build(allocationService.deassociateDeadNodes(remainingNodesClusterState, true, describeTasks(tasks)));
                }
    
    • 在publish新的cluster_state时,分为send阶段和commit阶段,send阶段要求多数派必须成功,然后再进行commit。如果在send阶段没有实现多数派返回成功,那么可能是有了新的master或者是无法连接到多数派个节点等,则master需要执行rejoin。
         try {
                publishClusterState.publish(clusterChangedEvent, electMaster.minimumMasterNodes(), ackListener);
            } catch (FailedToCommitClusterStateException t) {
                // cluster service logs a WARN message
                logger.debug("failed to publish cluster state version [{}] (not enough nodes acknowledged, min master nodes [{}])",
                    newState.version(), electMaster.minimumMasterNodes());
    
                synchronized (stateMutex) {
                    pendingStatesQueue.failAllStatesAndClear(
                        new ElasticsearchException("failed to publish cluster state"));
    
                    rejoin("zen-disco-failed-to-publish");
                }
                throw t;
            }
    
    • 在对其他节点进行定期的ping时,发现有其他节点也是master,此时会比较本节点与另一个master节点的cluster_state的version,谁的version大谁成为master,version小的执行rejoin。
         if (otherClusterStateVersion > localClusterState.version()) {
                rejoin("zen-disco-discovered another master with a new cluster_state [" + otherMaster + "][" + reason + "]");
            } else {
                // TODO: do this outside mutex
                logger.warn("discovered [{}] which is also master but with an older cluster_state, telling [{}] to rejoin the cluster ([{}])", otherMaster, otherMaster, reason);
                try {
                    // make sure we're connected to this node (connect to node does nothing if we're already connected)
                    // since the network connections are asymmetric, it may be that we received a state but have disconnected from the node
                    // in the past (after a master failure, for example)
                    transportService.connectToNode(otherMaster);
                    transportService.sendRequest(otherMaster, DISCOVERY_REJOIN_ACTION_NAME, new RejoinClusterRequest(localClusterState.nodes().getLocalNodeId()), new EmptyTransportResponseHandler(ThreadPool.Names.SAME) {
    
                        @Override
                        public void handleException(TransportException exp) {
                            logger.warn((Supplier<?>) () -> new ParameterizedMessage("failed to send rejoin request to [{}]", otherMaster), exp);
                        }
                    });
                } catch (Exception e) {
                    logger.warn((Supplier<?>) () -> new ParameterizedMessage("failed to send rejoin request to [{}]", otherMaster), e);
                }
            }
    

    集群扩缩容

    上面讲了节点发现、Master选举、错误检测等机制,那么现在我们可以来看一下如何对集群进行扩缩容。

    1 扩容DataNode

    假设一个ES集群存储或者计算资源不够了,我们需要进行扩容,这里我们只针对DataNode,即配置为:

    conf/elasticsearch.yml:
        node.master: false
        node.data: true
    

    然后需要配置集群名、节点名等其他配置,为了让该节点能够加入集群,我们把discovery.zen.ping.unicast.hosts配置为集群中的master-eligible node。

    conf/elasticsearch.yml:
        cluster.name: es-cluster
        node.name: node_Z
        discovery.zen.ping.unicast.hosts: ["x.x.x.x", "x.x.x.y", "x.x.x.z"]
    

    然后启动节点,节点会自动加入到集群中,集群会自动进行rebalance,或者通过reroute api进行手动操作。

    https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-reroute.html

    https://www.elastic.co/guide/en/elasticsearch/reference/current/shards-allocation.html

    2 缩容DataNode

    假设一个ES集群使用的机器数太多了,需要缩容,我们怎么安全的操作来保证数据安全,并且不影响可用性呢?

    首先,我们选择需要缩容的节点,注意本节只针对DataNode的缩容,MasterNode缩容涉及到更复杂的问题,下面再讲。

    然后,我们需要把这个Node上的Shards迁移到其他节点上,方法是先设置allocation规则,禁止分配Shard到要缩容的机器上,然后让集群进行rebalance。

    PUT _cluster/settings
    {
      "transient" : {
        "cluster.routing.allocation.exclude._ip" : "10.0.0.1"
      }
    }
    

    等这个节点上的数据全部迁移完成后,节点可以安全下线。

    更详细的操作方式可以参考官方文档:

    https://www.elastic.co/guide/en/elasticsearch/reference/current/allocation-filtering.html

    3 扩容MasterNode

    假如我们想扩容一个MasterNode(master-eligible node), 那么有个需要考虑的问题是,上面提到为了避免脑裂,ES是采用多数派的策略,需要配置一个quorum数:

    conf/elasticsearch.yml:
        discovery.zen.minimum_master_nodes: 2
    

    假设之前3个master-eligible node,我们可以配置quorum为2,如果扩容到4个master-eligible node,那么quorum就要提高到3。

    所以我们应该先把discovery.zen.minimum_master_nodes这个配置改成3,再扩容master,更改这个配置可以通过API的方式:

    curl -XPUT localhost:9200/_cluster/settings -d '{
        "persistent" : {
            "discovery.zen.minimum_master_nodes" : 3
        }
    }'
    

    这个API发送给当前集群的master,然后新的值立即生效,然后master会把这个配置持久化到cluster meta中,之后所有节点都会以这个配置为准。

    但是这种方式有个问题在于,配置文件中配置的值和cluster meta中的值很可能出现不一致,不一致很容易导致一些奇怪的问题,比如说集群重启后,在恢复cluster meta前就需要进行master选举,此时只可能拿配置中的值,拿不到cluster meta中的值,但是cluster meta恢复后,又需要以cluster meta中的值为准,这中间肯定存在一些正确性相关的边界case。

    总之,动master节点以及相关的配置一定要谨慎,master配置错误很有可能导致脑裂甚至数据写坏、数据丢失等场景。

    4 缩容MasterNode

    缩容MasterNode与扩容跟扩容是相反的流程,我们需要先把节点缩下来,再把quorum数调下来,不再详细描述。

    与Zookeeper、raft等实现方式的比较

    1. 与使用Zookeeper相比

    本篇讲了ES集群中节点相关的几大功能的实现方式:

    1. 节点发现
    2. Master选举
    3. 错误检测
    4. 集群扩缩容

    试想下,如果我们使用Zookeeper来实现这几个功能,会带来哪些变化?

    Zookeeper介绍

    我们首先介绍一下Zookeeper,熟悉的同学可以略过。

    Zookeeper分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

    简单来说,Zookeeper就是用于管理分布式系统中的节点、配置、状态,并完成各个节点间配置和状态的同步等。大量的分布式系统依赖Zookeeper或者是类似的组件。

    Zookeeper通过目录树的形式来管理数据,每个节点称为一个znode,每个znode由3部分组成:

    • stat. 此为状态信息, 描述该znode的版本, 权限等信息.
    • data. 与该znode关联的数据.
    • children. 该znode下的子节点.

    stat中有一项是ephemeralOwner,如果有值,代表是一个临时节点,临时节点会在session结束后删除,可以用来辅助应用进行master选举和错误检测。

    Zookeeper提供watch功能,可以用于监听相应的事件,比如某个znode下的子节点的增减,某个znode本身的增减,某个znode的更新等。

    怎么使用Zookeeper实现ES的上述功能

    1. 节点发现:每个节点的配置文件中配置一下Zookeeper服务器的地址,节点启动后到Zookeeper中某个目录中注册一个临时的znode。当前集群的master监听这个目录的子节点增减的事件,当发现有新节点时,将新节点加入集群。
    2. master选举:当一个master-eligible node启动时,都尝试到固定位置注册一个名为master的临时znode,如果注册成功,即成为master,如果注册失败则监听这个znode的变化。当master出现故障时,由于是临时znode,会自动删除,这时集群中其他的master-eligible node就会尝试再次注册。使用Zookeeper后其实是把选master变成了抢master。
    3. 错误检测:由于节点的znode和master的znode都是临时znode,如果节点故障,会与Zookeeper断开session,znode自动删除。集群的master只需要监听znode变更事件即可,如果master故障,其他的候选master则会监听到master znode被删除的事件,尝试成为新的master。
    4. 集群扩缩容:扩缩容将不再需要考虑minimum_master_nodes配置的问题,会变得更容易。

    使用Zookeeper的优劣点

    使用Zookeeper的好处是,把一些复杂的分布式一致性问题交给Zookeeper来做,ES本身的逻辑就可以简化很多,正确性也有保证,这也是大部分分布式系统实践过的路子。而ES的这套ZenDiscovery机制经历过很多次bug fix,到目前仍有一些边角的场景存在bug,而且运维也不简单。

    那为什么ES不使用Zookeeper呢,大概是官方开发觉得增加Zookeeper依赖后会多依赖一个组件,使集群部署变得更复杂,用户在运维时需要多运维一个Zookeeper。

    那么在自主实现这条路上,还有什么别的算法选择吗?当然有的,比如raft。

    2. 与使用raft相比

    raft算法是近几年很火的一个分布式一致性算法,其实现相比paxos简单,在各种分布式系统中也得到了应用。这里不再描述其算法的细节,我们单从master选举算法角度,比较一下raft与ES目前选举算法的异同点:

    相同点

    1. 多数派原则:必须得到超过半数的选票才能成为master。
    2. 选出的leader一定拥有最新已提交数据:在raft中,数据更新的节点不会给数据旧的节点投选票,而当选需要多数派的选票,则当选人一定有最新已提交数据。在es中,version大的节点排序优先级高,同样用于保证这一点。

    不同点

    1. 正确性论证:raft是一个被论证过正确性的算法,而ES的算法是一个没有经过论证的算法,只能在实践中发现问题,做bug fix,这是我认为最大的不同。
    2. 是否有选举周期term:raft引入了选举周期的概念,每轮选举term加1,保证了在同一个term下每个参与人只能投1票。ES在选举时没有term的概念,不能保证每轮每个节点只投一票。
    3. 选举的倾向性:raft中只要一个节点拥有最新的已提交的数据,则有机会选举成为master。在ES中,version相同时会按照NodeId排序,总是NodeId小的人优先级高。

    看法

    raft从正确性上看肯定是更好的选择,而ES的选举算法经过几次bug fix也越来越像raft。当然,在ES最早开发时还没有raft,而未来ES如果继续沿着这个方向走很可能最终就变成一个raft实现。

    raft不仅仅是选举,下一篇介绍meta数据一致性时也会继续比较ES目前的实现与raft的异同。

    小结

    本篇介绍了Elasticsearch集群的组成、节点发现、master选举、故障检测和扩缩容等方面的实现,与一般的文章不同,本文对其原理、存在的问题也进行了一些分析,并与其他实现方式进行了比较。

    作为Elasticsearch分布式一致性原理剖析系列的第一篇,本文先从节点入手,下一篇会介绍meta数据变更的一致性问题,会在本文的基础上对ES的分布式原理做进一步分析。

    展开全文
  • 问题 上传完hbase,配置好hbase-site.xml ,启动hbase,查看...2019-12-06 18:03:31,894 ERROR [master/hadoop-master:16000:becomeActiveMaster] master.HMaster: Failed to become active master at org.apach...

    问题

    上传完hbase,配置好 hbase-site.xml ,启动hbase,查看日志出现问题。

    2019-12-06 18:03:31,894 ERROR [master/hadoop-master:16000:becomeActiveMaster] master.HMaster: Failed to become active master
            at org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.rollWriter(WALProcedureStore.java:1092)
            at org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.recoverLease(WALProcedureStore.java:424)
            at org.apache.hadoop.hbase.procedure2.ProcedureExecutor.init(ProcedureExecutor.java:576)
            at org.apache.hadoop.hbase.master.HMaster.createProcedureExecutor(HMaster.java:1528)
            at org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:938)
            at org.apache.hadoop.hbase.master.HMaster.startActiveMasterManager(HMaster.java:2112)
            at org.apache.hadoop.hbase.master.HMaster.lambda$run$0(HMaster.java:580)
            at java.lang.Thread.run(Thread.java:745)
    2019-12-06 18:03:31,895 ERROR [master/hadoop-master:16000:becomeActiveMaster] master.HMaster: ***** ABORTING master hadoop-master,16000,1575626600996: Unhandled exception. Starting shutdown. *****
    java.lang.IllegalStateException: The procedure WAL relies on the ability to hsync for proper operation during component failures, but the underlying filesystem does not support doing so. Please check the config value of 'hbase.procedure.store.wal.use.hsync' to set the desired level of robustness and ensure the config value of 'hbase.wal.dir' points to a FileSystem mount that can provide it.
            at org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.rollWriter(WALProcedureStore.java:1092)
            at org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.recoverLease(WALProcedureStore.java:424)
            at org.apache.hadoop.hbase.procedure2.ProcedureExecutor.init(ProcedureExecutor.java:576)
            at org.apache.hadoop.hbase.master.HMaster.createProcedureExecutor(HMaster.java:1528)
            at org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:938)
            at org.apache.hadoop.hbase.master.HMaster.startActiveMasterManager(HMaster.java:2112)
            at org.apache.hadoop.hbase.master.HMaster.lambda$run$0(HMaster.java:580)
            at java.lang.Thread.run(Thread.java:745)
    2019-12-06 18:03:31,895 INFO  [master/hadoop-master:16000:becomeActiveMaster] regionserver.HRegionServer: ***** STOPPING region server 'hadoop-master,16000,1575626600996' *****
    2019-12-06 18:03:31,895 INFO  [master/hadoop-master:16000:becomeActiveMaster] regionserver.HRegionServer: STOPPED: Stopped by master/hadoop-master:16000:becomeActiveMaster
    2019-12-06 18:03:32,590 INFO  [master/hadoop-master:16000.splitLogManager..Chore.1] hbase.ScheduledChore: Chore: SplitLogManager Timeout Monitor was stopped
    2019-12-06 18:03:34,214 INFO  [master/hadoop-master:16000] ipc.NettyRpcServer: Stopping server on /10.0.1.73:16000
    2019-12-06 18:03:34,222 INFO  [master/hadoop-master:16000] regionserver.HRegionServer: Stopping infoServer
    2019-12-06 18:03:34,229 INFO  [master/hadoop-master:16000] handler.ContextHandler: Stopped o.e.j.w.WebAppContext@558756be{/,null,UNAVAILABLE}{file:/usr/local/hadoop-2.10.0/hbase-2.2.2/hbase-webapps/master}
    2019-12-06 18:03:34,233 INFO  [master/hadoop-master:16000] server.AbstractConnector: Stopped ServerConnector@2931ab92{HTTP/1.1,[http/1.1]}{0.0.0.0:16010}
    2019-12-06 18:03:34,233 INFO  [master/hadoop-master:16000] handler.ContextHandler: Stopped o.e.j.s.ServletContextHandler@1bc776b7{/static,file:///usr/local/hadoop-2.10.0/hbase-2.2.2/hbase-webapps/static/,UNAVAILABLE}
    2019-12-06 18:03:34,233 INFO  [master/hadoop-master:16000] handler.ContextHandler: Stopped o.e.j.s.ServletContextHandler@3b1ed14b{/logs,file:///usr/local/hadoop-2.10.0/hbase-2.2.2/logs/,UNAVAILABLE}
    2019-12-06 18:03:34,236 INFO  [master/hadoop-master:16000] regionserver.HRegionServer: aborting server hadoop-master,16000,1575626600996
    2019-12-06 18:03:34,237 INFO  [master/hadoop-master:16000] regionserver.HRegionServer: stopping server hadoop-master,16000,1575626600996; all regions closed.
    2019-12-06 18:03:34,237 INFO  [master/hadoop-master:16000] hbase.ChoreService: Chore service for: master/hadoop-master:16000 had [] on shutdown
    2019-12-06 18:03:34,241 INFO  [ReadOnlyZKClient-hadoop-master:2181,hadoop-slave:2181,hadoop-slave02:2181,hadoop-slave03:2181@0x6940cfa3] zookeeper.ZooKeeper: Session: 0x6edaaa11640001 closed
    2019-12-06 18:03:34,242 INFO  [ReadOnlyZKClient-hadoop-master:2181,hadoop-slave:2181,hadoop-slave02:2181,hadoop-slave03:2181@0x6940cfa3-EventThread] zookeeper.ClientCnxn: EventThread shut down for session: 0x6edaaa11640001
    2019-12-06 18:03:34,244 WARN  [master/hadoop-master:16000] master.ActiveMasterManager: Failed get of master address: java.io.IOException: Can't get master address from ZooKeeper; znode data == null
    2019-12-06 18:03:34,245 INFO  [master/hadoop-master:16000] wal.WALProcedureStore: Stopping the WAL Procedure Store, isAbort=true
    2019-12-06 18:03:34,245 INFO  [master/hadoop-master:16000] hbase.ChoreService: Chore service for: master/hadoop-master:16000.splitLogManager. had [] on shutdown
    2019-12-06 18:03:34,257 INFO  [main-EventThread] zookeeper.ClientCnxn: EventThread shut down for session: 0x36efe64ffc20001
    2019-12-06 18:03:34,258 INFO  [master/hadoop-master:16000] zookeeper.ZooKeeper: Session: 0x36efe64ffc20001 closed
    2019-12-06 18:03:34,258 INFO  [master/hadoop-master:16000] regionserver.HRegionServer: Exiting; stopping=hadoop-master,16000,1575626600996; zookeeper connection closed.
    2019-12-06 18:03:34,258 ERROR [main] master.HMasterCommandLine: Master exiting
    java.lang.RuntimeException: HMaster Aborted
            at org.apache.hadoop.hbase.master.HMasterCommandLine.startMaster(HMasterCommandLine.java:244)
            at org.apache.hadoop.hbase.master.HMasterCommandLine.run(HMasterCommandLine.java:140)
            at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
            at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:149)
            at org.apache.hadoop.hbase.master.HMaster.main(HMaster.java:2942)

    解决

    在配置文件 hbase-site.xml 中添加:

    <property>
      <name>hbase.unsafe.stream.capability.enforce</name>
      <value>false</value>
    </property>

    重启之后,问题就解决了。

     

     

    展开全文
  • # Replication role:slave master_host:192.168.1.29 master_port:6379 master_link_status:up master_last_io_seconds_ago:8 master_sync_in_progress:0 slave_repl_offset:308 slave_priority:100 slave_read_...
  • git 创建远程分支和删除 master 分支

    万次阅读 2018-07-19 19:57:54
    最近需要将不同的客户的代码分开管理,所以需要为这些代码分别创建分支。 目前版本库中分支结构如下: [yuhuashi@local:Project]$ git branch -a * master remotes/origin/HEAD -&gt; origin/master rem...
  • MHA之masterha_master_switch

    千次阅读 2017-06-01 10:29:20
    如下是 MHA 的 masterha_master_switch 功能的 官方介绍,大体翻译下,需要时候可以查阅。 masterha_master_switch masterha_master_switch可以用来做master failover 也可以用来做在线的主库切换。 Manual ...
  • Word Password Recovery Master 是Rixler Software公司出品的一款WORD一般保 护密码清除工具,其最具特色的是对WORD密码具有秒杀功能。通过调试和抓取网络数据包分析,该软件只是将WORD文档头存储密码的少量字节发送...
  • Busmaster使用.pdf

    千次阅读 2020-12-24 09:42:23
    Busmaster使用CANoe与Busmater的CAN通讯Foton电子电器Busmaster接收、发送、记录操作准备:①安装Busmaster软件;安装硬件驱动 (581的驱动)②软件中configure选项→hardware selection→对话框中选择581硬件→确定...
  • 目录背景问题探究 背景 某天同事小L找我帮忙解决代码冲突引起的问题,折腾一番之后,问题解决了。...因为我平时都是切换到master分支,git pull,然后切换到自己开发分支,再git merge master,对前面
  • 在进行MySQL主从复制配置时,change master 用于配置和改变 slave 服务器用于连接 master 服务器的参数,以便 slave服务器读取 master 服务器的 binlog 及 slave 服务器的 relay log。同时更新 master.info 及 relay...
  • $ git diff origin/master master => show me the changes between the remote master branch and my master branch 需要注意的是,remotes/origin/master 和 origin/master 的指向是相同的,可以运行以下命令看...
  • Elasticsearch并不像其他工具那样依赖zookeeper,它自己内部有一套维护集群的体系。本文主要研讨Elasticsearch中Master的选举机制。
  • --Master Slave实验 --创建数据目录 $ mkdir /data/1 $ mkdir /data/2 $ mkdir /data/3 --启动mongodb库 $ /data/mongodb-linux-i686-1.6.0/bin/mongod --port 27020 --dbpath /data/1 --master & $ /data/...
  • 数据库主从备份主要原理就是slave数据库根据master数据库进行的增删改操作留下的日志文件,在slave数据库里再执行一遍。 1.准备两台win7机器或虚拟机,并安装好mysql5.7数据库 Ip分别为192.168.0.127(主:Master)...
  • ScrumMaster的六大主要职责

    万次阅读 2018-03-13 14:04:12
    ScrumMaster是组成Scrum团队的三个角色之一。产品负责人主要负责构建正确的产品,开发团队负责以正确的方式构建产品,ScrumMaster则主要负责帮助产品负责人和开发团队中的每个人理解和拥抱Scrum的价值观、原则和实践...
  • kudu 添加master

    千次阅读 2019-06-18 18:32:21
    kudu 添加master节点不像其他大数据组件直接添加即可,操作比较复杂,步骤如下: 1.kudu添加master节点,集群不可用 2.Master节点数为奇数 3.在已存在master节点查看wal和数据目录,rpc_bind_addresses 端口,...
  • Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个MasterMaster与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master...
  • DeepLearningTutorials-master

    热门讨论 2014-02-19 16:18:33
    DeepLearningTutorials-master 深度学习的 theano 代码
  • 1. Master 单节点可用性 Master节点在Spark中所承载的作用是分配Application到Worker节点,维护Worker节点,Driver,Application的状态。 在Spark中,Master本身也提供了基于硬盘的单节点的可用性,也就是可以直接...
  • k8s集群添加master节点

    千次阅读 2020-03-13 20:46:58
    前提条件: 安装dockers 下载sealos 下载k8s离线包(v1.14.1,v1.15.0,v1.16.0,v1.17.0)14版本的下载链接找...添加master节点 环境: [root@node131 ~]# kubectl get node NAME STATUS ROLES AGE VERSION cm-serv...
  • Arduino_IRremote_master.zip

    热门讨论 2013-12-12 23:09:14
    红外收发库文件,默认载波38KHz; 在别处也可下载;
  • master.HMasterCommandLine: Master exiting

    千次阅读 2018-08-27 22:10:12
    2018-08-20 00:59:33,382 ERROR [main] master.HMasterCommandLine: Master exiting java.io.IOException: Could not start ZK at requested port of 2181. ZK was started at port: 2182. Aborting as clients (...
  • gitlab将分支代码合并到master

    千次阅读 2021-04-27 16:24:24
    1、首先在test分支上进行 git add . git commit -m "test" git push 2、切换到master上 git checkout master git merge test git push
  • master数据库是什么

    千次阅读 2020-10-15 13:12:29
    master 数据库记录 SQL Server 系统的所有系统级信息。 这包括实例范围的元数据(例如登录帐户)、端点、链接服务器和系统配置设置。 在 SQL Server中,系统对象不再存储在 master 数据库中,而是存储在 Resource ...
  • HBase:Region管理与Master工作机制

    千次阅读 多人点赞 2019-12-22 21:22:56
    本篇博客小菌为大家带来的是HBase的Region管理与Master工作机制。 region 的管理         首先让我们来看下region的管理,当然这存在一个前提: 任何时刻,一个region只能分配...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,521,922
精华内容 608,768
关键字:

master

友情链接: QQ窗口抖动.zip