我是Cassandra的新手,但我通过this Article解释了分片和复制,但我陷入了以下困境:

我有一个在本地计算机上配置了6个Cassandra节点的集群。我创建一个新的键空间“TestKeySpace”,其复制因子为6,并在键空间“employee”中创建一个表,主键为名为RID的自动递增编号。
我无法理解如何对这些数据进行分区和复制。我想知道的是,由于我将复制因子保持为6,并且数据将分布在多个节点上,那么每个节点是否将具有与其他节点完全相同的数据?

如果我的集群具有以下配置怎么办-

    Number of nodes - 6 (n1, n2 ,n3, n4, n5 and n6).
    replication_factor - 3.

我如何确定对于任何一个节点(假设为n1),在其他两个节点上复制数据以及哪些其他节点表现为不同的分片。

提前致谢。

问候,
维巴夫

PS-如果有人对此问题投反对票,请在评论中提及出现了什么问题。

最佳答案

我将用一个简单的例子对此进行解释。
cassandra中的键空间等效于RDBMS中的数据库模式名称。

首先创建一个键空间-

CREATE KEYSPACE MYKEYSPACE WITH REPLICATION = {
 'class' : 'SimpleStrategy',
 'replication_factor' : 3
};

让我们创建一个简单的表格-
CREATE TABLE USER_BY_USERID(
 userid int,
 name text,
 email text,
 PRIMARY KEY(userid, name)
) WITH CLUSTERING ORDER BY(name  DESC);

在此示例中,userid是您的分区键,名称是集群键。分区也称为行键,此键确定将在哪个节点行上保存。

您的第一个问题-



数据将根据您的分区键进行分区。默认情况下,C *使用Murmur3partitioner。您可以在cassandra.yaml配置文件中更改分区程序。分区的发生方式还取决于您的配置。您可以为每个节点指定 token 范围,例如,看看下面的cassandra.yaml配置文件。我已指定6个节点构成您的问题。

节点0的cassandra.yaml:
cluster_name: 'MyCluster'
initial_token: 0
seed_provider:
    - seeds:  "198.211.xxx.0"
listen_address: 198.211.xxx.0
rpc_address: 0.0.0.0
endpoint_snitch: RackInferringSnitch

节点1的cassandra.yaml:
cluster_name: 'MyCluster'
initial_token: 3074457345618258602
seed_provider:
    - seeds:  "198.211.xxx.0"
listen_address: 192.241.xxx.0
rpc_address: 0.0.0.0
endpoint_snitch: RackInferringSnitch

节点2的cassandra.yaml:
cluster_name: 'MyCluster'
initial_token: 6148914691236517205
seed_provider:
    - seeds:  "198.211.xxx.0"
listen_address: 37.139.xxx.0
rpc_address: 0.0.0.0
endpoint_snitch: RackInferringSnitch

....... Node3 ...... Node4 ....

节点5的cassandra.yaml:
cluster_name: 'MyCluster'
initial_token: {some large number}
seed_provider:
    - seeds:  "198.211.xxx.0"
listen_address: 37.139.xxx.0
rpc_address: 0.0.0.0
endpoint_snitch: RackInferringSnitch

让我们使用此插入语句-
INSERT INTO USER_BY_USERID VALUES(
 1,
 "Darth Veder",
 "darthveder@star-wars.com"
);

分区程序将计算PARTITION键的哈希值(在上面的示例中为userid-1),并确定将保存此行的节点。假设计算得出的哈希值是12345,该行将保存在节点0中(在上述配置中查找节点0的initial_token值)。

完整的cassandra.yaml配置configCassandra_yaml_r

您可以通过deployCalcTokens来了解如何生成 token 。

第二个问题-



根据您的复制策略和复制因子,数据将在每个节点上复制。您在创建键空间时必须指定复制因子和复制策略。
例如,在上面的示例中,我已使用SimpleStrategy作为复制策略。此策略适用于小型集群。对于地质分布的应用程序,可以使用NetworkTopologyStrategy。 plication_factor指定要创建的行的副本数,在此示例中,将创建每行的三个副本。通过简单的策略,cassandra将使用顺时针方向复制该行。

在上面的示例中,该行保存在Node0上,并且同一节点被复制到Node1和Node2上。
让我们再举一个例子-
INSERT INTO USER_BY_USERID VALUES(
 448454,
 "Obi wan kenobi",
 "obiwankenobi@star-wars.com"
);

对于用户ID 448454,计算出的哈希值为3074457345618258609,因此该行将保存在Node2(在上述配置中查找节点2的initial_token值),并按顺时针方向复制到Node3和Node4(记住,我们已指定复制)系数为3,因此只有三个副本Noe2,Node3,Node4)。

希望这可以帮助。

关于 Cassandra 分片和复制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41587806/

10-16 12:30