MySQL NDB Cluster 7.6.2 是 NDB 7.6 的新版本,基于 MySQL Server 5.7,包括
NDB
存储引擎 7.6 版中的功能,并修复了最近在之前的 NDB Cluster 版本中发现的错误。
获取 NDB Cluster 7.6。 NDB Cluster 7.6 源代码和二进制文件可以从 https://mysql.net.cn/downloads/cluster/获得。
有关 NDB Cluster 7.6 中所做更改的概述,请参阅 NDB Cluster 7.6 中的新增功能。
此版本还合并了以前 NDB Cluster 版本中所做的所有错误修复和更改,以及通过 MySQL 5.7.18 在主线 MySQL 5.7 中添加的所有错误修复和功能更改(请参阅MySQL 5.7.18 中的更改(2017-04- 10,普遍适用)。
不相容的变化;NDB 磁盘数据: 由于磁盘文件格式的变化,
--initial
在升级到此版本或从该版本降级时,需要重新启动每个数据节点。-
重要变化: 作为简化 NDB Cluster 配置的持续努力的一部分,索引的内存现在从动态分配
DataMemory
;配置IndexMemory
参数现在已弃用,并且可能会在未来的 NDB 版本中删除。IndexMemory
在 设置的任何内存config.ini
现在都会自动添加到DataMemory
. 此外,默认值DataMemory
增加到98M,IndexMemory
减少到0。除了简化 的配置之外
NDB
,这些更改的另一个好处是通过增加 LDM 线程的数量进行扩展不再受限于为 设置的值不够大IndexMemory
。以前,有时增加 LDM 线程的数量可能会导致索引内存耗尽,但DataMemory
仍有大量可用。因为
DBACC
内核块的实例(负责哈希索引存储)现在彼此共享内存以及与DBLQH
(充当本地数据管理器的内核块)共享内存,它们可以利用扩展不会增加的事实DataMemory
使用率大,可以自由使用空闲内存做索引。(有关这些内核块的更多信息,请参阅 DBACC 块和 DBLQH 块.) 换句话说,索引内存不再是在集群启动时仅分配给每个 DBACC 实例一次的静态数量,而是现在可以在条件需要时分配和释放此资源。此处列出了作为这项工作的一部分所做的相关更改:
-
一些
DataMemory
与表数据存储无关的使用实例现在改为使用事务内存。因此,在某些系统上可能需要增加
SharedGlobalMemory
. 此外,使用大型事务执行初始批量数据加载的系统可能需要将大型事务分解为较小的事务。 数据节点现在生成
MemoryUsage
事件(请参阅NDB 集群日志事件)并在资源使用率达到 99% 时在集群日志中写入适当的消息,除了像以前那样达到 80%、90% 或 100% 时。REPORT MEMORYUSAGE
和其他公开内存消耗的命令现在使用 32K 而不是 8K 的页面大小显示索引内存消耗。IndexMemory
不再是ndbinfo.memoryusage
表格memory_type
列中显示的值之一。-
该
ndbinfo.resources
表现在将DISK_OPERATIONS
资源显示为TRANSACTION_MEMORY
。该
RESERVED
资源已被删除。 IndexMemory
不再显示在 ndb_config输出中。
-
性能:
DBTC
内核块和DBLQH
内核块以及相关代码中 的许多调试语句和打印输出在许多常见用例中,这有望使本地数据管理和事务协调器线程的性能提高多达 10%。-
NDB 集群 API;ndbinfo 信息数据库: 向信息数据库添加了两个表
ndbinfo
。该config_nodes
表提供有关配置为给定 NDB Cluster 的一部分的节点的信息,例如节点 ID 和进程类型。该processes
表显示有关当前连接到集群的节点的信息;此信息包括进程名称和系统进程 ID,以及服务地址。对于每个数据节点和SQL节点,它还显示了该节点的天使进程的进程ID。作为实现该
processes
表所做工作的一部分,一个新set_service_uri()
方法已添加到 NDB API。有关详细信息,请参阅 ndbinfo config_nodes Table和 ndbinfo processes Table以及 Ndb_cluster_connection::set_service_uri()。
NDB Cluster APIs: NDB cluster 的系统名称现在 作为状态变量的值 在mysql
Ndb_system_name
客户端中可见,也可以通过 NDB API 应用程序使用该Ndb_cluster_connection::get_system_name()
方法获取。可以使用 集群配置文件部分中Name
参数[system]
向ndb_config 添加了
--query-all
选项。此选项的行为与 选项非常相似,只是 (缩写形式:)一次转储所有属性的配置信息。(缺陷 #60095,缺陷 #11766869)--query
--query-all
-a
以前,当一个 LDM 线程遇到 I/O 滞后时,例如在磁盘过载情况下,它写入本地检查点的速度会更慢——也就是说,它会以 I/O 滞后模式写入。但是,其他 LDM 线程不一定遵守或符合此状态。为确保在遇到此类减速时所有 LDM 线程都会降低 LCP 的写入速度,
NDB
现在全局跟踪 I/O 滞后模式,以便在至少一个线程以 I/O 滞后模式写入时立即报告 I/O 滞后状态,因此所有 LDM 线程都被迫在滞后模式下写入坚持。其他 LDM 实例写入速度的降低应该会增加整体容量,从而在这种情况下比以前更快地克服磁盘过载情况。-
添加了ndb_import工具以方便将 CSV 格式的数据(例如 生成的数据)加载
SELECT INTO OUTFILE
到NDB
表中。ndb_import的功能类似于mysqlimport或LOAD DATA
SQL 语句,并支持许多类似的数据文件格式化选项。需要连接到NDB
管理服务器(ndb_mgmd);为此[api]
,集群文件中 必须有一个未使用的槽。config.ini
此外,目标数据库和表(使用NDB
存储引擎)必须已经存在,并且 CSV 文件的名称(减去任何文件扩展名)必须与目标表的名称相同。创建目标数据库和表需要一个正在运行的 SQL 节点,但ndb_import不需要运行。有关详细信息,请参阅 ndb_import — 将 CSV 数据导入导航台。
-
分区:在具有大量 分区的显式分区表上运行时,列
EXPLAIN PARTITIONS
显示的不正确值 的输出partitions
NDB
这是因为,在处理
EXPLAIN
语句时,mysqld 将哈希值的分区 ID 计算为 ( ),这仅在表按 分区时正确 ,因为其他分区类型使用不同的方法将哈希值映射到分区身份证。此修复将 mysqld执行的分区 ID 计算替换为内部 函数,该函数根据表的分区类型正确计算分区 ID。(缺陷号 21068548)hash_value
%number_of_partitions
HASH
NDB
参考资料:另请参阅:Bug #25501895、Bug #14672885。
Microsoft Windows: 在 Windows 上收集有关 CPU 的信息时,Auto-Installer 仅计算物理内核,这与在其他平台上不同,它会收集有关物理内核和虚拟内核的信息。现在Windows上获取的CPU信息与其他平台上提供的是一样的。(缺陷 #85209,缺陷 #25636423)
索拉里斯;ndbmemcache:
ndbmemcache
使用 Developer Studio 编译 NDB Cluster 时未在 Solaris 平台上正确构建。(缺陷 #85477,缺陷 #25730703)索拉里斯;MySQL NDB ClusterJ: 使用 Oracle Developer Studio 编译 NDB Cluster 时,在 Solaris 平台上未正确构建 ClusterJ。(缺陷号 25738510)
Solaris: 由于对系统运行时库的依赖,Solaris 的最低要求版本现在是 Solaris 11 update 3。
-
Solaris: 在 Solaris 上,MySQL 现在是使用 Developer Studio 12.5 而不是gcc构建的。二进制文件需要安装 Developer Studio C/C++ 运行时库。有关如何仅安装库的信息,请参见此处:
https://docs.oracle.com/cd/E60778_01/html/E60743/gozsu.html
NDB 磁盘数据: 在某些情况下,将 NDB 磁盘数据表的动态内存列设置
NULL
为未正确处理。(错误#79253,错误#22195588)-
NDB 复制:在某些情况下, 执行
CREATE TABLE
可能会导致复制从 SQL 线程挂起。(缺陷 #85015,缺陷 #25654833)参考资料:此问题是 Bug #83676、Bug #25042101 的回归。
-
ndb_report_thresh_binlog_epoch_slip
启用后,当事件缓冲区使用率很高时,事件缓冲区状态消息 会report_reason=LOW/ENOUGH_FREE_EVENTBUFFER
打印在日志中,然后降低到较低水平。该计算基于分配的事件缓冲区内存总量,而不是 ; 设置的限制ndb_eventbuffer_max_alloc
;即使事件缓冲区具有无限内存(ndb_eventbuffer_max_alloc
= 0,默认值),它也会被打印出来,这可能会使用户感到困惑。这是固定的,如下所示:
的计算
ndb_eventbuffer_free_percent
现在基于ndb_eventbuffer_max_alloc
,而不是实际分配的数量。当
ndb_eventbuffer_free_percent
设置ndb_eventbuffer_max_alloc
为 0 时,report_reason=LOW/ENOUGH_FREE_EVENTBUFFER
不再打印使用的事件缓冲区状态消息。设置后, 只要大于阈值,就会每 10 秒(而不是每秒)写入
ndb_report_thresh_binlog_epoch_slip
一次事件缓冲区状态消息 。report_reason=BUFFERED_EPOCHS_OVER_THRESHOLD
(缺陷号 25726723)
-
批量更新是通过读取记录并在记录集上执行事务来执行的,该事务在读取记录时启动。当事务初始化失败时,事务执行器函数随后没有意识到发生了这种情况,从而导致 SQL 节点故障。通过在尝试初始化事务时提供适当的错误处理来解决此问题。(缺陷号 25476474)
参考资料:另请参阅:Bug #20092754。
DBDIH
在数据库具有大量片段副本的某些情况下,作为本地检查点结束 的主块对数据节点主线程的 CPU 使用率 可能接近 100%。这是通过减少 LCP 期间片段队列检查的频率和范围来解决的。(缺陷号 25443080)对主键大于80字节的表 执行在线
ALTER TABLE ... REORGANIZE PARTITION
语句 导致数据节点重启,导致重组失败。NDB
(漏洞#25152165)-
集群部分重启期间的多个数据节点故障可能会导致 API 节点失败。这是由于一个线程扩展了内部对象 ID 映射,从而改变了它在内存中的位置,而另一个线程仍在访问旧位置,导致后一个线程出现分段错误。
出现此问题 的内部
map()
和 函数现在已成为线程安全的。unmap()
(缺陷号 25092498)参考资料:另请参阅:Bug #25306089。
计划关闭具有超过 10 个数据节点的 NDB Cluster 并不总是正常执行。(缺陷号 20607730)
-
使用长信号格式的丢弃
TRANS_AI
信号未由DBTC
内核块处理。(缺陷 #85606,缺陷 #25777337)参考资料:另请参阅:Bug #85519、Bug #27540805。
-
当行应该只传递给 SPJ API 时,我通过消除
FLUSH_AI
将空行传递给内核块的 不需要的属性改进了推送连接处理 ;DBSPJ
这减少了AttrInfo
为产生结果而必须执行的预测集。这也使得TRANSID_AI
在传递 SPJ API 结果时使用打包信号成为可能,这样效率更高。(缺陷 #85525,缺陷 #25741170)参考资料:另请参阅:Bug #85545、Bug #25750355。
、、 、、 和NDB 内核块
TRANSID_AI
支持 对传入消息使用长信号格式(在 NDB 6.4 中引入) ,但该块仅在发送到or 时产生长信号,否则发送一系列短信号反而。现在只要接收块支持此优化,就会对此类消息使用长信号。(缺陷 #85519,缺陷 #25740805)BACKUP
DBTC
DBLQH
SUMA
DBSPJ
DBUTIL
DBTUP
DPSPJ
DBUTIL
DBTUP
-
为了防止扫描返回比客户端保留缓冲区更多的行、字节或两者,
DBTUP
内核块 在发送给请求 块TRANSID_AI
的信号中报告它已发送给客户端 的大小。知道可用于结果集的最大批处理大小,如果超过,则终止扫描批处理。TUPKEYCONF
DBLQH
DBLQH
该
DBSPJ
块的FLUSH_AI
属性允许从同一行DBTUP
生成两个TRANSID_AI
结果,一个用于客户端,一个用于DBSPJ
,这是在连接表上进行键查找所需要的。这两个的大小都被添加到DBTUP
块报告的读取长度中,这导致控制DBLQH
块认为它消耗了比实际情况更多的可用最大批大小,从而导致扫描批提前终止,这可能对 SPJ 扫描的性能产生负面影响。为更正此问题,在这种情况下,现在仅报告 API 请求的实际读取长度部分。(缺陷 #85408,缺陷 #25702850) 在 SPARC 平台上使用 Oracle Developer Studio 12.5 构建的 Solaris 11 的数据节点二进制文件因总线错误而失败。(漏洞 #85390,漏洞 #25695818)
在扫描请求的初始阶段,
DBTC
内核块向块发送一系列DIGETNODESREQ
信号,DBDIH
以获得要扫描的每个片段的字典信息。如果DBDIH
返回DIGETNODESREF
,则不会读取来自该信号的错误代码,而是始终返回Error 218 Out of LongMessageBuffer 。现在在这种情况下,实际使用来自 DIGETNODESREF信号的错误代码。(漏洞 #85225,漏洞 #25642405)如果用户尝试在自动安装程序仍在运行时调用 ndb_setup.py——例如,在关闭启动它的终端后,稍后打开一个新终端并在新终端中调用它——程序失败并显示错误Web 服务器已在运行,这是预期的行为。在这种情况下,
mcc.pid
必须先删除该文件,然后才能重新启动自动安装程序(也是预期行为)。现在,当程序因为这个原因失败时,mcc.pid
错误消息中会包含 的位置以简化此任务。(缺陷 #85169,缺陷 #25611093)在同一节点组中的一个或多个数据节点发生故障后计划关闭数据节点并不总是正确执行。(缺陷 #85168,缺陷 #25610703)
-
源自不同 SQL 节点的同一数据库对象上的模式操作之间存在竞争条件的可能性;当其中一个 SQL 节点延迟释放其对受影响的模式对象的元数据锁时,可能会发生这种情况,这种方式在模式分发协调器看来是因为错误的模式更改确认了锁释放。这可能会导致在部分或所有 SQL 节点上不正确地应用模式更改,或者由于分发协议失败而导致节点日志中重复等待最大
###
秒分发消息的超时。(缺陷 #85010,缺陷 #25557263)参考资料:另请参阅:Bug #24926009。
-
当使用
ALTER TABLE
语句将外键添加到 NDB 表或从中删除时,父表的元数据不会更新,这使得之后可以对父表执行无效的更改操作。在升级到此版本之前,您可以通过
SHOW CREATE TABLE
在添加或删除外键后立即在父级上运行来解决此问题;此语句导致重新加载表的元数据。(错误#82989,错误#24666177) -
当还启用查询缓存时,具有级联外键的表上的事务
NDB
返回不一致的结果,因为 mysqld不知道子表更新。这意味着稍后SELECT
从子表中获取的结果是从查询缓存中获取的,此时包含陈旧数据。在这种情况下,通过将父表的所有子表添加到一个内部列表来解决 这个问题,以便在父表
NDB
更新时检查更新,以便mysqld现在正确地通知任何应该从查询缓存中失效的更新子表. (缺陷 #81776,缺陷 #23553507)