Cassandra(二)


Cassandra是基于列族(Column Family)的四维或五维模型。它借鉴了 Amazon 的 Dynamo 和 Google's BigTable 的数据结构和功能特点,采用 Memtable 和 SSTable 的方式进行存储。在 Cassandra 写入数据之前,需要先记录日志 ( CommitLog ),然后数据开始写入到 Column Family 对应的 Memtable 中,Memtable 是一种按照 key 排序数据的内存结构,在满足一定条件时,再把 Memtable 的数据批量的刷新到磁盘上,存储为 SSTable 。

//无中心的架构设计,所有节点都是平等的,之间通过gossip进行节点通信


//--------------------------------------------------------------------------------------------
//启动Cassandra的配置
step one : 修改配制文件 storage-conf.xml:
默认的内容
<CommitLogDirectory>/var/lib/cassandra/commitlog</CommitLogDirectory>
<DataFileDirectories>
<DataFileDirectory>/var/lib/cassandra/data</DataFileDirectory>
</DataFileDirectories>
配置后的内容
<CommitLogDirectory>/data3/db/lib/cassandra/commitlog</CommitLogDirectory>
<DataFileDirectories>
<DataFileDirectory>/data3/db/lib/cassandra/data</DataFileDirectory>
</DataFileDirectories>



step two : 修改日志配制文件 log4j.properties:
log4j.properties 配置
# 日志路径
#log4j.appender.R.File=/var/log/cassandra/system.log
# 配置后的日志路径 :
log4j.appender.R.File=/data3/db/log/cassandra/system.log
创建文件存放数据和日志的目录
# mkdir – p /data3/db/lib/cassandra
# mkdir – p /data3/db/log/Cassandra




//启动服务器
bin/cassandra -f
//启动客户端
bin/cassandra-cli
//连接服务器
connect ip地址/Port端口

停止 Cassandra 服务
查出 Cassandra 的 pid:16328
# ps -ef | grep cassandra
# kill 16328


show cluster name//显示集群的名字



//-----------------------------------------至此可以启动与测试使用Cassandra了




//存在主键--;列族;类似于HBase---键值存储--类似于Redis
//某种程度上又那么类似于关系数据库(包括语法)
keyspace   相当于一个数据库
family(列族)相当于一个表


show keyspaces  显示所有的数据库
create keyspace test 建立一个数据库名叫test
use test 使用该数据库
create column family User建立一个User的列族
describe keyspace test 对该数据库的描述

//增加数据,列族是一个多维有序的映射
//无需提前设置---但是列族是要设置的
set User['a']['name']='Xue'
set User['a']['email']='[email protected]'

//User是个列族,a就是key,name和email就是两个列

count User['a'] 计算列族User在['a']的数目
//有点像Redis基于内存数据库啊


//获取该数据
get User['a']['name']
get User['a']['email']
get User['a']
//

del User['a']['email']//删除该数据



//集群就是个keyspace的巨大容器
对keyspace的配置有
副本因子
副本存放策略
列族




//每个列都是一个由键,值,时间戳组成的
//不需要先预定--只要有先设置列族再往里面添加列
列的定义中存在另外一个元素设置---列的排列顺序(多种)


//超级列---是一些子列的集合
//多维的存储如['a']['name']--a就是一个超级列

//还可以设计组合键--将多个键值设计融合在一起--这是设计问题了

//具体的可以通过Java API来具体操作cassandra--进行增删改查
//查询时候可以使用区间与切片返回大的集合的一个自己
//相当于条件查询啦---总之啦--存在多种查询方式了
//删除也有多种了---单个与批量的删除
//总之啦--各种丰富的 API 操作


//垃圾回收也是延时的--可以在回收时间内进行数据恢复


可以通过Thrift与Avro与不同的语言进行交互
还有Web,还有一些Java和Python写的客户端进行交互
还可以有可视化界面进行监控(MBean)
其他的分析工具(JMap,OpenNMS,Nagios)


维护的工具:
cfstats:查看每个列族数据的概述信息
tpstats:维护线程池的信息
刷写 bin/nodetool flush -h ip地址
修复 bin/nodetool repair -h ip地址
快照 bin/nodetool -h ip地址 snapshot
快照 bin/nodetool -h ip地址 snapshot one_keysapce_name
清理 bin/nodetool cleanup -h ip地址
清除快照 bin/nodetool -h ip地址 cleansnapshot
负载均衡 bin/nodetool -h ip地址 loadbalance
查看所有节点 bin/nodetool -host ip地址 ring
撤销节点 bin/nodetool decommission -h ip地址



性能调优:
改变commit log改变存储位置--可以多的设置多个位置--其他
如日志反转时间参数设置--写操作持久化参数设置
设置回复超时
memtable内存大小的设置--在内存存在的时间--写入磁盘的线程数目
并发操作数目--包括硬件的考量
缓存的设置
进行压力测试
缓冲区尺寸
JVM调试

猜你喜欢

转载自986289063.iteye.com/blog/2224345