您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

关于卡珊德拉八卦协议的两三件事 《企业网站源码》

  • 时间:2022-11-03 11:24 编辑: 来源: 阅读:313
  • 扫一扫,手机访问
摘要:关于卡珊德拉八卦协议的两三件事 《企业网站源码》
八卦协议是Cassandra维护各节点状态的重要组件。这里我们将基于Gossip协议的三次握手,逐步分析Gossip协议的源代码。 八卦协议是Cassandra维护各节点状态的重要组件。我们以八卦协议的三次握手为线索,逐步分析八卦协议的源代码。 Gossip协议通过判断节点的世代和版本来确定节点状态信息是新的还是旧的。如果节点重启,则代加1,每次从零开始计算版本。 因此,代是大版本号,版本是小版本号。理解这个概念对后面的握手逻辑有很大的帮助。 Gossip协议最重要的属性之一是endpointStateMap,它以address为键,以EndpointState为值来维护节点本身的状态信息。 内点状态包含节点网络版本、主机id、RPC地址、版本、DC、机架、负载、状态和令牌的信息。 一般来说,所有节点维护的endpointStateMap应该是一致的。如果出现信息不一致或者新增、替换、删除节点,中间的状态维护就要靠八卦了。 另一个重要的属性subscribers,gossip会在节点状态改变时通知每个订户。 gossip启动时,它会随机选择集群中的一个节点每秒发送一条gossipdestsyn消息,并开始与其他节点通信,如下图所示:接下来我们按照上面的流程图一步步分析gossipdestsyn代码,gossipdestsyn消息是在GossipTask中构造的。 1//syn消息包含集群名、分区设备、gDigests消息2 gossipdestsyn digest syn message = new gossipdestsyn(database descriptor。getclustername(),databasedriptor。getpartitionname()、gdigests);34 MessageOut & ltGossipDigestSyn & gtmessage = new MessageOut & ltGossipDigestSyn & gt(MessagingService。Verb.GOSSIP_DIGEST_SYN,digestSynMessage,GOSSIP digestsyn . serializer);GossipDigestSyn消息的主要部分在gdigers中,它是由gossiper . instance . makerandomgossipdest(gdigers)方法生成的。 私有void makeRandomGossipDigest(List & lt;八卦文摘& gtgDigests)02 { 03 endpoint state EP state;04 int generation = 0;05 int max version = 0;007//本地EP状态将是endpointstatemap的一部分08//当前节点维护的节点列表09List < InetAddress & gtendpoints = new ArrayList & ltInetAddress & gt(endpointstatemap . keyset());0//求解11个集合. shuffle(端点,随机)无序;12 for(inet address endpoint:endpoints)13 { 14 EP state = endpointstatemap . get(endpoint);15 if (epState!= null) 16 {17 //获取生成版本号18Generation = epstate。GetHeartBeatState()。get generation();19 //EndpointState包含令牌、hostid、状态、负载等信息。,所以用冒泡排序得到最大的max version 20 max version = getmaxendpointstatevision(EP state);21 } 22 gDigests.add(新GossipDigest(endpoint,generation,max version));23 } 2425 if(logger . istrace enabled())26 { 27 StringBuilder sb = new StringBuilder();28 for(gossip digest GDI gest:GDI gest)29 { 30 sb . append(GDI gest);31 sb . append(" ");32 } 33 logger.trace("八卦摘要是:{} ",sb);34} 35}节点A发送gossipdestsyn后,节点B将通过GossipDigestSynVerbHandler解析gossipdestsyn消息。具体的求解逻辑在gossiper . instance . examine gossiper,上面的方法和版本号对比后,主要的求解逻辑是senall方法和requestAll方法,并跟进:1 private void request all(gossip digest g digest,list < GossipDigest & gtdeltaGossipDigestList,Int remote generation) 2 {3/*我们在这里是因为我们在本地没有此端点的数据,所以请求所有内容。*/4//生成一个摘要,等待对面节点发送消息5 deltagosifdigest . add(new gossip Digest(gdigest . get endpoint(),远程生成,0));6 if(logger . istrace enabled())7 logger . trace(" request all for { } ",GDI gest . get endpoint());8 } 1私有void sendAll(gossip digest GDI gest,Map & ltInetAddress,EndpointState & gtdeltaEpStateMap,int maxremotevision)2 { 3 EndpointState localEpStatePtr = getStateForVersionBiggerThan(gdigest . get endpoint(),maxremotevision);4 if (localEpStatePtr!= null) 5 //通过ack消息向对方发送endpintState信息6 deltaepstatemap . put(gdigest . get endpoint()、localepstateptr);7}这里我们发现发送给对方节点的ack消息已经构造好了,包括deltaGossipDigestList(对方节点的信息是最新的,所以需要对方节点发送给我们endpointState)和deltaEpStateMap(当前节点是新的,所以我们发送给对方节点)。 Gossip通过GossipDigestAckVerbHandler解决ack消息。主要有两个逻辑:1。如果deltaEpStateMap中有数据,说明本地applicationState需要升级。执行gossiper . instance . applystatecall方法。2.如果deltaGossipDigestList有数据,说明对方节点需要升级,构造EndpointState,发送ack2消息给GossipDigestAck2VerbHandler,求解ack2消息。主要逻辑也在Gossip . instance . applystately,我们来看看Gossip . instance . applystately的逻辑,这里已经分析了八卦三次握手的全过程(由于平台字数限制,部分代码以图片形式展示,点击放大) 点击关注,第一时间了解华为云鲜科技~


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部