Vnodes简短历史

Vnodes又叫Virtual Nodes。是Cassandra在1.2版本里引入的功能,已经在生产环境中使用了近8年了。从2.0版本开始,因为默认配置里num_tokens一般会设成256,所以如果你没有修改过默认参数,那很有可能你一直都在使用这个功能。

当初引入vnodes主要是为了改善增加节点时的灵活性。在pre-1.2时代(也就是没有vnodes功能的时候),每次集群扩容都必须要让节点数翻倍,比如3个节点扩容到6个节点,下次需要扩容的时候再增加到12个节点。这是因为每个节点都只拥有一个token范围,增加新节点的时候就是把每个token范围一分为二,让每个新节点都负责一半的token范围。但是,如果要保证整个集群的token范围是均匀分布的,每次新增加的节点数需要跟已有的节点数一致。这样每次翻倍的扩容方式显然对运维和资源计划造成了很大的挑战。

有了vnodes以后,默认情况下每个物理节点会负责256个token范围,增加一个新的节点只需要从每个已有节点的256个token范围中取出若干个,合起来凑成256个新token范围分配给新来的节点就好了。整个集群的token范围分布还是均匀的。

Vnodes功能在1.2版推出以后,受到了广大生产环境Cassandra运维人员的欢迎,所以在2.0版里,vnodes功能被默认启用,而且这个num_tokens参数默认的被配置成了256。

Vnodes带来的问题

可是,随着越来越多的Cassandra集群开始在生产环境里使用vnodes,它的一些不尽如人意的地方逐渐开始体现出来。

最大的一个问题,体现在运行nodetool repair的时候:因为repair是按照节点的token范围来安排一个个的小任务,以进行副本之间的比较和修复工作;一个节点拥有的token范围的数量越多,这样的小任务就越多;当一个节点拥有了256个token范围,并且存储了几百GB数据的时候,每个keyspace的repair小任务加起来所花的时间动辄就会达到几小时甚至数天;生产环境中一般会有几个keyspace,再加上nodetool repair -pr需要10天之内在所有的节点上都运行一轮,这会对运维带来比较大的困难。

另外,当一个节点拥有了256个token范围时,增加新节点的bootstrap过程也会带来多得多的SSTable数量,需要消耗大量的CPU才能把这些大量的小SSTable消化掉。

比较棘手的是,这些问题并不是简单的在配置中降低num_tokens取值就可以解决的。把num_tokens设置成一个更小的值比如16,当然会大大改善repair和bootstrap,但是这样面临着两个主要的挑战:

  1. Cassandra 1.2原有的vnodes算法设计一般假设每个节点会有数百个token范围,使用的是随机重新分配的算法,token范围数量多的时候没问题,但是token范围数量降低到十几个的时候,很容易出现数据不均匀分配的情况(如下图所示),而且节点增加的越多,这种不均匀的现象会越严重;
  2. 一个数据中心的vnodes数量在数据中心初始化的时候就确定了,将来想要改的话,只能启用新的数据中心迁移数据。
Datacenter: us-east-1
=====================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.1*.3*.1* 1.55 TiB 16 4.1% f683ab0e-a687-400f-80fb-28f7b4471ffc b
UN 172.1*.3*.1** 1.05 TiB 16 2.9% 2097cd01-4161-44a9-a944-d5445e8c5e02 c
UN 172.1*.3*.2* 720.26 GiB 16 3.0% e6593e3a-bb1c-499c-a99b-73781cfcd076 c
UN 172.1*.3*.2* 1.3 TiB 16 4.0% 99670a7c-a55f-4a43-8e4b-a3cccc71f08f a
UN 172.1*.3*.1** 961.67 GiB 16 3.2% a4bb1648-3582-4f05-a1e6-3125e9c3c46c b
UN 172.1*.3*.1** 1.29 TiB 16 4.4% 890e98d3-d88d-4d8c-89b4-7e9444bb69be a
UN 172.1*.3*.2* 1.42 TiB 16 4.0% 3f2817da-9dc5-4122-8977-5d3d93669b4e c
UN 172.1*.3*.1** 710.53 GiB 16 4.9% 72405162-f121-46d4-a220-a1fd2db868e8 b
UN 172.1*.3*.3* 2.38 TiB 16 7.1% f15c768c-0175-4646-bc68-7b20a74d7f0d b
UN 172.1*.3*.1** 2.68 TiB 16 7.3% 2f444803-7787-474a-9ed9-8555147023d3 c
UN 172.1*.3*.1** 1.59 TiB 16 5.2% bd838966-23e2-44b2-986c-729ede679604 c
UN 172.1*.3*.5* 808.48 GiB 16 4.3% 1fe83c82-1fb2-4570-9aae-7805370f24b0 b

新版本是怎样解决问题的

针对上面提到的第一个挑战,Cassandra 3.0里启用了新的token分配算法,并且增加了一个新的参数allocate_tokens_for_keyspace,这个贪心算法虽然不能完全避免token范围热点的情况出现,但是它的最大好处是,在集群中继续增加节点的话,token范围的热点会越来越少,数据分配会越来越均匀。

Cassandra 4.0在此基础之上又做了更多的改进,3.0里的参数allocate_tokens_for_keyspace将被allocate_tokens_for_local_replication_factor取代。这样配置的工作更加简单,因为不再需要在初始化一个数据中心的时候提供一个keyspace的名字。

