【问题标题】:cassandra sharding and replicationcassandra 分片和复制
【发布时间】:2017-05-26 01:30:18
【问题描述】:

我是 Cassandra 的新手,虽然 this Article 解释了分片和复制,但我被困在一个点上 -

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

如果我的集群有以下配置怎么办 -

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

我如何确定对于任何一个节点(比如说 n1),数据在哪些其他两个节点上被复制,以及哪些其他节点表现为不同的分片。

提前致谢。

问候, 维巴夫

PS - 如果有人反对这个问题,请在 cmets 中提及问题所在。

【问题讨论】:

    标签: cassandra replication database-replication sharding


    【解决方案1】:

    我将用简单的例子来解释这一点。 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)。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2019-01-18
      • 2019-03-26
      • 2013-11-12
      • 2013-12-14
      相关资源
      最近更新 更多