`
gemantic
  • 浏览: 336022 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

cassandra技术分享

阅读更多


背景

 

cassandras是由facebook的两位工程开发出来的一款nosql数据库。它兼有Dynamo和BigTable的优点。主要有下面一些特点:

  • 分布式,无单点失败
  • 基于列族的数据模型
  • 可水平扩展,添加或删除节点不需要重启任何进程

安装与配置

 

cassandra的安装和配置都比较简单。如果不做集群,直接把下下来的压缩包解压后,就可以使用。如果要做集群,那就需要配置conf目录下的storage-conf.xml文件。storage-conf.xml文件中的主要配置参数解释如下:

  • ClusterName  集群名.两台机器要处于同一个集群,必须配置相同的集群名
  • AutoBootstrap  如果设置为true,当有新结点加入集群时,不再需要额外的操作
  • KeySpace  相当于关系数据库中的scheme或database
  • Partitioner  分区器.如果要使数据均匀的分布到各个结点上,可以使用RandomPartitioner
  • Seeds  种子结点.
  • ListenAddress  结点间互相通信使用的ip地址

配置完storage-conf.xml文件后,执行bin目录下的cassandra文件就可以启动cassandra.要监视集群的运行状态可以使用nodeprobe命令.

 

客户端API

 

连接cassandra可以使用两种api,一种是thrift api,另一种是高级api.下面是一段用thrift api连接cassandra的代码

Ttransport tr = new Tsocket(“192.168.0.1”, 9160);
TProtocol  proto = TBinaryProtocol(tr);
tr.open();
Cassandra.Client client = new Cassandra.Client(proto);
ColumnPath  cp = new ColumnPath(“Super1”, 
			“SuperColumn_1”.getBytes(“utf-8”), null);
ColumnOrSuperColumn cosc = client.get(“Keyspace1”, key, cp, 
				ConsistencyLevel.ONE);
SuperColumn sc = cosc.super_column;
for (Column col : sc.columns) {
	String colname = new String(col.getName(), “UTF-8”);
	String colvalue = new String(col.getValue(), “UTF-8”);
	…   …
}
tr.close();

假设集群有三个结点组成: 192.168.0.1, 192.168.0.2, 192.168.0.3,那么上面这段连接cassandra的代码就有一个问题: 代码中只连接192.168.0.1这一个结点,一旦这个结点宕机就与整个集群失去了联系.但其实cassandra是没有中心结点的,一个结点宕机不会影响整个集群(假设复制因子大于1),所以在连接cassandra时不能只尝试连接一个结点,而应当尝试连接多个结点.

 

数据的读取和写入

 

写入过程如下:

1) 写入提交日志

2) 发送数据到合适的结点

3) 写入本地日志并且更新memtables

4) 把memtable中的数据刷新到磁盘上

5) 删除提交日志

6) 如果需要,则对存储的数据进行compact

 

读取过程如下:

1) 通过api访问任一个结点

2) 如果该结点存在这个key指定的数据,则返回,否则根据partioner计算该key对应的value在哪个结点,并从该结点取得数据返回.

 

一致性哈希和Gossip协议

 

cassandra能做到没有单点代失败实际上是由一致性哈希和gossip协议保证的.

 

 

限制 

 

使用cassandra时要注意下面这些限制:

  • 一行数据必须要能放到一个结点上.cassandra不会把一行数据分开存储
  • 一列数据的长度不能大于2GB
  • 一行最多可以包含有20亿列
  • key必须限制在64kb以下

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics