分区键如何工作?
How do partition keys work?
我是 Cassandra 的新手,我读到主键与分区键是一回事。
我的问题很简单,在这种情况下:
CREATE TABLE users (
user_name varchar PRIMARY KEY,
password varchar,
gender varchar,
session_token varchar,
state varchar,
birth_year bigint
);
由于分区键负责跨节点的数据分发,在这种情况下username
将如何分发数据?
实际上,PRIMARY KEY 与分区键不相同。分区键是 PRIMARY KEY 的一部分。是的,它是决定一行如何在集群中分布的部分。
how will the data be distributed by username in this case?
如果我创建你的 table,插入一些值并查询它,我可以通过在我的 SELECT:
> 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 还可能将每一行的额外副本放置在其他节点上。
您可以使用 nodetool getendpoints
.
检查您的数据将放置在何处
下面是一个简单的例子。
我在这里 ccm
创建我的集群 - https://github.com/pcmanus/ccm.
我将使用具有以下键空间配置的 table 用户:
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
'john' 将在 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 上。
我是 Cassandra 的新手,我读到主键与分区键是一回事。
我的问题很简单,在这种情况下:
CREATE TABLE users (
user_name varchar PRIMARY KEY,
password varchar,
gender varchar,
session_token varchar,
state varchar,
birth_year bigint
);
由于分区键负责跨节点的数据分发,在这种情况下username
将如何分发数据?
实际上,PRIMARY KEY 与分区键不相同。分区键是 PRIMARY KEY 的一部分。是的,它是决定一行如何在集群中分布的部分。
how will the data be distributed by username in this case?
如果我创建你的 table,插入一些值并查询它,我可以通过在我的 SELECT:
> 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 还可能将每一行的额外副本放置在其他节点上。
您可以使用 nodetool getendpoints
.
下面是一个简单的例子。
我在这里 ccm
创建我的集群 - https://github.com/pcmanus/ccm.
我将使用具有以下键空间配置的 table 用户:
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
'john' 将在 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 上。