背景
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以下