我是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),复制数据的其他两个节点以及哪些其他节点表现为不同的分片。
先谢谢。
此致 Vibhav
PS - 如果有人投票,这个问题请在评论中提及出错的地方。
答案 0 :(得分:10)
我将用简单的例子来解释这个。 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配置文件中更改分区程序。分区的发生方式也取决于您的配置。您可以为每个节点指定令牌范围,例如,查看下面的cassandra.yaml配置文件。我已经在你的问题中指定了6个节点。
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(在上面的配置中查找Node0的initial_token值)。
完成cassandra.yaml配置configCassandra_yaml_r
您可以通过此deployCalcTokens了解如何生成令牌。
第二个问题 -
如何复制数据?
根据您的复制策略和复制因素,数据将在每个节点上进行复制。您必须在创建密钥空间时指定复制因子和复制策略。
例如,在上面的示例中,我使用SimpleStrategy
作为复制策略。该策略适用于小型集群。对于地理分布式应用程序,您可以使用NetworkTopologyStrategy
。 replication_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)。
希望这有帮助。