以下部分描述了与早期版本系列相比,MySQL NDB 集群在 NDB 集群 8.4.0 中实现的变化。NDB 集群 8.4 作为开发版本提供,用于预览和测试当前正在开发的新功能。对于生产环境,请使用 NDB 8.0;有关更多信息,请参阅 MySQL NDB 集群 8.0。NDB 集群 7.6 和 7.5 是以前的 GA 版本,仍然在生产环境中受支持,但我们建议新的生产部署使用 MySQL NDB 集群 8.0。
NDB 集群 7.4 和 7.3 是以前的 GA 版本,已经达到其生命周期终点;它们不再受支持或维护。
NDB 集群 8.4 的新增功能
以下是 NDB 集群 8.4 中可能引起您兴趣的主要变化和新功能:
ndbinfo transporter_details 表。
transporter_details
表提供了有关 NDB 集群中使用的各个传输器的的信息。它在其他方面类似于ndbinfo
transporters
表,后者以聚合形式提供此类信息。与 NDB 8.0 中引入的版本相比,NDB 8.4.0 提供了额外的列。这些新列及其简要说明如下:
sendbuffer_used_bytes
:当前存储的待发送信号数据的字节数,使用此传输器。sendbuffer_max_used_bytes
:使用此传输器存储的待发送信号数据的历史最大字节数。传输器连接时重置。sendbuffer_alloc_bytes
:当前分配给此传输器以存储待发送字节的发送缓冲区的字节数。发送缓冲区内存以大块分配,可能使用率很低。sendbuffer_max_alloc_bytes
:分配给此传输器以存储待发送字节的发送缓冲区的历史最大字节数。
NDB 8.4.1 添加了一个
type
列,用于显示传输的连接类型(TCP
或SHM
)。有关更多信息,请参阅 第 25.6.17.65 节 “ndbinfo transporter_details 表”。
NDB 复制:过滤未使用的更新。 以前,当执行二进制日志记录的 SQL 节点使用
log_replica_updates=OFF
时,在副本 NDB 集群上应用的任何复制更新都会发送到执行二进制日志记录的 SQL 节点。这些更新实际上并未应用或用于任何其他目的;这会导致不必要的网络流量和资源消耗。在 NDB 8.4 及更高版本中,在副本 SQL 节点上应用的更新将在此节点上过滤掉,并且不再发送到任何其他 SQL 节点。不触发任何日志记录的更新也不再由副本发送。
MySQL 集群管理器有一个高级命令行界面,可以简化许多复杂的 NDB 集群管理任务。有关更多信息,请参阅 MySQL 集群管理器 8.4.1 用户手册。
NDB 8.x 创新版本中的更改
以下是 NDB 集群创新版本(8.1、8.2、8.3)与 NDB 8.0 相比,可能引起您兴趣的新功能和主要变化:
用于集群节点通信的 TLS。 NDB 集群 8.3 及更高版本支持由传输层安全 (TLS) 和 Internet 公钥基础结构 (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 还提供轮换密钥的帮助,以允许待处理密钥在活动密钥到期之前替换活动密钥。
可以使用带有
--test-tls
选项的 ndb_mgm 客户端从系统 shell 测试节点 TLS 连接,或者在 ndb_mgm 客户端中使用TLS INFO
命令进行测试。您可以通过检查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 集群 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 集群中,当
NDB
二进制日志注入器参与处理架构更改和跟踪二进制日志状态时,通过更改线程本地指针来强制选择用于为此类目的分配内存的区域,从而尝试捕获在纪元处理期间执行的所有分配。在纪元结束时,这些指针被重置,区域内存被释放,区域结构被丢弃;这释放了内存,但也需要为下一个纪元重新设置它。线程本地指针更改还引入了在不同子系统中激活功能时错误分配内存的风险。MySQL NDB 集群 8.3 对此功能进行了以下改进:删除了对线程本地指针的更改,并替换为显式参数,以提供在纪元期间用于分配的区域。
为下一个纪元重用区域,从而避免重复设置。
这些更改仅在内部进行,但应该可以通过节省连续纪元中的内存释放和重新分配来提供明显的改进。
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 未定义,因此不再相关;因此,我们不再尝试在那时打印它们。删除了达到最大限制时打印的重复信息(相同的信息在警告和崩溃信息中都显示)。
此外,当
log_error_verbosity
大于或等于 3(INFO 级别)时,我们不再每ndb_metadata_check_interval
(默认 60)秒向 SQL 节点的错误日志打印消息 正在验证排除的对象,因为此类消息往往会淹没错误日志,使其难以检查,并占用过多的磁盘空间,而不会为用户提供任何额外的好处。现在可以以正确和安全的方式处理在具有非常大且可能重叠的
IN()
和NOT IN()
列表的查询之间进行下推连接。ndbcluster
插件日志消息现在使用SYSTEM
作为日志级别,使用NDB
作为日志记录的子系统。这意味着始终会打印来自ndbcluster
插件的信息性消息;可以使用--ndb_extra_logging
控制其详细程度。