仅在 cassandra 集群的一个数据中心插入行
Insert rows only in one datacenter in cassandra cluster
出于某些测试目的,我想破坏由两个数据中心组成的测试 cassandra 集群中数据的一致性。
我假设如果我使用等于 LOCAL_QUORUM
或 LOCAL_ONE
的一致性级别,我将实现这一目标。假设我有一个 cassandra 节点 node11
属于 DC1
:
cqlsh node11
CONSISTENCY LOCAL_QUORUM;
INSERT INTO test.test (...) VALUES (...) ;
但实际上,数据出现在所有节点中。即使一致性级别LOCAL_*
,我也可以从属于DC2
的node22
读取它。我仔细检查过:nodetool
向我显示了两个数据中心,node11
肯定属于 DC1
,而 node22
属于 DC2
。
我的键空间test
配置如下:
CREATE KEYSPACE "test"
WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'dc1' : 2, 'dc2' : 2};
我每个DC分别有两个节点
我的问题:
在我看来,我错误地理解了这些一致性级别的概念。事实上,它们并不阻止将数据写入不同的 DC,而只是要求数据至少出现在当前数据中心。理解正确吗?
更重要的是:当我将不同的数据存储在 一个 [=] 内的两个数据中心时,是否有任何方法可以执行这样的技巧并实现这样的 "broken" 一致性? =48=]集群?
(目前我认为实现这一目标的唯一方法是打破环路,不允许来自一个 DC 的节点知道来自另一个 DC 的节点的任何信息,但我不喜欢这个解决方案) .
- LOCAL_QUORUM,此一致性级别需要从本地 DC 收到的确认的法定人数,但所有数据都发送到密钥空间中定义的所有节点。
Even at low consistency levels, the write is still sent to all
replicas for the written key, even replicas in other data centers. The
consistency level just determines how many replicas are required to
respond that they received the write.
https://docs.datastax.com/en/archived/cassandra/2.0/cassandra/dml/dml_config_consistency_c.html
- 我认为没有正确的方法可以做到这一点
此建议仅用于测试场景,以打破 2 个 DC 之间的数据一致性。 (没试过,但根据我的理解应该可以)
- 以本地*一致性在一个 DC(比如 DC1)中写入数据
- 在写入之前,保持 DC2 中的节点关闭,以便 DC1 将在 DC2 节点关闭时存储提示。
- 让 max_hint_window_in_ms(默认为 3 小时 - 您可以缩短)时间过去,以便 DC1 协调员删除所有提示
- 启动 DC2 节点并使用 LOCAL* 查询进行查询,来自 DC1 的数据将不会出现在 DC2 中。
您可以重复这些步骤并在 DC2 中插入具有不同值的数据以保持 DC1 不变,这样相同的数据在 DC1 和 DC2 中将具有不同的值。
出于某些测试目的,我想破坏由两个数据中心组成的测试 cassandra 集群中数据的一致性。
我假设如果我使用等于 LOCAL_QUORUM
或 LOCAL_ONE
的一致性级别,我将实现这一目标。假设我有一个 cassandra 节点 node11
属于 DC1
:
cqlsh node11
CONSISTENCY LOCAL_QUORUM;
INSERT INTO test.test (...) VALUES (...) ;
但实际上,数据出现在所有节点中。即使一致性级别LOCAL_*
,我也可以从属于DC2
的node22
读取它。我仔细检查过:nodetool
向我显示了两个数据中心,node11
肯定属于 DC1
,而 node22
属于 DC2
。
我的键空间test
配置如下:
CREATE KEYSPACE "test"
WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'dc1' : 2, 'dc2' : 2};
我每个DC分别有两个节点
我的问题:
在我看来,我错误地理解了这些一致性级别的概念。事实上,它们并不阻止将数据写入不同的 DC,而只是要求数据至少出现在当前数据中心。理解正确吗?
更重要的是:当我将不同的数据存储在 一个 [=] 内的两个数据中心时,是否有任何方法可以执行这样的技巧并实现这样的 "broken" 一致性? =48=]集群?
(目前我认为实现这一目标的唯一方法是打破环路,不允许来自一个 DC 的节点知道来自另一个 DC 的节点的任何信息,但我不喜欢这个解决方案) .
- LOCAL_QUORUM,此一致性级别需要从本地 DC 收到的确认的法定人数,但所有数据都发送到密钥空间中定义的所有节点。
Even at low consistency levels, the write is still sent to all replicas for the written key, even replicas in other data centers. The consistency level just determines how many replicas are required to respond that they received the write.
https://docs.datastax.com/en/archived/cassandra/2.0/cassandra/dml/dml_config_consistency_c.html
- 我认为没有正确的方法可以做到这一点
此建议仅用于测试场景,以打破 2 个 DC 之间的数据一致性。 (没试过,但根据我的理解应该可以)
- 以本地*一致性在一个 DC(比如 DC1)中写入数据
- 在写入之前,保持 DC2 中的节点关闭,以便 DC1 将在 DC2 节点关闭时存储提示。
- 让 max_hint_window_in_ms(默认为 3 小时 - 您可以缩短)时间过去,以便 DC1 协调员删除所有提示
- 启动 DC2 节点并使用 LOCAL* 查询进行查询,来自 DC1 的数据将不会出现在 DC2 中。
您可以重复这些步骤并在 DC2 中插入具有不同值的数据以保持 DC1 不变,这样相同的数据在 DC1 和 DC2 中将具有不同的值。