我将用简单的例子来解释这一点。
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 个节点。
节点 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",
"[email protected]"
);
分区器将计算 PARTITION 键的哈希值(在上面的示例中为 userid - 1),并决定该行将保存在哪个节点。假设计算出的哈希值是 12345,该行将保存在节点 0 上(在上面的配置中查找 Node0 的initial_token 值)。
完整的cassandra.yaml配置配置Cassandra_yaml_r
你可以通过这个部署CalcTokens了解如何生成令牌。
第二个问题——
数据如何复制?
根据您的复制策略和复制因子,数据将在每个节点上复制。创建键空间时必须指定复制因子和复制策略。
例如,在上面的例子中,我使用了SimpleStrategy
作为复制策略。该策略适合小型集群。对于地质分布式应用程序,您可以使用NetworkTopologyStrategy
。 replication_factor 指定要创建一行的多少个副本,在本例中,每行将创建三个副本。通过简单的策略,cassandra 将使用顺时针方向复制行。
在上面的示例中,该行保存在 Node0 上,并且同一节点被复制到 Node1 和 Node2 上。
我们再举一个例子——
INSERT INTO USER_BY_USERID VALUES(
448454,
"Obi wan kenobi",
"[email protected]"
);
对于用户 id 448454,计算出的哈希值是 3074457345618258609,因此该行将保存在 Node2 上(在上面的配置中查找节点 2 的initial_token 值),并按顺时针方向复制到 Node3 和 Node4(记住我们已经指定了复制)因子为 3,因此只有三个副本(Noe2、Node3、Node4)。
希望这可以帮助。