以下部分描述了 MySQL NDB 集群 8.3.0 中的变化,相比早期版本系列。NDB 集群 8.1 作为预览和测试新功能的创新版本。对于生产,请使用 NDB 8.0;有关详细信息,请参阅 MySQL NDB 集群 8.0。NDB 集群 7.6 和 7.5 是之前的 GA 版本,仍然在生产中受支持;有关 NDB 集群 7.6 的信息,请参阅 NDB 集群 7.6 中的新功能。类似地,关于 NDB 集群 7.5 的信息,请参阅 NDB 集群 7.5 中的新功能。NDB 集群 7.4 和 7.3 是之前的 GA 版本,已经达到生命周期的结束,并且不再受支持或维护。我们建议新的生产部署使用 MySQL NDB 集群 8.0。
NDB 集群 8.3 中的新功能
NDB 集群 8.3 中的主要变化和新功能如下所示:
-
集群节点通信的 TLS。 NDB 集群 8.3 及更高版本提供了对网络通信的 Transport Layer Security (TLS) 和 Internet Public Key Infrastructure (PKI) 支持,以验证和加密 NDB 节点之间的连接,以及 NDB 管理服务器和其客户端之间的连接;TLS 应用于 NDB 传输协议和 NDB 管理协议。
该功能使用 TLS 互认证,在该认证中,节点的证书文件包含用于验证对等节点证书的信任链。当 TLS 在集群中启用时,数据节点和管理节点使用 TLS 执行以下任务:
-
相互认证
NDB
客户端和服务器在网络级别,防止未经授权的访问作为客户端或服务器 -
加密数据传输,避免数据窃听、修改和中间人攻击
使用 MySQL 客户端协议的连接使用 MySQL 用户认证,可能使用 TLS(包括可选的互认证 TLS),如本手册其他地方所述;请参阅 第 8.3 节,“使用加密连接”,以获取更多信息。
NDB
实现了一个新的工具 ndb_sign_keys,该工具可以用于创建和管理 CA、证书文件和密钥。您可以使用 ndb_sign_keys--create-key
生成给定配置文件的所有节点的密钥和证书集。使用 ndb_sign_keys,可以将节点证书绑定到特定的主机名,使其在给定的日期到期,并将其与特定的节点类型关联,以便客户端与服务器、管理服务器与数据节点区分开。(每个 NDB TLS 证书都可以用于 MGM 客户端连接。)私钥是在原地创建的,以便最小化包含私钥的文件的复制。所有私钥和证书都被标记为活动或待定;ndb_sign_keys 还提供了帮助,以便在活动密钥到期之前旋转密钥。
可以使用 ndb_mgm 客户端的
--test-tls
或在 ndb_mgm 客户端中使用TLS INFO
命令测试节点 TLS 连接。可以通过检查ndbinfo
certificates
表来获取集群节点使用的证书信息。要强制实施TLS要求,请在每个集群主机的
my.cnf
文件中设置客户端选项ndb-mgm-tls=strict
,然后在集群config.ini
文件的[mgm default]
部分中设置RequireTls=true
,并在配置文件的[ndbd default]
部分中设置RequireTls=true
。然后,使用--reload
--config-file
执行集群的滚动重新启动。在NDB 8.3及更高版本中,NDB Cluster API应用程序也支持TLS连接。有关MGM API支持的信息,请参阅TLS 函数。NDB API
Ndb_cluster_connection
类添加了configure_tls()
get_tls_certificate_path()
方法,以便客户端设置TLS连接。有关更多信息,请参阅第 25.6.15 节,“NDB 集群的 TLS 链接加密”,以及第 25.5.28 节,“ndb_sign_keys — 创建、签名和管理 NDB 集群的 TLS 密钥和证书”。
-
-
NDB API 主键更新。 以前,当使用除
NdbRecord
之外的任何其他机制尝试更新主键值时,NDB API 将返回错误 4202 不允许在元组键属性上设置值,即使设置的值与现有值相同。在 NDB 8.1 中,现在将更新检查委托给数据节点,就像使用NdbRecord
执行更新一样。这意味着现在可以使用
NdbOperation::setValue()
、NdbInterpretedCode::write_attr()
和其他NdbOperation
和NdbInterpretedCode
方法设置列值(包括NdbOperation
方法incValue()
、subValue()
,NdbInterpretedCode
方法add_val()
、sub_val()
等)。这也适用于NdbOperation
接口的OperationOptions::OO_SETVALUE
扩展。 -
改进的警告。 对警告输出进行了以下改进:
-
现在还将打印没有进度的最大时间,除了本地检查点(LCP)经过的时间。
-
当 LCP 达到
WAIT_END_LCP
状态时,表 ID 和片段 ID 是未定义的,因此不再相关;因此,我们不再尝试在那个点打印它们。 -
删除了达到最大限制时打印的重复信息(相同的信息同时显示为警告和崩溃信息)。
此外,我们不再每隔
ndb_metadata_check_interval
(默认 60) 秒在 SQL 节点的错误日志中打印消息 验证排除对象,因为这些消息倾向于淹没错误日志,难以检查,并且占用了过多的磁盘空间,而对用户没有任何额外的好处。 -
-
现在正确和安全地处理了具有非常大且可能重叠的
IN()
和NOT IN()
列表的推送连接查询。 -
ndbcluster
插件日志消息现在使用SYSTEM
作为日志级别和NDB
作为日志子系统。 这意味着来自ndbcluster
插件的信息性消息总是被打印;其详细程度可以通过使用--ndb_extra_logging
进行控制。 -
二进制日志注入器内存分配。 在 NDB 集群的早期版本中,当
NDB
二进制日志注入器参与处理架构更改和跟踪二进制日志的状态时,选择arena用于分配内存的arena是通过更改线程局部指针来强制的,从而尝试捕获epoch处理期间执行的所有分配。在epoch结束时,这些指针被重置,arena内存被释放,arena结构被丢弃;这释放了内存,但也需要为下一个epoch重新设置。线程局部指针的更改也引入了在激活不同子系统的功能时内存被错误分配的风险。 MySQL NDB 集群 8.3 对此功能进行了以下改进:-
删除了对线程局部指针的更改,并用明确的参数提供了用于epoch期间的arena分配。
-
重复使用下一个epoch的arena,从而避免了重复设置的需要。
这些变化仅限于内部,但应该通过在连续的epoch中保存内存释放和重新分配来提供明显的改进。
-
MySQL 集群管理器具有先进的命令行界面,可以简化许多复杂的 NDB 集群管理任务。请参阅 MySQL 集群管理器 8.3.0 用户手册,以获取更多信息。