gpt4 book ai didi

docker - 空白新 Cassandra-Cluster 中的代币平衡

转载 作者:行者123 更新时间:2023-12-02 19:02:08 25 4
gpt4 key购买 nike

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

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

我使用 cassandra:latest,这意味着此时版本为 3.11.4。

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

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

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

- "CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch"
- "CASSANDRA_NUM_TOKENS=8"
- "MAX_HEAP_SIZE=512M"
- "HEAP_NEWSIZE=128M"

堆大小是如此之小,因为它只测试集群的开始并且我的笔记本没有足够的内存。
partitioner 是 cassandra 的默认 Murmur3Partitioner

我只启动集群,没有创建 key 空间或其他事情。

在我发现的每个文档中,都有关于平衡 token 范围和不平衡 token 分布不好等的声明。

但是什么是平衡的 token 范围?

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

集群运行状况良好,日志中没有错误。 docker-compose ps 的结果描述为:
         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 的集群分布,始终具有 24 个 token 范围。

Cassandra 中的 token 范围是 -2^63 到 +2^63 - 1(java long)。
如果我调用
docker exec -ti docker_cassandra-seed_1 nodetool ring
我收到以下结果。
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

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

或者换句话说,理想的 token 分布中每个节点的 ((2^63 * 2) - 1) / (3 * 8) = 768.614.336.404.564.000 token 计算的完美案例。

抱歉,我在这里只擅长快速计算(大约 10000 秒):
-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


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

或稍微合并(从结果的中间)完全不均匀或不平衡或不分布:
-5184169415607375486
-2082614198258325552
-1084866128895283137

经过一些测试,我设置了一个 super 简单的东西。
一台电脑(使用 ubuntu 18.04、java 1.8.0_201、cassandra 3.6 版)。
安装,让所有参数默认,启动 cassandra 服务并查看 token 分布。

结果如下:
tokendistribution on a new cluster

所以我的问题是:Cassandra 集群中的平衡 token 范围意味着什么?

最佳答案

如此链接中所述
https://thelastpickle.com/blog/2019/02/21/set-up-a-cluster-with-even-token-distribution.html
它似乎是解决方案,至少对于 key 空间的 token 和数据的分配而言。
我采取以下步骤来获得平衡的系统:

  • 为种子节点设置 cassandra.yaml(对于我的测试用例 num_tokens=8)让其他参数作为默认值
  • 启动种子节点,等待准备就绪
  • 通过 cqlsh 或编程解决方案连接并创建 key 空间(对于我的复制因子 = 1 的测试用例)。
  • 关闭种子节点
  • 编辑种子节点的 cassandra.yaml 并注释/添加 allocate_tokens_for_keyspace: [your_keyspace_name_from_step_3] 的参数
  • 启动种子节点并等待节点准备就绪
  • 编辑集群中第二个节点的 cassandra.yaml 执行步骤 5。在此文件中,num_token 等于种子节点的 num_token。
  • 运行第二个节点,等待它准备好
  • 对集群中的任何其他节点执行步骤 7-8。

  • 有了那个,例如在键空间的测试表中添加 2.000.000 个数据行的测试运行我看到以下结果:
    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

    甚至 token 分发也比以前更好:
    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 提供解决方案的链接。

    关于docker - 空白新 Cassandra-Cluster 中的代币平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58467244/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com