from:http://www.cnblogs.com/foohack/p/5627163.html
Cassandra note:
依賴:需要java 8 (http://www.oracle.com/technetwork/java/javase/downloads/index.html)
數(shù)據(jù)模型: 與Hbase同樣是屬于列式數(shù)據(jù)庫,Key-Value存儲(chǔ)系統(tǒng)。(http://www.ibm.com/developerworks/cn/opensource/os-cn-cassandra/)
http://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling
集群中的數(shù)據(jù)是靠partion key的hash code均勻映射到不同的節(jié)點(diǎn)上去的。partionkey是primary key的第一個(gè)元素,所以選一個(gè)好的主
key才能使數(shù)據(jù)更好的均勻存儲(chǔ)在不同的節(jié)點(diǎn)上。
Cassandra的節(jié)點(diǎn)實(shí)例叫Cluster,里面可以包含一個(gè)或多個(gè)鍵空間(KeysSpace).鍵空間是存放列族(Column Family)的容器,相當(dāng)于
關(guān)系數(shù)據(jù)中的database,schema。列族是存放列(column)的容器,類似與關(guān)系數(shù)據(jù)庫中的table。超級(jí)列(Super column)是一種
特殊的列,它的value值可以包含多個(gè)column。 columns是cassandra的最基本單位,有name,value,timestamp構(gòu)成。
列式數(shù)據(jù)庫的優(yōu)點(diǎn):
1.適合存儲(chǔ)大量數(shù)據(jù),而不是小量數(shù)據(jù)。因?yàn)閿?shù)據(jù)是是基于列存儲(chǔ)的,所以可以忽略不需要的列的數(shù)據(jù),提高查找效率。
與之對(duì)應(yīng)的是行數(shù)據(jù)庫。
2.高壓縮比。節(jié)省存儲(chǔ)空間,也節(jié)省CPU和內(nèi)存。
3.高裝載速度。
列式數(shù)據(jù)庫的缺點(diǎn):
1.不適合掃描小量數(shù)據(jù)。
2.不適合隨機(jī)更新數(shù)據(jù)。
3.不適合做含有刪除的更新的實(shí)時(shí)操作。
查詢數(shù)據(jù):
Cassandra有自己的一套查詢語言CQL(類似SQL),在數(shù)據(jù)訪問方式上亦是如此。客戶端可以與集群中的任意節(jié)點(diǎn)相連,并訪問任意的數(shù)據(jù)。
cassandra在寫入數(shù)據(jù)之前需要記錄日志(CommitLog),然后數(shù)據(jù)開始寫入到 Column Family 對(duì)應(yīng)的 Memtable 中,
Memtable 是一種按照 key 排序數(shù)據(jù)的內(nèi)存結(jié)構(gòu),在滿足一定條件時(shí),再把 Memtable 的數(shù)據(jù)批量的刷新到磁盤上,存儲(chǔ)為 SSTable 。
存儲(chǔ)二進(jìn)制大文件(不推薦存儲(chǔ)):http://wiki.apache.org/cassandra/FAQ#large_file_and_blob_storage
Cassandra的GUI管理工具整理:http://wiki.apache.org/cassandra/FAQ#gui 也有自帶的CLI工具連接Cassandra
Cassandra集群種子的概念(很重要):http://wiki.apache.org/cassandra/FAQ#seed
類似與Cassandra集群的初始化節(jié)點(diǎn)(集線器),各個(gè)節(jié)點(diǎn)通過種子節(jié)點(diǎn)互相學(xué)習(xí)(交換)各自的數(shù)據(jù)(狀態(tài)),所以新加入的Cassandra節(jié)點(diǎn)都需要給它
指定種子節(jié)點(diǎn),下次啟動(dòng)的時(shí)候就不需要了。
Cassandra 的C++ 接口:
Cassandra的各種編程語言的接口是有Thrift這個(gè)開源工具生成的,語言無關(guān)的Thrift輸入文件(cassandra.thrift)Cassandra已經(jīng)自帶
,安裝thrift運(yùn)行 thrift.exe -gen cpp cassandra.thrift生成就可以了。 cpp的接口依賴thrift的核心庫叫l(wèi)ibthrift,libthrift依賴boost1.53.0
版本和openssl
Cassandra windows 安裝配置:
解壓,配置好CASSANDRA_HOME環(huán)境變量的路徑(也就是你解壓的cassandra根目錄),然后運(yùn)行bin下的cassandra.bat,如果發(fā)現(xiàn)logs
目錄底下的system.log文件中有INFO - Starting up server gossip,那么恭喜你,Cassandra已經(jīng)在你的本機(jī)啟動(dòng)起來了。
*****************************************Cassandra的基本操作************************************************
數(shù)據(jù)模型:多維的hash表,每行可以有不同的列。每行都有個(gè)鍵. keyspace包含若干列族
(列族和表是同一個(gè)概念:http://stackoverflow.com/questions/18824390/whats-the-difference-between-creating-a-table-and-creating-a-columnfamily-in-ca),
keyspace在邏輯上是容納列族和某些配置屬性的命名空間。列族定義了相關(guān)的數(shù)據(jù)名字和它們的排序方式。
入門必讀:http://wiki.apache.org/cassandra/GettingStarted
CQLSH中運(yùn)行外部創(chuàng)建的cql腳本文件: SOURCE '[file_path]'
鍵空間的創(chuàng)建:
CREATE KEYSPACE [keyspace_name] WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3};
----鍵空間的創(chuàng)建要附帶副本屬性,class可以指定NetworkTopologyStrategy或SimpleStrategy。SimpleStrategy只用于測(cè)試評(píng)估Cassandra
生產(chǎn)環(huán)境使用NetworkTopologyStrategy. 鍵空間類似關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)庫(database)
鍵空間的修改:
ALTER KEYSPACE [keyspace_name] WITH REPLICATION = {};
鍵空間的刪除:
DROP KEYSPACE [keyspace_name]
鍵空間的使用:
USE [keyspace_name]
列出已存在的鍵空間:
DESCRIBE keyspaces;
列出某個(gè)鍵空間下的所有表:
USE [keyspace_name];
DESCRIBE tables;
列出某個(gè)鍵空間下的所有列族:
USE [keyspace_name];
DESCRIBE columnfamilies;
列出特定的表的基本信息:
DESCRIBE TABLE [keyspace_name].[table_name];
建表:
http://docs.datastax.com/en/cql/3.1/cql/cql_using/create_table_t.html
表的主鍵可以是復(fù)合的,就是多個(gè)列組成一個(gè)主鍵:
CREATE TABLE emp (
empID int,
deptID int,
first_name varchar,
last_name varchar,
PRIMARY KEY (empID, deptID)); //主鍵的第一個(gè)鍵就是分區(qū)鍵(empID),分區(qū)鍵的目的就是把表中的數(shù)據(jù)均分到集群中的
各個(gè)節(jié)點(diǎn)中
更改表:
ALERT TABLE [table_name] [some change]
https://docs.datastax.com/en/cql/3.0/cql/cql_reference/alter_table_r.html
沒辦法更改主鍵,因?yàn)橹麈I涉及到數(shù)據(jù)的物理儲(chǔ)存
給表的某列建立索引:
CREATE INDEX ON [table_name] (column_name);
查表:
SELCT [column_name] FROM [keyspace].[table_name] WHERE [column_name] = [value] //其中column_name必須是主鍵的其中部分,
如果有多個(gè)條件必須其中有一個(gè)是分區(qū)鍵
更新表中的值:
UPDATE [keyspace].[table_name] SET [column_name] = [new_value] WHERE [column_name]=[value]
刪除表中列或行:
刪除列中值:DELETE [column_name] FROM [table_name] WHERE [column_name] = [value] # 同查表
刪除一整行:DELETE FROM [table_name] WHERE [column_name] = [value] #同上
自定義數(shù)據(jù)類型(http://docs.datastax.com/en/cql/3.1/cql/cql_using/cqlUseUDT.html):
CREATE TYPE [keyspace_name].[type_name] (
street text,
city text,
zip_code int,
phones set<text>
);
自定義的數(shù)據(jù)類型的字面值是json-style的風(fēng)格。
內(nèi)建的數(shù)據(jù)類型(http://docs.datastax.com/en/cql/3.1/cql/cql_reference/cql_data_types_c.html):
ascii,bigint,blob,boolean,counter,double,float,inet,int,list,map,set,text,uuid,
timestamp,tuple,varchar(UTF-8 encoded string) ,varint
查看集群信息:
SELECT * FROM system.peers;
本地幫助文檔的查看:
HELP [COMMAND]
比如:查看創(chuàng)建鍵空間 HELP CREATE_KEYSPACE;
CQL語句支持多語句提交(Batch):
可以減少Node之間的流量交換,類似于事務(wù),是原子的。
http://docs.datastax.com/en/cql/3.1/cql/cql_reference/batch_r.html#reference_ds_djf_xdd_xj__batch-conditional
http://docs.datastax.com/en/cql/3.1/cql/cql_using/use-batch-static.html
給數(shù)據(jù)設(shè)置存活期:
超過存活期的數(shù)據(jù),將被銷毀。
INSERT INTO [table_name]
([column_name1], [column_name2])
VALUES ([column_value1], [column_value2]) USING TTL 86400; # 86400 sec 大概是一天的存活期
是給column_name2設(shè)置的
UPDATE [table_name] USING TTL 432000 SET [column_name] = [column_value]
WHERE user_name = 'cbrown';