Cassandra DB:'replication_factor' 最终控制什么?
Cassandra DB: What ultimately does 'replication_factor' controls?
我想验证和测试'replication_factor'和Cassandra DB的一致性级别ONE。
我指定了一个集群:'MyCluster01',在两个数据中心有三个节点:RAC1 中的 DC1(node1, node2),RAC2 中的 DC2(node3)。
结构如下:
[root@localhost ~]# nodetool status
Datacenter: DC1
===============
Status=Up/Down |/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN 10.0.0.62 409.11 KB 256 ? 59bf9a73-45cc-4f9b-a14a-a27de7b19246 RAC1
UN 10.0.0.61 408.93 KB 256 ? b0cdac31-ca73-452a-9cee-4ed9d9a20622 RAC1
Datacenter: DC2
===============
Status=Up/Down |/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN 10.0.0.63 336.34 KB 256 ? 70537e0a-edff-4f48-b5db-44f623ec6066 RAC2
然后,我创建了一个键空间和 table,如下所示:
CREATE KEYSPACE my_check1 WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'};
create table replica_test(id uuid PRIMARY KEY);
After I inserted one record into that table:
insert into replica_test(id) values (uuid());
select * from replica_test;
id
--------------------------------------
5e6050f1-8075-4bc9-a072-5ef24d5391e5
我得到了那个记录。
但是当我停止节点1并在节点2和节点3中再次查询时,
none 的查询成功。
select * from replica_test;
Traceback (most recent call last): File "/usr/bin/cqlsh", line 997,
in perform_simple_statement
rows = self.session.execute(statement, trace=self.tracing_enabled) File
"/usr/share/cassandra/lib/cassandra-driver-internal-only-2.1.3.post.zip/cassandra-driver-2.1.3.post/cassandra/cluster.py",
line 1337, in execute
result = future.result(timeout) File "/usr/share/cassandra/lib/cassandra-driver-internal-only-2.1.3.post.zip/cassandra-driver-2.1.3.post/cassandra/cluster.py",
line 2861, in result
raise self._final_exception Unavailable: code=1000 [Unavailable exception] message="Cannot achieve consistency level ONE"
info={'required_replicas': 1, 'alive_replicas': 0, 'consistency':
'ONE'}
当 'nodetool status' 命令返回时:
UN 10.0.0.62 409.11 KB 256 ? 59bf9a73-45cc-4f9b-a14a-a27de7b19246 RAC1
DN 10.0.0.61 408.93 KB 256 ? b0cdac31-ca73-452a-9cee-4ed9d9a20622 RAC1
UN 10.0.0.63 336.34 KB 256 ? 70537e0a-edff-4f48-b5db-44f623ec6066 RAC2
当我尝试停止节点 2 时,让节点 1 和 3 保持活动状态;或者停止节点 3,保持节点 1 和 2 存活;错误也发生了。
那有什么问题呢,既然我觉得我已经满足了一致性级别,那么这条记录到底存在哪里呢?
NetworkTopologyStrategy
应该在跨多个 DC 复制时使用。
What ultimately does 'replication_factor' controls?
直接回答这个问题,复制因子 (RF) 控制存在于集群或数据中心 (DC) 中的每个数据分区的副本数。在您的例子中,您有 3 个节点,RF 为 1。这意味着当一行写入您的集群时,它仅存储在 1 个节点上。这也意味着你的集群无法承受单个节点的故障。
相比之下,考虑 3 节点集群上的 RF 3。这样的集群可以承受1或2个节点的故障,并且仍然能够支持对其所有数据的查询。
在所有节点都已启动且 运行 的情况下,尝试此命令:
nodetool getendpoints my_check1 replica_test 5e6050f1-8075-4bc9-a072-5ef24d5391e5
这将告诉您键 5e6050f1-8075-4bc9-a072-5ef24d5391e5
的数据驻留在哪个节点上。我的第一个想法是,您正在删除唯一具有此键的节点,然后尝试查询它。
我的第二个想法与卡洛在他的回答中所说的相呼应。您正在使用 2 个 DC,which is really not supported with the SimpleStrategy
。将 SimpleStrategy
与多个 DC 一起使用可能会产生不可预知的结果。同样对于多个 DC,您需要使用 NetworkTopologyStrategy
和默认 SimpleSnitch
以外的其他内容。否则 Cassandra 可能无法找到合适的节点来完成操作。
首先,re-create your keyspace and table with the NetworkTopologyStrategy
。然后将您的告密者(在 cassandra.yaml
中)更改为网络感知告密者,重新启动您的节点,然后再次尝试此练习。
我想验证和测试'replication_factor'和Cassandra DB的一致性级别ONE。
我指定了一个集群:'MyCluster01',在两个数据中心有三个节点:RAC1 中的 DC1(node1, node2),RAC2 中的 DC2(node3)。
结构如下:
[root@localhost ~]# nodetool status
Datacenter: DC1
===============
Status=Up/Down |/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN 10.0.0.62 409.11 KB 256 ? 59bf9a73-45cc-4f9b-a14a-a27de7b19246 RAC1
UN 10.0.0.61 408.93 KB 256 ? b0cdac31-ca73-452a-9cee-4ed9d9a20622 RAC1
Datacenter: DC2
===============
Status=Up/Down |/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN 10.0.0.63 336.34 KB 256 ? 70537e0a-edff-4f48-b5db-44f623ec6066 RAC2
然后,我创建了一个键空间和 table,如下所示:
CREATE KEYSPACE my_check1 WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'};
create table replica_test(id uuid PRIMARY KEY);
After I inserted one record into that table:
insert into replica_test(id) values (uuid());
select * from replica_test;
id
--------------------------------------
5e6050f1-8075-4bc9-a072-5ef24d5391e5
我得到了那个记录。
但是当我停止节点1并在节点2和节点3中再次查询时, none 的查询成功。
select * from replica_test;
Traceback (most recent call last): File "/usr/bin/cqlsh", line 997,
in perform_simple_statement
rows = self.session.execute(statement, trace=self.tracing_enabled) File
"/usr/share/cassandra/lib/cassandra-driver-internal-only-2.1.3.post.zip/cassandra-driver-2.1.3.post/cassandra/cluster.py",
line 1337, in execute
result = future.result(timeout) File "/usr/share/cassandra/lib/cassandra-driver-internal-only-2.1.3.post.zip/cassandra-driver-2.1.3.post/cassandra/cluster.py",
line 2861, in result
raise self._final_exception Unavailable: code=1000 [Unavailable exception] message="Cannot achieve consistency level ONE"
info={'required_replicas': 1, 'alive_replicas': 0, 'consistency':
'ONE'}
当 'nodetool status' 命令返回时:
UN 10.0.0.62 409.11 KB 256 ? 59bf9a73-45cc-4f9b-a14a-a27de7b19246 RAC1
DN 10.0.0.61 408.93 KB 256 ? b0cdac31-ca73-452a-9cee-4ed9d9a20622 RAC1
UN 10.0.0.63 336.34 KB 256 ? 70537e0a-edff-4f48-b5db-44f623ec6066 RAC2
当我尝试停止节点 2 时,让节点 1 和 3 保持活动状态;或者停止节点 3,保持节点 1 和 2 存活;错误也发生了。
那有什么问题呢,既然我觉得我已经满足了一致性级别,那么这条记录到底存在哪里呢?
NetworkTopologyStrategy
应该在跨多个 DC 复制时使用。
What ultimately does 'replication_factor' controls?
直接回答这个问题,复制因子 (RF) 控制存在于集群或数据中心 (DC) 中的每个数据分区的副本数。在您的例子中,您有 3 个节点,RF 为 1。这意味着当一行写入您的集群时,它仅存储在 1 个节点上。这也意味着你的集群无法承受单个节点的故障。
相比之下,考虑 3 节点集群上的 RF 3。这样的集群可以承受1或2个节点的故障,并且仍然能够支持对其所有数据的查询。
在所有节点都已启动且 运行 的情况下,尝试此命令:
nodetool getendpoints my_check1 replica_test 5e6050f1-8075-4bc9-a072-5ef24d5391e5
这将告诉您键 5e6050f1-8075-4bc9-a072-5ef24d5391e5
的数据驻留在哪个节点上。我的第一个想法是,您正在删除唯一具有此键的节点,然后尝试查询它。
我的第二个想法与卡洛在他的回答中所说的相呼应。您正在使用 2 个 DC,which is really not supported with the SimpleStrategy
。将 SimpleStrategy
与多个 DC 一起使用可能会产生不可预知的结果。同样对于多个 DC,您需要使用 NetworkTopologyStrategy
和默认 SimpleSnitch
以外的其他内容。否则 Cassandra 可能无法找到合适的节点来完成操作。
首先,re-create your keyspace and table with the NetworkTopologyStrategy
。然后将您的告密者(在 cassandra.yaml
中)更改为网络感知告密者,重新启动您的节点,然后再次尝试此练习。