了解Cassandra中单个分区的读取

时间:2017-12-26 11:18:08

标签: apache cassandra cassandra-3.0

我有一个3节点设置,Node1(172.30.56.60),Node2(172.30.56.61)和Node3(172.30.56.62), 它具有100K的单个分区数据,该分区由nodeip构成 请找到nodeip的令牌/分区值 - 172.30.56.60

cqlsh:qnapstat> SELECT token(nodeip) FROM nodedata WHERE nodeip = '172.30.56.60' LIMIT 5; 

 system.token(nodeip)
----------------------
   222567180698744628
   222567180698744628
   222567180698744628
   222567180698744628
   222567180698744628

根据下面提供的./nodetool环值,'172.30.56.60'仅将数据返回给协调器,因为从节点172.30.56.60处理从173960939250606057到239923324758894350的值。 注意:这是我的理解

172.30.56.60  rack1       Up     Normal  32.72 MiB       100.00%             173960939250606057                          
172.30.56.62  rack1       Up     Normal  32.88 MiB       100.00%             239923324758894351                          
172.30.56.61  rack1       Up     Normal  32.84 MiB       100.00%             253117576269706963                          
172.30.56.60  rack1       Up     Normal  32.72 MiB       100.00%             273249439554531014                          
172.30.56.61  rack1       Up     Normal  32.84 MiB       100.00%             295635292275517104                          
172.30.56.62  rack1       Up     Normal  32.88 MiB       100.00%             301162927966816823                          

我在这里有两个问题,

1)当我尝试执行以下查询时,是否意味着Coordinator(比如172.30.56.61)读取172.30.56.60中的所有数据?

2)在收到协调器中的所有100个K条目之后,协调器是否会执行100K的聚合,如果是,它会将所有100K条目保存在172.30.56.61的内存中吗?

SELECT Max(readiops) FROM nodedata WHERE nodeip = '172.30.56.60';

谢谢, 哈利

1 个答案:

答案 0 :(得分:4)

有一个很好的工具叫做 CQL TRACING ,它可以帮助你在执行SELECT查询后理解和查看事件流。

cqlsh> INSERT INTO test.nodedata (nodeip, readiops) VALUES (1, 10);
cqlsh> INSERT INTO test.nodedata (nodeip, readiops) VALUES (1, 20);
cqlsh> INSERT INTO test.nodedata (nodeip, readiops) VALUES (1, 30);
cqlsh> select * from test.nodedata ;

 nodeip | readiops   
--------+-----------
      1 |        10 
      1 |        20 
      1 |        30 

(3 rows)
cqlsh> SELECT MAX(readiops) FROM test.nodedata WHERE nodeip = 1;

 system.max(readiops)
-----------------------
                   30

(1 rows)

现在让我们设置cqlsh> TRACING ON并再次运行相同的查询。

cqlsh> TRACING ON
Now Tracing is enabled
cqlsh> SELECT MAX(readiops) FROM test.nodedata WHERE nodeip = 1;

 system.max(readiops)
----------------------
                   30

(1 rows)

Tracing session: 4d7bf970-eada-11e7-a79d-000000000003


 activity                                                                                                                                                        | timestamp                  | source       | source_elapsed
-----------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+--------------+----------------
                                                                                                                                              Execute CQL3 query | 2017-12-27 07:48:44.404000 | 172.16.0.128 |              0
                                                                                                        read_data: message received from /172.16.0.128 [shard 4] | 2017-12-27 07:48:44.385109 |  172.16.0.48 |              9
                                                                                       read_data handling is done, sending a response to /172.16.0.128 [shard 4] | 2017-12-27 07:48:44.385322 |  172.16.0.48 |            222
                                                                                                                                   Parsing a statement [shard 1] | 2017-12-27 07:48:44.404821 | 172.16.0.128 |             --
                                                                                                                                Processing a statement [shard 1] | 2017-12-27 07:48:44.404913 | 172.16.0.128 |             93
 Creating read executor for token 6292367497774912474 with all: {172.16.0.128, 172.16.0.48, 172.16.0.115} targets: {172.16.0.48} repair decision: NONE [shard 1] | 2017-12-27 07:48:44.404966 | 172.16.0.128 |            146
                                                                                                          read_data: sending a message to /172.16.0.48 [shard 1] | 2017-12-27 07:48:44.404972 | 172.16.0.128 |            152
                                                                                                             read_data: got response from /172.16.0.48 [shard 1] | 2017-12-27 07:48:44.405497 | 172.16.0.128 |            676
                                                                                                                  Done processing - preparing a result [shard 1] | 2017-12-27 07:48:44.405535 | 172.16.0.128 |            715
                                                                                                                                                Request complete | 2017-12-27 07:48:44.404722 | 172.16.0.128 |            722

关于你的问题:

  1. 协调员将查询传递给副本(如果RF = 1或(RF > 1CL=ONE),而不是从1个副本接收回复,但if({ {1}}和RF > 1),而不是需要从多个副本接收回复并比较答案,因此协调员方面也进行了编排。 它实际完成的方式是对最快的副本(使用snitch)的数据请求和对满足CL所需的其他副本的摘要请求。 然后协调员需要对来自数据和摘要请求的响应进行哈希处理并进行比较。 如果将分区散列到特定节点,它将驻留在该节点中(假设RF = 1),并且只从该节点读取信息。

  2. 客户端使用查询发送页面大小,因此回复本身以批量(默认值= 5000)返回,可以从客户端设置。

  3. 我建议您在Cassandra读取路径上观看此youtube剪辑以获取更多详细信息。