- 1、本文档共14页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Cassandra的笔记
一、Cassandra学习笔记之数据模型
Column
Column是Cassandra中最小的数据单元,它是一个三元的数据类型,包含name,value,timestamp.
Column必须有一个名称,类似于JAVA中的字符串,应用创建后可以动态地设置,Column可以在name上建索引。不要求每个name都有对应的value,value可以为空。还有一列是时间戳,标识column必威体育精装版更新的时间。时间戳是由客户端应用程序提供的,请求到来时总是希望返回时间戳必威体育精装版的数据,如果多个客户端同时更新相同的列,列值与最近的更新相同。
SuperColumn
ColumnFamily可以是一个常规Column,也可以是一个SuperColumn.可以将SuperColumn想象成Column的数组,它包含一个name以及一系列Column.
注意:SuperColumn本身不包含timestamp属性。使用SuperColumn有一个限制,要读取其中一个子列的值,必须把所有子列都反序列化,且不能在子列中建索引。因此SuperColumn的应用场合是子列数相对较小的情况。
ColumnFamily
相比关系型数据库,Cassandra中的ColumnFamily相当于数据库中的表,它是一个包含了许多行的结构,每一行由Key和这个Key所关联的Column组成。与关系数据库不同的是,每行不要求有相同数目的列。有两种不同的列族设计:静态和动态。
静态ColumnFamily:使用一组不变的列名,这点更像关系型数据库。如下图:
动态ColumnFamily:每一行的列名不相同,是在运行过程中动态计算和设置的。如下图:
ColumnFamily每一行可以是一系列Column,也可以是一系列SuperColumn。
Keyspace
每个Keyspace包含多个ColumnFamily,并且可以指定数据备份策略和备份数。一般一个Cassandra一个Keyspace。
Columnsupercolumncolumnfamilykeyspace
二、Cassandra学习笔记之Gossip协议
Gossip协议概述
Cassandra集群中的节点没有主次之分,它们通过一种叫做Gossip的协议进行通信。通过Gossip协议,它们可以知道集群中有哪些节点,以及这些节点的状态如何?每一条Gossip消息上都有一个版本号,节点可以对接收到的消息进行版本比对,从而得知哪些消息是我需要更新的,哪些消息是我有而别人没有的,然后互相倾诉吐槽,确保二者得到的信息相同,这很像现实生活中的八卦(摆龙门阵)一样,一传十,十传百,最后尽人皆知。
在Cassandra启动时,会启动Gossip服务,Gossip服务启动后会启动一个任务GossipTask,这个任务会周期性地与其他节点进行通信。GossipTask是位于org.apache.cassandra.gms.Gossip类下的一个内部类,其run方法如下:
[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
public void run(){
MessagingService.instance().waitUntilListening();
/* Update the local heartbeat counter. */
endpointStateMap.get(FBUtilities.getBroadcastAddress()).getHeartBeatState().updateHeartBeat();
final ListGossipDigest gDigests = new ArrayListGossipDigest();
Gossiper.instance.makeRandomGossipDigest(gDigests);
if (gDigests.size() 0){
GossipDigestSyn digestSynMessage = new GossipDigestSyn(DatabaseDescriptor.getClusterName(),
DatabaseDescriptor.getPartitionerName(),
文档评论(0)