假设,我打算用cassandra作为数据库来构建一个分布式系统。系统将在多个服务器上运行,例如服务器A,B,C,D,E等。每个服务器都有Cassandra实例,所有服务器都将形成一个集群。
在我假设的分布式系统中,X服务器总数应该处理用户请求。例如,服务器A,B,C,D,E中的3个应该处理来自用户uA的请求。每个应用程序都应使用精确的数据副本更新其Cassandra实例。例如,如果用户uA向用户uB发送消息,则每个应用程序应使用发送的消息的准确副本更新其数据库,并且按照预期,Cassandra应该从该点接管以确保所有节点都是最新的。
如何配置Cassandra以确保Cassandra在更新所有其他节点之前首先检查插入数据库的所有副本是否完全相同
Psst:请尽可能简单地解释。我是Cassandra的新手,从MySQL过来。提前谢谢
答案 0 :(得分:3)
每次在Cassandra中发生更改时,都会将其传递给所有相关节点(具有数据副本的节点)。但有时这种情况不会发生,因为节点出现故障或太忙,网络出现故障等等。
您要问的是如何从Cassandra或其他方面获得一致性,如何进行更改并保证下一次阅读具有最新信息。
在Cassandra中,您可以在每个查询中选择一致性,因此,如果您愿意,可以获得一致的数据。有多个一致性选项,但通常只使用:
ONE - 只有一个节点必须接受或接受更改。这意味着快速读/写,但一致性较低(如果您写入A,有人可以在B未读更新时读取)。
QUORUM - 51%的节点必须接受或接受更改。这意味着读取和写入速度不快,但如果在BOTH读写中使用它,则会获得完全一致性。这是因为如果超过一半的节点在插入/更新/删除后拥有数据,那么,当从超过一半的节点读取数据时,至少有一个节点将拥有最新的信息,这将是要传递的信息。 。 (如果您有3个节点ABC并且您写入A和B,则有人可以从C读取,但也可以从A或B读取,这意味着它将始终获得最新信息。)
Cassandra知道什么是最新信息,因为每次更改都有时间戳和最近的胜利。
您还有其他选项,例如ALL,这是不推荐使用的,因为它要求所有节点都已启动且可用。如果某个节点不可用,则表示系统已关闭。