欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Cassandra NOSQL 数据库

程序员文章站 2022-03-20 20:59:46
...
Cassandra或许不会因为是NoSQL而得到关注,但是它在完成某些特定工作上,有迷人的魅力,这Netflix和Instagram两家公司一定知道。

过去的这些年,NoSQL的参与者,例如MongoDB已经得到了快速发展,受到了非常多的关注,但是 Apache Cassandra的光环褪去,作为创造了Cassandra的Facebook已经放弃了它,Cassandra的社区也好像过时了快。但
是Cassandra的命运迎来的转机,Netflix近来决心把他们自己的数据中心的oracle改成Cassandra Amazon云。不久
以后,Facebook也再次开始使用Cassandra,而Twitter和WebEx都不同程度的使用着Cassandra.

Cassandra的一个大问题在于它太个性,好像不好把它进行分类,虽然类似HBase,它是一个Column-family数据库,但是它却有很大的独得性。它跟文档NoSQL数据库也是不同的类别例如MongoDB或Couchbase,或key-value-pair数据库DynamoDB,Redis,Riak,等等都不一样,它自成一类。

什么是cloumn-family数据库?

一个column-family数据库它按行关键字来存储数据,它非常类似一张表,跟人们熟悉的关系数据库的表很容易混淆,尤其是自从google著名的column-family应用被称为BigTable以后,人们更容易把column的存储结构与关系数据库下的表相混淆了,但是一定要注意此表非彼表。

首先,他们基本上缺少架构schema,架构可以让你很容易的添加你想添加的列(但是你需要考虑存储优化,数据分布等问题),在Cassandra里,表的关键字不紧紧围了方便查找,它可以允许系统有效的在集群上对数据分片,看下面标准的column family结构吧,它看起来非常类似JSON.


ColumnFamilyName {

rowkey1 = {column1:"value1", column2:"value2"},

rowkey2 = {column1:"value2.1", column2:"value2.2", column3:"value2.3"},

rowkey3 = {column2:"value3.2", column3:"value3.3"},

rowkey4 = {column1:"value4.1", column3:"value4.3"}

}


上面是标准的column family数据库数据存储结构,看起来有一定的局限性,但是作为补充,它还包括一个超级列的概念,类似下面的结构:


SuperColumnFamily {

ColumnFamily1 {

cf1rowkey1 = {column1:"value1", column2:"value2"},

cf1rowkey2 = {column1:"value2.1", column2:"value2.2", column3:"value2.3"},

cf1rowkey3 = {column2:"value3.2", column3:"value3.3"},

cf1rowkey4 = {column1:"value4.1", column3:"value4.3"}

},

ColumnFamily2 {

cf2rowkey1 = {column1:"value1", column2:"value2"},

cf2rowkey2 = {column1:"value2.1", column2:"value2.2", column3:"value2.3"},

cf2rowkey3 = {column2:"value3.2", column3:"value3.3"},

cf2rowkey4 = {column1:"value4.1", column3:"value4.3"}

}

}



另外你还可以找到另外几种结构,例如composite columns和其他类型的列,包括静态和动态列等等。还有些特殊的列类型包括计数列,时间戳列等。


什么情况下使用Cassandra?

一,时间类型的数据

       时间类型的数据包括任何温度传感器,工作日志,或股票价格数据等,也包括博客数据,电影片段数据等等,这些数据被证明如果使用文档数据库例如MongoDB会导致失败。

二,产品目录

三,信息过滤系统的子系统信息推荐系统-Recommendations

四,诈    骗与垃  圾信息侦  听系统

五,后端的大数据存储系统

        应该说后台数据库存储系统,用Cassandra的地方不是太多,主要是应用它的缓存功能全局网数据复制
        的能力,如果你需要异地备份双活数据库的话,你可以使用下Cassandra.

Cassandra与Hbase

Cassandra有自己的优点和缺点,正如Hbase一样,它们都有各自的使用场合两者都在Hadoop生态下,Cassandra用来对读写进行高复合工作,而对毫秒级的数据一致性不是太擅长,而HBase则可以弥补这些,从更大的范围讲,Cassandra适合业务系统,而HBase则更多的用在数据仓库和事务场景的系统上。

说说事务......


开发人员经常困惑什么时候才真正的需要原子级别的一致性,同样如果你开始使用RDBMS,你也会困惑,因为关系型数据库经常需要跨越多个地点收集相同的一组数据。这样一个人的信息可能被打乱放到了多个表中,因为它们有不同的电话好吗,有不同的地址等等,这样就引出-好的数据库架构到底是什么样的?

在现在的任何系统之下,你都需要对数据一致性进行妥协,因为无论你使用什么类型的数据库,都不可能提供长时间运行的事务(足够轻量级的可以满足互联网应用级的要求),因为没有人可以在信息持久话的模式下做操作,而且每个用户对应一个连接,而事务则经常打断用户的操作,影响用户的体验,这就是进行原子级的数据一致性的代价。

