【问题标题】:How do partition keys work?分区键如何工作?
【发布时间】:2016-02-19 20:21:07
【问题描述】:

我是 Cassandra 的新手,我读到主键与分区键相同。

我的问题很简单,在这种情况下:

CREATE TABLE users (
  user_name varchar PRIMARY KEY,
  password varchar,
  gender varchar,
  session_token varchar,
  state varchar,
  birth_year bigint
);

由于分区键负责跨节点分发数据,在这种情况下,username 将如何分发数据?

【问题讨论】:

标签: indexing cassandra primary-key database-partitioning


【解决方案1】:

实际上,PRIMARY KEY不与分区键相同。分区键是主键的一部分。是的,它是决定行如何在集群中分布的部分。

在这种情况下,用户名如何分配数据?

如果我创建你的表,插入一些值并查询它,我可以通过在我的 SELECT 中使用 token 函数来获得一些分配过程的窗口:

> SELECT token(user_name), user_name FROM user2;

 system.token(user_name) | user_name
-------------------------+-----------
    -5077180869401877077 |   Patdard
    -4874582970682694928 |      Robo
     4639906948852899531 |      Bill
     4645660266327417866 |       Bob
     4877648712764681009 | Valentina
     5726383012007749221 |   Helcine
     7724711996172375448 |  Jebediah

(7 rows)

假设我有 5 个节点。在 Cassandra 中,每个节点负责一个主令牌范围。让我们假设以下内容:

1)  5534023222112865485 to -9223372036854775808
2) -9223372036854775807 to -5534023222112865485
3) -5534023222112865484 to -1844674407370955162
4) -1844674407370955161 to  1844674407370955161
5)  1844674407370955161 to  5534023222112865484

注意:通过运行计算的范围:

python -c 'print [str(((2**64 / 5) * i) - 2**63) for i in range(5)]'

在 MVP Robbie Strickland 的Cassandra High Availability中也有这种描述。

Cassandra 获取分区键的散列令牌值(在本例中为user_name)并使用它来确定行显示分配到哪个节点。鉴于上面的哈希标记值,以及我列出的范围,这些是每个用户名应该去的节点:

Node 1: Helcine, Jebediah
Node 3: Patdard, Robo
Node 5: Bill, Bob, Valentina

根据您的复制因子 (RF),Cassandra 还可能将每行的额外副本放置在其他节点上。

【讨论】:

    【解决方案2】:

    您可以使用nodetool getendpoints检查您的数据将放置在哪里。

    下面是简单的例子。

    我在这里使用ccm 来创建我的集群 - https://github.com/pcmanus/ccm。

    我将通过以下键空间配置使用您的表用户:

    CREATE KEYSPACE test_user WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};
    

    所以会有3个副本。

    首先我创建有 5 个节点的集群:

    > ccm create -v 3.2 -n 5 test
    

    启动它们:

    > ccm start
    

    并检查我的集群是否启动并运行:

    > ccm status                                   
    
    Cluster: 'test'
    ---------------
    node1: UP
    node3: UP
    node2: UP
    node5: UP
    node4: UP
    

    现在我可以使用nodetool getendpoints 来检查数据的放置位置:

    > ccm node1 nodetool getendpoints test_user users john;    
    
    127.0.0.1
    127.0.0.2
    127.0.0.3
    

    “约翰”将在 127.0.0.1、127.0.0.2、127.0.0.3 上。

    > ccm node1 nodetool getendpoints test_user users tom; 
    
    127.0.0.3
    127.0.0.4
    127.0.0.5
    

    “tom”将在 127.0.0.3、127.0.0.4、127.0.0.5 上。

    【讨论】:

      猜你喜欢
      • 2018-01-16
      • 1970-01-01
      • 2017-05-19
      • 2017-03-20
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多