1. 什么是Apache Cassandra?
Apache Cassandra是一個(gè)開源,分布式和分散式/分布式存儲(chǔ)系統(tǒng)(數(shù)據(jù)庫),用于管理遍布世界各地的大量結(jié)構(gòu)化數(shù)據(jù)。它提供高可用性的服務(wù),沒有單點(diǎn)故障。下面列出了Apache Cassandra的一些值得注意的地方:
- 它是可擴(kuò)展,容錯(cuò)和一致的。
- Apache Cassandra是一個(gè)開源,分布式和分散式/分布式存儲(chǔ)系統(tǒng)(數(shù)據(jù)庫),用于管理遍布世界各地的大量結(jié)構(gòu)化數(shù)據(jù)。它提供高可用性的服務(wù),沒有單點(diǎn)故障。
- 它是一個(gè)面向列的數(shù)據(jù)庫。
- 它的分布設(shè)計(jì)基于Amazon的Dynamo及其在Google的Bigtable上的數(shù)據(jù)模型。
- 創(chuàng)建在Facebook,它與關(guān)系數(shù)據(jù)庫管理系統(tǒng)有很大的不同。
- Cassandra實(shí)現(xiàn)了一個(gè)沒有單點(diǎn)故障的Dynamo風(fēng)格的復(fù)制模型,但增加了一個(gè)更強(qiáng)大的“列族”數(shù)據(jù)模型。
- Cassandra被一些最大的公司使用,如Facebook,Twitter,Cisco,Rackspace,ebay,Netflix等。
2. Cassandra的特點(diǎn)
Cassandra因其卓越的技術(shù)特性而變得如此受歡迎。下面給出了Cassandra的一些特性:
- 彈性可擴(kuò)展性 - Cassandra是高度可擴(kuò)展的; 它允許添加更多的硬件以適應(yīng)更多的客戶和更多的數(shù)據(jù)根據(jù)要求。
- 始終基于架構(gòu) - Cassandra沒有單點(diǎn)故障,它可以連續(xù)用于不能承擔(dān)故障的關(guān)鍵業(yè)務(wù)應(yīng)用程序。
- 快速線性性能 - Cassandra是線性可擴(kuò)展性的,即它為你增加集群中的節(jié)點(diǎn)數(shù)量增加你的吞吐量。因此,保持一個(gè)快速的響應(yīng)時(shí)間。
- 靈活的數(shù)據(jù)存儲(chǔ) - Cassandra適應(yīng)所有可能的數(shù)據(jù)格式,包括:結(jié)構(gòu)化,半結(jié)構(gòu)化和非結(jié)構(gòu)化。它可以根據(jù)您的需要?jiǎng)討B(tài)地適應(yīng)變化的數(shù)據(jù)結(jié)構(gòu)。
- 便捷的數(shù)據(jù)分發(fā) - Cassandra通過在多個(gè)數(shù)據(jù)中心之間復(fù)制數(shù)據(jù),可以靈活地在需要時(shí)分發(fā)數(shù)據(jù)。
- 事務(wù)支持 - Cassandra支持屬性,如原子性,一致性,隔離和持久性(ACID)。
- 快速寫入 - Cassandra被設(shè)計(jì)為在廉價(jià)的商品硬件上運(yùn)行。 它執(zhí)行快速寫入,并可以存儲(chǔ)數(shù)百TB的數(shù)據(jù),而不犧牲讀取效率。
3. 相關(guān)概念
keyspace -> table –> column,對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫 database -> table -> column
存儲(chǔ)結(jié)構(gòu):
CREATE TABLE mykeyspace.mytable (
key1 text,
key2 text,
key3 text,
column1 bigint,
column2 int,
column3 timestamp,
PRIMARY KEY (key1, key2, key3);
)
key1: partitionKey,分區(qū)主鍵,用來決定Cassandra會(huì)使用集群中的哪個(gè)結(jié)點(diǎn)來記錄該數(shù)據(jù),每個(gè)Partition Key對(duì)應(yīng)著一個(gè)特定的Partition;

