如何解决cassandra中“无法完成对任何主机的操作”的问题?

rryofs0p  于 2021-06-09  发布在  Cassandra
关注(0)|答案(2)|浏览(823)

我有一个非常简单的aws lambda函数,在这个函数中,我连接到一个amazon keyspaces for cassandra数据库。python中的这段代码可以工作,但我时常会遇到错误。我该如何纠正这种奇怪的行为?我假设您在初始化集群时需要进行其他设置。例如, set_max_connections_per_host . 如果有任何帮助,我将不胜感激。
错误:

('Unable to complete the operation against any hosts', {<Host: X.XXX.XX.XXX:XXXX eu-central-1>: ConnectionShutdown('Connection to X.XXX.XX.XXX:XXXX was closed')})

lambda\u函数.py:

import sessions

cassandra_db_session = None
cassandra_db_username = 'your-username'
cassandra_db_password = 'your-password'
cassandra_db_endpoints = ['your-endpoint']
cassandra_db_port = 9142

def lambda_handler(event, context):
    global cassandra_db_session
    if not cassandra_db_session:
        cassandra_db_session = sessions.create_cassandra_session(
            cassandra_db_username,
            cassandra_db_password,
            cassandra_db_endpoints,
            cassandra_db_port
        )
    result = cassandra_db_session.execute('select * from "your-keyspace"."your-table";')
    return 'ok'

会话.py:

from ssl import SSLContext
from ssl import CERT_REQUIRED
from ssl import PROTOCOL_TLSv1_2
from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
from cassandra.policies import DCAwareRoundRobinPolicy

def create_cassandra_session(db_username, db_password, db_endpoints, db_port):
    ssl_context = SSLContext(PROTOCOL_TLSv1_2)
    ssl_context.load_verify_locations('your-path/AmazonRootCA1.pem')
    ssl_context.verify_mode = CERT_REQUIRED
    auth_provider = PlainTextAuthProvider(username=db_username, password=db_password)
    cluster = Cluster(
        db_endpoints,
        ssl_context=ssl_context,
        auth_provider=auth_provider,
        port=db_port,
        load_balancing_policy=DCAwareRoundRobinPolicy(local_dc='eu-central-1'),
        protocol_version=4,
        connect_timeout=60
    )
    session = cluster.connect()
    return session
uurv41yg

uurv41yg1#

在客户端设置最大连接没有多大意义,因为aws lambda在两次运行之间实际上是“死的”。出于同样的原因,建议禁用驱动程序心跳(使用 idle_heartbeat_interval = 0 )因为在下一次调用函数之前不会发生任何活动。
这并不一定会导致您看到的问题,但是在服务器端关闭连接后,驱动程序很有可能会重用该连接。
由于缺少关于aws密钥空间内部工作的公共文档,很难知道集群上发生了什么。我一直怀疑aws的keyspaces在dynamo db前面有一个类似cql的api引擎,所以有一些像你看到的那样的怪癖很难追踪,因为它需要的知识只能在aws内部获得。
fwiw datastax驱动程序没有针对aws密钥空间进行测试。

nwnhqdif

nwnhqdif2#

这是我看到的最大问题:

result = cassandra_db_session.execute('select * from "your-keyspace"."your-table";')

代码看起来不错,但我看不到 WHERE 条款。因此,如果有大量数据,则单个节点(选择作为协调器)必须在从所有其他节点提取数据的同时构建结果集。由于这会导致(联合国)可预见的糟糕表现,这可以解释为什么它有时有效,但其他的却不行。
提示:cassandra中的所有查询都应该有一个 WHERE 条款。

相关问题