2016-02-19 71 views
1

我是Cassandra的新手,我发现主键和分区键是一样的。分区键如何工作?

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

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

由于分区键是负责数据分发翻过你的节点,如何将数据由username在这种情况下,如何分配?

+0

你可以在这里阅读关于主键和分区键的区别:http://stackoverflow.com/questions/24949676/difference-between-partition-key-composite-key-and-clustering-key-in-cassandra – grzesiekw

+0

请再读一遍我的问题 – farhawa

回答

2

其实,PRIMARY KEY是而不是与分区键一样。分区键是PRIMARY KEY的一部分。是的,它是决定如何在整个集群中分布行的部分。

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

如果我创建表,插入一些价值观和查询它,我可以通过使用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罗比斯特里克兰的Cassandra High Availability

Cassandra获取分区键的散列标记值(在这种情况下为user_name),并使用它来确定将该行显示分配给哪个节点。鉴于上述散列令牌值,而且我列出了范围,这些都是每个用户名应到节点:

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

根据复制因子(RF),卡珊德拉也可以将额外的复本在其他节点上的每一行。

1

你可以用nodetool getendpoints查看你的数据放在哪里。

下面是一个简单的例子。

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

我会用你的表用户提供了以下密钥空间CONFIGRATION:

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上。