首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >空白新Cassandra集群中的令牌平衡

空白新Cassandra集群中的令牌平衡
EN

Stack Overflow用户
提问于 2019-10-20 03:23:56
回答 2查看 236关注 0票数 1

我的设置由3个Cassandra节点组成。每个节点都作为docker容器的一部分运行。

一个种子节点和两个普通节点。

我使用的是cassandra:latest,这意味着现在的版本是3.11.4。

所有节点都在一个集群中运行。

所有节点都在一个数据中心运行。

我在docker-compose.yml中使用以下设置

代码语言:javascript
复制
- "CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch"
- "CASSANDRA_NUM_TOKENS=8"
- "MAX_HEAP_SIZE=512M"
- "HEAP_NEWSIZE=128M"

Heap-size之所以如此小,是因为它只测试集群的开始,而我的笔记本没有足够的ram。分区程序是cassandra的默认Murmur3Partitioner

我只启动了集群,没有创建the start或者其他东西。

在我发现的每个文档中,都有关于平衡令牌范围和不平衡令牌分布的陈述,等等。

但是什么是平衡的标记范围呢?

当我启动集群时,首先是种子容器,每隔1分钟,其他节点就会启动并准备就绪。

群集运行状况良好,日志中没有错误。作为docker-compose ps描述的结果:

代码语言:javascript
复制
         Name                        Command               State                                Ports
----------------------------------------------------------------------------------------------------------------------------------
docker_cassandra-seed_1   docker-entrypoint.sh bash  ...   Up      7000/tcp, 7001/tcp, 7199/tcp, 0.0.0.0:23232->9042/tcp, 9160/tcp
docker_cassandra1_1       docker-entrypoint.sh bash  ...   Up      7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp
docker_cassandra2_1       docker-entrypoint.sh bash  ...   Up      7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp

如果群集已启动,则有3个节点在每个节点上运行8个vnode。它是一个包含24个令牌范围的群集分布。

Cassandra中的内标识范围是-2^63到+2^63 -1 (java long)。如果我调用一个

docker exec -ti docker_cassandra-seed_1 nodetool ring

我收到以下结果。

代码语言:javascript
复制
docker exec -ti docker_cassandra-seed_1 nodetool ring

Datacenter: tc1
==========
Address     Rack        Status State   Load            Owns                Token

172.27.0.3  rack1       Up     Normal  254.57 KiB      88.87%              -8870864291163548206
172.27.0.4  rack1       Up     Normal  231.07 KiB      55.89%              -8804151848356105327
172.27.0.2  rack1       Up     Normal  220.44 KiB      55.24%              -8578084366820530367
172.27.0.4  rack1       Up     Normal  231.07 KiB      55.89%              -7746741366682664202
172.27.0.4  rack1       Up     Normal  231.07 KiB      55.89%              -7013522326538302096
172.27.0.3  rack1       Up     Normal  254.57 KiB      88.87%              -6994428155886831685
172.27.0.2  rack1       Up     Normal  220.44 KiB      55.24%              -6650863707982675450
172.27.0.4  rack1       Up     Normal  231.07 KiB      55.89%              -5995004048488281144
172.27.0.4  rack1       Up     Normal  231.07 KiB      55.89%              -5683587085031530885
172.27.0.4  rack1       Up     Normal  231.07 KiB      55.89%              -5274940575732780430
172.27.0.3  rack1       Up     Normal  254.57 KiB      88.87%              -5184169415607375486
172.27.0.2  rack1       Up     Normal  220.44 KiB      55.24%              -2082614198258325552
172.27.0.3  rack1       Up     Normal  254.57 KiB      88.87%              -1084866128895283137
172.27.0.2  rack1       Up     Normal  220.44 KiB      55.24%              2495470503021543046
172.27.0.3  rack1       Up     Normal  254.57 KiB      88.87%              3043280549254813456
172.27.0.4  rack1       Up     Normal  231.07 KiB      55.89%              3058642754102082410
172.27.0.2  rack1       Up     Normal  220.44 KiB      55.24%              3117172086630093502
172.27.0.3  rack1       Up     Normal  254.57 KiB      88.87%              3405798334726690865
172.27.0.2  rack1       Up     Normal  220.44 KiB      55.24%              3829479365384141235
172.27.0.2  rack1       Up     Normal  220.44 KiB      55.24%              4124513942316551627
172.27.0.2  rack1       Up     Normal  220.44 KiB      55.24%              4807293191442647176
172.27.0.4  rack1       Up     Normal  231.07 KiB      55.89%              4911525338969505185
172.27.0.3  rack1       Up     Normal  254.57 KiB      88.87%              8068956543491535994
172.27.0.3  rack1       Up     Normal  254.57 KiB      88.87%              8197176123795617738

这意味着环中每个令牌范围之间的差异是完全不同的。

或者换句话说,这是计算理想令牌分布中每个节点的((2^63 * 2) - 1) / (3 * 8) = 768.614.336.404.564.000令牌的完美情况。

对不起,我在这里只擅长快速计算(大约1000秒):

