我正在使用 QuestDB Enterprise 2.1.1 并设置权限。当我使用内置管理员用户时,我可以使用 ILP 以编程方式提取数据,例如使用文档中的此代码片段
conf = f'http::addr=localhost:9000;username=admin;password=quest;auto_flush_rows=100;auto_flush_interval=1000;'
with Sender.from_conf(conf) as sender:
sender.row(
'trades',
symbols={
'symbol': 'ETH-USD',
'side': 'sell'},
columns={
'price': 2615.54,
'amount': 0.00044,
},
at=datetime.datetime(
2022, 3, 8, 18, 53, 57, 609765,
tzinfo=datetime.timezone.utc))
我已经创建了一个用户:
create user ilp_ingest WITH PASSWORD ilp123;
grant ILP to ilp_ingest;
grant PGWIRE to ilp_ingest;
GRANT CREATE TABLE to ilp_ingest;
GRANT INSERT ON ilp_test to ilp_ingest;
grant select on all tables to ilp_ingest;
但是当我尝试使用
ilp_ingest
用户获取数据时,我的访问被拒绝。如果预先创建表或者我开始发送数据以启用表自动创建,都会发生这种情况。
我错过了什么?
在 QuestDB 中,您可以通过两种方式使用 ILP 协议摄取数据:TCP 传输或 HTTP 传输。通常不建议使用 TCP 传输,它的可用主要是由于历史原因。该代码段使用推荐的 HTTP 传输。
发生未授权问题是因为 QuestDB 需要
GRANT HTTP to user;
实际上,除非您计划使用 TCP 传输,否则您不需要授予
ILP
授权。
此外,建议不要使用
user
和 password
作为凭证,而建议生成 HTTP 令牌,如
ALTER USER ilp_ingest CREATE TOKEN TYPE REST WITH TTL ‘10d’ REFRESH;
在服务器端使用令牌更轻,这可以在摄取大量数据时产生不同的吞吐量。
然后我们可以将连接字符串上的用户和密码替换为
token
,如所示
conf = f'http::addr=localhost:9000;token=XY132213wXXXXzzzzzzzzz;auto_flush_rows=100;auto_flush_interval=1000;'