docker - 空白新 Cassandra-Cluster 中的代币平衡
问题描述
我的设置由 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"
堆大小是如此之小,因为它只测试集群的开始并且我的笔记本没有足够的内存。Murmur3Partitioner
分区器是cassandra的默认设置。
我只启动集群,没有创建密钥空间或其他事情。
在我发现的每个文档中,都有关于平衡令牌范围和不平衡令牌分布不好等的声明。
但是什么是平衡的令牌范围?
当我启动集群时,首先是种子容器,每个其他节点每隔 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 个令牌范围。
Cassandra 中的令牌范围是 -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
这意味着环中每个令牌范围之间的差异是完全不同的。
或者换句话说,((2^63 * 2) - 1) / (3 * 8) = 768.614.336.404.564.000
理想的令牌分布中每个节点的令牌计算的完美案例。
抱歉,我在这里只擅长快速计算(大约 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
右列描述了每个令牌范围的分布。这是最大和最小代币范围之间的巨大差距。
或稍微合并(从结果的中间)完全不均匀或不平衡或不分布:
-5184169415607375486
-2082614198258325552
-1084866128895283137
经过一些测试,我设置了一个超级简单的东西。一台电脑(使用 ubuntu 18.04、java 1.8.0_201、cassandra 3.6 版)。安装,让所有参数默认,启动 cassandra 服务并查看令牌分布。
结果如下: 新集群上的令牌分布
所以我的问题是:Cassandra 集群中的平衡令牌范围意味着什么?
解决方案
如此链接 https://thelastpickle.com/blog/2019/02/21/set-up-a-cluster-with-even-token-distribution.html中所述, 它似乎是解决方案,至少对于分发键空间的令牌和数据。我采取以下步骤来获得平衡的系统:
- 为种子节点设置 cassandra.yaml(对于我的测试用例 num_tokens=8)让其他参数作为默认值
- 启动种子节点,等待准备就绪
- 通过 cqlsh 或编程解决方案连接并创建密钥空间(对于我的复制因子 = 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
甚至令牌分发也比以前更好:
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 提供解决方案的链接。
推荐阅读
- javascript - 离子离子搜索栏增加清除图标的大小
- r - 在 R 中使用 pivot_longer 转换数据
- azure - 从一个租户(租户 1)的 ADLS Gen 1 到第二个租户(租户 2)的 ADLS 2 Gen 2 的数据传输
- javascript - 如何将“
”替换为“ - javascript - 按值对数组对象进行排序
- sql - 删除由连接多个表的选择查询获取的行
- .net-core - 找不到方法:System.MissingMethodException Microsoft.Extensions.DependencyInjection.IServiceCollection.AddAuthorization
- spring-boot - Spring WebFlux + Spring Data Jdbc + Spring Session Redis
- python - AttributeError:“NoneType”对象没有属性“评估”,评估 keras 中加载的模型
- azure - 在哪里可以找到 Azure.Service Powershell 模块?