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)。
希望这对您有所帮助。
我是 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)。
希望这对您有所帮助。