我将用简单的例子来解释这一点。
cassandra 中的键空间相当于 RDBMS 中的数据库模式名称。
首先创建一个keyspace -
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 是您的分区键,名称是集群键。分区也叫row key,这个key决定了保存在哪个节点上。
你的第一个问题 -
我无法理解这些数据将如何分区?
数据将根据您的分区键进行分区。默认情况下,C* 使用Murmur3partitioner。您可以在 cassandra.yaml 配置文件中更改分区程序。分区如何发生,也取决于您的配置。您可以为每个节点指定令牌范围,例如查看下面的 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
.......节点3 ......节点4 ....
节点 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"
);
Partitioner 将计算 PARTITION 键的哈希值(在上面的示例中 userid - 1),并决定将保存该行的哪个节点。假设计算的哈希值是 12345,这一行将保存在节点 0(在上面的配置中查找节点 0 的 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)。
希望这会有所帮助。