前言
java
cassandra是一種NoSQL數據庫,No是指No Relational。cassandra的數據模型結合了Dynamo的key/value和BigTable 的面向列的特色,主要被設計爲存儲大規模的分佈式數據。node
高可靠性:gossip座位通訊協議,節點同等地位,無主從之分.(hbase是master/slaver,單點失效的可能) p2p 去中心化python
高可擴展:級聯可擴展,添加新節點操做簡單sql
最終一致性:cap定律數據庫
高效寫操做, 讀取指定鍵值的記錄較快, 但範圍查詢,與多個節點有關會慢, 讀取全表也慢apache
cql語言,與sql語句類似度高windows
https://my.oschina.net/silentriver/blog/182678 Cassandra – 理解關鍵概念和數據模型網絡
1.官網狀況async
http://cassandra.apache.org/分佈式
"Manage massive amounts of data, fast, without losing sleep"
目前版本 3.9 (pgp, md5 and sha1), released on 2016-09-29.
線性擴展(Linear scalability)
每一個節點identical.
2.安裝Cassandra
個人機器是windows10
下載 apache-cassandra-3.9-bin.tar.gz 後解壓
添加系統變量 : CASSANDRA_HOME
而後添加path環境變量爲%CASSANDRA_HOME%\bin
windows 就能夠輸入 cassandra 回車啓動了
Linux
啓動 bin/cassandra -f 關閉Control-C
或者 bin/cassandra 關閉 kill pid or pkill -f CassandraDaemon 查找進程 pgrep -f CassandraDaemon
查看狀態
bin/nodetool status
3.配置集羣
若是隻是單點,則上面的配置就ok了,但若是要部署集羣,則須要另外配置.
cassandra.yaml
最基本的參數
cluster_name
: the name of your cluster.seeds
: 以逗號分隔的集羣種子IP地址. 當一個節點啓動的時候,它會從配置文件中讀取配置信息,這樣它就知道它屬於哪一個集羣,它須要跟哪一個節點通訊以獲取其餘節點信息(這個通訊節點稱爲種子節點)。這些信息是必須在每一個節點的cassandra.yaml裏配置的。storage_port
: 非必須改變,除非此端口被防火牆牆了.整個集羣內部要相同listen_address
: 本節點的IP, 由於要與其餘節點通信,因此這個參數設置正確很是重要. 或者,能夠設置listen_interface告訴
Cassandra which interface to use. Set only one, not both.native_transport_port
: 客戶端與Cassandra通信的端口,保證不被牆.
更改目錄位置
data_file_directories
: one or more directories where data files are located.commitlog_directory
: the directory where commitlog files are located.saved_caches_directory
: the directory where saved caches are located.hints_directory
: the directory where hints are located.環境變量 cassandra-env.sh
日誌
logback.xml
3. CQLSH的使用
前期準備,須要python運行環境, python版本用2.7 不要用更高的版本
$ bin/cqlsh localhost Connected to Test Cluster at localhost:9042. [cqlsh 5.0.1 | Cassandra 3.8 | CQL spec 3.4.2 | Native protocol v4] Use HELP for help. cqlsh> SELECT cluster_name, listen_address FROM system.local; cluster_name | listen_address --------------+---------------- Test Cluster | 127.0.0.1 (1 rows) cqlsh>
步驟一,create a keyspace
CREATE KEYSPACE devJavaSource WITH REPLICATION={'class': 'SimpleStrategy','replication_factor':1 };
tip:可能運行失敗,報錯 OperationTimedOut: errors={'127.0.0.1': 'Client request timeout. See Session.execute[_async](timeout)'}, last_host=127.0.0.1
修改 cqlsh.py 文件的參數DEFAULT_REQUEST_TIMEOUT_SECONDS
爲更大的值能夠解決(修改後重啓cassandra), 然而我也不知道具體緣由.
步驟二, use created keyspace
USE devJavaSource;
步驟三, 新建表 插入數據 查詢
CREATE TABLE USERS (ID int PRIMARY KEY,NAME text,ADDRESS text);
INSERT INTO USERS (ID, NAME, ADDRESS) VALUES (11101, ‘john’, ‘Oakland’); INSERT INTO USERS (ID, NAME, ADDRESS) VALUES (11102, ‘smith’, ‘California’); INSERT INTO USERS (ID, NAME, ADDRESS) VALUES (11103, ‘Joe’, ‘Nederland’);
SELECT * FROM USERS;
步驟四,創建索引
CREATE CUSTOM INDEX index_name ON keyspace_name.table_name ( column_name ) (USING class_name) (WITH OPTIONS = map) cqlsh:devjavasource> create index on users(name);
4.節點之間的交互 gossip
節點獨立,對等
最終一致性原理
gossip協議來發現集羣種其餘節點的位置和狀態信息
peer-to-peer,按期交換狀態信息
節點啓動 ------------------>從cassandra.yaml獲得集羣名稱,以及種子節點列表(所以每一個節點的種子節點列表必須相同)
選派誰作種子節點沒什麼特別的意義,僅僅在於新節點加入到集羣中時走gossip流程時有用,因此它們沒什麼特權
Gossiper(進程)經過每一個節點的心跳來感知節點是否存活, 能夠根據網絡情況設置靈敏度參數phi_convict_threshold