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
过去的这些年,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
上一篇: cassandra 删除数据那些事儿