Cassandra 分片和复制

cassandra sharding and replication

我是 Cassandra 的新手,虽然 this Article 解释了分片和复制,但我被困在了一个点上 -

我在本地机器上配置了一个包含 6 个 Cassandra 节点的集群。我创建了一个新的键空间 "TestKeySpace",复制因子为 6,键空间 "employee" 中有一个 table,主键是名为 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 
};

让我们创建一个简单的 table -

CREATE TABLE USER_BY_USERID(
 userid int,
 name text,
 email text,
 PRIMARY KEY(userid, name)
) WITH CLUSTERING ORDER BY(name  DESC);

在此示例中,userid 是您的分区键,名称是集群键。 Partition也叫row key,这个key决定了在哪个节点上保存行。

你的第一个问题 -

I am not able to understand how this data will be partitioned?

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

cassandra.yaml 节点 0:

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

cassandra.yaml 节点 1:

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

cassandra.yaml 对于节点 2:

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

.......节点 3 ......节点 4 ....

cassandra.yaml 节点 5:

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"
);

Partitioner 会计算PARTITION 键的hash(在上面的例子中userid - 1),并决定这一行将保存在哪个节点。假设计算出的哈希值是 12345,该行将保存在节点 0(在上述配置中查找节点 0 的 initial_token 值)。

完成cassandra.yaml配置configCassandra_yaml_r

你可以通过这个deployCalcTokens了解如何生成令牌。

第二个问题 -

how data gets replicated?

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

在上面的示例中,行保存在 Node0 上,同一节点被复制到 Node1 和 Node2 上。 再举个例子-

INSERT INTO USER_BY_USERID VALUES(
 448454,
 "Obi wan kenobi",
 "obiwankenobi@star-wars.com"
);

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

希望这对您有所帮助。