前言
相信大家已經會用cqlsh訪問Cassandra。但是實際應用中我們需要自己開發代碼去訪問Cassandra,並不想像cqlsh這樣只是簡單的串連一個節點,敲一些cql。我們需要串連多個節點,平衡請求到每個Cassandra node上,我們要管理串連池等等。當然這些都不用大家操心,社區版本的SDK已經完成了這些功能,我們接下來將教大家如果使用SDK進行訪問。
準備工作
- 擷取訪問地址。
進入Cassandra控制台> 資料庫連接。
- 查看私網串連地址。由於安全考慮,預設不開通公網,如需擷取公網串連地址,請單擊申請外網地址。說明 根據叢集規模不同,訪問地址個數也不相同。如果有多個盡量使用多個地址,避免單個節點掛掉串連不上叢集。公網和內網訪問方式幾乎相同,只是地址不同。
- 添加白名單。
實際訪問之前,請確保已經將客戶機的IP加入白名單,具體操作參見設定白名單。
多語言程式碼範例
Java訪問
- Maven加入依賴。
<dependency> <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-driver-core</artifactId> <version>3.7.2</version> </dependency>
重要 這個依賴會引入一些公用庫,為了避免依賴衝突導致不必要的麻煩,請先在一個新工程中測試。 - 編寫Java存取碼。
import com.datastax.driver.core.Cluster; import com.datastax.driver.core.PlainTextAuthProvider; import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.Session; public class Demo { public static void main(String[] args) { // 此處填寫資料庫連接點地址(公網或者內網的),控制台有幾個就填幾個。 // 實際上SDK最終只會連上第一個可串連的連接點並建立控制串連,填寫多個是為了防止單個節點掛掉導致無法串連資料庫。 // 此處無需關心連接點的順序,因為SDK內部會先打亂連接點順序避免不同用戶端的控制串連總是連一個點。 // 千萬不要把公網和內網的地址一起填入。 String[] contactPoints = new String[]{ "cds-xxxxxxxx-core-003.cassandra.rds.aliyuncs.com", "cds-xxxxxxxx-core-002.cassandra.rds.aliyuncs.com" }; Cluster cluster = Cluster.builder() .addContactPoints(contactPoints) // 填寫賬戶名密碼(如果忘記可以在 帳號管理 處重設) .withAuthProvider(new PlainTextAuthProvider("cassandra", "123456")) // 如果進行的是公網訪問,需要在帳號名後面帶上 @public 以切換至完全的公網鏈路。 // 否則無法在公網連上所有內部節點,會看到異常或者卡頓,影響本地開發調試。 // 後續會支援網路鏈路自動識別(即無需手動添加@public)具體可以關注官網Changelog。 //.withAuthProvider(new PlainTextAuthProvider("cassandra@public", "123456")) .build(); // 初始化叢集,此時會建立控制串連(這步可忽略,建立Session時候會自動調用) cluster.init(); // 串連叢集,會對每個Cassandra節點建立長串連池。 // 所以這個操作非常重,不能每個請求建立一個Session。合理的應該是每個進程預先建立若干個。 // 通常來說一個夠用了,你也可以根據自己業務測試情況適當調整,比如把讀寫的Session分開管理等。 Session session = cluster.connect(); // 查詢,此處我們查一下許可權相關的表,看看我們建立了幾個角色。 // 這是系統資料表,預設只有cassandra這個superuser賬戶有SELECT許可權。 // 如果你使用其他帳號測試,可以換一個表或者授權一下。 ResultSet res = session.execute("SELECT * FROM system_auth.roles"); // ResultSet 實現了 Iterable 介面,我們直接將每行資訊列印到控制台 res.forEach(System.out::println); // 關閉Session session.close(); // 關閉Cluster cluster.close(); } }
Python訪問
- 安裝SDK庫。
# 指定版本安裝(建議安裝3.x版本) pip install cassandra-driver==3.19.0 # 安裝最新版本 pip install cassandra-driver # https://pypi.org/project/cassandra-driver/#history
- 編寫Python存取碼。
#!/usr/bin/env python # -*- coding: UTF-8 -*- import logging import sys from cassandra.cluster import Cluster from cassandra.auth import PlainTextAuthProvider logging.basicConfig(stream=sys.stdout, level=logging.INFO) cluster = Cluster( # 此處填寫資料庫連接點地址(公網或者內網的),控制台有幾個就填幾個。 # 實際上SDK最終只會連上第一個可串連的連接點並建立控制串連,填寫多個是為了防止單個節點掛掉導致無法串連資料庫。 # 此處無需關心連接點的順序,因為SDK內部會先打亂連接點順序避免不同用戶端的控制串連總是連一個點。 # 千萬不要把公網和內網的地址一起填入。 contact_points=["cds-xxxxxxxx-core-003.cassandra.rds.aliyuncs.com", "cds-xxxxxxxx-core-002.cassandra.rds.aliyuncs.com"], # 填寫賬戶名密碼(如果忘記可以在 帳號管理 處重設) auth_provider=PlainTextAuthProvider("cassandra", "123456")) # 果進行的是公網訪問,需要在帳號名後面帶上 @public 以切換至完全的公網鏈路。 # 否則無法在公網連上所有內部節點,會看到異常或者卡頓,影響本地開發調試。 # 後續會支援網路鏈路自動識別(即無需手動添加 @public)具體可以關注官網Changelog。 # auth_provider=PlainTextAuthProvider("cassandra@public", "123456")) # 串連叢集,會對每個Cassandra節點建立長串連池。 # 所以這個操作非常重,不能每個請求建立一個Session。合理的應該是每個進程預先建立若干個。 # 通常來說一個夠用了,你也可以根據自己業務測試情況適當調整,比如把讀寫的Session分開管理等。 session = cluster.connect() # 查詢,此處我們查一下許可權相關的表,看看我們建立了幾個角色。 # 這是系統資料表,預設只有cassandra這個superuser賬戶有SELECT許可權。 # 如果你使用其他帳號測試,可以換一個表或者授權一下。 rows = session.execute('SELECT * FROM system_auth.roles') # 列印每行資訊到控制台 for row in rows: print("# row: {}".format(row)) # 關閉Session session.shutdown() # 關閉Cluster cluster.shutdown()
- 其他語言訪問。
其他語言提供者類似Python和Java,可以參考github社區文檔: