应用说明

这是应用程序的逐步说明(请参阅schema附件):

  • Service1使用来自RabbitMQ的消息

  • Service1对它执行某些操作然后使用列插入数据(处理为false)

  • Service1从cassandra获取ID(数据只是插入)并在具有ID的专用RabbitMQ队列中推送消息

  • Service2使用来自专用RabbitMQ队列的消息,做一些事情然后用列INSERT(实际更新)数据(处理为true)

群集说明

在上一次发布之前,我们有一个3节点集群,复制因子为2.发布的一个步骤是删除所有数据并重新创建密钥空间(项目尚未 生产环境 ) .

出于冗余原因,我们必须添加第二个数据中心 . 这是在发布期间,在DROP键空间和重新创建之间完成的 . Keyspace设置从(DC1:2)到(DC1:2,DC2,2)

时间表

  • 停止应用程序的部分服务(导致写入cassandra的服务)

  • DROP KEYSPACE

  • 添加第二个数据中心

  • 启动所有DC2节点

  • 将复制因子更改为相关键空间的(DC1:2,DC2,2)

  • 在新节点上重建

  • 使用(DC1:2,DC2,2)创建应用程序密钥空间

  • 正在运行迁移

  • 从RabbitMQ开始使用服务

问题

发布后,我们必须运行所谓的“迁移”,将数据从旧数据存储区导入到新数据存储区(cassandra) . 这是部分工作,之后当我们启动服务时,我们注意到已处理的列始终保持“假” . 尽管前面的所有步骤都正常工作 .

那时,我们注意到忘记将一致性级别从QUORUM更改为LOCAL_QUORUM . 我们试图改变它并重新启动,但它没有用 . 我们还试图恢复第3步,删除第2个数据中心,它不起作用 .

最后,唯一有效的方法是DROP表并重新启动服务 .

因为当我们要上线时,将表格投入 生产环境 将不是一个选项,我们决定尝试按照相同的时间表重现问题 .

测试执行

  • 首次测试,再现 生产环境 中的所有相同步骤给出了相同的结果 .

  • 步骤相同但使用了从工作开始的LOCAL_QUORUM的一致性级别 .

  • 重试与QUORUM的一致性级别也有效!!!

  • 此次尝试以一致性级别重试LOCAL_QUORUM失败

  • 对于LOCAL_QUORUM的一致性级别,但是service2已停止工作==>在RabbitMQ中显示的数据使处理列变为true,以及以下内容 .

  • 对于LOCAL_QUORUM的一致性级别但是service2停止工作时延迟更多==>在RabbitMQ中显示的数据使处理列变为真但不是以下的 .

  • 对于LOCAL_QUORUM的一致性级别,一个1 DC从一开始就失败了

  • 对于LOCAL_QUORUM的一致性级别,一个1个DC,1个节点和RF到1在迁移期间工作,但之后我们重新启动服务时没有工作 .

上次测试当前正在运行,当处理列未正确设置为true时,我们停止service2一段时间,然后我们重新启动它,问题得到解决,并且从那时起它就一直在运行 .

现在我们正在更改应用程序,以便我们最后只写一次cassandra . 使用RabbitMQ在服务之间共享数据 . 即使这将删除问题(已处理的列不再存在),我们希望了解此问题的根本原因 .

提前致谢,