MySQL NDB Cluster 8.0.19 是 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.19 在主线 MySQL 8.0 中添加的所有错误修复和功能更改(请参阅MySQL 8.0.19 中的更改(2020-01- 13,普遍适用)。
重要更改:服务器系统变量 的默认值
ndb_autoincrement_prefetch_sz
已增加到 512。(错误号 30316314)重要变化:
NDB
现在支持超过 2 个片段副本(最多 4 个)。设置NoOfReplicas=3
或NoOfReplicas=4
现在已完全包含在我们的内部测试中,因此支持在生产中使用。(错误#97479、错误#97579、错误#25261716、错误#30501414、错误#30528105)-
重要变化: 添加了
TransactionMemory
数据节点配置参数,简化了事务操作的数据节点内存分配配置。这是正在进行的事务和本地数据管理器 (LDM) 内存池工作的一部分。如果设置了该参数,则以下参数与配置文件不兼容,
TransactionMemory
不能在config.ini
配置文件中设置:如果您尝试同时设置这些不兼容的参数中的任何一个
TransactionMemory
,则集群管理服务器无法启动。更多信息参见
TransactionMemory
参数说明和 与TransactionMemory不兼容的Parameters。有关NDB Cluster 数据节点如何分配内存资源的信息,另请参阅 数据节点内存管理。(缺陷 #96995,缺陷 #30344471) -
重要更改: 几个 NDB Cluster 数据节点配置参数的最大值或默认值已在此版本中更改。此处列出了这些更改:
的最大值
DataMemory
从 1 TB 增加到 16 TB。的最大值
DiskPageBufferMemory
也从 1 TB 增加到 16 TB。的默认值
StringMemory
降低到 5%。此前,这是 25%。的默认值
LcpScanProgressTimeout
从 60 秒增加到 180 秒。
-
Performance: Read from any fragment replicas,以极低的表写入性能成本极大地提高了表读取性能,现在默认为所有
NDB
表启用。这意味着ndb_read_backup
系统变量的默认值现在为 ON,并且 在创建新 表NDB_TABLE
注释选项 (以前,默认值分别为 OFF 和 0。)READ_BACKUP
NDB
有关详细信息,请参阅 设置 NDB 注释选项以及
ndb_read_backup
系统变量的说明。 -
NDB 磁盘数据: 当使用非易失性存储设备(例如固态驱动器(尤其是那些使用 NVMe 进行数据传输的设备)、磁盘数据文件的单独物理驱动器或两者)时,磁盘数据文件检查点的延迟已减少。作为这项工作的一部分,引入了此处列出的两个新数据节点配置参数:
MaxDiskDataLatency
设置磁盘访问允许延迟的最大值,中止超过此时间量的事务以完成DiskDataUsingSameDisk
通过提高创建磁盘数据检查点的速率,可以利用将磁盘数据文件保存在单独的磁盘上的优势
此版本还向
ndbinfo
数据库添加了三个新表。此处列出的这些表可以帮助监控磁盘数据检查点的性能:diskstat
提供有关磁盘数据表空间在前 1 秒内读取、写入和页面请求的信息diskstats_1sec
提供与表中给出的类似的信息diskstat
,但在最后 20 秒中的每一秒都这样做pgman_time_track_stats
表报告影响磁盘数据表空间的磁盘操作延迟
有关其他信息,请参阅 磁盘数据延迟参数。
添加了
ndb_metadata_sync
服务器系统变量,简化了元数据同步何时成功完成的了解。将此变量设置为true
触发立即同步NDB
字典和 MySQL 数据字典之间的所有更改,而不考虑为ndb_metadata_check
或 设置的任何值ndb_metadata_check_interval
。同步完成后,其值自动重置为false
。(缺陷号 30406657)新增
DedicatedNode
数据节点、API节点、管理节点参数。当设置为 true 时,此参数可防止管理服务器将此节点的节点 ID 分发给任何未明确请求它的节点。主要用于测试,此参数在多个管理服务器在同一主机上运行的情况下可能很有用,并且仅使用主机名不足以区分同一类型的进程。(缺陷 #91406,缺陷 #28239197)现在,堆栈跟踪会在数据节点异常终止时写入数据节点日志。
元数据从 MySQL 数据字典自动同步到
NDB
现在包括包含NDB
表的数据库。有了这个增强,如果一个表存在于 中NDB
,而它所属的表和数据库在给定的 SQL 节点上不存在,则不再需要手动创建数据库。相反,NDB
应该在 SQL 节点上自动创建数据库以及属于该数据库的所有表。
-
不兼容的更改:默认情况下, ndb_restore不再恢复共享用户和对
mysql.ndb_sql_metadata
表的授权。添加了一个新的命令行选项--include-stored-grants
来覆盖此行为并启用共享用户和授权数据和元数据的恢复。作为此修复的一部分,ndb_restore现在还可以正确处理系统表上的有序索引。(缺陷号 30237657)
参考资料:另请参阅:Bug #29534239、Bug #30459246。
-
Incompatible Change: The minimum value for the
RedoOverCommitCounter
data node configuration parameter has been increased from 0 to 1.RedoOverCommitLimit
也已从 0 增加到 1。在升级之前,您应该检查集群全局配置文件并对为这些参数设置的值进行任何必要的调整。(漏洞#29752703)
macOS: 在 macOS 上,SQL 节点有时会在启动集群时的二进制日志设置阶段意外关闭。当存在名称使用大写字母并
lower_case_table_names
设置为 2 的模式时,就会发生这种情况。这会导致尝试使用字母大小写不正确的密钥获取元数据锁,随后这些锁会失败。(缺陷号 30192373)微软Windows; NDB 磁盘数据: 在 Windows 上,在使用磁盘数据表时重启主节点以外的数据节点会导致
TSMAN
. (缺陷 #97436,缺陷 #30484272)Solaris: 调试时, ndbmtd消耗了 Solaris 11.4 SRU 12 及更高版本上的所有可用交换空间。(缺陷号 30446577)
Solaris: 用于存储在表中的数值的字节顺序
mysql.ndb_sql_metadata
在 Solaris/Sparc 上不正确。这可以在使用 ndb_select_all或 ndb_restore--print
时看到。(缺陷号 30265016)-
NDB 磁盘数据: 在一个 SQL 节点上删除磁盘数据表后,尝试在另一个 SQL 节点上执行查询
INFORMATION_SCHEMA.FILES
停滞在Waiting for tablespace metadata lock
. (缺陷号 30152258)参考资料:另请参阅:Bug #29871406。
NDB 磁盘数据:
ALTER TABLESPACE ... ADD DATAFILE
有时可能会在尝试获取元数据锁时挂起。(漏洞#29871406)NDB 磁盘数据: 在 NDB 7.6 中引入版本 2 格式之前使用的版本 1 磁盘格式的兼容性代码证明不是必需的,并且不再使用。
-
在 NDB 8.0.18 中完成的工作允许更多节点引入多个信号的长信号变体,将位掩码作为其参数之一,我们开始使用这些新的长信号变体,即使以前的(仍然支持的)短变体就足够了. 这引入了几个解决 LongMessageBuffer错误 的新机会。
为了避免这种情况,现在在这种情况下我们尽可能使用短信号变体。一些受影响的信号包括
CM_REGCONF
,CM_REGREF
,FAIL_REP
,NODE_FAILREP
,ISOLATE_ORD
,COPY_GCIREQ
,START_RECREQ
,NDB_STARTCONF
和START_LCP_REQ
。(缺陷号 30708009)参考资料:另请参阅:Bug #30707970。
-
NDB 8.0.18 中修复了一个问题,在该问题中,如果表定义在中途发生更改,则会过早地中止事务,但未能测试释放由 分配的内存
getExtraMetadata()
。现在,在中止事务之前,此内存已正确释放。(缺陷号 30576983)参考资料:此问题是 Bug #29911440 的回归。
初始化数据时属性缓冲区的过度分配
DBTC
导致 api 连接记录的预分配因内存意外耗尽而失败。(缺陷号 30570264)NDB
在尝试更新具有权限但在表NDB_STORED_USER
中找不到 的本地用户 的情况下改进了错误处理 。ndb_sql_metadata
(缺陷号 30556487)ALTER TABLE ... ALGORITHM=COPY
在将新表重命名为原始表的名称之后但在删除原始表之前 执行语句期间的事务失败 导致mysqld过早退出。(缺陷号 30548209)除非安装了 WiX 工具包,否则在 Windows 上使用非 MSI 构建
-DWITH_NDBCLUSTER
不会成功。(缺陷号 30536837)-
NDB 8.0.18中 数据节点配置参数的 ndb_config
allowed_values
输出 与以前版本中获得的输出不一致 。(缺陷号 30529220)--xml
--configinfo
Arbitration
参考资料:另请参阅:Bug #30505003。
实施部分本地检查点时引入的故障
ndbrequire()
假设m_participatingLQH
在接收时必须清除,当主机在发送之后和处理任何 信号之前START_LCP_REQ
发生故障时不一定为真。(缺陷号 30523457)START_LCP_REQ
START_LCP_CONF
当主节点在发送
LCP_COMPLETE_REP
信号时失败并且它被发送到一些节点,但不是所有节点,有时本地检查点会挂起。(缺陷号 30520818)管理服务器没有
NODE_FAILREP
正确处理所有情况。(缺陷号 30520066)设置为 0 时,
SharedGlobalMemory
某些资源不满足最低要求。(缺陷号 30411835)与和选项一起 执行ndb_restore 不会为目标数据库中的任何表创建索引。(缺陷号 30411122)
--rebuild-indexes
--rewrite-database
--exclude-missing-tables
-
将schema写入
ndb_schema
表失败时,NDB_SCHEMA
对象中的状态没有被清除,导致SQL节点在试图释放对象时关闭。(缺陷号 30402362)参考资料:另请参阅:Bug #30371590。
在同步范围页面时,如果在接收到写入范围同步页面的最后一页
CONTINUEB
的信号时处理 LCP 的信号仍然未完成, 则当前本地检查点 (LCP) 可能会无限期地停止 。FSWRITECONF
如果从数据页写入另一页,LCP 也可以重新启动。这个问题也可能导致PREP_LCP
页面在不应该的时候被写入。(缺陷号 30397083)-
如果事务在从磁盘页面缓冲区获取页面时中止并且磁盘系统过载,事务将无限期挂起。这也可能导致重新启动挂起和节点故障处理失败。(错误#30397083,错误#30360681)
参考资料:另请参阅:Bug #30152258。
数据节点故障并显示错误Another node failed during system restart...发生在部分重启期间。(缺陷号 30368622)
自动同步可能会触发在给定时间对特定元数据对象采取的锁定数量的增加,例如当同步尝试与涉及相同元数据对象的 DDL 或 DML 语句同时发生时;竞争锁可能导致 NDB 死锁检测逻辑惩罚用户操作而不是后台同步。我们通过在自动同步期间更改所有独占元数据锁获取尝试来解决此问题,以便它们使用 0 超时(而不是之前允许的 10 秒),从而避免死锁检测并优先考虑用户操作。(缺陷号 30358470)
如果在删除日志文件组作为部分本地检查点的一部分
SYNC_EXTENT_PAGES_REQ
时接收到信号PGMAN
,并因此删除此块锁定的页面以进行下一步处理,则 LCP 会因尝试访问已删除的页面而终止。(缺陷号 30305315)-
对于已完成的本地检查点,集群日志中报告了错误的字节数。(缺陷号 30274618)
参考资料:另请参阅:Bug #29942998。
使用该 选项 执行ndb_drop_table
--help
会导致该程序过早终止,并且不会产生任何帮助输出。(缺陷号 30259264)尝试连接到集群并因此在设置期间尝试获取全局模式锁 (GSL) 的 mysqld会
ndb-wait-setup
忽略设置并在 GSL 已被另一个 mysqld获取时无限期挂起,例如在执行ALTER TABLE
语句时. (缺陷号 30242141)当使用该算法更改包含自引用外键(换句话说,引用同一表的另一列的外键)的表时
COPY
,外键定义将被删除。(缺陷号 30233405)-
在 MySQL 8.0 中,用户显式提供的外键名称在 SQL 层自动生成并存储在数据字典中。这些名称的形式 与MySQL 5.7 中存储引擎 生成的名称一致 。NDB 8.0.18 引入了一个行为变化 ,它也使用生成的名称,但在某些情况下,例如当表被重命名时,仍然会在内部生成并使用自己的格式来使用这些名称,而不是 SQL 层生成的名称并存储在数据字典中,这导致了以下问题:
[
table_name
]_ibfk_[#
]InnoDB
NDB
NDB
SHOW CREATE TABLE
输出和内容的 差异INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
外键元数据锁定不当
错误消息中的外键名称令人困惑
在这种情况下,现在
NDB
还使用 MySQL 服务器提供的名称重命名外键,以与InnoDB
. (缺陷号 30210839)参考资料:另请参阅:Bug #96508、Bug #30171959。
当外键引用的表被重命名时,参与的 SQL 节点在模式分发期间未正确更新其数据字典中引用表的外键定义。(缺陷号 30191068)
数据节点对其他数据节点故障的处理有时无法正确同步,从而导致两个或多个数据节点将不同的节点视为主节点。(缺陷号 30188414)
由于
DbtupBuffer.cpp
检查 API 节点是否使用 NDB 6.4 之前的软件版本的旧断言,某些扫描操作失败。这不再是必需的或正确的,并且已被删除。(缺陷号 30188411)-
执行全局模式锁 (GSL) 时, 在尝试获取表对象引用时
NDB
使用单个Ndb_table_guard
对象连续退出;在第一次尝试失败后,这是不可能成功的,因为Ndb_table_guard
假设底层对象指针只在初始化时确定一次,之前检索到的指针随后从缓存的引用中返回。这导致无限等待获取 GSL,导致 binlog 注入器线程挂起,因此mysqld 认为所有
NDB
表都是只读的。为避免此问题,现在为每次此类重试NDB
使用一个新实例。Ndb_table_guard
(缺陷号 30120858)参考:这个问题是 Bug #30086352 的回归。
将 SQL 节点从以前的版本系列升级到 NDB 8.0 时,
.frm
读取内容然后安装到数据字典中的文件不包含任何有关外键的信息。这意味着外键信息没有安装在 SQL 节点的数据字典中。这是通过使用 NDB 数据字典中可用的外键信息在表元数据升级期间更新本地 MySQL 数据字典来解决的。(缺陷号 30071043)-
使用该选项恢复表会
--disable-indexes
导致在 MySQL 数据字典中安装错误的表定义。这是因为打包到 NDB 字典的表定义中的序列化字典信息 (SDI) 用于创建表对象;只有当 DDL 更改通过 MySQL 服务器完成时,SDI 定义才会更新。安装错误的表定义意味着无法打开该表,直到再次使用--rebuild-indexes
.这是通过扩展自动同步来解决的,这样它将 SDI 与 NDB 字典表信息进行比较,并且在列定义不匹配的情况下失败。仅涉及索引的不匹配被视为临时错误,在下一轮更改检测期间再次检测到有问题的表。(错误#30000202,错误#30414514)
将
MAX_ROWS
用于将分区从 NDB 7.4 制作的备份更改为运行 NDB 7.6 的集群的表无法正常工作。这是通过确保升级代码处理 为字典PartitionBalance
提供有效的表规范来解决的。NDB
(漏洞#29955656)备份完成时写入群集日志的摘要事件的数据字节数被截断为 32 位,因此日志记录数与此事件在日志中打印的数据记录数之间存在显着不匹配. (漏洞#29942998)
-
mysqld
ALTER TABLE
有时会在超时的长时间操作期间中止 (漏洞#29894768)参考资料:另请参阅:Bug #29192097。
-
当一个 SQL 节点连接到 时
NDB
,它不知道它之前是否连接过该集群,因此无法确定它的数据字典信息只是过时了,还是完全无效。通过为数据字典中的表和表对象ndb_schema
实现NDB
唯一 的模式版本标识符(模式 UUID),解决了这个问题。ndb_schema
现在,每当mysqld作为 SQL 节点连接到集群时,它可以将存储在其数据字典中的模式 UUID 与存储在ndb_schema
表,这样就知道它是否是第一次连接。如果是这样,SQL 节点将删除可能在其数据字典中的任何条目。(漏洞#29894166)参考资料:另请参阅:Bug #27543602。
改进了由表发现和表元数据升级生成的日志消息。(漏洞#29894127)
-
在每个节点有 10 个线程的 2 节点集群上使用 2 个 LDM 线程可能会导致分区不平衡,这样每个节点上的一个 LDM 线程是零碎片的主要线程。尝试从此集群恢复多线程备份失败,因为一个 LDM 的数据文件仅包含 12 字节的数据文件头,ndb_restore无法读取。在其他情况下也会出现同样的问题,比如在线添加一个空节点后立即进行备份。
发现这个是在
ODirect
启用了EOF备份数据文件写入,其大小小于512字节且备份处于该STOPPING
状态时出现的。这通常只发生在中止的备份中,但也可能发生在 LDM 没有碎片的成功备份中。我们通过引入额外的检查来解决这个问题,以确保只有当备份实际上包含一个应该导致它中止的错误时才会跳过写入。(缺陷号 29892660)参考资料:另请参阅:Bug #30371389。
对于
NDB
表格,ALTER TABLE ... ALTER INDEX
不适用于ALGORITHM=INPLACE
. (漏洞 #29700197)-
ndb_restore在 32 位平台上测试失败。此问题已通过将此工具使用的线程堆栈大小从 64 KB 增加到 128 KB 来解决。(漏洞#29699887)
参考资料:另请参阅:Bug #30406046。
由于
DBTUP
在线升级后从表中删除行时出错,导致集群意外关闭。(漏洞#29616383)-
在某些情况下
SignalSender
,用作ndb_mgmd和 实现的一部分的类会ndbinfo
缓冲过多数量的不需要SUB_GCP_COMPLETE_REP
和API_REGCONF
信号,从而导致不必要的内存消耗。(漏洞 #29520353)参考资料:另请参阅:Bug #20075747、Bug #29474136。
BackupLogBufferSize
不接受配置参数 的设置 。(漏洞 #29415012)-
当使用该选项运行 mysqld
--upgrade=FORCE
时,它报告了以下问题:[Warning] Table 'mysql.ndb_apply_status' requires repair. [ERROR] Table 'mysql.ndb_apply_status' repair failed.
这是因为
--upgrade=FORCE
导致引导系统线程运行CHECK TABLE FOR UPGRADE
,但ha_ndbcluster::open()
在模式同步完成之前拒绝打开表,最终导致报告的情况。(漏洞 #29305977)参考资料:另请参阅:Bug #29205142。
当使用显式 SHM 连接时,
ShmSize
设置为大于系统可用共享内存的值, mysqld在启动时无限期挂起并且没有产生任何有用的错误消息。(漏洞#28875553)-
每当节点关闭时,都会重新计算最大全局检查点 (GCP) 提交延迟和 GCP 保存超时,以考虑数据节点数量的变化。当阈值降低到先前的值以下时,这可能会导致可行节点的意外关闭。(漏洞#27664092)
参考资料:另请参阅:Bug #26364729。
-
插入子行的事务可以与删除该子行的父行的事务同时运行。在这种情况下,应该中止其中一个事务,以免产生孤立的子行。
在提交对子行的插入之前,会触发对父行的读取以确认父行存在。类似地,在父行上提交删除之前,执行读取或扫描以确认不存在子行。当插入和删除事务同时运行时,它们的准备和提交操作可以以两个事务都提交的方式进行交互。发生这种情况是因为触发读取是使用
LM_CommittedRead
锁执行的(参见 参考资料NdbOperation::LockMode
),锁的强度不足以防止此类错误场景。通过对两个触发读取使用更强的
LM_SimpleRead
锁定模式来解决此问题。使用LM_SimpleRead
rather thanLM_CommittedRead
locks 确保在涉及并发插入子行和从父行删除的事务的每种可能场景中至少有一个事务中止。(缺陷号 22180583) 同一 SQL 节点上的并发
SELECT
和ALTER TABLE
语句有时会在等待释放锁时相互阻塞。(错误#17812505,错误#30383887)模式同步中的故障处理涉及将警告和错误推送到二进制日志记录线程。如果出现某些可能导致线程中累积警告的故障,也会重试模式同步。现在,每次尝试模式同步后,此类警告和错误都会被清除。(漏洞 #2991036)
当节点出现故障时,应忽略来自任何本地块的
INCL_NODECONF
信号,除非为了重置c_nodeStartSlave.nodeId
。(缺陷 #96550,缺陷 #30187779)-
返回错误 1022 时,
NDB
没有打印受影响表的名称。(错误#74218,错误#19763093)参考资料:另请参阅:Bug #29700174。