如何在 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

Docker 上的 DataStax Enterprise:由于 /hadoop/conf 目录不可写而无法启动

无法从 Python 应用程序连接到 DataStax Enterprise 集群