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),它通过静态数据加密提供保护
NDB
。这包括持久保存到磁盘的所有NDB
表数据和日志文件,旨在防止在未经授权访问 NDB Cluster 数据文件(如表空间文件或日志)后恢复数据。要对存储
NDB
表数据的文件强制加密,请设置EncryptedFileSystem
为1
,这会导致所有数据在写入这些文件和从这些文件中读取时根据需要进行加密和解密。其中包括 LCP 数据文件、重做日志文件、表空间文件和撤消日志文件。将文件系统加密与 一起使用时
NDB
,您还必须执行以下任务:-
在启动或重新启动数据节点时,使用数据节点选项之一或 为每个数据节点提供
--filesystem-password
密码--filesystem-password-from-stdin
。此密码使用相同的格式并受与用于加密NDB
备份的密码相同的约束(请参阅 ndb_restore--backup-password
选项的描述)。您可以在命令行或
my.cnf
文件中提供加密密码。有关更多信息和示例, 请参阅 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)
-
-
重要变更;NDB 客户端程序: 许多 NDB 程序选项从未实施过,现在已被删除。此处列出了已删除的选项和程序:
--ndb-optimized-node-selection
: ndbd,ndbmtd, ndb_mgm, ndb_delete_all, ndb_desc, ndb_drop_index, ndb_drop_table, ndb_show_tables, ndb_blob_tool, ndb_config, ndb_index_stat, ndb_move_data, ndbinfo_select_all, ndb_select_count--character-sets-dir
: ndb_mgm,ndb_mgmd, ndb_config, ndb_delete_all, ndb_desc, ndb_drop_index, ndb_drop_table, ndb_show_tables, ndb_blob_tool, ndb_config, ndb_index_stat, ndb_move_data, ndbinfo_select_all, ndb_select_count, ndb_waiter--core-file
:ndb_mgm, ndb_mgmd,ndb_config, ndb_delete_all, ndb_desc, ndb_drop_index, ndb_drop_table, ndb_show_tables, ndb_blob_tool, ndb_config, ndb_index_stat, ndb_move_data, ndbinfo_select_all, ndb_select_count, ndb_waiter--connect-retries
: ndb_mgmd,ndb_waiter--connect-retry-delay
: ndb_mgmd,ndb_waiter--ndb-nodeid
:ndb_config
有关更多信息,请参阅NDB Cluster Programs 中指示的程序和程序选项的描述。(缺陷号 34059253)
-
重要变化: 该
ndbcluster
插件现在包含在所有 MySQL 服务器构建中,但 32 位平台的构建除外。作为这项工作的一部分,我们解决了 NDB Cluster 的cmake选项的一些问题,使插件选项的NDBCLUSTER
行为与其他插件选项一样,并添加了一个新选项WITH_NDB
来控制 NDB for MySQL Cluster 的构建。此版本对与 MySQL Cluster 相关 的cmake选项 进行了以下更改 :
添加
WITH_NDB
选项(默认OFF
)。启用此选项会导致构建 MySQL Cluster 二进制文件。弃用该
WITH_NDBCLUSTER
选项;改用WITH_NDB
。删除
WITH_PLUGIN_NDBCLUSTER
选项。而是使用WITH_NDB
来构建 MySQL 集群。更改
WITH_NDBCLUSTER_STORAGE_ENGINE
选项,使其现在(仅)控制是否ndbcluster
构建插件本身。此选项现在自动设置为何ON
时WITH_NDB
为构建启用,因此在使用 NDB Cluster 支持编译 MySQL 时不再需要设置它。
有关更多信息,请参阅 用于编译 NDB Cluster 的 CMake 选项。
添加了ndbxfrm
--detailed-info
的选项。这类似于 选项,但另外打印出文件的标题和结尾。(缺陷号 34380739)--info
-
此版本允许在 MySQL 服务器运行时使用压缩事务启用和禁用二进制日志记录,该事务 对mysql或其他客户端会话 中的表进行
ZSTD
压缩。要启用该功能,请 将此版本中引入的系统变量设置为 . 可以使用 系统变量控制所使用的压缩级别,该版本也添加在此版本中;默认压缩级别为.NDB
ndb_log_transaction_compression
ON
ndb_log_transaction_compression_level_zstd
3
笔记尽管从客户端会话更改
binlog_transaction_compression
和 系统变量的值对表binlog_transaction_compression_level_zstd
的二进制日志记录没有影响, 但命令行或文件中的设置会导致启用,无论 . 在这种情况下,要禁用(仅) 表 的二进制日志事务压缩,请在mysqld启动后在 MySQL 客户端会话中 设置。NDB
--binlog-transaction-compression=ON
my.cnf
ndb_log_transaction_compression
--ndb-log-transaction-compression
NDB
ndb_log_transaction_compression=OFF
有关详细信息,请参阅 二进制日志事务压缩。(缺陷号 32927582)
-
将条件推送为推送连接的一部分时,要求所有
table
.column
参考是以下之一:条件本身被推送到的表
一个表,它是推送连接的根的祖先
一个表,它是推送查询树中表的祖先
在最后一种情况下,在寻找可能的祖先时,我们没有通过以下两种方式中的一种或两种方式完全识别此类表的所有候选对象:
由于嵌套级依赖关系而需要祖先的任何表都未添加为祖先
已知将所有可能的祖先作为必需祖先或关键父代的表直接与我们的祖先连接,并提供这些作为祖先本身;因此,这些表也应该作为祖先提供。
此补丁实现了情况 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)