但是在很多情况下,一毫秒甚至500毫秒不会有太多的不同,如果我修改了一些行关键字,最终Cassandra会进行持久话,那么我就可以进行读操作,可能这读操作是虚拟读。这里的问题在于,你不会关注一个短暂的错误,例如你正在看电影,发现里面的片段少了,没有数据加载,但是紧紧一会后,你再次单击那部电影,恢复正常了,可以正常观看了,这里你不太会太在意,你在意的是,每当电影目录被更新,你的操作都会被奇怪的中断,所以当前在互联网级的应用上,你需要在性能和系统规模及数据一致性之间做出妥协,有的时候,一致性跟性能及规模来说并不是过于重要。



在安装好JDK1.6的Windows系统上安装Cassandra,并进行简单的测试。

1 下载Cassandra

去http://cassandra.apache.org/下载即可。写此文章时最新的版本是1.0.1,

2 安装Cassandra
将下载的压缩包解压,假设解压的位置是F:\jl_work\apache-cassandra-1.0.1。



3:jre的安装与windows环境变量的配置
1)如果你的机器没有安装jre,请先下载windows版jre程序并配置好java的环境变量(已下载安装过就不用再装了)

去sun官方下载windows版式的jre   http://java.sun.com/javase/downloads/index.jsp
2)设置环境变量"我的电脑"--"高级"选项卡--"环境变量"--"系统变量--新增",根据自己安装的jre与cassandra的位置来设置系统变量的值
我的机器jre安装在: C:\Program Files\Java\jre1.6.0_02

cassandra 安装在:F:\jl_work\apache-cassandra-1.0.1




4: 正式的启动Cassandra服务

在cmd窗口中执行F:\jl_work\apache-cassandra-1.0.5\bin下面的cassandra.bat启动cassandra服务



成功后会看到以下画面


出现上面的图后表示服务启动成功了,记住,这个cmd的窗口不要关闭,关闭了服务就被一起关闭了,接下来客户端的连接就不行了。
5:客户端的连接
服务启动成功之后,cassandra里面默认有一个测试数据库,访问的方式是在cmd窗口中执行F:\jl_work\apache-cassandra-1.0.5\bin下面的cassandra-cli.bat批处理文件,然后出现cassandra提示符,在提示符后面输入connect localhost/9160;就可以连上默认的数据库。下图是连接成功后的界面。





1)create keyspace mcas; 可理解为创建一个数据库
2)create column family timebasedtoken withcomparator=UTF8Type and

default_validation_class=UTF8Type andkey_validation_class=UTF8Type;

create column family timebasedtoken with

key_validation_class=UTF8Type and

comparator =UTF8Type and

column_metadata =

[

{column_name:serid ,validation_class:UTF8Type },

{column_name:seed,validation_class:UTF8Type},


{column_name: offset, validation_class:LongType},


{column_name: state, validation_class:LongType},

{column_name:modelType, validation_class: UTF8Type},

{column_name:timeWindow, validation_class: LongType},


{column_name: idType, validation_class:UTF8Type},

{column_name:idNumber, validation_class: UTF8Type},

{column_name:badPwCount, validation_class: LongType},


{column_name: staticPwd, validation_class:UTF8Type},

{column_name:staticPwVolity, validation_class: LongType},

{column_name:algorith, validation_class: UTF8Type},


{column_name: pwLength, validation_class:UTF8Type},

{column_name:chgCode, validation_class: UTF8Type},

{column_name:lastPwd, validation_class: UTF8Type}

];可理解为创建一个表


update column family timebasedtoken with keys_cached =1000000; //修改key缓存容量
再接着我们试着插入一条新记录,并读出这条记录的值。

插入的命令是"set"关键字
在命令提示符下输入 set User1[tableName1][column1] = testValue;
如果提示"Value inserted"表示插入成功。
同样我们把插入的值读出来,使用的关键字是"get"

在命令提示符下输入
get
timebasedtoken [ascii(0000000001)];
如图,我们把刚才插入的数据给读了出来。








在linux 下配置
















配置修改如下:



即:


exportJAVA_HOME=/usr/java


PATH=$JAVA_HOME/bin:$PATH


exportPATH


CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CASSANDRA_HOME/lib/*.jar


export CLASSPATH




然后修改







即:


PATH=$PATH:$HOME/bin


CASSANDRA_HOME=$HOME/apache-cassandra-1.0.5/




exportPATH


export
CASSANDRA_HOME




配置修改完成




然后修改cassandra下面的conf下面的cassandra.yaml文件


rpc_address: 0.0.0.0
rpc_address变量修改为:0.0.0.0 否则外界ip访问不了




ok基本修改完成




linux下面启动cassandra和windows下面没什么差别




可能会修改jvm内存












常用的命令:




update column family timebasedtoken with keys_cached = 5000000; 修改keys缓存




./nodetool–h localhost cfstats(bin目录下面才能运行) //查看本机cassandra状态(里面含有各个keyspace)


运行运行成功后显示的一个例子






vmstat 2








所圈为cpu空闲百分数






ps -ef | grep cass 查找指定名称的进程








kill
杀死进程


kill 5536


http://www.cnblogs.com/elearn007/p/3800207.html
http://bbs.51cto.com/thread-971173-1-1.html