我在Cassandra数据库上观看了一个video,它变得非常有效,并且真正解释了很多关于Cassandra的内容。我还准备了一些关于Cassandra的文章和书籍,但我无法理解的是Cassandra如何横向扩展。通过水平缩放,我的意思是添加更多节点以获得更多空间。 据我所知,每个节点都有相同的数据,即如果一个节点有1TB的数据并被复制到其他节点,这意味着所有n个节点都将包含1TB的数据。我在这里错过了什么吗?
答案 0 :(得分:10)
是的,你错过了一些东西。数据可能不需要重复 n 次,其中 n 是节点数。您通常会将复制因子(RF)配置为低于节点数(N)。
例如,RF = 3,N = 5.意味着每行将在5个节点中随机选择的3个节点(加上原始副本)重复3次。如果一个节点出现故障,则其他节点上的其他节点将有3个副本。
这在较大的群集中效果更好,例如RF = 5,N = 100.
更高的RF可提高数据冗余和读取速度,但会降低写入速度。因此,如果您的RF非常高,如RF = N,则可以实现平衡,您具有非常高的数据冗余,对节点故障的高弹性以及高读取吞吐量。另一方面,您的写入吞吐量将非常有限,因为数据需要复制到所有节点。如果在这种情况下一个节点发生故障,则写入可能会失败(取决于客户端配置),因为无法实现所需的复制因子。
答案 1 :(得分:2)
您要为每个分区(行/数据)存储的副本数(即相同数据)是可配置的。因此,如果您有n个节点,理论上可以将数据库设置为复制每个分区n次。然后,如果添加更多节点,则不会发生水平缩放。但是,如果将副本数设置为1或2,则每个节点有更多空间可以水平存储数据。然后,新数据可以进入新节点。但请记住,如果任何一组节点在特定时间出现故障,那么复制品数量会减少,您丢失数据的可能性就会增大。
答案 2 :(得分:1)
是的,很多。
复制的发生取决于密钥空间的复制因子。因此,如果复制因子为2,则将创建两个副本。在20节点集群中,这意味着只有3个节点将拥有一组数据,其他17个节点将拥有其余数据。
节点中的数据根据设置为聚类键的列中的数据进行划分。因此,在群集密钥列中具有相同数据的一组行将放置在单个节点中。这是为了确保一个查询只需要命中一个节点来完成查询。
答案 3 :(得分:1)
据我所知,每个节点都有相同的数据,即如果一个节点有1TB的数据并被复制到其他节点,这意味着所有n个节点都将包含1TB的数据。我在这里错过了什么吗?
是的,并非所有节点都必须是彼此的副本。根据我想要支持的可用性级别,我可以将复制因子设置为 lower 而不是节点总数。
假设我有一个复制因子为2的2节点集群。因此,在这种情况下,每个节点 都有一个完整的数据副本。如果我的磁盘用完了,我可以通过添加新节点来减轻其中的一部分,同时将复制因子设置为2(3个节点,RF为2)。
这样,如果每个磁盘都有1TB的存储空间,并且每个磁盘的容量为900GB,那么添加一个新节点(同时保持我的RF相同)会使每个节点只负责2/3的数据。因此,在这种情况下,每个节点将保存600GB的数据(在我的2个现有节点上释放300GB)。因此,我通过水平缩放来增加磁盘容量。
问题是即使我有3个节点,我也真的只能输掉其中一个节点。如果我丢失了两个节点,那么我无法提供查询。
答案 4 :(得分:0)
复制因子为3意味着群集中将有三个数据副本。复制因子还确定使用仲裁读/写时返回的节点数。仲裁读/写意味着查询将被发送到(RF / 2 + 1)。给定RF 3,查询将被发送到两个节点(小数总是向下舍入)。如果始终执行仲裁读取和写入,则始终会有一致的响应,因为副本集中至少有一个节点具有正在查询的数据。
从书Practical Cassandra开始,这意味着公式是RF / 2 +1 - 密钥空间的副本数量
答案 5 :(得分:0)
我认为缺少的部分是理解标记化。群集具有一系列令牌,该范围在节点之间划分以用于所有权。插入数据时,会为其分配一个令牌,用于确定其在群集中的位置。 (注意:这是主要的令牌放置,如果RF = 3,则群集中将存在另外两个存在该数据的位置。)
因此,如果您有9个节点,则您的令牌范围被划分为9个部分,并且数据被放置在9个节点上作为分配的令牌。但是,如果您的群集有90个节点,则令牌范围分为90个部分,数据将被分配并放置在90个节点上。
了解令牌和位置至关重要,不应与拓扑混淆。