前言

相信大家已经会用cqlsh访问Cassandra。但是实际应用中我们需要自己开发代码去访问Cassandra,并不想像cqlsh这样只是简单的连接一个节点,敲一些cql。我们需要连接多个节点,平衡请求到每个Cassandra node上,我们要管理连接池等等。当然这些都不用大家操心,社区版本的SDK已经完成了这些功能,我们接下来将教大家如果使用SDK进行访问。

准备工作

  1. 获取访问地址。
    1. 进入Cassandra控制台> 数据库连接

    2. 查看私网连接地址。由于安全考虑,默认不开通公网,如需获取公网连接地址,请单击申请外网地址
      说明 根据集群规模不同,访问地址个数也不相同。如果有多个尽量使用多个地址,避免单个节点挂掉连接不上集群。公网和内网访问方式几乎相同,只是地址不同。
  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 以切换至完全的公网链路。
          // 否则无法在公网连上所有内部节点,会看到异常或者卡顿,影响本地开发调试。
          // 后续会支持网络链路自动识别(即无需手动添加@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 以切换至完全的公网链路。
        # 否则无法在公网连上所有内部节点,会看到异常或者卡顿,影响本地开发调试。
        # 后续会支持网络链路自动识别(即无需手动添加 @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社区文档: