MySQL NDB Cluster 8.0 发行说明  /  MySQL NDB Cluster 8.0.20 的变化(2020-04-27,正式发布)

MySQL NDB Cluster 8.0.20 的变化(2020-04-27,正式发布)

MySQL NDB Cluster 8.0.20 是 NDB 8.0 的新版本,它基于 MySQL Server 8.0,包括 NDB存储引擎 8.0 版中的功能,并修复了最近在之前的 NDB Cluster 版本中发现的错误。

获取 NDB Cluster 8.0。  NDB Cluster 8.0 源代码和二进制文件可以从 https://mysql.net.cn/downloads/cluster/获得。

有关 NDB Cluster 8.0 中所做更改的概述,请参阅 NDB Cluster 中的新增功能

此版本还合并了以前 NDB Cluster 版本中所做的所有错误修复和更改,以及通过 MySQL 8.0.20 在主线 MySQL 8.0 中添加的所有错误修复和功能更改(请参阅MySQL 8.0.20 中的更改(2020-04- 27,一般可用性))。

添加或更改的功能

  • 重要变化: 现在可以将备份分成多个片,并使用为 ndb_restore实用程序实现的两个新选项并行恢复这些片,从而可以使用多个ndb_restore实例来恢复与备份大小大致相同的子集parallel,这应该有助于减少从备份中恢复 NDB Cluster 所需的时间长度。

    这些--num-slices选项决定了备份应该被划分成的片数;提供要由ndb_restore--slice-id恢复的切片的 ID(小于切片数 0 到 1)。

    最多支持 1024 个切片。

    有关详细信息,请参阅 --num-slices--slice-id选项的说明。(缺陷号 30383937)

  • 重要变化: 为了提高更新操作的处理速度,NDB现在支持并默认使用每个节点组的多个传输器。默认情况下,集群中每个节点组使用的传输器数量等于本地数据管理(LDM)线程的数量。虽然这个数字对于大多数用例来说应该是最佳的,但可以通过设置 NodeGroupTransporters 此版本中引入的数据节点配置参数的值来调整它。最大值是 LDM 线程数或 TC 线程数中的较大者,最多为 32 个传输器。

    有关更多信息,请参阅多个转运蛋白

  • NDB 客户端程序:为ndb_blob_tool实用程序 添加了两个选项 ,以使其能够检测存在内联部分的缺失 blob 部分,并用正确长度的占位符 blob 部分(由空格字符组成)替换这些部分。要检查是否缺少 blob 部分,请使用 ndb_blob_tool --check-missing选项。要用占位符替换任何缺失的 blob 部分,请使用该程序的 --add-missing选项,该选项也添加在此版本中。(漏洞 #28583971)

  • NDB 客户端程序: 删除了ndb_waiterndb_show_tables实用程序对 NDBT库的依赖。该库用于 NDB开发测试,正常使用不需要。此更改对用户的可见影响是这些程序在运行完成后不再打印 。依赖此行为的应用程序应在升级到此版本时进行更新以反映此更改。 NDBT_ProgramExit - status

  • MySQL NDB ClusterJ: 未使用的antlr3插件已从 ClusterJpom文件中删除。(漏洞 #29931625)

  • MySQL NDB ClusterJ: ClusterJ 支持 MySQL NDB Cluster 8.0 的最低 Java 版本现在是 Java 8。(缺陷 #29931625)

  • MySQL NDB ClusterJ:ClusterJ 使用的一些 Java API 现在在最近的 Java 版本中已弃用。对 ClusterJ 进行了这些调整:

    • 将所有Class.newInstance()呼叫 替换为Class.getDeclaredConstructor().newInstance() 呼叫。还根据需要更新了异常处理和测试用例。

    • 所有Number从原始类型或原始类型实例化对象的类的构造函数String都已弃用。valueOf()用相应的方法调用 替换了所有此类弃用的实例化 调用。

    • Proxy.getProxyClass()现已弃用 。该类DomainTypeHandlerImpl 现在使用该方法直接创建一个新实例 Proxy.newProxyInstance()Proxy从类中删除对该类及其构造函数的 所有引用DomainTypeHandlerImplSessionFactoryImpl类现在使用代理对象底层的接口来标识域类,而不是使用代理类。也更新了 DomainTypeHandlerFactoryTest

    • finalize()方法现已弃用。此补丁不会更改重写的 finalize() 方法,而只会抑制对它们的警告。此弃用将在以后的补丁中单独处理。

    • 更新了 CMake 配置以在编译 ClusterJ 时将弃用警告视为错误。

    (漏洞 #29931625)

  • NDB现在支持 ndbinfo表的版本控制,并在内部维护其表的当前定义。启动时, NDB将其支持 ndbinfo的版本与存储在数据字典中的版本进行比较。如果版本不同,则 NDB删除所有旧ndbinfo 表并使用当前定义重新创建它们。

  • 许多以前无法下推到数据节点的外连接和半连接现在可以下推(请参阅 引擎条件下推优化)。

    现在可以推送的外连接包括满足以下条件的外连接:

    • 此表上没有未推送的条件

    • 在同一个连接嵌套或它所依赖的上层连接嵌套中的其他表上没有未推送的条件

    • 同一个连接嵌套中的所有其他表,或者它所依赖的上层连接嵌套中的所有其他表也被推送

    现在可以推送使用索引扫描的半连接,如果它满足刚刚针对推送的外部连接指出的条件,并且它使用该firstMatch策略。

    参考资料:另请参阅:Bug #28728603、Bug #28672214、Bug #29296615、Bug #29232744、Bug #29161281、Bug #28728007。

  • 实现了一个新的简化界面,用于启用和配置自适应 CPU 自旋。本 SpinMethod次发布新增的数据节点参数,提供以下四种设置:

    • StaticSpinning:禁用自适应旋转;使用以前 NDB Cluster 版本中采用的静态旋转

    • CostBasedSpinning:使用基于成本的模型启用自适应旋转

    • LatencyOptimisedSpinning:启用针对延迟优化的自适应旋转

    • DatabaseMachineSpinning:启用针对托管数据库的机器优化的自适应旋转,其中每个线程都有自己的 CPU

    这些设置中的每一个都会导致数据节点根据需要为此处列出的一个或多个自旋参数使用一组预定值:

    • SchedulerSpinTimer: 这个名字的数据节点配置参数。

    • EnableAdaptiveSpinning:启用或禁用自适应旋转;不能直接在集群配置文件中设置,可以直接使用控制DUMP 104004

    • SetAllowedSpinOverhead:允许获得延迟的 CPU 时间;不能直接在 config.ini文件中设置,但可以直接更改,使用DUMP 104002

    可用的预设应涵盖大多数用例,但您可以使用数据节点配置参数和 刚刚列出的命令以及ndb_mgm集群管理客户端中的其他命令来 SpinMethod微调自适应自旋行为 ;有关完整列表 ,请参阅说明 。SchedulerSpinTimerDUMPDUMPSchedulerSpinTimer

    NDB 8.0.20 还添加了一个新的 TCP 配置参数 TcpSpinTime,用于设置给定 TCP 连接的自旋时间。这可用于为数据节点、管理节点和 SQL 或 API 节点之间的任何此类连接启用自适应旋转。

    ndb_top工具也得到了增强,可以提供每个线程的自旋时间信息这在终端窗口中显示为绿色。

    有关详细信息,请参阅 SpinMethodTcpSpinTime配置参数的说明、DUMP前面列出或指示的命令以及 ndb_top的文档。

修正错误

  • 重要更改:lower_case_table_names设置为 0 时,发出一个查询,其中任何外键名称的字母大小写与创建时的大小写不同会导致集群意外关闭。这是因为 mysqld 将外键名称视为不区分大小写,即使在区分大小写的文件系统上也是如此,而NDB字典存储外键名称的方式取决于 的值 lower_case_table_names,因此,当它被设置为 0 时,在查找期间,NDB期望任何外键名称的字母大小写与创建它们时所用的匹配。然后在 lettercase 中找不到不同的外键名称NDB 字典,即使它可以在 MySQL 数据字典中找到,导致前面描述的问题 NDBCLUSTER

    lower_case_table_names设置为 1 或 2 时不会发生此问题 。

    通过使外键名称不区分大小写并删除对 lower_case_table_names. 这意味着以下两项现在始终为真:

    1. 外键名称现在使用与创建时相同的字母大小写存储,而不考虑 lower_case_table_names.

    2. 查找外键名称NDB现在始终不区分大小写。

    (缺陷号 30512043)

  • 打包:mysql-cluster-community-server-minimal从RPM 包中 删除了对 Perl 的不必要依赖 (缺陷号 30677589)

  • 打包: NDB由于使用isnan() 而不是std::isnan(). (缺陷号 30396292)

    参考:这个问题是 Bug #30338980 的回归。

  • OS X: 删除了SCHEMA_UUID_VALUE_LENGTH 在源代码中仅使用一次NDB在 Mac OSX 上构建时会导致编译警告。变量已替换为 UUID_LENGTH. (缺陷号 30622139)

  • NDB 磁盘数据: 表空间数据文件中的范围分配现在在表空间使用的所有数据文件中以循环方式执行。在多个存储设备用于磁盘数据存储的情况下,这应该提供更均匀的数据分布。(缺陷号 30739018)

  • NDB 磁盘数据: 在某些情况下,磁盘数据表的检查点无法完成,导致数据节点意外关闭。(缺陷号 30728270)

  • NDB 磁盘数据: 未初始化的变量导致在集群重启后执行磁盘数据 DDL 操作时出现问题。(缺陷号 30592528)

  • MySQL NDB ClusterJ:DateNDB 集群读取值时,ClusterJ 有时会从行中提取错误的年份值。这是因为Utility班级在解包Date值时错误地提取了一些额外的年份位。此补丁使 ClusterJ 仅提取所需的位。(缺陷号 30600320)

  • MySQL NDB ClusterJ: 当集群的 NdbOperation::AbortOption类型值为 时AO_IgnoreOnError,当出现读取错误时,ClusterJ 将其视为行丢失并返回null而不是异常。这是因为对于AO_IgnoreOnErro,该 execute()方法总是在每个事务后返回一个成功代码,并且 ClusterJ 应该检查任何单个操作中的任何错误;但是,在这种情况下,ClusterJ 未检查读取操作。使用此补丁,现在会在查询执行后检查读取操作是否有错误,因此会报告读取错误。(缺陷号 30076276)

  • 针对 MySQL 优化器中先前问题的修复对 NDB存储引擎的引擎条件下推产生了不利影响。(缺陷号 303756135)

    参考资料:此问题是 Bug #97552、Bug #30520749 的回归。

  • 还原带符号的自动增量列时, ndb_restore在确定数据中包含的最大值时错误地处理了负值。(缺陷号 30928710)

  • 在以 启动的 SQL 节点上 --ndbcluster,在集群中的任何其他节点启动之前,表创建在创建ndbinfo 模式时成功,但视图的创建没有成功,而是引发 HA_ERR_NO_CONNECTION。(缺陷号 30846678)

  • 以前(在 NDB 7.6.4 之前) SPJ为推送连接的根表的每个片段激活一个 worker 实例,但在 NDB 7.6 及更高版本中,为每个数据节点激活一个 worker 并负责该节点上的所有片段数据节点。

    在进行此更改之前,每个这样的工作人员为所有工作人员扫描并行度等于 1 的片段就足以 SPJ让所有本地数据管理器线程保持忙碌。当 worker 数量因更改而减少时,最小并行度应该增加到等于每个 worker 的片段数以保持并行度。

    此修复可确保现在已完成此操作。(缺陷号 30639503)

  • 系统ndb_metadata_sync变量设置为true,触发MySQL数据字典与NDB 字典之间的元数据同步;当同步完成时,该变量会自动重置为 false 以指示同步已完成。涉及检测 MySQL 数据字典中不存在但被 NDB字典使用的模式的一种情况有时会导致 ndb_metadata_sync在属于该模式的所有表成功同步之前被重置。(缺陷号 30627292)

  • 使用共享用户和授权时,所有 ALTER USER语句都作为快照分发,无论它们是否包含明文密码。

    此外,SHOW CREATE USER不包括 MAX_QUERIES_PER_HOUR设置为零的资源限制(例如 ),这意味着这些资源限制不会分布在 SQL 节点之间。(缺陷号 30600321)

  • 用于登录的两个缓冲区 QMGR大小不足。(缺陷号 30598737)

    参考资料:另请参阅:Bug #30593511。

  • SPJ从节点输出日志中 删除了与相关的无关调试输出 。(缺陷号 30572315)

  • 当执行 NDB Cluster 的初始重启时,作为 SQL 节点附加到它的每个 MySQL 服务器识别重启,ndb_schema从数据字典重新安装表,然后清除在重启之前创建的所有 NDB 模式定义。ndb_schema由于数据字典是在重新安装 后才被清除的,因此有时会因为ndb_schema与执行重启前的其中一个表具有相同的表 ID 而导致安装失败。通过确保在 ndb_schema重新安装表之前清除数据字典来解决此问题。(缺陷号 30488610)

  • NDB有时假设包含索引统计信息的节点列表是有序的,但这个列表并不总是在所有节点上以相同的方式排序。这意味着在某些情况下NDB会忽略更新索引统计信息的请求,这可能会导致索引统计信息表中的数据过时。(缺陷号 30444982)

  • 当优化器决定将表预排序为临时表时,在后面的表连接之前,要排序的表不应该是推送连接的一部分。尽管抽象查询计划接口中存在检测此类查询计划的逻辑,但这并不能正确检测所有使用 filesort into temporary table. 这被更改为检查是否已设置文件排序描述符;如果是这样,作为访问表的第一步,表内容被分类到一个临时文件中,这大大简化了对连接结构的解释。我们现在还检测要排序的表何时是推送连接的一部分,这应该可以防止此接口将来出现回归。(缺陷号 30338585)

  • 当节点 ID 分配请求因 NotMaster临时错误而失败时,总是立即重试节点 ID 分配,而不考虑错误原因。这导致了非常高的重试率,其影响可以观察到 节点 失败日志消息的Alloc 节点 IDnnn数量过多(大约每秒 15,000 条消息)。(缺陷号 30293495)

  • 对于NDB没有显式主键的表,NdbReceiverBuffer可以分配太小的大小。这是因为NDB从数据节点发送的属性位图总是包含主键。在这种情况下,现在考虑了隐藏主键所需的额外空间。(缺陷号 30183466)

  • 在转换使用以前版本的 NDB Cluster 中的文件NDB创建的表 .frm并将其作为表对象存储在 MySQL 数据字典中时,即使检测到表索引之间存在不匹配,也有可能提交表对象MySQL 数据字典和那些用于同一表的表示的NDB字典。在 NDB 8.0 中创建的表没有出现此问题,在这种情况下不需要以这种方式升级表元数据。

    通过确保在提交表对象之前实际执行所有此类比较来解决此问题,无论创建原始表时是否使用.frm文件来存储其元数据。(漏洞#29783638)

  • 获取集群元数据时引发的错误导致内存泄漏。(缺陷 #97737,缺陷 #30575163)