前言

相信大家已經會用cqlsh訪問Cassandra。但是實際應用中我們需要自己開發代碼去訪問Cassandra,并不想像cqlsh這樣只是簡單的連接一個節點,敲一些cql。我們需要連接多個節點,平衡請求到每個Cassandra node上,我們要管理連接池等等。當然這些都不用大家操心,社區版本的SDK已經完成了這些功能,我們接下來將教大家如果使用SDK進行訪問。

準備工作

  1. 獲取訪問地址。
    1. 進入Cassandra控制臺> 數據庫連接。

    2. 查看私網連接地址。由于安全考慮,默認不開通公網,如需獲取公網連接地址,請單擊申請外網地址p122701
      說明 根據集群規模不同,訪問地址個數也不相同。如果有多個盡量使用多個地址,避免單個節點掛掉連接不上集群。公網和內網訪問方式幾乎相同,只是地址不同。
  2. 添加白名單。

    實際訪問之前,請確保已經將客戶機的IP加入白名單,具體操作參見設置白名單。

多語言代碼示例

Java訪問
  1. Maven加入依賴。
    <dependency>
        <groupId>com.datastax.cassandra</groupId>
        <artifactId>cassandra-driver-core</artifactId>
        <version>3.7.2</version>
    </dependency>
                
    注意 這個依賴會引入一些公共庫,為了避免依賴沖突導致不必要的麻煩,請先在一個新工程中測試。
  2. 編寫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訪問
  1. 安裝SDK庫。
    # 指定版本安裝(建議安裝3.x版本)
    pip install cassandra-driver==3.19.0
    # 安裝最新版本
    pip install cassandra-driver
    # https://pypi.org/project/cassandra-driver/#history      
  2. 編寫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()
                
  3. 其他語言訪問。

    其他語言訪問接口類似Python和Java,可以參考github社區文檔: