項目中用到了cassandra,用來存儲海量數據,且要有高效的查詢;本博客就進行簡單的介紹和進行一些基本的操作 一、使用場景: 是一款分散式的結構化數據存儲方案(NoSql資料庫),存儲結構比Key-Value資料庫(像Redis)更豐富,但是比Document資料庫(如Mongodb)支持度有限; ...
項目中用到了cassandra,用來存儲海量數據,且要有高效的查詢;本博客就進行簡單的介紹和進行一些基本的操作
一、使用場景:
是一款分散式的結構化數據存儲方案(NoSql資料庫),存儲結構比Key-Value資料庫(像Redis)更豐富,但是比Document資料庫(如Mongodb)支持度有限;適合做數據分析或數據倉庫這類需要迅速查找且數據量大的應用
相關概念:
keyspace -> table –> column,對應關係型資料庫 database -> table -> column
存儲結構:
CREATE TABLE mykeyspace.mytable (
key1 text,
key2 text,
key3 text,
column1 bigint,
column2 int,
column3 timestamp,
PRIMARY KEY (key1, key2, key3);
)
key1: partitionKey,分區主鍵
key2, key3 clusterKey,集群主鍵
二、安裝
官方文檔:http://cassandra.apache.org/doc/latest/
1、依賴:jdk、python
本博客中用到的版本分別為:jdk1.7、python2.7.10,、cassandra2.2.8,註意,我是在win7上做的演示
2、安裝
jdk和python的安裝我這裡就不演示,大家自行安裝;
Cassandra安裝也很簡單,將apache-cassandra-2.2.8-bin.tar.gz進行解壓即可。
三、配置
官方文檔:http://cassandra.apache.org/doc/latest/getting_started/configuring.html
Cassandra配置文件都在conf目錄下,其中cassandra.yaml可以完成cassandra的大部分配置,我們主要關註以下兩部分
1、Main runtime properties(主要的cassandra運行時屬性)
a) cluster_name:集群名,同一集群的多個節點,集群名要一致
b) seeds: 種子節點,集群中的全部機器的ip,以逗號隔開
c) storage_port: Cassandra伺服器與伺服器之間連接的埠號,一般不需要修改,但要保證此埠上沒有防火牆
d) listen_address: Cassandra集群中伺服器與伺服器之間相互通信的地址。如果留空,將預設使用伺服器的機器名
e) native_transport_port: 預設的CQL本地服務埠,本地的cql客戶端與伺服器交互的埠
2、Changing the location of directories(相關的文件目錄)
a) data_file_directories: 數據文件存放的目錄,一個或多個
b) commitlog_directory: 提交信息的日誌文件存放的目錄
c) saved_caches_directory: 緩存存放的目錄
四、運行
配置完cassandra後,啟動cassandra很簡單,$CASSANDRA_HOME/bin目錄下雙擊cassandra.bat即可,那麼cassandra就啟動起來了,那麼我們怎麼與cassandra進行交互了?啟動cqlsh.bat即可:雙擊$CASSANDRA_HOME/bin目錄下的cqlsh.bat,接下來你就可以隨心所欲的與cassandra交互了
五、cassandra基本操作
官方文檔:http://cassandra.apache.org/doc/latest/cql/index.html
1、查詢全部的keyspace:describe keyspaces;(或desc keyspaces;)
2、創建一個keyspace:CREATE KEYSPACE IF NOT EXISTS myCas WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor':1};
class : 副本配置策略(總共有三種):
Simple Strategy(RackUnaware Strategy):副本不考慮機架的因素,按照Token放置在連續下幾個節點。如下圖所示,假如副本數為3,屬於A節點的數據在B.C兩個節點中也放置副本
OldNetwork Topology Strategy(RackAware Strategy):考慮機架的因素,除了基本的數據外,先找一個處於不同數據中心的點放置一個副本,其餘N-2個副本放置在同一數據中心的不同機架中
Network Topology Strategy(DatacneterShard Strategy):將M個副本放置到其他的數據中心,將N-M-1的副本放置在同一數據中心的不同機架中
3、使用某個keyspace:use myCas;
4、查詢全部的table:desc tables;
5、創建一張表:CREATE TABLE user (id int, user_name varchar, PRIMARY KEY (id) );
創建表的時候至少指定一個主鍵
6、向表中插入一條記錄:INSERT INTO user (id,user_name) VALUES (1,'zhangsan');
列名必須要顯示指定,如果表中已存在相同主鍵的記錄,那麼該操作會覆蓋表中已存在的記錄
7、查詢表中全部數據:select * from user;
cassandra查詢有很多限制,比如只能單表查詢,不支持聯表查詢和子查詢,查詢條件只支持key查詢和索引列查詢,而且key有順序的限制,等等;更多詳情請自行閱讀官方文檔
8、簡單的條件查詢:select * from user where id=1;
9、創建索引:create index on user(user_name);
10、索引列查詢:select * from user where user_name='zhangsan';
若沒有在name上創建索引,那麼此查詢會報錯;
11、更新表中數據:update user set user_name='lisi' where id=2;
只支持按主鍵更新,也就是where後只能跟主鍵
12、刪除表中記錄:delete from user where id=1;
刪除某條記錄中的某個欄位,該欄位會被設成null:delete user_name from user where id=1;
無論是刪除某條記錄,還是將某個欄位置null,都只支持按主鍵刪除,也就是where後只能跟主鍵
13、批量操作:Multiple INSERT, UPDATE and DELETE can be executed in a single statement by grouping them through a BATCH statement(通過batch能夠執行多個insert、update以及delete),例如:
BEGIN BATCH
INSERT INTO user (id, user_name) VALUES (2, 'second user');
UPDATE user SET user_name = 'ps22dhds' WHERE id = 2;
INSERT INTO user (id, user_name) VALUES (3, 'lee long');
DELETE user_name FROM user WHERE id = 3;
APPLY BATCH;
六、登錄認證
官方文檔:http://cassandra.apache.org/doc/latest/cql/security.html#
不知道大家發現沒有,前面的cassandra操作是在沒有登錄的情況下進行的,這在實際生產環境中肯定是不行的,那麼接下來我們看看cassandra的登錄認證
1、修改配置文件cassandra.yaml
把預設的authenticator: AllowAllAuthenticator運行所有人登錄設置為用密碼登錄:authenticator: PasswordAuthenticator
2、登錄cassandra,然後創建新的用戶
配置文件修改完後,啟動cassandra(如若雙擊cassandra.bat啟動報錯,可以試著在cmd中啟動cassandra);接著啟動客戶端: cqlsh.bat -ucassandra -pcassandra;
cassandra用戶是預設的,客戶端啟動成功後,創建新的用戶:create user admin with password 'admin' superuser; 新用戶創建成功後,退出客戶端:exit;
用新用戶登錄:cqlsh.bat -uadmin –padmin; 刪除預設用戶cassandra:drop user cassandra;
記得把預設用戶刪除掉;另外,可以到system_auth下的roles表中查看已有用戶;
更多詳情請閱讀官方文檔
七、後話
1、操作結果我這裡就沒貼上來了,希望大家自己動手去嘗試
2、有什麼問題,大家可以第一時間看官方文檔,註意官方文檔中有個這個:http://cassandra.apache.org/doc/latest/faq/index.html
3、cassandra版本要註意,以及它的依賴(jdk、python)的版本,不同的版本支持的內容會有所不同
4、不知道大家註意到沒有,cql中where後能跟的內容很受限(相比關係型資料庫),後面跟大家詳細探討
5、下篇博客講java操作cassandra,歡迎大家來捧場