代码语言:javascript
复制
-9.223.372.036.854.770.000  Long Min
-8.870.864.291.163.540.000  352.507.745.691.229.000
-8.804.151.848.356.100.000  66.712.442.807.440.400
-8.578.084.366.820.530.000  226.067.481.535.570.000
-7.746.741.366.682.660.000  831.343.000.137.870.000
-7.013.522.326.538.300.000  733.219.040.144.359.000
-6.994.428.155.886.830.000  19.094.170.651.470.800
-6.650.863.707.982.670.000  343.564.447.904.160.000
-5.995.004.048.488.280.000  655.859.659.494.390.000
-5.683.587.085.031.530.000  311.416.963.456.750.000
-5.274.940.575.732.780.000  408.646.509.298.750.000
-5.184.169.415.607.370.000  90.771.160.125.410.300
-2.082.614.198.258.320.000  3.101.555.217.349.050.000
-1.084.866.128.895.280.000  997.748.069.363.040.000
2.495.470.503.021.540.000   3.580.336.631.916.820.000
3.043.280.549.254.810.000   547.810.046.233.270.000
3.058.642.754.102.080.000   15.362.204.847.269.900
3.117.172.086.630.090.000   58.529.332.528.010.200
3.405.798.334.726.690.000   288.626.248.096.600.000
3.829.479.365.384.140.000   423.681.030.657.450.000
4.124.513.942.316.550.000   295.034.576.932.410.000
4.807.293.191.442.640.000   682.779.249.126.090.000
4.911.525.338.969.500.000   104.232.147.526.860.000
8.068.956.543.491.530.000   3.157.431.204.522.030.000
8.197.176.123.795.610.000   128.219.580.304.080.000
9.223.372.036.854.770.000   Long Max

右列描述了每个令牌范围的分布。这是最大和最小令牌范围之间的巨大差距。

或者是一点合并(从结果的中间开始),完全不均匀或不平衡或不分布:

代码语言:javascript
复制
-5184169415607375486
-2082614198258325552
-1084866128895283137

经过一些测试,我已经设置了一个非常简单的东西。一台个人电脑(装有ubuntu18.04,java 1.8.0_201,cassandra version3.6)。安装,将所有参数设为默认值,启动cassandra服务并查看令牌分发。

下面是结果:tokendistribution on a new cluster

所以我的问题是:什么是Cassandra集群中平衡的token-range?

EN

回答 2

Stack Overflow用户

发布于 2019-10-21 20:52:13

正如这个链接https://thelastpickle.com/blog/2019/02/21/set-up-a-cluster-with-even-token-distribution.html中所描述的,它似乎是解决方案,至少对于密钥空间的令牌和数据的分发来说是这样的。为了获得一个平衡的系统,我采取了以下步骤:

让另一个参数作为default

  • startup
  1. cassandra.yaml,为种子节点设置种子节点(对于我的测试用例num_tokens=8),等待,直到准备就绪,通过cqlsh或编程解决方案连接,并创建密钥空间(对于我的测试案例,使用replication-factor=1).
  2. shutdown,seed-node
  3. edit种子节点的cassandra.yaml,并输出/添加种子节点的seed-node
  4. edit参数,然后等待,直到节点准备就绪,然后编辑群集中第二个节点的cassandra.yaml。请执行步骤5。在此文件中,num_token等于seed-node.
  5. run的num_token。第二个节点可以等待,直到它准备就绪
  6. 对群集中的任何其他节点执行步骤7-8。

有了这一点,例如在键空间的测试表中添加2.000.000个数据行的测试运行,我看到了以下结果:

代码语言:javascript
复制
docker exec -ti docker_cassandra-seed_1 nodetool status
Datacenter: tc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address      Load       Tokens       Owns (effective)  Host ID                               Rack
UN  172.30.10.4  36.03 MiB  8            33.3%             1e0d781f-d71f-4704-bcd1-efb5d4caff0e  rack1
UN  172.30.10.2  36.75 MiB  8            33.3%             56287b3c-b0f1-489f-930e-c7b00df896f3  rack1
UN  172.30.10.3  36.03 MiB  8            33.3%             943acc5f-7257-414a-b36c-c06dcb53e67d  rack1

甚至令牌分布也比以前更好:

代码语言:javascript
复制
172.30.10.2                         6.148.914.691.236.510.000
172.30.10.3                         6.148.914.691.236.520.000
172.30.10.4                         5.981.980.531.853.070.000

目前,关于不均匀分布的问题有一些澄清,因此再次感谢Chris Lohfink与解决方案的链接。

票数 2
EN

Stack Overflow用户

发布于 2019-10-22 03:58:58

我在上面的场景中做了一些测试。我的测试集群由5个节点组成(1个种子节点,4个普通节点)。

上面的前5个步骤仍然有效:

  1. 为种子节点设置cassandra.yaml (对于我的测试用例num_tokens=8)让另一个参数作为默认的
  2. 启动种子节点,等待ready
  3. 通过cqlsh或编程解决方案连接并创建密钥空间(对于我的测试用例,复制因子=1)。
  4. 关闭种子节点,编辑种子节点的cassandra.yaml并输出注释/添加用于

种子节点的参数,然后等待节点准备就绪

然后,您可以同时启动所有其他节点(在我的示例中为4) (或者在每个节点启动之间延迟1分钟),但是自动启动的。重要的是,所有节点都设置了allocate_tokens_for_keyspace: [your_keyspace....]

在所有节点都打开并填入1.000.000行后,就会有20%的均衡。

如果你启动一个有很多节点的集群,这个场景会让你的生活变得更容易。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58467244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档