前言
相信大家已經會用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 以切換至完全的公網鏈路。 // 否則無法在公網連上所有內部節點,會看到異?;蛘呖D,影響本地開發調試。 // 后續會支持網絡鏈路自動識別(即無需手動添加@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 以切換至完全的公網鏈路。 # 否則無法在公網連上所有內部節點,會看到異?;蛘呖D,影響本地開發調試。 # 后續會支持網絡鏈路自動識別(即無需手動添加 @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社區文檔: