【问题标题】:Cassandra Python Driver Reproducible TimeoutsCassandra Python 驱动程序可重现超时
【发布时间】:2015-11-16 22:39:48
【问题描述】:

我们正在尝试将 Apache Cassandra 用于一个大型项目,并且我们有一个 Python 脚本可以在数据库集群中运行 INSERT 查询。

在开发人员笔记本电脑 (MacOSX) 上测试脚本时,它可以完美运行,并且可以毫无问题地执行所有 INSERT。

每次在生产机器(Linux)上运行时,它总是有一个:

cassandra.OperationTimedOut: errors={}, last_host=cassandra1.example.com

我们使用DataStax Python Driver 并在创建集群时使用多个主机(cassandra1.example.com 和 cassandra2.example.com)。

两台计算机在网络方面具有相同类型和级别的访问权限(无防火墙等)。生产服务器与数据库的 ping 时间为 4 毫秒,而开发人员的笔记本电脑平均为 40-50。

任何想法似乎是什么问题?

【问题讨论】:

  • 如果您分享您的插入代码会有所帮助。我的直觉告诉我,你正在压倒可能不如你的 osx 机器强大的云服务器。
  • 你是说一切都超时了吗?连接?要求?所有请求,还是仅部分请求?
  • Everything 超时,nothing else 正在使用集群。这是一个空的 Cassandra 实例,我尝试向它提供数据。在 OS X 笔记本电脑上使用相同的脚本,在更差的网络条件下(10x RTT)并且一切正常......
  • 没有更多信息,无法判断。发生这种情况时,服务器上的负载是什么样的?故障总是同一台机器吗?您的重试和负载平衡策略是什么?你的射频是多少?有多大的集群?一致性水平?你在使用批次吗?你是在做异步查询还是同步?如果是异步的,你是在使用 cassandra.concurrent 模块还是只是爆破?
  • 我很乐意回答任何问题以解决问题。 Cassandra 集群是一个全新的 3 节点集群。也就是说,除了我试图插入的表之外,它没有数据。我已经在集群初始化中添加了所有 3 台机器,但始终将第一台机器报告为最后一次尝试。一致性级别是默认的且未更改。我没有使用批次。我正在做同步查询。在 Mac OS X 笔记本电脑上运行相同的脚本可以正常工作,并将结果添加到数据库中。使用笔记本电脑和 cassandra 服务器上的 cqlsh 手动运行查询

标签: python cassandra datastax


【解决方案1】:

很可能 40 到 50 毫秒的网络延迟会降低脚本的速度,以至于在从笔记本电脑运行时不会使服务器过载。生产服务器更靠近的地方,因此它们可以更快地发送垃圾邮件,并使它们超载。如果您尽可能快地向异步写入发送垃圾邮件,您可能需要通过每隔一段时间检查一次结果来限制它们,或者只是进行速率限制。

【讨论】:

  • 目前 Cassandra 集群有足够的节点,只有一台计算机以每五分钟一次的速度尝试写入。我创建了一个垃圾邮件脚本,在开发笔记本电脑上运行它,它每分钟管理 > 20,000 次写入(笔记本电脑最大线程容量)。
【解决方案2】:

问题已经解决,解决方法如下:

我们有一个基本上用作对象的 Python 类。在初始化程序中,我们创建了集群并连接到它,然后使用self.clusterself.session 等将会话/连接/集群变量作为属性传递。

后来,从这个类中的一个方法,我们调用了self.sessionexecute()语句:

def executeQuery(self, id) self.session.execute("INSERT INTO table (id) VALUES (" + str(id) + ");")

然后我们将对象初始化器替换为一个空函数,并将所有与 Cassandra 相关的函数放入 executeQuery() 方法中。问题已解决,没有发生超时。

【讨论】:

    猜你喜欢
    • 2017-04-05
    • 2018-07-17
    • 2015-04-12
    • 2017-11-26
    • 2018-06-15
    • 2018-11-10
    • 1970-01-01
    • 2018-11-05
    • 2015-08-06
    相关资源
    最近更新 更多