分区键如何工作?

时间:2016-02-19 20:21:07

标签: indexing cassandra primary-key database-partitioning

我是Cassandra的新手,我读到主键和分区键是一样的。

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

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

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

2 个答案:

答案 0 :(得分:3)

实际上,PRIMARY KEY 与分区键相同。分区键是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还可能在其他节点上放置每行的其他副本。

答案 1 :(得分:1)

您可以使用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

'汤姆'将在127.0.0.3,127.0.0.4,127.0.0.5。