全部产品
云市场

多语言SDK访问(公网&内网)

更新时间:2019-09-04 10:10:06

前言

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

准备工作

1.获取访问地址

进入控制台 -> 数据库连接connection-page

因为安全上的考虑,默认是没有开通公网的。如需获取公网访问地址,请先按上图指示开通。现在我们获取到了形如下的访问地址:

  1. cds-xxxxxxxx-core-003.cassandra.rds.aliyuncs.com
  2. cds-xxxxxxxx-core-002.cassandra.rds.aliyuncs.com

根据集群规模不同,访问地址个数也不相同。如果有多个尽量使用多个地址,避免单个节点挂掉连接不上集群的窘境。公网和内网访问方式几乎是相同的,只是地址不一样,下面我们将通过Java和Python的代码演示。

2.添加白名单

实际访问之前,请确保已经将客户机的IP加入白名单,具体操作参考:https://help.aliyun.com/document_detail/129151.html?spm=a2c4g.11186623.6.556.73594022kKnXVq

多语言代码示例

1. Java访问

1.1 Maven加入依赖

  1. <dependency>
  2. <groupId>com.datastax.cassandra</groupId>
  3. <artifactId>cassandra-driver-core</artifactId>
  4. <version>3.7.2</version>
  5. </dependency>

这个依赖会引入一些公共库,为了避免依赖冲突导致不必要的麻烦,请先在一个新工程中测试。

1.2 编写Java访问代码

  1. import com.datastax.driver.core.Cluster;
  2. import com.datastax.driver.core.PlainTextAuthProvider;
  3. import com.datastax.driver.core.ResultSet;
  4. import com.datastax.driver.core.Session;
  5. public class Demo {
  6. public static void main(String[] args) {
  7. // 此处填写数据库连接点地址(公网或者内网的),控制台有几个就填几个。
  8. // 实际上SDK最终只会连上第一个可连接的连接点并建立控制连接,填写多个是为了防止单个节点挂掉导致无法连接数据库。
  9. // 此处无需关心连接点的顺序,因为SDK内部会先打乱连接点顺序避免不同客户端的控制连接总是连一个点。
  10. // 千万不要把公网和内网的地址一起填入。
  11. String[] contactPoints = new String[]{
  12. "cds-xxxxxxxx-core-003.cassandra.rds.aliyuncs.com",
  13. "cds-xxxxxxxx-core-002.cassandra.rds.aliyuncs.com"
  14. };
  15. Cluster cluster = Cluster.builder()
  16. .addContactPoints(contactPoints)
  17. // 填写账户名密码(如果忘记可以在 帐号管理 处重置)
  18. .withAuthProvider(new PlainTextAuthProvider("cassandra", "123456"))
  19. // 如果进行的是公网访问,需要在帐号名后面带上 @public 以切换至完全的公网链路。
  20. // 否则无法在公网连上所有内部节点,会看到异常或者卡顿,影响本地开发调试。
  21. // 后续会支持网络链路自动识别(即无需手动添加@public)具体可以关注官网Changelog。
  22. //.withAuthProvider(new PlainTextAuthProvider("cassandra@public", "123456"))
  23. .build();
  24. // 初始化集群,此时会建立控制连接(这步可忽略,建立Session时候会自动调用)
  25. cluster.init();
  26. // 连接集群,会对每个Cassandra节点建立长连接池。
  27. // 所以这个操作非常重,不能每个请求创建一个Session。合理的应该是每个进程预先创建若干个。
  28. // 通常来说一个够用了,你也可以根据自己业务测试情况适当调整,比如把读写的Session分开管理等。
  29. Session session = cluster.connect();
  30. // 查询,此处我们查一下权限相关的表,看看我们创建了几个角色。
  31. // 这是系统表,默认只有cassandra这个superuser账户有SELECT权限。
  32. // 如果你使用其他帐号测试,可以换一个表或者授权一下。
  33. ResultSet res = session.execute("SELECT * FROM system_auth.roles");
  34. // ResultSet 实现了 Iterable 接口,我们直接将每行信息打印到控制台
  35. res.forEach(System.out::println);
  36. // 关闭Session
  37. session.close();
  38. // 关闭Cluster
  39. cluster.close();
  40. }
  41. }

2. Python访问

2.1 安装SDK库

  1. # 指定版本安装(建议安装3.x版本)
  2. pip install cassandra-driver==3.19.0
  3. # 安装最新版本
  4. pip install cassandra-driver
  5. # https://pypi.org/project/cassandra-driver/#history

2.2 编写Python访问代码

  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3. import logging
  4. import sys
  5. from cassandra.cluster import Cluster
  6. from cassandra.auth import PlainTextAuthProvider
  7. logging.basicConfig(stream=sys.stdout, level=logging.INFO)
  8. cluster = Cluster(
  9. # 此处填写数据库连接点地址(公网或者内网的),控制台有几个就填几个。
  10. # 实际上SDK最终只会连上第一个可连接的连接点并建立控制连接,填写多个是为了防止单个节点挂掉导致无法连接数据库。
  11. # 此处无需关心连接点的顺序,因为SDK内部会先打乱连接点顺序避免不同客户端的控制连接总是连一个点。
  12. # 千万不要把公网和内网的地址一起填入。
  13. contact_points=["cds-xxxxxxxx-core-003.cassandra.rds.aliyuncs.com",
  14. "cds-xxxxxxxx-core-002.cassandra.rds.aliyuncs.com"],
  15. # 填写账户名密码(如果忘记可以在 帐号管理 处重置)
  16. auth_provider=PlainTextAuthProvider("cassandra", "123456"))
  17. # 果进行的是公网访问,需要在帐号名后面带上 @public 以切换至完全的公网链路。
  18. # 否则无法在公网连上所有内部节点,会看到异常或者卡顿,影响本地开发调试。
  19. # 后续会支持网络链路自动识别(即无需手动添加 @public)具体可以关注官网Changelog。
  20. # auth_provider=PlainTextAuthProvider("cassandra@public", "123456"))
  21. # 连接集群,会对每个Cassandra节点建立长连接池。
  22. # 所以这个操作非常重,不能每个请求创建一个Session。合理的应该是每个进程预先创建若干个。
  23. # 通常来说一个够用了,你也可以根据自己业务测试情况适当调整,比如把读写的Session分开管理等。
  24. session = cluster.connect()
  25. # 查询,此处我们查一下权限相关的表,看看我们创建了几个角色。
  26. # 这是系统表,默认只有cassandra这个superuser账户有SELECT权限。
  27. # 如果你使用其他帐号测试,可以换一个表或者授权一下。
  28. rows = session.execute('SELECT * FROM system_auth.roles')
  29. # 打印每行信息到控制台
  30. for row in rows:
  31. print("# row: {}".format(row))
  32. # 关闭Session
  33. session.shutdown()
  34. # 关闭Cluster
  35. cluster.shutdown()

3. 其他语言访问

其他语言访问接口类似Python和Java,可以参考github社区文档: