什麼是Cassandra?
當您需要可伸縮性和高可用性而不影響性能時,Apache Cassandra數據庫是正確的選擇。線性可擴展性 和在商用硬件或雲基礎架構上經過驗證的容錯能力使它成爲關鍵任務數據的理想平臺。Cassandra對跨多個數據中心的複製提供了一流的支持,爲您的用戶提供了更低的延遲,並且能讓您在區域性斷電情況下也穩如老狗,生生不息。
Cassandra有以下特性:
容錯:數據會自動複製到多個節點以實現容錯。支持跨多個數據中心的複製。可以更換故障節點而不會造成停機。
高性能:Cassandra 在基準測試和實際應用程序中始終勝過流行的NoSQL替代方案,這主要是因爲在基礎架構方面有很多選擇。
去中心化:沒有單點故障。沒有網絡瓶頸。集羣中的每個節點都是相同的
可擴展:一些最大的生產部署包括Apple的75,000個節點存儲超過10 PB的數據,Netflix(2,500個節點,420 TB,每天超過1萬億個請求),中國搜索引擎Easou(270個節點,300 TB,超過8億個)每天的請求數)和eBay(超過100個節點,250 TB)。
可靠性:Cassandra 適用於即使整個數據中心發生故障也不會丟失數據的應用程序。
可伸縮性:讀寫吞吐量都隨着新機器的增加而線性增加,而不會造成停機或應用中斷。
安裝Cassandra
前提條件
- 安裝最新版本的Java 8,Oracle Java Standard Edition 8或OpenJDK 8。要驗證您是否安裝了正確的Java版本,請輸入。java -version
- 注意:Cassandra 4.0(CASSANDRA-9608)中添加了對Java 11的實驗支持。在Java 11上運行Cassandra是試驗性的。這樣做自擔風險。有關更多信息,請參見 NEWS.txt。
- 要使用cqlsh,請使用Python 2.7或Python 3.6+ 的最新版本。要驗證您是否安裝了正確的Python版本,請輸入。python --version
選擇安裝方法
對於大多數用戶而言,安裝二進制tarball是最簡單的選擇。壓縮包將所有內容解壓縮到一個位置,二進制文件和配置文件位於它們自己的子目錄中。tarball安裝最明顯的屬性是它不需要root
權限,可以安裝在任何Linux發行版上。
打包安裝需要root
權限。如果要使用YUM安裝Cassandra,請在CentOS和基於RHEL的發行版上安裝RPM構建。如果要使用APT安裝Cassandra,請在Ubuntu和其他基於Debian的發行版上安裝Debian構建。請注意,YUM和APT方法都需要root
權限,並且將以cassandra
OS用戶身份安裝二進制文件和配置文件 。
安裝二進制壓縮包
1)驗證安裝的Java版本,例如:
$ java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~16.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
2)從Apache Cassandra下載 站點上的鏡像之一下載二進制tarball 。例如,要下載3.11.6:
$ curl -OL https://mirror.bit.edu.cn/apache/cassandra/3.11.6/apache-cassandra-3.11.6-bin.tar.gz
3)打開壓縮包
$ tar xzvf apache-cassandra-3.11.6-bin.tar.gz
4)啓動Cassandra
有關如何配置安裝的信息,請參閱配置Cassandra
$ cd apache-cassandra-4.0.0/
$ bin/cassandra
5)檢查Cassandra的狀態
$ bin/nodetool status
# 輸出中的狀態列應報告UN,代表“ Up / Normal”。
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 127.0.0.1 70.03 KiB 256 100.0% ac0d7d8c-4086-4fc1-b19b-a8a50708b5aa rack1
# 或者,通過以下方式連接到數據庫:
$ bin/cqlsh
安裝RPM軟件包
1)驗證安裝的Java版本,例如:
$ java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~16.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
2)將Cassandra的Apache存儲庫添加到文件中/etc/yum.repos.d/cassandra.repo
(作爲root
用戶)。最新的主版本是4.0,對應的發行版名稱是40x
(後綴“ x”)。對於老版本使用311x
的C * 3.11系列,30x
3.0,22x
2.2和21x
2.1。例如,要添加版本4.0(40x
)的存儲庫:
[cassandra]
name=Apache Cassandra
baseurl=https://downloads.apache.org/cassandra/redhat/40x/
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://downloads.apache.org/cassandra/KEYS
3)從源更新包索引:
$ sudo yum update
4)使用YUM安裝Cassandra:
$ sudo yum install cassandra
注意:cassandra
安裝過程中將創建一個新的Linux用戶。Cassandra服務也將以該用戶身份運行。
5)啓動Cassandra服務:
$ sudo service cassandra start
6)使用以下方法監視啓動進度:
$ tail -f /var/log/cassandra/system.log
7)檢查Cassandra的狀態:
$ nodetool status
輸出中的狀態列應報告UN
,代表“正常/正常”。
或者,通過以下方式連接到數據庫:
$ cqlsh
配置Cassandra
要在單個節點上運行Cassandra,存在的默認配置文件./conf/cassandra.yaml
就足夠了,您無需更改任何配置。但是,當部署節點羣集或使用不在同一主機上的客戶端時,必須更改某些參數。
Cassandra配置文件可以在conf
tarball目錄中找到。對於軟件包,配置文件將位於中/etc/cassandra
。
主要運行屬性
Cassandra中的大多數配置都是通過可以在中設置的yaml屬性完成的cassandra.yaml
。至少應考慮設置以下屬性:
cluster_name
:集羣的名稱。seeds
:用逗號分隔的羣集種子IP地址列表。storage_port
注意:您不一定需要更改此設置,但請確保沒有防火牆阻止此端口。listen_address
:節點的IP地址,這是允許其他節點與此節點通信的地址,因此更改它很重要。或者,您可以設置listen_interface
告訴Cassandra使用哪個接口,以及連續使用哪個地址。僅設置一個,而不要同時設置兩個。native_transport_port
:對於storage_port,請確保此端口未被防火牆阻止,因爲客戶端將在此端口上與Cassandra通信。
更改目錄的位置
以下yaml屬性控制目錄的位置:
data_file_directories
:數據文件所在的一個或多個目錄。commitlog_directory
:提交日誌文件所在的目錄。saved_caches_directory
:保存的緩存所在的目錄。hints_directory
:提示所在的目錄。
出於性能原因,如果您有多個磁盤,請考慮將提交日誌和數據文件放在不同的磁盤上。
環境變量
JVM級別的設置(例如堆大小)可以在中設置cassandra-env.sh
。您可以將任何其他JVM命令行參數添加到JVM_OPTS
環境變量。當Cassandra啓動時,這些參數將傳遞給JVM。
日誌
正在使用的日誌記錄器是logback。您可以通過編輯更改日誌記錄屬性logback.xml
。默認情況下,它將在INFO級別登錄到一個名爲的文件system.log
,在調試級別登錄到一個名爲的文件debug.log
。在前臺運行時,它還將以INFO級別登錄到控制檯。
插入和查詢
Cassandra的API是CQL,即Cassandra查詢語言。要使用CQL,您將需要連接到集羣,這可以完成:
- 使用cqlsh
- 或通過Cassandra的客戶端驅動程序。
CQLSH
cqlsh是用於通過CQL與Cassandra交互的命令行shell腳本。它隨每個Cassandra軟件包一起提供,可以在cassandra可執行文件旁邊的bin /目錄中找到。它連接到命令行上指定的單個節點。例如:
$ 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>
CQL詳細介紹
qlsh是用於通過CQL(Cassandra查詢語言)與Cassandra交互的命令行shell腳本。它隨每個Cassandra軟件包一起提供,可以在cassandra可執行文件旁邊的bin /目錄中找到。cqlsh利用Python本機協議驅動程序,並連接到命令行上指定的單個節點。
命令行選項
用法:
cqlsh [options] [host [port]]
選項:
-
-C
--color
強制顏色輸出
-
--no-color
禁用顏色輸出
-
--browser
指定用於顯示cqlsh幫助的瀏覽器。這可以是受支持的瀏覽器名稱之一(例如
firefox
),也可以是後跟瀏覽器路徑%s
(例如 )。/usr/bin/google-chrome-stable %s
-
--ssl
連接到Cassandra時使用SSL
-
-u
--user
用於通過Cassandra進行身份驗證的用戶名
-
-p
--password
用於與Cassandra進行身份驗證的密碼,應與
--user
-
-k
--keyspace
要進行身份驗證的密鑰空間,應與
--user
-
-f
--file
從給定文件執行命令,然後退出
-
--debug
打印其他調試信息
-
--encoding
指定輸出的非默認編碼(默認爲UTF-8)
-
--cqlshrc
指定一個非默認位置
cqlshrc
的文件 -
-e
--execute
執行給定的語句,然後退出
-
--connect-timeout
以秒爲單位指定連接超時(默認爲2s)
-
--python /path/to/python
指定Python解釋器的完整路徑,以覆蓋安裝了多個解釋器的系統上的默認值
-
--request-timeout
以秒爲單位指定請求超時(默認爲10s)
-
-t
--tty
強制tty模式(命令提示符)
特殊命令
除了支持常規的CQL語句外,cqlsh還支持許多不屬於CQL的特殊命令。這些在下面詳細說明。
CONSISTENCY
用法:CONSISTENCY
設置要遵循的操作的一致性級別。有效的參數包括:
ANY
ONE
TWO
THREE
QUORUM
ALL
LOCAL_QUORUM
LOCAL_ONE
SERIAL
LOCAL_SERIAL
SERIAL CONSISTENCY
用法:SERIAL CONSISTENCY
設置要執行的操作的串行一致性級別。有效的參數包括:
SERIAL
LOCAL_SERIAL
串行一致性水平僅由條件更新(INSERT
,UPDATE
和DELETE
用IF
條件)。對於那些,串行一致性級別定義了串行階段(或“ paxos”階段)的一致性級別,而正常一致性級別定義了“學習”階段的一致性,即,將保證哪種類型的讀取都可以看到正確的更新遠。例如,如果條件寫入的一致性級別爲QUORUM
(並且成功),則QUORUM
保證可以看到該寫入。但是,如果該寫入的常規一致性級別爲ANY
,則只能SERIAL
保證一致性級別爲的讀取才能看到它(即使具有一致性的讀取ALL
也不能保證足夠)。
SHOW VERSION
打印正在使用的cqlsh,Cassandra,CQL和本機協議版本。例:
cqlsh> SHOW VERSION
[cqlsh 5.0.1 | Cassandra 3.8 | CQL spec 3.4.2 | Native protocol v4]
SHOW HOST
除集羣名稱外,還打印cqlsh連接到的Cassandra節點的IP地址和端口。例:
cqlsh> SHOW HOST
Connected to Prod_Cluster at 192.0.0.1:9042.
SHOW SESSION
Pretty打印特定的跟蹤會話。
用法:SHOW SESSION
用法示例:
cqlsh> SHOW SESSION 95ac6470-327e-11e6-beca-dfb660d92ad8
Tracing session: 95ac6470-327e-11e6-beca-dfb660d92ad8
activity | timestamp | source | source_elapsed | client
-----------------------------------------------------------+----------------------------+-----------+----------------+-----------
Execute CQL3 query | 2016-06-14 17:23:13.979000 | 127.0.0.1 | 0 | 127.0.0.1
Parsing SELECT * FROM system.local; [SharedPool-Worker-1] | 2016-06-14 17:23:13.982000 | 127.0.0.1 | 3843 | 127.0.0.1
...
SOURCE
讀取文件的內容,並以CQL語句或特殊的cqlsh命令執行每一行。
用法:SOURCE
用法示例:
cqlsh> SOURCE '/home/thobbs/commands.cql'
CAPTURE
開始捕獲命令輸出並將其附加到指定文件。捕獲到的輸出不會在控制檯上顯示。
用法:
CAPTURE '<file>';
CAPTURE OFF;
CAPTURE;
也就是說,必須在字符串文字內給出要附加到的文件的路徑。相對於當前工作目錄解釋路徑。支持使用tilde速記符號('~/mydir'
)來引用$HOME
。
僅捕獲查詢結果輸出。僅cqlsh命令的錯誤和輸出仍將顯示在cqlsh會話中。
要停止捕獲輸出並再次在cqlsh會話中顯示它,請使用。CAPTURE OFF
要檢查當前的捕獲配置,請不使用CAPTURE
任何參數。
HELP
提供有關cqlsh命令的信息。要查看可用主題,請輸入HELP
不帶任何參數的內容。要查看有關某個主題的幫助,請使用。另請參見用於控制使用哪種瀏覽器顯示幫助的參數。HELP ``--browser
TRACING
啓用或禁用查詢跟蹤。啓用跟蹤後,查詢完成後,將打印查詢期間事件的跟蹤。
用法:
TRACING ON
TRACING OFF
PAGING
啓用分頁,禁用分頁或設置讀取查詢的頁面大小。啓用分頁後,一次將僅提取一頁數據,並且將顯示提示以提取下一頁。通常,最好在交互式會話中啓用分頁,以免一次獲取和打印大量數據。
用法:
PAGING ON
PAGING OFF
PAGING <page size in rows>
EXPAND
啓用或禁用行的垂直打印。EXPAND
當獲取許多列或單個列的內容很大時,啓用很有用。
用法:
EXPAND ON
EXPAND OFF
LOGIN
以當前會話的指定Cassandra用戶身份進行身份驗證。
用法:
LOGIN <username> [<password>]
EXIT
結束當前會話並終止cqlsh進程。
用法:
EXIT
QUIT
CLEAR
清除控制檯。
用法:
CLEAR
CLS
DESCRIBE
打印模式元素或集羣的描述(通常是一系列DDL語句)。這對於轉儲全部或部分模式很有用。
用法:
DESCRIBE CLUSTER
DESCRIBE SCHEMA
DESCRIBE KEYSPACES
DESCRIBE KEYSPACE <keyspace name>
DESCRIBE TABLES
DESCRIBE TABLE <table name>
DESCRIBE INDEX <index name>
DESCRIBE MATERIALIZED VIEW <view name>
DESCRIBE TYPES
DESCRIBE TYPE <type name>
DESCRIBE FUNCTIONS
DESCRIBE FUNCTION <function name>
DESCRIBE AGGREGATES
DESCRIBE AGGREGATE <aggregate function name>
在任何命令中,DESC
都可以代替使用DESCRIBE
。
該命令顯示集羣名稱和分區程序:DESCRIBE CLUSTER
cqlsh> DESCRIBE CLUSTER
Cluster: Test Cluster
Partitioner: Murmur3Partitioner
該命令顯示重新創建整個架構所需的DDL語句。這對於轉儲架構以克隆集羣或從備份還原特別有用。DESCRIBE SCHEMA
COPY TO
將數據從表複製到CSV文件。
用法:
COPY <table name> [(<column>, ...)] TO <file name> WITH <copy option> [AND <copy option> ...]
如果未指定任何列,則表中的所有列將被複制到CSV文件。可以通過在表名後面添加一個用逗號括起來的列名列表來指定要複製的列子集。
本應是代表目標文件的路徑字符串文字(單引號)。這也可以是特殊值(不帶單引號),以將CSV打印到stdout。```STDOUT`
有關同時適用於和的選項,請參見共享的COPY選項。COPY TO``COPY FROM
COPY TO選項
-
MAXREQUESTS
最大令牌數範圍可以同時獲取。默認爲6。
-
PAGESIZE
單個頁面中要獲取的行數。預設爲1000。
-
PAGETIMEOUT
默認情況下,頁面超時爲頁面大小每1000個條目10秒,如果頁面大小較小則爲10秒。
-
BEGINTOKEN
,ENDTOKEN
要導出的令牌範圍。默認爲導出完整的鈴聲。
-
MAXOUTPUTSIZE
輸出文件的最大大小,以行數爲單位;超出此最大值,輸出文件將被拆分爲多個段。-1表示無限制,並且是默認值。
-
ENCODING
用於字符的編碼。默認爲
utf8
。
COPY FROM
將數據從CSV文件複製到表。
用法:
COPY <table name> [(<column>, ...)] FROM <file name> WITH <copy option> [AND <copy option> ...]
如果未指定任何列,則CSV文件中的所有列都將複製到表中。可以通過在表名後面添加一個用逗號括起來的列名列表來指定要複製的列子集。
的應爲字符串文字(帶單引號),代表源文件的路徑。這也可以是特殊值(不帶單引號),以便從stdin讀取CSV數據。```STDIN`
有關同時適用於和的選項,請參見共享的COPY選項。COPY TO``COPY FROM
COPY TO選項
-
INGESTRATE
每秒要處理的最大行數。默認爲100000
-
MAXROWS
要導入的最大行數。-1表示無限制,並且是默認值。
-
SKIPROWS
要跳過的許多初始行。默認爲0。
-
SKIPCOLS
以逗號分隔的要忽略的列名稱列表。默認情況下,不跳過任何列。
-
MAXPARSEERRORS
要忽略的最大解析錯誤總數。-1表示無限制,並且是默認值。
-
MAXINSERTERRORS
要忽略的最大插入錯誤總數。-1表示無限。默認值爲1000。
-
ERRFILE
=來存儲無法導入所有行的文件,在默認情況下,這是
import__.err
地方是你的密鑰空間,並
爲你的表名。 -
MAXBATCHSIZE
單個批次中插入的最大行數。默認爲20
-
MINBATCHSIZE
單個批處理中插入的最小行數。默認爲2。
-
CHUNKSIZE
一次從主進程傳遞給子工作進程的行數。預設爲1000。
共享的COPY選項
和共有的選項。COPY TO``COPY FROM
-
NULLVAL
空值的字符串佔位符。默認爲
null
。 -
HEADER
對於,控制CSV輸出文件中的第一行是否包含列名稱。對於COPY FROM,指定CSV輸入文件中的第一行是否包含列名。默認爲。
COPY TO``false
-
DECIMALSEP
用作小數點分隔符的字符。默認爲
.
。 -
THOUSANDSSEP
用於分隔數千個字符。默認爲空字符串。
-
BOOLSTYlE
布爾值的字符串文字格式。默認爲
True,False
。 -
NUMPROCESSES
爲
COPY
任務創建的子工作進程數。默認值最大爲4,最大爲16 。但是,最多將創建(num_cores-1)個進程。COPY FROM``COPY TO
-
MAXATTEMPTS
在放棄之前獲取數據範圍(使用時)或插入數據塊(使用時)的最大嘗試失敗次數。默認爲5。
COPY TO``COPY FROM
-
REPORTFREQUENCY
狀態更新的頻率(以秒爲單位)。默認值爲0.25。
-
RATEFILE
一個可選文件,用於輸出速率統計信息。默認情況下,統計信息不會輸出到文件中。
客戶端驅動程序
以下列出了Java、Python、Go語言的Cassandra客戶端驅動程序。在選擇驅動程序之前,應驗證特定驅動程序支持的Cassandra版本和功能。
Java
Python
Go
客戶端的詳細使用細則,讀者可點擊鏈接相應的學習,後面有機會的話考慮出一部分教程。