-
性能: 事件缓冲区内存分配的缺陷被确定为效率低下并可能导致不良结果。当从操作系统分配额外的内存来缓冲接收到的事件数据时,即使内存已经分配但仍未使用,也可能会发生这种情况。这是通过直接从页面分配内存管理器 (
mmap()
) 分配事件缓冲区内存来解决的,操作系统提供了此类功能,允许直接控制内存,以便在释放时实际上返回给系统。这种重新实现避免了现有的趋向于处理最坏情况的内存使用、维护最坏情况事件缓冲区事件计数的数据结构以及在不可用位置无用的空闲内存缓存。这项工作还应该有助于最大限度地减少缓冲事件的运行时成本,最大限度地减少堆碎片,并避免由于过多的不同内存映射而导致特定于操作系统的问题。
此外,epoch 和内部 EventData 对象之间的关系现在在整个事件生命周期(从接收到消费)中得到保留,因此无需迭代和保持同步,表示 epoch 及其
EventData
对象的两个不同列表。作为这项工作的一部分,集群日志中现在提供了有关相关事件缓冲区指标的更好报告。
参考资料:另请参阅:Bug #21651536、Bug #21660947、Bug #21661297、Bug #21673318、Bug #21689380、Bug #21809959。
NDB Cluster APIs: 添加了
Ndb::setEventBufferQueueEmptyEpoch()
方法,可以启用空事件排队(事件类型TE_EMPTY
)。(缺陷号 22157845)-
NDB Cluster APIs:
Ndb_free_list_t
是一个用于 NDB API 实现的模板,用于创建一个列表来保存已发布的 API 对象,例如NdbTransaction
、NdbOperation
和NdbRecAttr
。此模板的一个缺点是已释放的 API 对象在拥有对象的生命周期内保留在列表中,Ndb
因此对任何对象的需求的瞬态峰值会导致内存中的有效泄漏,这种泄漏会一直持续到该Ndb
对象本身被释放为止。这项工作向每个
Ndb_free_list
实例添加统计信息,这些实例对列表维护的对象的使用情况进行采样;现在,当对象被释放时,它们可以根据收集到的使用统计信息被释放到空闲列表中,或者被释放。 JSON: 存储
NDB
引擎支持MySQL 5.7.8及以后版本实现JSON
数据类型和MySQLJSON
此支持受限于单个NDB
表最多可以有 3JSON
列。-
ThreadConfig
对多线程数据节点 ( ndbmtd ) 配置参数 进行了以下增强和补充 :cpubind
使用和 . 添加了对 FreeBSD 和 Windows 上非独占 CPU 锁定的支持cpuset
。添加了对 Solaris 上的独占 CPU 锁定的支持,使用
cpubind_exclusive
和cpuset_exclusive
,这是在此版本中添加的。添加了线程优先级使用
thread_prio
,这是在此版本中添加的。thread_prio
在 Linux、FreeBSD、Windows 和 Solaris 上受支持,但此设置的确切效果因平台而异;有关详细信息,请参阅文档。添加了
realtime
对 Windows 平台设置的支持。
更多信息请参见
ThreadConfig
在线文档中参数的说明。(缺陷号 25830247) ndb_restore现在为其操作的特定阶段执行输出日志记录。(缺陷号 21097957)
-
MySQL NDB Cluster 数据节点使用的哈希索引实现的改进意味着分区现在可以包含超过 16 GB 的固定列数据,并且固定列数据的最大分区大小现在增加到 128 TB。先前的限制源于内核中的
DBACC
块NDB
仅对块中处理的行的固定大小部分使用 32 位引用DBTUP
,即使 45 位引用已在DBACC
块外的内核其他地方使用;现在,所有此类引用都DBACC
改用 45 位指针。作为这项工作的一部分,
DBACC
内核块返回的过于笼统的错误消息现在已通过使它们更具体来得到改进。(错误#13844581,错误#17465232) -
对发送线程的处理进行了大量更改和改进
NDB
。以下列表中简要描述了更改:减少发送线程的资源需求,确保使用发送线程的给定配置优于不使用发送线程的相同配置。
使用其他空闲线程(接收线程除外)作为发送线程,而不会在低负载情况下产生额外的 CPU 资源。
改进了写入事务的响应时间。
提供以更优雅的方式处理错误的配置数据。
通过改进数据节点关于资源使用情况的实时报告,可以测量 CPU 使用情况。
作为实施刚刚列出的最后一项的一部分,
ndbinfo
信息数据库中添加了一些新表,这些表按节点、线程 ID 和线程类型提供有关 CPU 和线程活动的信息。这些表列在这里:cpustat
: 提供每秒、每线程的 CPU 统计信息cpustat_50ms
:显示原始的每线程 CPU 统计数据,每 50 毫秒收集一次cpustat_1sec
:提供原始的每线程 CPU 统计数据,每秒收集一次cpustat_20sec
:显示原始的每线程 CPU 统计数据,每 20 秒收集一次threads
:显示线程类型的名称和描述
有关详细信息,请参阅 ndbinfo:NDB Cluster 信息数据库。
重写了
NDB
存储引擎的全局模式锁定功能的实现,以利用 MySQL 5.7.11 的 MySQL 服务器中实现的元数据锁定挂钩。-
NDB
许多改进通过使本地读取表成为可能来 提供额外的读取可伸缩性 。现在可以启用从任何片段副本读取,而不是仅从主片段副本读取。默认情况下禁用此功能以保持与以前的行为兼容,但可以使用ndb_read_backup
此版本中添加的系统变量为给定的 SQL 节点启用。通过设置片段计数类型,也可以更灵活地分配分区。可能的计数类型是每个节点一个,每个节点组一个,每个节点每个本地数据管理器 (LDM) 一个(这是以前的分配方案,仍然是默认值),每个节点组每个 LDM 一个。
FRAGMENT_COUNT_TYPE
可以通过嵌入在或 的NDB_TABLE
注释中 的选项来控制单个表的此设置。CREATE TABLE
ALTER TABLE
这也意味着,在恢复表模式时, ndb_restore
--restore-meta
现在使用目标集群的默认分区,而不是复制从中获取备份的集群的分区。这在恢复到具有比原始数据节点更多的数据节点的集群时很有用。有关详细信息,请参阅 恢复到比原始节点更多的节点。使用片段计数类型的两个每个节点组设置之一的表也可以完全复制。这要求表的片段计数类型为
ONE_PER_NODE_GROUP
或ONE_PER_LDM_PER_NODE_GROUP
,并且可以使用注释FULLY_REPLICATED=1
中的选项启用。NDB_TABLE
默认情况下,可以使用此版本中添加的系统变量 为所有新NDB
表 启用该选项。ndb_fully_replicated
使用语法
READ_BACKUP
也支持 表级别的设置。COMMENT="NDB_TABLE=..."
也可以(通常更可取)在单个CREATE TABLE
或ALTER TABLE
语句的一个注释中设置多个选项。有关更多信息和示例,请参阅 设置 NDB 注释选项。此版本还引入了
ndb_data_node_neighbour
系统变量,旨在与事务提示(和完全复制的表)一起使用,并为当前 SQL 节点提供“附近”数据节点的 ID 以供使用。有关详细信息,请参阅文档中对此变量的描述。参考资料:另请参阅:Bug #18435416、Bug #11762155、Bug #54717。
-
不兼容的更改: 当数据节点仅部分连接到 API 节点时,用于下推连接的节点可能会从不同节点上的事务协调器获取其请求,而没有(尚未)连接到 API 节点本身。在这种情况下,
NodeInfo
请求 API 节点的对象不包含有关 API 节点软件版本的有效信息,这导致DBSPJ
块在中止时(错误地)假定 API 节点使用NDB
版本 7.2.4 或更早版本,需要在查询中止期间使用向后兼容模式,该模式发送节点故障错误而不是导致中止的真正错误。现在,每当出现这种情况时,如果软件版本尚不可用,则假定
NDB
API 节点版本大于 7.2.4。(漏洞 #23049170) 重要变化: 当使用该
--initialize
选项启动时, mysqld不再启用NDBCLUSTER
存储引擎插件。需要进行此更改以防止尝试将系统数据库初始化为分布式(而不是特定于单个 SQL 节点),这可能导致元数据锁定死锁。此修复程序还在--initialize
这方面使 的行为与停用--bootstrap
选项的行为一致,该选项启动了一个最小的mysqld 实例而不启用NDB
. (缺陷号 22758238)-
性能: 在内部轮询方法
do_poll()
中发现性能问题,轮询客户端在完成轮询之前没有检查自己是否被唤醒。后来的分析表明,只要轮询队列中的部分客户端接收到数据就足够了。do_poll()
然后可以向这些客户端发出信号并放弃其轮询权,即使指定的最长等待时间 (10 ms) 尚未到期。此更改允许
do_poll()
继续轮询,直到指定的最长等待时间到期,或者轮询客户端本身被唤醒(通过接收它正在等待的内容)。这避免了客户端线程之间不必要的线程切换,从而减少了 API 客户端中多达 10% 的相关开销,从而在客户端线程执行自己的轮询时显着提高了性能。(缺陷 #81229,缺陷 #23202735) MACOS : 在OS X上, NDB_CONFIG
--host
在选项中使用一个空字符串时失败 (缺陷 #80689,缺陷 #22908696)Microsoft Windows:由于调用动态加载函数的问题, ndb_mgmd在 32 位 Windows 平台上无法启动;此类问题也可能发生在其他
NDB
使用ndb_init()
. 发现所有使用的函数都已在目标版本的 Windows 中得到支持,因此通过删除这些函数的动态加载并改用 Windows 头文件提供的版本来解决此问题。(缺陷 #80876,缺陷 #23014820)Microsoft Windows: 当使用多个并行构建作业在 Windows 上构建 MySQL NDB Cluster 时,构建有时可能会失败,因为无法安装host_info.exe 。为解决此问题,
install_mcc
目标现在始终先于host_info
目标构建。(缺陷 #80051,缺陷 #22566368)Microsoft Windows:
ANALYZE TABLE
在具有一个或多个索引的表上 执行导致ndbmtd由于信号损坏而失败并出现 InvalidAttrInfo错误。此问题在 Windows 上一直发生,但也可能在其他平台上遇到。(错误#77716,错误#21441297)Solaris: ndb_print_file实用程序在 Solaris 9 for SPARC 上始终失败。(缺陷 #80096,缺陷 #22579581)
-
NDB 磁盘数据: 数据节点使用 MySQL NDB Cluster 磁盘数据在重启期间对日志记录进行了以下改进:
数据节点要应用的撤消日志总量现在作为日志中存在的总页数提供。这是最坏情况的估计。
现在在应用撤消日志时定期提供进度信息(每 30000 条记录一次)。此信息作为当前重新启动期间到目前为止应用的记录数和撤消日志页数提供。
(漏洞 #22513381)
NDB Cluster API: 删除 Ndb 对象使用了不成比例的大量 CPU。(缺陷号 22986823)
NDB Cluster API:
NdbIndexOperation
使用基于过时的唯一索引 执行事务 现在在这种情况下会检查索引,如果无法使用,则事务会失败并出现相应的错误。(错误#79494,错误#22299443)-
在 MySQL NDB Cluster 7.4.8 中引入并由 API 和管理节点用于管理信号的环回传输器的保留发送缓冲区计算不正确。(漏洞 #23093656,漏洞 #22016081)
参考资料:此问题是 Bug #21664515 的回归。
-
在节点重启期间,重新创建用于验证外键引用完整性的内部触发器并不可靠,因为可能并非所有分布式 TC 和 LDM 实例都同意所有触发器标识。为了解决这个问题,在节点重启序列中添加了一个额外的步骤,在此期间通过查询当前主节点来确定触发器标识。(缺陷号 23068914)
参考资料:另请参阅:Bug #23221573。
在强制关闭集群中的 2 个数据节点之一之后
NoOfReplicas=2
,由于仲裁失败,另一个数据节点也关闭了。(漏洞 #23006431)中止
CREATE LOGFILE GROUP
由于缺少共享全局内存而失败的语句未正确执行,导致节点故障。此外,发生这种情况的事务未正确回滚,也导致任何后续CREATE LOGFILE GROUP
失败。(缺陷号 22982618)该
ndbinfo.tc_time_track_stats
表使用直方图桶来了解延迟的分布。这些桶的大小也在HISTOGRAM BOUNDARY INFO
数据节点启动期间作为消息报告;此打印输出是多余的,因此已被删除。(缺陷号 22819868)由于用于测试版本间升级兼容性的矩阵中缺少条目,无法从以前版本的 MySQL NDB Cluster 在线升级到 MySQL NDB Cluster 7.5。(缺陷号 22024947)
DBTUP
当片段的可变大小页面总计超过 4 GB 时,调试构建中 发生故障。(漏洞 #21313546)-
使用ndb_restore 恢复元数据
-m
有时会失败,并显示错误消息Failed to create index...创建唯一索引时。在诊断这个问题时,发现内部错误 PREPARE_SEIZE_ERROR(临时错误)被报错为未知错误。现在在这种情况下, ndb_restore 会重试创建唯一索引,并且PREPARE_SEIZE_ERROR被报告为 NDB Error 748 Busy during read of event table。(缺陷号 21178339)参考资料:另请参阅:Bug #22989944。
-
mysqld在执行时没有干净地关闭
ndb_index_stat
。(缺陷号 21098142)参考资料:另请参阅:Bug #23343739。
-
对数据节点错误记录机制进行了以下改进:
将消息槽大小从 499 字节增加到 999 字节,以防止日志消息相互覆盖或被截断。
在输出中添加了一个
Trace file name
字段。该字段包含引起跟踪的线程的跟踪文件名(没有任何路径)和跟踪文件号。ndbmtd跟踪文件现在也显示在错误日志中。
(缺陷号 21082710)
-
DBDICT
和GETTABINFOREQ
队列调试增强如下:GETTABINFOREQ
可以通过设置DictTrace
>= 2 来启用 数据节点对信号进程的监视 。添加了
ApiVerbose
配置参数,它为设置为大于或等于 2 的 API 节点启用 NDB API 调试日志记录。添加了显示队列
DUMP
当前状态的代码 1229 。GETTABINFOREQ
(参见转储 1229。)
另请参阅DBDICT 块。(缺陷号 20368450)
参考资料:另请参阅:错误 #20368354。
ndb_binlog_index
当MySQL 服务器关闭期间 写入表失败时, mysqld 会终止NDB
二进制日志记录线程。(错误#81166,错误#23142945)内部表信息方法未释放与表描述关联的内存
NdbDictInterface::parseTableInfo()
。(漏洞 #81141,漏洞 #23130084)TransporterFacade
在执行互斥体数组初始化时 改进了内部构造函数的内存使用情况 。(错误#81134,错误#23127824)ha_ndbcluster::get_metadata()
修复了在此方法调用的函数中或其中一个函数中 出现错误时发生的内存泄漏 。(缺陷 #81045,缺陷 #23089566)Ndb
创建新对象 时,用于验证连接的内部函数无法更新连接计数 。这有可能为每个验证连接的操作创建一个新Ndb
对象,这可能会对性能产生影响,尤其是在执行模式操作时。(缺陷 #80750,缺陷 #22932982)对既不使用有序索引也不使用任何磁盘数据列的表进行表扫描
NDB
通常使用ACC
扫描。如果在扫描一个唯一但无序的索引时发生这种情况,该索引在扫描开始后收缩(由于行被删除)然后再次增长(行插入),那么既没有删除也没有插入的单个行可能会被扫描两次。(缺陷 #80733,缺陷 #22926938)创建大量表后在ndb_mgm客户端 中启动备份导致集群强制关闭。(漏洞 #80640,漏洞 #228849958)
-
当一个 SQL 节点启动并加入模式分发协议时,另一个已经在等待分发模式更改的 SQL 节点在等待期间超时。这是因为代码错误地假定新的 SQL 节点也将确认模式分发,即使新节点加入得太晚而无法参与其中。
作为此修复的一部分,模式分发进度的打印输出现在总是在不太重要的部分之前打印位掩码的较重要部分;此类打印输出中的位掩码格式也得到了改进。(缺陷 #80554,缺陷 #22842538)
MySQL NDB Cluster Auto-Installer 无法在不同平台上以各种方式工作。(错误#79853,错误#22502247)
内部函数
ndbrequire()
,与 一样assert()
,计算给定表达式并在表达式未计算为真时终止进程,现在将失败的表达式包含在其错误日志的输出中。(错误#77021,错误#21128318)-
尝试在正在进行的备份期间删除表失败,并显示错误消息Unknown table;现在,它失败了Unable to alter table as backup is in progress。(缺陷 #47301,缺陷 #11755512)
参考资料:另请参阅:Bug #44695、Bug #11753280。