MySQL NDB Cluster 8.0 发行说明  /  MySQL NDB Cluster 8.0.31 的变化(2022-09-15,全面上市)

MySQL NDB Cluster 8.0.31 的变化(2022-09-15,全面上市)

MySQL NDB Cluster 8.0.31 是 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.31 在主线 MySQL 8.0 中添加的所有错误修复和功能更改(请参阅MySQL 8.0.31 中的更改(2022-10- 11、普遍适用))。

透明数据加密 (TDE)

  • 此版本实施了透明数据加密 (TDE),它通过静态数据加密提供保护NDB。这包括持久保存到磁盘的所有NDB表数据和日志文件,旨在防止在未经授权访问 NDB Cluster 数据文件(如表空间文件或日志)后恢复数据。

    要对存储NDB 表数据的文件强制加密,请设置 EncryptedFileSystem1,这会导致所有数据在写入这些文件和从这些文件中读取时根据需要进行加密和解密。其中包括 LCP 数据文件、重做日志文件、表空间文件和撤消日志文件。

    将文件系统加密与 一起使用时NDB,您还必须执行以下任务:

    只有使用NDB存储引擎的表才能通过此功能进行加密;请参阅 NDB 文件系统加密限制。其他表,例如用于NDB模式分发、复制和二进制日志记录的表,通常使用 InnoDB; 请参阅 InnoDB 静态数据加密。有关二进制日志文件加密的信息,请参阅 加密二进制日志文件和中继日志文件

    进程生成或使用的文件NDB(例如操作系统日志、崩溃日志和核心转储)未加密。被用户使用NDB但不包含任何用户表数据的文件也未加密;这些包括 LCP 控制文件、模式文件和系统文件(请参阅 NDB Cluster 数据节点文件系统)。管理服务器配置缓存也未加密。

    此外,NDB 8.0.31 添加了一个新的实用程序 ndb_secretsfile_reader,用于从加密文件中提取密钥信息。

    此增强功能建立在 NDB 8.0.22 中完成的工作之上,以实现加密NDB备份。有关详细信息,请参阅 RequireEncryptedBackup 配置参数的说明,以及 使用 NDB Cluster Management Client 创建备份

    笔记

    由于密钥处理方面的改进,将加密文件系统从以前的版本升级到 NDB 8.0.31 或更高版本需要滚动初始重启数据节点。

    (漏洞#34417282)

转速说明

  • ndbinfo 信息数据库: 使用 RPM 文件将 SQL 节点从 NDB 7.5 或 NDB 7.6 升级到 NDB 8.0 未ndbinfo正确启用插件。这是因为,由于 ndbcluster在升级mysqld期间禁用了插件,因此 ndbinfo插件也是如此;这导致 .frmndbinfo表相关的文件在升级后被遗留下来。

    现在在这种情况下,将删除早期版本中的所有ndbinfo 表文件,并启用插件。.frm(漏洞#34432446)

添加或更改的功能

修正错误

  • 将条件推送为推送连接的一部分时,要求所有 table. column 参考是以下之一:

    • 条件本身被推送到的表

    • 一个表,它是推送连接的根的祖先

    • 一个表,它是推送查询树中表的祖先

    在最后一种情况下,在寻找可能的祖先时,我们没有通过以下两种方式中的一种或两种方式完全识别此类表的所有候选对象:

    1. 由于嵌套级依赖关系而需要祖先的任何表都未添加为祖先

    2. 已知将所有可能的祖先作为必需祖先或关键父代的表直接与我们的祖先连接,并提供这些作为祖先本身;因此,这些表也应该作为祖先提供。

    此补丁实现了情况 1 和情况 2。在第二种情况下,我们采用保守的方法,只添加那些具有 single row lookup访问类型的表,而不添加那些使用索引扫描的表。(缺陷号 34508948)

  • EXPLAIN某些启用了 ndb_join_pushdown(默认)的大型连接查询的执行被拒绝,并出现 NDB 错误 FirstInner /Upper has to be an ancestor or a sibling。(缺陷号 34486874)QRY_NEST_NOT_SUPPORTED

  • NDB连接下推处理程序发现无法下推的表时,它会尝试生成一条解释性消息,传达拒绝的原因,其中包括所涉及的表的名称。在某些情况下,优化器已经优化了表,这意味着处理程序无法再访问它 NDB,从而导致查询失败。

    我们通过引入对此类情况的检查并在未找到表时打印不包含表名的更通用消息来解决此问题。(缺陷号 34482783)

  • EncryptedFilesystem 参数未使用 定义 CI_RESTART_INITIAL,因此在ndb_config--initial的输出中未显示为 require ,即使该参数实际上需要初始重启才能生效。 (缺陷号 34456384)

  • 当找到可以在推送连接中下推的表时,表的可推送性可能取决于后面的表是否也被推送。在这种情况下,我们采取乐观的方法并假设后面的表也被推送。如果这个假设失败了,我们可能需要取消推送一个表和依赖于它的任何其他表。这种级联的 取消推送可能是由于以下一种或两种情况造成的:

    • 一个键引用引用了一个表中的列,该列后来被证明是不可推送的。

    • 推送条件指的是表中的列,后来证明是不可推送的。

    我们之前处理过第一种情况,但是在 NDB 8.0.27 中完成的工作中省略了第二种情况的处理,以启用引用来自属于同一推送连接的其他表中的列的条件。(缺陷号 34379950)

  • NdbScanOperation错误被异步返回给客户端,可能是在客户端正在进行其他处理时。成功调用 NdbTransaction::execute() 仅保证扫描请求已组装并无误地发送至事务协调器;它不等待从数据节点返回任何类型的CONF或 信号。REF在这种特殊情况下,预期的 TAB_SCANREF信号被异步返回到客户端空间,可能是在客户端仍在执行其他操作时。

    我们通过在收到NdbTransaction错误时不设置错误代码 来使此行为更具确定性 。TAB_SCANREF(缺陷号 34348706)

  • 当尝试更新 VARCHAR作为表主键一部分的列时,据报道NDB,从提供给该方法的数据库中读取的值的长度 不正确。cmp_attr()除了解决此问题外,我们还删除了不正确的长度检查,该检查要求此方法的参数的二进制字节长度相同,这不适用于作为字符进行比较的属性,其比较语义由其字符定义集和排序规则。(缺陷号 34312769)

  • -Og在用于调试版本 的 OEL7 和 OEL8 上编译 NDB Cluster 时 , gcc引发空指针减法错误。(错误#34199675,错误#34199732)

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

  • ndb_blob_tool未正确处理读取数据时引发的错误。(缺陷号 34194708)

  • 作为设置信号执行策略的一部分,我们计算每个作业缓冲区要执行的最大信号数的安全配额。由于假设每个执行的信号最多生成四个外向信号,我们可能需要限制信号配额,以免溢出缓冲区。实际上,在每一轮信号执行中,我们执行的信号不能超过 out 缓冲区可以容纳的信号的 1/4。

    此计算未考虑在 NDB 8.0.23 中完成的工作引入了多个写入器的可能性,所有写入器都使用同一作业缓冲区中的相同可用空间。因此,需要在写入相同缓冲区的工作人员之间进一步分配信号配额。

    现在,要执行的最大信号数的计算考虑到了每个队列可能有更多的写入器。(缺陷号 34065930)

  • NDB调度程序检测到作业缓冲区已满,并开始从保留缓冲区分配时,它会在等待消费者时让出 CPU。就在屈服之前,它会在休眠之前对这种情况进行最终检查。当此检查表明作业缓冲区未满时出现问题,因此允许调度程序继续执行信号,即使允许执行的信号数量限制仍然存在0。这导致了一轮无信号执行,然后是另一次收益检查,等等,在等待接收器线程消耗某些东西时无缘无故地保持 CPU 占用。

    问题的根本原因是使用了不同的指标来计算要执行的信号的限制(当此限制为 时触发了产量检查 0),以及随后检查作业缓冲区是否已满的产量回调。

    在 MySQL NDB Cluster 8.0.23 中实现可伸缩作业缓冲区之前,NDB等待更多作业缓冲区达 10 次;这是无意中改变的,所以它只等了一次就放弃了,尽管日志消息表明它NDB已经睡了十次。作为此修复的一部分,我们恢复了该更改,因此,和以前一样,我们在放弃之前最多等待十次以获得更多作业缓冲区。作为这项工作的附加部分,我们还删除了之前添加的用于检测自旋等待的额外(和不需要的)代码。(缺陷号 34038016)

    参考资料:另请参阅:Bug #33869715、Bug #34025532。

  • 作业缓冲区充当数据节点内部块线程之间的通信链接。当这些线程的数据结构被初始化时,一个 32K 的页面被分配给每个这样的链接,即使这些线程从不(按设计)相互通信。这浪费了内存资源,并且对性能的影响很小,因为经常检查作业缓冲区页面是否有可用信号,因此我们有必要将未使用的作业缓冲区页面加载到翻译后备缓冲区和 L1、L2 和 L3 缓存中。

    现在,我们设置一个空的作业缓冲区作为所有通信链接最初引用的哨兵。实际(使用的)作业缓冲区页面现在仅在我们实际将信号写入其中时才会分配,就像页面变满时分配新内存页面一样。(错误号 34032102)

  • 由于作业缓冲区已满,即使本地缓冲区仍然可用,数据节点也可能被迫关闭。(缺陷号 34028364)

  • 使作业调度程序对未决信号的检查更加一致和可靠。(缺陷号 34025532)

    参考资料:另请参阅:Bug #33869715、Bug #34038016。

  • 批处理与每个键的多个运行中操作的组合、使用IgnoreError和非主副本上发生的瞬态错误在某些情况下会导致内部不一致,DBTUP 从而导致副本未对齐和其他问题。我们现在通过检测非主副本上的操作何时失败,并 AbortOnError在这种情况下强制处理(回滚)包含事务来防止这种情况发生。(缺陷号 34013385)

  • ndb_restore对 DDL 操作引发的临时错误的 处理已得到改进并保持一致。在所有这些情况下,ndb_restore现在MAX_RETRIES在放弃之前最多重试 (11) 次操作。(缺陷号 33982499)

  • 消除了编译 NDB Cluster 时引发许多警告的原因。(错误#33797357,错误#33881953)

  • 当变化率很高时,事件订阅者确认收到的速度很慢,或者两者兼而有之, SUMA块可能会用完缓冲事件的空间。(缺陷号 30467140)

  • ALTER TABLE ... COMMENT="NDB_TABLE=READ_BACKUP=1"或对表ALTER TABLE..COMMENT="NDB_TABLE=READ_BACKUP=0"执行非复制(在线)ALTER操作以添加或删除其READ_BACKUP 属性(请参阅 NDB_TABLE 选项),这会增加表上所有索引的索引版本。使用以前的索引版本存储的现有统计数据是孤立的,从未被删除;这导致在收集索引统计信息时浪费内存和低效搜索。

    我们通过清理索引样本来解决这些问题;我们删除样本版本大于或小于当前样本版本的所有样本。此外,当索引 ID 和版本找不到现有统计信息时,以及索引被删除时。在最后一种情况下,我们放宽了删除操作的范围,并删除了与相关索引 ID 相对应的所有条目,而不是同时删除索引 ID 和索引版本。

    此修复清理了存储大量索引统计数据的示例表。由索引元数据而不是实际统计信息组成的头表仍然包含孤立行,但由于它们占用的内存量微不足道,因此它们不会对统计信息搜索效率产生不利影响,并且在索引 ID 和版本更新时清除陈旧条目重用。

    另请参阅NDB API 统计计数器和变量。(漏洞#29611297)