多语言SDK访问(公网&内网)
前言
相信大家已经会用cqlsh访问Cassandra。但是实际应用中我们需要自己开发代码去访问Cassandra,并不想像cqlsh这样只是简单的连接一个节点,敲一些cql。我们需要连接多个节点,平衡请求到每个Cassandra node上,我们要管理连接池等等。当然这些都不用大家操心,社区版本的SDK已经完成了这些功能,我们接下来将手把手教大家如果使用SDK进行访问。
准备工作
1.获取访问地址
进入控制台 -> 数据库连接
因为安全上的考虑,默认是没有开通公网的。如需获取公网访问地址,请先按上图指示开通。现在我们获取到了形如下的访问地址:
cds-xxxxxxxx-core-003.cassandra.rds.aliyuncs.com
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加入依赖
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.7.2</version>
</dependency>
这个依赖会引入一些公共库,为了避免依赖冲突导致不必要的麻烦,请先在一个新工程中测试。
1.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();
}
}
2. Python访问
2.1 安装SDK库
# 指定版本安装(建议安装3.x版本)
pip install cassandra-driver==3.19.0
# 安装最新版本
pip install cassandra-driver
# https://pypi.org/project/cassandra-driver/#history
2.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社区文档:
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论