初探 Cassandra

王嘉鴻 2020/12/28 10:40:36
3935

1. 前言

      因專案中需要對大量資料做操作以及保存,傳統RDB在這方面的運用似乎會遇到瓶頸,筆者因此設法朝NoSQL 方向找尋其他替代方案。請教Google大神後,發現兩個比較熱門的選擇,分別是MongoDB與Cassandra。進一步分析後,發現MongoDB資料結構為 JSON,語法與相關使用與RDB完全不同,但Cassandra 的使用方式,與常用的RDB似乎差異不大,似乎值得研究看看。以下將分享筆者初步接觸Cassandra 的經驗。

 

2. Cassandra

      關於Cassandra的介紹文章很多,可參考 Cassandra官網 或是 中文介紹,這邊不另外介紹,以下將由安裝開始,分享實際操作經驗

  2.1 安裝

      Linux、Windows 都可以進行安裝,筆者這裡使用 ubuntu 做為安裝環境,可參考 官網安裝教學 或是 影片教學

      環境需求: JDK 8 以上(筆者使用 JDK11發生了錯誤,後來是使用JDK8才沒問題)

echo "deb https://downloads.apache.org/cassandra/debian 311x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
curl https://downloads.apache.org/cassandra/KEYS | sudo apt-key add -
sudo apt-get update
sudo apt-key adv --keyserver pool.sks-keyservers.net --recv-key A278B781FE4B2BDA
sudo apt-get install cassandra
service cassandra start

      以上就安裝完成,如有 curl 套件沒裝請先安裝,可以執行 nodetool status 查看狀態看到下圖表示 cassandra 已經啟動

 

  2.2 CQLSH

      安裝完成後輸入 cqlsh 可直接進入 Cassandra ,如需要更改 Cassandra  ip 位置則使用 cqlsh ip,使用方式可參考 中文介紹 

 

  2.3 建立資料

      第一步驟需要建立 keyspace 這相當於我們在 RDB 上建立 database,執行下列語法

CREATE KEYSPACE test_ks WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 1};

test_ks - keyspace 的名稱,class 有兩種方式可選擇這邊使用 SimpleStrategy,replication_factor 複製 node 數量因為單台使用所以為 1

      第二步驟建立 table,每個 table 都需要 Primary key,這邊需要提到一個很重要的東西 Partition Key 詳解請參考

Cassandra primary key

語法: create table book( category text, seq int, name text, price int PRIMARY KEY(category, seq)),測試完成就可以開始簡單的測試語法 

 

3. 程式實作

      安裝好 Cassandra  後,我們來看看程式該怎麼來操作,在這之前需要做些設定,如果你是在本機安裝就不需要做此設定。若程式跟 Cassandra  分別為不同台機器,這時我們需要改變 Cassandra  的 ip 位置讓 client 端可以連進來。

這邊筆者使用的環境為 ubuntu,需要改變的檔案為  Cassandra .yaml,path: /etc/Cassandra 。開後需要改變三個地方,seeds、listen_address、rpc_address,分別修改為主機 ip 位置,之後重啟這樣就可以讓 client 連線(如果firewall試開啟狀態,則 需要開通 port) 細節可參考 cassandra設定

 

  3.1 查詢

      使用 Spring Boot 來做為我們連線程式,參考範例 Spring Boot With Cassandra

      套件: spring-boot-starter-data-cassandra

      當一切都準備好,寫隻測試程式來看看是否正常,完成後發現其實跟我們以往使用上沒什麼差別

 

  3.1 大批新增

      快速寫入是 Cassandra  很大的賣點,筆者當然要來試試是否真的如此。

      實際測試insert 10萬筆資料量後,意外發現竟然需要36秒才完成!! 說好的快速寫入呢?

      診斷後,發現是使用方式上的問題,透過套件執行會是一筆一筆的寫入 Cassandra  這樣當然會很慢(廢話),其實Cassandra 有提供大批執行的方式,使用上也很簡單: 就是一口氣把 insert 指令都丟給他,Cassandra BatchOperations 這個介面可以幫我們實作這項任務。 

 

      不過要注意的是,使用 Cassandra BatchOperations時, 可能會得到這個錯誤訊息: Batch statement cannot contain more than 65535 statements,此錯誤很好理解: 執行指令不得超過 65535,只好換個方式,改寫成迴圈分批執行。這時候,如果切的筆數過多(筆者切6萬筆),你可能會得到這個錯誤: Query timed out after PT2S,當遇到這個問題時,可進行以下處理

      1.修改 Cassandra .yaml 將 time out 時間拉長 

      2. 執行筆數切小點,方便測試(我懶)將筆數切成一萬筆一次。

執行完成後 12秒完成。比較一下使用MarianDB來處理相同的資料量 insert,當 hibernate batch.size 設定 50時 ,其執行時間為43秒。初步對照結果看起來還不錯。

 

4. 總結

      以上是初步測試的結果,當然還需要做些調整,應用情境上的選擇還需要評估,如果想要嘗試 NoSQL 又怕改變太多 Cassandra 也許是一種不錯的選擇,但還是跟 RDB 的思維上有很大的差異,也許部分採用 Cassandra  搭配 RDB 會是不錯的方式。

 

參考網站:

Cassandra官網 、中文介紹官網安裝教學 、 影片教學Cassandra primary keycassandra設定

Spring Boot With Cassandra

 

王嘉鴻