4. Cassandra安裝
依賴:jdk、python,并且要保證jvm(java命令)和jdk(javac命令)版本一致,python的版本也會(huì)根據(jù)你下載的Cassandra版本有要求,具體請(qǐng)查看官方文檔:http://cassandra.apache.org/doc/latest/,jdk和python的安裝我這里就不演示,大家自行安裝;這里只說一下Cassandra的安裝過程;
- 去官網(wǎng)下載文件,下載最新版本即可,https://cassandra.apache.org/
- 解壓到你的的目錄下,例如:E:\apache-cassandra-3.11.2\bin
-
運(yùn)行cmd,cd到你解壓的目錄下,運(yùn)行cassandra.bat,如果出現(xiàn)
證明運(yùn)行成功,否則檢查錯(cuò)誤;
-
如果運(yùn)行成功,在命令行輸入cqlsh,就可以愉快地寫cql代碼啦~,如果你的電腦中裝有兩個(gè)python版本,如有python35和python27,可以不用修改環(huán)境變量,直接在運(yùn)行cqlsh的時(shí)候前面加上python27的路徑,如圖:
5. 數(shù)據(jù)類型
下面只是簡(jiǎn)單介紹了一下,具體用法請(qǐng)查看官方文檔:https://cassandra.apache.org/doc/latest/cql/types.html#grammar-token-collection_type。
-
Native type:
-
Collection
CQL支持3種集合類型:Map、Set和List。這些集合的類型由以下定義:
- User-defined types
例:
CREATE TYPE phone (
country_code int,
number text,
)
CREATE TYPE address (
street text,
city text,
zip text,
phones map<text, phone>
)
CREATE TABLE user (
name text PRIMARY KEY,
addresses map<text, frozen<address>>
)
INSERT INTO user (name, addresses)
VALUES ('z3 Pr3z1den7', {
'home' : {
street: '1600 Pennsylvania Ave NW',
city: 'Washington',
zip: '20500',
phones: { 'cell' : { country_code: 1, number: '202 456-1111' },
'landline' : { country_code: 1, number: '...' } }
},
'work' : {
street: '1600 Pennsylvania Ave NW',
city: 'Washington',
zip: '20500',
phones: { 'fax' : { country_code: 1, number: '...' } }
}
})
- Tuples
例:
CREATE TABLE durations (
event text,
duration tuple<int, text>,
)
INSERT INTO durations (event, duration) VALUES ('ev1', (3, 'hours'));
- Custom types
這種類型用法比較復(fù)雜并且不太友好,可以用user-defined type 替代之。
6. 基本操作
具體教程可以參考w3cshool教程https://www.w3cschool.cn/cassandra/cassandra_create_keyspace.html。這里只介紹幾種常用基本命令:
- 創(chuàng)建一個(gè)keyspace:CREATE KEYSPACE IF NOT EXISTS myCas WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor':1};
class : 副本配置策略(總共有三種):
Simple Strategy(RackUnaware Strategy):為集群指定簡(jiǎn)單的復(fù)制因子,副本不考慮機(jī)架的因素,按照Token放置在連續(xù)下幾個(gè)節(jié)點(diǎn);
OldNetwork Topology Strategy(RackAware Strategy):考慮機(jī)架的因素,除了基本的數(shù)據(jù)外,先找一個(gè)處于不同數(shù)據(jù)中心的點(diǎn)放置一個(gè)副本,其余N-2個(gè)副本放置在同一數(shù)據(jù)中心的不同機(jī)架中;
Network Topology Strategy(DatacneterShard Strategy):將M個(gè)副本放置到其他的數(shù)據(jù)中心,將N-M-1的副本放置在同一數(shù)據(jù)中心的不同機(jī)架中; - 查詢?nèi)康膋eyspace:describe keyspaces;(或desc keyspaces;)
- 使用某個(gè)keyspace:use myCas;
- 查詢?nèi)康膖able:desc tables;
- 創(chuàng)建一張表:CREATE TABLE user (id int, user_name varchar, PRIMARY KEY (id) ); 注意創(chuàng)建表的時(shí)候至少指定一個(gè)主鍵;
- 刪除表: drop table user;
- 描述一張表:desc user;
- 向表中插入一條記錄:INSERT INTO user (id,user_name) VALUES (1,'zhangsan');
- 查詢表中全部數(shù)據(jù):select * from user;
cassandra查詢有很多限制,比如只能單表查詢,不支持聯(lián)表查詢和子查詢,查詢條件只支持key查詢和索引列查詢,而且key有順序的限制,等等;更多詳情請(qǐng)自行閱讀官方文檔; - 簡(jiǎn)單的條件查詢:select * from user where id=1;
- 創(chuàng)建索引:create index on user(user_name);
- 索引列查詢:select * from user where user_name='zhangsan';
若沒有在name上創(chuàng)建索引,那么此查詢會(huì)報(bào)錯(cuò);索引列只可以用=號(hào)查詢,不能使用>或<;如果想用>或<查詢,可以加上ALLOW FILTERING,例如:select * from teacher where age>35 ALLOW FILTERING;如果查詢條件里,有一個(gè)是根據(jù)索引查詢,那其它非索引非主鍵字段,也可以通過加一個(gè)ALLOW FILTERING來過濾實(shí)現(xiàn); - 更新表中數(shù)據(jù):update user set user_name='lisi' where id=2;
只支持按主鍵更新,也就是where后只能跟主鍵 - 刪除表中記錄:delete from user where id=1;
刪除某條記錄中的某個(gè)字段,該字段會(huì)被設(shè)成null:delete user_name from user where id=1;無論是刪除某條記錄,還是將某個(gè)字段置null,都只支持按主鍵刪除,也就是where后只能跟主鍵; - 刪除自定義類型: drop type user_defined;
7. 常見錯(cuò)誤解決方法
-
“except ImportError, e”這種錯(cuò)誤應(yīng)該是你的python版本是3.0以上的,而對(duì)應(yīng)版本的Cassandra需要2.x的版本,因此你可能需要重新裝一個(gè)2.x的版本;
- 另外要保證jdk和jvm版本一致,可以在cmd命令下查看:javac -version 和 java -version;
-
Cassandra中文查詢亂碼,可以在命令行輸入chcp 65001,即可設(shè)為 UTF-8 編碼。
- 官網(wǎng)提供的常見問題:http://cassandra.apache.org/doc/latest/faq/index.html;
8. Cassandra-java基本操作
可以參考http://www.cnblogs.com/youzhibing/p/6607082.html。
9. Cassandra高級(jí)操作
可以參考: cassandra高級(jí)操作之索引、排序以及分頁
參考文章:






