文档章节

Cassandra Gossiper协议

散关清渭
 散关清渭
发布于 2014/10/27 00:21
字数 505
阅读 81
收藏 0

Cassandra 集群使用Gossip协议维护集群状态  各个节点之间是平等的  并非如同hadoop一样存在主从之分

通过Gossip协议可以知道集群中各个节点的当前状态 

Cassandra中的GossipTask类主要实现了节点间消息通信机制  

// wait on messaging service to start listening
MessagingService.instance().waitUntilListening();

/* Update the local heartbeat counter. */
endpointStateMap.get(FBUtilities.getBroadcastAddress())
                .getHeartBeatState().updateHeartBeat();


final List<GossipDigest> gDigests = new ArrayList<GossipDigest>();
Gossiper.instance.makeRandomGossipDigest(gDigests);

if (gDigests.size() > 0)
{
    GossipDigestSyn digestSynMessage = new GossipDigestSyn(
            DatabaseDescriptor.getClusterName(),
            DatabaseDescriptor.getPartitionerName(),
            gDigests);    

    MessageOut<GossipDigestSyn> message = new MessageOut<GossipDigestSyn>(
        MessagingService.Verb.GOSSIP_DIGEST_SYN,
        digestSynMessage,
        GossipDigestSyn.serializer);

    /* Gossip to some random live member */
    boolean gossipedToSeed = doGossipToLiveMember(message);

    /* Gossip to some unreachable member to check if he is back up */
    doGossipToUnreachableMember(message);

                    
    if (!gossipedToSeed || liveEndpoints.size() < seeds.size())
        doGossipToSeed(message);

    doStatusCheck();
}


看看sendGossip方法的是实现:

List<InetAddress> liveEndpoints = ImmutableList.copyOf(epSet);
int size = liveEndpoints.size();
...
        
/* Generate a random number from 0 -> size */
int index = (size == 1) ? 0 : random.nextInt(size);
InetAddress to = liveEndpoints.get(index);
MessagingService.instance().sendOneWay(message, to);


MessagingService sendOneWay方法实现部分 

主要部分如下所示  简单说就是先获取一个连接再把需要发送的连接放进队列

其中connectionManagers是一个 ConcurrentMap<InetAddress, OutboundTcpConnectionPool>

用来存储Address到ConnectionPool的映射表

enqueue的时候会先检查队列长度 大于1024 会触发expireMessages机制

另队列中的消息包装成了QueuedMessage结构

// get pooled connection (really, connection queue)
OutboundTcpConnection connection = getConnection(to, processedMessage);

// write it
connection.enqueue(processedMessage, id);



SinkManager类主要用来做message集合使用


Gossip 协议交换过程


节点在开始交换Gossip信息的时候 首先发送一个GossipDigestSynMessage

GossipDigestSyn digestSynMessage = new GossipDigestSyn(
        DatabaseDescriptor.getClusterName(),
        DatabaseDescriptor.getPartitionerName(),gDigests);

MessageOut<GossipDigestSyn> message = new MessageOut<GossipDigestSyn>(
        MessagingService.Verb.GOSSIP_DIGEST_SYN,
        digestSynMessage,GossipDigestSyn.serializer);


当有节点收到GossipDigestSynMessage时  使用GossipDigestAckMessage回复消息

GossipDigestAckMessage其中主要包含两部分:GossipDigest列表和InetAddress --> EndpointState映射

final List<GossipDigest> gDigestList;
final Map<InetAddress, EndpointState> epStateMap;


具体的处理过程以IVerbHandler的形式注册到MessagingService上 

verbHandler.doVerb(message, id);// 具体调用相应MessageHandler





参考资料:

[ArchitectureGossip] http://wiki.apache.org/cassandra/ArchitectureGossip

[internode communication]  http://www.datastax.com/documentation/cassandra/1.2/cassandra/architecture/architectureGossipAbout_c.html

[Cassandra中Gossip具体实现方式] http://blog.csdn.net/zhangzhaokun/article/details/5859760



© 著作权归作者所有

上一篇: PG SQL收集
下一篇: Linux Dstat
散关清渭
粉丝 23
博文 238
码字总数 166498
作品 0
东城
程序员
私信 提问
聊聊Cassandra的FailureDetector

序 本文主要研究一下Cassandra的FailureDetector IFailureDetector cassandra-3.11.4/src/java/org/apache/cassandra/gms/IFailureDetector.java IFailureDetector接口定义了isAlive、inter......

go4it
05/01
11
0
Cassandra 分布式数据库详解,第 1 部分:配置、启动与集群

Cassandra 的配置详解 了解一个软件的配置项的意义是使用这个软件的前提,这里详细介绍 Cassandra 的配置文件(storage-config.xml)中各个配置项的意义,这其中包含有很多配置参数,我们可以...

ihaolin
2014/08/17
245
0
Cassandra Thrift

Cassandra Thrift ~ 首先定义了Cassandra IDL的命名空间 namespace java org.apache.cassandra.thriftnamespace cpp org.apache.cassandranamespace csharp Apache.Cassandranamespace py ca......

散关清渭
2014/03/08
199
0
NoSQL 数据库--ScyllaDB

ScyllaDB 是用 C++ 重写的 Cassandra,每节点每秒处理 100 万 TPS。ScyllaDB 完全兼容 Apache Cassandra,拥有比 Cassandra 多 10x 倍的吞吐量,降低了延迟。 ScyllaDB 号称是世界上最快的 ...

叶秀兰
2015/09/24
21.3K
27
Cassandra gossip介绍系列之一

Gossip 是一种去中心化,点对点的数据交互协议,Cassandra 的元信息 交互是依赖于gossip,当然Cassandra的节点状态检测也有依赖gossip的交互带来的信息;所以gossip是集群状态的一个基石,这...

玄陵
09/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

设计模式之访问者模式

定义 Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which......

陈年之后是青葱
昨天
10
0
PhotoShop 高级应用 : 分层云彩 - 简单闪电效果

1.创建黑白渐水平渐变图层 2.选择滤镜选项卡: 渲染--->分层云彩功能 3.将滤镜-云彩效果渲染后的图层进行反相操作 【此时出现闪电效果】 6.调整色阶,使得闪电效果更明显 7.创建剪贴蒙版:色...

东方墨天
昨天
11
0
三种实现Android主界面Tab的方式

三种实现Android主界面Tab的方式 https://www.cnblogs.com/caobotao/p/5103673.html

shzwork
昨天
11
0
java8-Optional类

背景 NPE问题,100%的Java程序员都碰到,并且曾经是心中的痛。 1965年英国TonyHoare引入了Null引用,后续的设计语言包括Java都保持了这种设计。 一个例子 业务模型 Person 有车一族, 有Car...

春天springcarter
昨天
11
0
py 登录github时token以及cookie的应用

import requestsfrom bs4 import BeautifulSoup## 获取tokenr1 = requests.get('https://github.com/login')s1 = BeautifulSoup(r1.text,'html.parser')token = s1.find(name='input',......

子枫Eric
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部