在我的应用程序日志中,我已经看到,默认情况下,在运行create / alter table语句之后,cassandra驱动程序似乎会进行处理以使模式达成协议最多10秒。
我可以(并且应该)设置一致性级别,例如' quorum'执行DDL语句时,例如'创建表..如果不是存在'确保我的表被创建并传播到所有节点?
答案 0 :(得分:2)
更改一致性级别不会影响群集达成协议所需的时间。如果您的群集需要10秒钟,您的客户端可能只是达到默认超时而不是完全等待所有节点达成协议。有关此过程的详细信息,请查看Java Driver docs。
在应用程序之外,您可以使用nodetool describecluster
检查架构状态。这将显示特定节点是否不接受对架构的更改。这里有一些more information从运营商的角度解决架构分歧。
答案 1 :(得分:2)
自1.1+以来Cassandra中的模式更改(数据定义)是通过gossip完成的。由于它使用Gossip,它是一个独立的读/写路径,而不是典型的数据操作请求(SELECT,DELETE,INSERT等),因此这些操作没有可调整的一致性,因为八卦不能以可调整的一致性运行。从我链接的文章中,您可以看到在群集中宣布架构更改被动,此外,当您拥有在架构更改时无法访问的节点时,您可以获得架构不一致/解决方案。 / p>
您多久修改一次架构?正如您所看到的那样,虽然每个节点必须保持一致,但仍然是一个非常昂贵的操作,因为您可以看到架构更改。出于这个原因,应该避免Cassandra中频繁的模式更改(也就是动态列)。我很想知道模式的更改频率和原因,也许您可以重新构建以避免动态列/表以避免在Cassandra中进行昂贵的模式更改。