如何在 DataStax Enterprise 上使用 Stargate 获取数据
Posted
技术标签:
【中文标题】如何在 DataStax Enterprise 上使用 Stargate 获取数据【英文标题】:How to get data using Stargate on DataStax Enterprise 【发布时间】:2021-11-15 13:31:56 【问题描述】:我在开发服务器中安装了 datastax cassandra 6.8,我还在另一台开发服务器中安装了 Stargate 最新版本。 Stargate 和 Cassandra 之间建立了连接。我在日志文件中看不到任何错误。 我可以使用邮递员对 Stargate 进行休息呼叫以获取 auth_token。 之后,我将该令牌设置为标头并进行 GET 调用以检索数据
http://dev server and port/v2/keyspaces/dco/test1?where="id":"$eq":"c8e67364-1547-4833-9208-9ea9c0f0acf6"
我收到此错误
"description": "Server error: org.apache.cassandra.stargate.transport.ServerError: Unexpected persistence error: Name authentication_schemes/INTERNAL is not valid for any resource type",
"code": 500
该错误看起来像是我用来获取 auth_token 的用户/通行证无权检索数据。但我尝试使用该用户/密码登录 cassandra,并且能够进行选择和插入查询。
请你帮我弄清楚我是如何绕过这个问题的。
下面是我的 postman 和 Cassandra db 截图
Cassandra 表 test1(id 是 uuid 和主键)
id | create_date
--------------------------------------+---------------------------------
f47dee1b-1b51-4e25-933f-6f3f8817a6f5 | 1970-01-01 00:00:00.000000+0000
c8e67364-1547-4833-9208-9ea9c0f0acf6 | 2021-09-16 18:59:16.352000+0000
faae6180-0464-11ec-9a03-0242ac130003 | 2009-07-13 08:30:12.000000+0000
【问题讨论】:
【参考方案1】:您的帖子中没有足够的信息来确定根本问题是什么,所以我将发布我的测试环境,以便您可以将其与您的进行比较。
DSE 配置
这是我的单节点 DSE 6.8.15 集群:
$ nodetool status
Datacenter: Cassandra
=====================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving/Stopped
-- Address Load Tokens Owns (effective) Host ID Rack
UN 10.101.36.175 203.4 KiB 8 100.0% 722c2393-92c8-4eb5-999c-c39063a9aee5 rack1
这些是我在cassandra.yaml
中配置的条目:
cluster_name: 'stargate'
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: "10.101.36.175"
listen_address: 10.101.36.175
native_transport_address: 10.101.36.175
在dse.yaml
:
authentication_options:
enabled: true
default_scheme: internal
星门配置
我的 Stargate 节点的 IP 是 10.101.36.44
,我已经启动它:
$ starctl \
--cluster-name stargate \
--cluster-seed 10.101.36.175 \
--cluster-version 6.8 \
--listen 10.101.36.44 \
--dc Cassandra \
--rack rack1 \
--dse \
--enable-auth
作为参考,我使用了Stargate.io Installation Guide中的示例。
Stargate 启动后,我可以确认 API 端点的所有必要端口都已启动:
$ sudo lsof -nPi -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-r 817 systemd-resolve 13u IPv4 22041 0t0 TCP 127.0.0.53:53 (LISTEN)
sshd 1136 root 3u IPv4 25117 0t0 TCP *:22 (LISTEN)
sshd 1136 root 4u IPv6 25128 0t0 TCP *:22 (LISTEN)
java 8724 ubuntu 467u IPv6 59646 0t0 TCP *:7199 (LISTEN)
java 8724 ubuntu 468u IPv6 59647 0t0 TCP *:37421 (LISTEN)
java 8724 ubuntu 473u IPv6 59240 0t0 TCP 10.101.36.44:7000 (LISTEN)
java 8724 ubuntu 851u IPv6 61496 0t0 TCP *:8081 (LISTEN)
java 8724 ubuntu 866u IPv6 62632 0t0 TCP *:8090 (LISTEN)
java 8724 ubuntu 867u IPv6 63503 0t0 TCP *:8084 (LISTEN)
java 8724 ubuntu 872u IPv6 65299 0t0 TCP *:8080 (LISTEN)
java 8724 ubuntu 889u IPv6 63517 0t0 TCP *:9042 (LISTEN)
java 8724 ubuntu 1013u IPv6 65561 0t0 TCP *:8082 (LISTEN)
测试
在我的集群中,我创建了这个表:
CREATE KEYSPACE sgoneks WITH replication = 'class': 'SimpleStrategy', 'replication_factor': '1' AND durable_writes = true;
CREATE TABLE sgoneks.vaccinations_by_name (
name text PRIMARY KEY,
firstdose date,
seconddose date,
vaccine text
)
并且该表包含以下数据:
sguser@cqlsh> SELECT * FROM sgoneks.vaccinations_by_name ;
name | firstdose | seconddose | vaccine
--------+------------+------------+-------------
bob | 2021-02-28 | 2021-05-23 | astrazeneca
carlos | 2021-03-12 | 2021-04-02 | astrazeneca
alice | 2021-06-20 | 2021-07-19 | pfizer
这是我生成身份验证令牌并将其保存为环境变量的方式:
$ curl -L -X POST 'http://10.101.36.44:8081/v1/auth' \
-H 'Content-Type: application/json' \
--data-raw '"username":"sguser", "password":"sguser"'
"authToken":"41867001-216d-4525-b612-6b883a64984d"
$ export AUTH_TOKEN="41867001-216d-4525-b612-6b883a64984d"
这是通过检查 sgoneks
键空间是否存在的快速连接测试:
$ curl -L -X GET 'http://10.101.36.44:8082/v2/schemas/keyspaces/sgoneks' \
-H 'Content-Type: application/json' \
-H "X-Cassandra-Token: $AUTH_TOKEN" \
-H "Accept: application/json" \
| jq
"data":
"name": "sgoneks"
最后,我在这里检索到name='alice'
的疫苗接种详情:
$ curl -L -X GET 'http://10.101.36.44:8082/v2/keyspaces/sgoneks/vaccinations_by_name/alice' \
-H 'Content-Type: application/json' \
-H "X-Cassandra-Token: $AUTH_TOKEN" \
| jq
"count": 1,
"data": [
"name": "alice",
"firstdose":
"year": 2021,
"month": "JUNE",
"monthValue": 6,
"chronology":
"calendarType": "iso8601",
"id": "ISO"
,
"dayOfMonth": 20,
"dayOfWeek": "SUNDAY",
"era": "CE",
"dayOfYear": 171,
"leapYear": false
,
"seconddose":
"year": 2021,
"month": "JULY",
"monthValue": 7,
"chronology":
"calendarType": "iso8601",
"id": "ISO"
,
"dayOfMonth": 19,
"dayOfWeek": "MONDAY",
"era": "CE",
"dayOfYear": 200,
"leapYear": false
,
"vaccine": "pfizer"
]
附带说明一下,您可能会发现只使用 Astra DB 会更容易,因为它带有 Stargate.io 预配置并可以使用。
如果您的 DSE 安装仍然存在问题,我建议您使用 DataStax Support 记录一张票,以便我们的一位工程师可以直接为您提供帮助。干杯!
【讨论】:
【参考方案2】:您是否偶然在 DSE 集群中使用 LDAP 身份验证?目前 Stargate 不支持它,这可能会导致您看到的错误。
如果可能,我会尝试撤销您正在使用的角色的INTERNAL
相关权限。您也可以尝试创建一个只有基本权限且没有身份验证方案的新角色。
【讨论】:
以上是关于如何在 DataStax Enterprise 上使用 Stargate 获取数据的主要内容,如果未能解决你的问题,请参考以下文章
Datastax Enterprise Ubuntu 安装系统限制
在 DataStax Enterprise 中更改减速器/映射器的数量
麦格理银行借助DataStax Enterprise (DSE) 驱动数字化转型
红帽 6.4 上的 Datastax Enterprise 5.0.0