有了这样算法的加持,社区也逐渐开始建议所有用户在新建数据库的时候,把num_tokens参数直接改成一个比256小得多的取值。最新的讨论可以看这个JIRA和这个邮件列表的讨论。社区现在达成的共识是在4.0版本中把默认的num_tokens设置成16,并且默认启用新的token分配算法。如果4.0 release测试过程不再发现新的问题,在4.0正式版发布以后,所有运行新版本的集群将会是每节点拥有16个token范围,以兼顾运维操作的高效,和数据分配的均匀。

Cassandra Vnodes在Cassandra 2.0-4.0中的演进的更多相关文章

  1. libQtCassandra 0.5.0 发布

    libQtCassandra 0.5.0 修复了 QCassandraRow::exists() 函数的问题,更新了 Thrift 库. libQtCassandra 是一个高级的 C++ 库用来访问 ...

  2. Cassandra Demo--Python操作cassandra

    ================================================================ 创建keyspace和table CREATE KEYSPACE ex ...

  3. 微软Visual Studio Code 0.8.0发布,新增多种主题

    月30日,Build 开发者大会上,正式宣布了 Visual Studio Code 项目;并将其定义为:一个运行于 Mac OS X.Windows和 Linux 之上的,针对于编写现代 Web 和 ...

  4. Ubuntu14.04 64位机上安装cuda8.0 cudnn5.0操作步骤 - 网络资源是无限的

    查看Ubuntu14.04 64位上显卡信息,执行: lspci | grep -i vga lspci -v -s 01:00.0 nvidia-smi 第一条此命令可以显示一些显卡的相关信息:如果 ...

  5. Xamarin For Visual Studio 3.0.54.0 完整离线破解版(C# 开发Android、IOS工具 吾乐吧软件站分享)

    Xamarin For Visual Studio就是原本的Xamarin For Android 以及 Xamarin For iOS,最新版的已经把两个独立的插件合并为一个exe安装包了.为了区分 ...

  6. 《征服 C 指针》摘录1:什么是空指针?区分 NULL、0 和 '\0'

    一.什么是空指针? 空指针 是一个特殊的指针值. 空指针 是指可以确保没有向任何一个对象的指针.通常使用宏定义 NULL 来表示空指针常量值. 空指针 确保它和任何非空指针进行比较都不会相等,因此经常 ...

  7. Oracle Database 11g Release 2(11.2.0.3.0) RAC On Redhat Linux 5.8 Using Vmware Workstation 9.0

    一,简介 二,配置虚拟机 1,创建虚拟机 (1)添加三块儿网卡:   主节点 二节点 eth0:    公网  192.168.1.20/24   NAT eth0:    公网  192.168.1 ...

  8. kafka0.9.0及0.10.0配置属性

    问题导读1.borker包含哪些属性?2.Producer包含哪些属性?3.Consumer如何配置?borker(0.9.0及0.10.0)配置Kafka日志本身是由多个日志段组成(log segm ...

  9. Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0

    下载jar,导入到maven中cmd中输入:mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=1 ...

随机推荐

  1. JS中splice方法的使用

    在js中,arr.splice(str)方法是处理数组的利器,利用它可以实现在指定位置删除.替换.插入指定数量的元素. 其语法为:  arr.splice(index[, deleteCount, e ...

  2. vue 公众号H5 使用微信JSAPI 录音 完整齐全

    官方文档必须首当其冲 1.微信jsAPI 录音文档 2.获取微信临时素材文档 首先H5录音功能的话 对于普通H5网上是有很多的方法 插件  但是兼容性很差 特别是对于ios 一开始想的是用H5 做个通 ...

  3. Android 开发学习进程0.13 Androidstudio快捷键 xmlns

    xmlns XML namespace xml命名空间 其中主要是定义xml文件定义位置 前缀有三种,android app tools 后面为唯一标识符URI android 表示为引用自安卓系统 ...

  4. kereas 实现鸢尾花分类

    import tensorflow as tf from sklearn import datasets import numpy as np x_train=datasets.load_iris() ...

  5. JavaScript设计模式之单例模式【惰性单例】

    在提高开发水平,往中高级前端工程师中,利用设计模式是必不可少的一条道路.掌握设计模式的思想远远比硬套重要,因为设计模式是一种思想,不局限于开发语言.但实际上由于语言的特性不同,往往在实现的时候会有不少 ...

  6. 笔记:phpstudy、虚拟机CentOS安装、Linux命令

    一.phpstudy 1.phpstudy实现w(Windows)a(Apache)m(Mysql)p(php)环境 Apache  用来发布Web服务   80端口 MySQL   开源的建议灵活的 ...

  7. install -M

    [root@controller ~]# source admin-openrc [root@controller ~]# neutron ext-list +-------------------- ...

  8. Vue管理系统前端系列五自定义主题

    目录 自定义主题 1.安装「主题生成工具」 2.安装白垩主题 3.新建颜色挑选组件 自定义主题 1.安装「主题生成工具」 由于主题工具需要依赖于 node-sass,而node-sass版本兼容性并不 ...

  9. python open函数初习

    open("路径","打开方式")  打开方式:'r'只读模式,‘w’写模式,‘a’追加模式 ‘b’二进制模式,‘+’读/写模式.例: fh=open(&quo ...

  10. 【译】Database Profiling with Visual Studio

    你是否在排查运行缓慢的 web 应用程序时怀疑是数据库层造成的?以前排查数据库层需要特定的工具,现在可以使用 Visual Studio 的 Performance Explorer 中的数据库分析工 ...