当前位置:  开发笔记 > 程序员 > 正文

cassandra分片和复制

如何解决《cassandra分片和复制》经验,为你挑选了1个好方法。

我是Cassandra的新手,虽然这篇文章解释了分片和复制,但我陷入了困境 -

我有一个群集,在我的本地计算机上配置了6个Cassandra节点.我创建了一个新的键空间"TestKeySpace",复制因子为6,键空间为"employee",主键为自动增量号,命名为RID.我无法理解如何对这些数据进行分区和复制.我想知道的是,因为我将复制因子保持为6,并且数据将分布在多个节点上,那么每个节点是否将具有与其他节点完全相同的数据?

如果我的群集具有以下配置:

    Number of nodes - 6 (n1, n2 ,n3, n4, n5 and n6).
    replication_factor - 3. 

如何确定任何一个节点(比如n1),其他两个节点复制数据以及哪些其他节点表现为不同的分片.

提前致谢.

此致,Vibhav

PS - 如果有人投票,这个问题请在评论中提到错误.



1> 小智..:

我将用简单的例子解释一下.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

....... 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).

希望这可以帮助.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有