5.5.3set命令

set [--sequential-restart] [--retry] attribute_assignment_list cluster_name

attribute_assignment_list:
    attribute_assignment[,attribute_assignment][,...]

attribute_assignment:
    attribute_name:process_specification[+process_specification][=value]

process_specification:
    [process_name][:process_id]

process_name:
    {ndb_mgmd|ndbd|ndbmtd|mysqld|ndbapi}

此命令用于设置一个或多个配置属性的值。可以在进程级别或实例级别设置属性。

set无论集群是否已经启动,命令都会被执行。在未运行的集群中,MySQL 集群管理器仅更新配置文件。但是,在正在运行的集群中,MySQL Cluster Manager 还会自动执行 使属性更改生效所需的任何节点重启或滚动重启(请参阅执行 NDB Cluster 的滚动重启)。但是,由于重启操作(尤其是滚动重启)可能会花费大量时间,因此最好在启动集群并将其投入使用之前更改配置。

对于 MySQL Cluster Manager 8.0.31 及更高版本:对于通常需要重新启动集群节点以重新配置正在运行的集群的任何配置选项,如果set尝试使用与已使用的值相同的命令,则命令返回错误,告诉用户该命令不会对集群造成任何更改。如果确实需要set在这种情况下运行命令并强制重启相关进程,请使用该 --retry选项。

使用该--sequential-restart 选项使 set命令执行的滚动重新启动是 顺序 的。

在使用 NDB Cluster TDE 时设置密码文件的路径。这实际上是作为配置属性实现的。例子:

mcm> set filesystem-password-file:ndbmtd:=/home/myndb/myc.pwd mycluster;

有关详细信息,请参阅设置加密

要在进程级别设置属性,请使用 set包含具有以下形式的属性分配的语句 attribute_nameprocess_name= value

例如,要 在ndbdDataMemory进程级别设置为 500 MB ,以便新值适用于集群中的所有ndbd进程,您可以发出包含属性分配的命令,如下所示: setDataMemory:ndbd=500M

mcm> set DataMemory:ndbd=500M mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (5.68 sec)

要验证是否正在使用新设置,您可以发出以下get命令:

mcm> get DataMemory mycluster;
+------------+-------+----------+------+----------+------+---------+---------+
| Name       | Value | Process1 | Id1  | Process2 | Id2  | Level   | Comment |
+------------+-------+----------+------+----------+------+---------+---------+
| DataMemory | 500M  | ndbd     | 1    |          |      | Process |         |
| DataMemory | 500M  | ndbd     | 2    |          |      | Process |         |
+------------+-------+----------+------+----------+------+---------+---------+
2 rows in set (0.79 sec)
笔记

有关此命令的更多信息,请参阅 第 5.5.1 节 “get命令”

要为特定流程实例设置属性,请在属性分配中包含流程 ID;这种属性赋值的形式是 attribute_name: process_name: process_id= value。例如,要将 进程 ID 为 200 的mysqld50进程的 wait_timeout 属性设置为 200,您将发出 set包含属性分配的命令wait_timeout:mysqld:51=200,如下所示:

mcm> set wait_timeout:mysqld:50=200 mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (6.18 sec)

get您可以使用适用的命令 验证设置是否生效:

mcm> get wait_timeout mycluster;
+--------------+-------+----------+------+----------+------+-------+---------+
| Name         | Value | Process1 | Id1  | Process2 | Id2  | Level | Comment |
+--------------+-------+----------+------+----------+------+-------+---------+
| wait_timeout | 200   | mysqld   | 50   |          |      |       |         |
+--------------+-------+----------+------+----------+------+-------+---------+
1 row in set (0.50 sec)

Read only无法设置 标记的属性。尝试这样做失败并出现错误,如下所示:

mcm> get :ndbd mycluster;
+--------------+-------------+----------+-----+----------+-----+-------+-----------+
| Name         | Value       | Process1 | Id1 | Process2 | Id2 | Level | Comment   |
+--------------+-------------+----------+-----+----------+-----+-------+-----------+
| DataDir      | /opt/c2data | ndbd     | 1   |          |     |       |           |
| HostName     | tonfisk     | ndbd     | 1   |          |     |       | Read only |
| NodeId       | 2           | ndbd     | 1   |          |     |       | Read only |
| DataDir      | /opt/c3data | ndbd     | 2   |          |     |       |           |
| HostName     | grindval    | ndbd     | 2   |          |     |       | Read only |
| NodeId       | 3           | ndbd     | 2   |          |     |       | Read only |
+--------------+-------------+----------+-----+----------+-----+-------+-----------+
6 rows in set (1.42 sec)
mcm> set HostName:ndbd:1=lax mycluster;
ERROR 6008 (00MGR): Config attribute HostName is read only and cannot be changed

但是,您可以设置强制属性,例如本节前面显示的示例,其中 DataDir配置属性设置为用户定义的值。

警告

NoOfReplicas必须仅在进程级别设置 强制 属性。尝试在实例级别设置它可能会使集群、MySQL 集群管理器或两者都处于无法使用的配置中。

get 命令的情况不同,您不能set全局范围内发出操作——也就是说,您不能在单个属性分配中为属性设置单个值,以便新属性值适用于所有进程,而不管进程类型,即使具有该名称的属性可以应用于所有进程类型。您也不能在单个属性分配中指定多个进程类型。尝试做这些事情中的任何一个都会导致错误,如下所示:

mcm> set DataDir=/var/cluster-data mycluster;
ERROR 3 (00MGR): Illegal syntax

mcm> set DataDir:ndb_mgmd,ndbd,mysqld=/var/cluster-data mycluster;
ERROR 3 (00MGR): Illegal syntax

相反,您必须为每个流程类型使用流程级属性分配。但是,您不一定需要为每种进程类型发出单独的设置命令。相反,您还可以在单​​个 set命令中进行多个属性分配,以逗号分隔列表的形式提供分配。此命令为名为的集群中的所有 MySQL NDB Cluster 进程 set 分配/var/cdata数据目录 ( ) : DataDirmycluster

mcm> set DataDir:ndb_mgmd=/var/cdata, \
            DataDir:ndbd=/var/cdata, \
            DataDir:mysqld=/var/cdata mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (7.66 sec)

mcm> get DataDir mycluster;
+---------+------------+----------+---------+----------+---------+-------+---------+
| Name    | Value      | Process1 | NodeId1 | Process2 | NodeId2 | Level | Comment |
+---------+------------+----------+---------+----------+---------+-------+---------+
| DataDir | /var/cdata | ndbmtd   | 1       |          |         |       |         |
| DataDir | /var/cdata | ndbmtd   | 2       |          |         |       |         |
| DataDir | /var/cdata | ndb_mgmd | 49      |          |         |       |         |
| datadir | /var/cdata | mysqld   | 50      |          |         |       |         |
| datadir | /var/cdata | mysqld   | 51      |          |         |       |         |
+---------+------------+----------+---------+----------+---------+-------+---------+
5 rows in set (0.08 sec)

get 刚才的命令可以看出,属性赋值成功,并在进程级别生效。

笔记

在 MySQL Cluster Manager 中,配置属性名称不区分大小写。有关MySQL Cluster Manager 中区分大小写问题的更多信息, 请参阅字符串搜索中的区分大小写。

同样,您不能在单个属性分配中引用多个进程 ID,即使它们是同一类型的进程;以下命令不起作用

mcm> set DataMemory:ndbd:1,2=750M mycluster;
ERROR 3 (00MGR): Illegal syntax

相反,您需要使用以下命令:

mcm> set DataMemory:ndbd:1=750M,DataMemory:ndbd:2=750M mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (7.70 sec)

(当然,如果这些是中仅有的两个数据节点 mycluster,那么该命令set DataMemory:ndbd=750M mycluster也可以完成相同的任务。)

笔记

一些配置属性适用于进程之间的连接,因此需要您在设置它们的过程中引用这两个进程。在这种情况下,您必须使用特殊的流程规范语法;有关如何完成此操作的信息, 请参阅 设置 TCP 连接属性。

您也不能在单个属性分配中为多个属性设置值;这意味着以下命令 不起作用

mcm> set UndoDataBuffer=32M,UndoIndexBuffer=8M:ndbd mycluster;
ERROR 3 (00MGR): Illegal syntax

mcm> set DataMemory,IndexMemory:ndbd=1G mycluster;
ERROR 3 (00MGR): Illegal syntax

但是,如果您为要更新其值的每个属性编写完整且有效的属性分配,则可以重写这两个命令,以便它们成功执行,如下所示:

mcm> set UndoDataBuffer:ndbd=32M,UndoIndexBuffer:ndbd=8M mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (6.62 sec)

mcm> set DataMemory:ndbd=1G,IndexMemory:ndbd=1G mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (7.04 sec)

事实上,没有理由不能在一个set命令中执行所有四个赋值,使用四个属性赋值的列表,如下所示:

mcm> set UndoDataBuffer:ndbd=32M,UndoIndexBuffer:ndbd=8M, \
          DataMemory:ndbd=1G, IndexMemory:ndbd=1G mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (6.24 sec)

但是,最好不要在任何单个set命令中执行过多的属性分配,因为这会使发现错误变得更加困难。

在 Windows 上,设置其值包含路径(例如DataDir)的属性时,必须将路径中的所有反斜杠字符替换为正斜杠。假设您要使用在 Windows 上运行的名为 MySQL NDB 集群中节点 ID 为 50的mysqldC:\temp\node50进程的 tmpdir属性 。可以使用适当的命令查看此属性的原始值: myclusterget

mcm> get tmpdir mycluster;
+--------+----------------+----------+-----+----------+-----+-------+---------+
| Name   | Value          | Process1 | Id1 | Process2 | Id2 | Level | Comment |
+--------+----------------+----------+-----+----------+-----+-------+---------+
| tmpdir | c:\c50data\tmp | mysqld   | 50  |          |     |       |         |
+--------+----------------+----------+-----+----------+-----+-------+---------+
1 row in set (0.22 sec)

进行所需配置更改的正确set命令如下所示:

mcm> set tmpdir:mysqld:50=c:/temp/node50 mycluster;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (2.62 sec)

当您使用检查值时 get——即使它最初是使用反斜杠显示的——在显示新值时使用正斜杠:

mcm> get tmpdir mycluster;
+--------+----------------+----------+-----+----------+-----+-------+---------+
| Name   | Value          | Process1 | Id1 | Process2 | Id2 | Level | Comment |
+--------+----------------+----------+-----+----------+-----+-------+---------+
| tmpdir | c:/temp/node50 | mysqld   | 50  |          |     |       |         |
+--------+----------------+----------+-----+----------+-----+-------+---------+
1 row in set (0.22 sec)

但是,如果您尝试在发出set命令时在路径中使用反斜杠,命令将失败:

mcm> set tmpdir:mysqld:4=c:\temp\4 mycluster;
Outfile disabled.
ERROR:
Unknown command '\4'.
ERROR 6014 (00MGR): Path name for parameter tmpdir must be absolute.
The value 'c:mp4' is illegal.

为mysqld节点设置属性

当设置了一个动态变量时,mcmd 会向mysqld发送一条应用该值的SET GLOBAL 语句,并将该值保存到mysqld 配置文件中,以便下次重新启动该mysqld进程时可以再次应用该值。设置一个非动态的变量会触发立即重启。

MySQL Cluster Manager 8.0.30 及更高版本:当没有数据节点可用时,set 重新启动mysqld节点而不同时重新启动数据节点的命令将被拒绝。这是为了确保首先处理数据节点的任何问题,以便mysqld重启真正成功。

设置 TCP 连接属性

对于一些仅在使用 TCP 连接时适用的属性(例如 SendBufferMemoryand ReceiveBufferMemory 属性),有必要使用修改后的语法来为属性值赋值。在这种情况下,属性分配包含两个流程规范,一个用于每个流程类型或设置应用的实例,并用加号 ( +) 连接。对于以下示例,请考虑名为 的集群 mycluster2,它由此处显示的进程组成:

mcm> list processes mycluster2;
+------+----------+-------------+
| Id   | Name     | Host        |
+------+----------+-------------+
| 49   | ndb_mgmd | grindval    |
| 1    | ndbd     | tonfisk     |
| 2    | ndbd     | flundra     |
| 50   | mysqld   | haj         |
| 51   | mysqld   | torsk       |
+------+----------+-------------+
5 rows in set (0.16 sec)

(有关此命令的更多信息,请参见第 5.6.3 节“list processes命令”。)

get除非已设置,否则 TCP 连接属性不会显示在命令的输出中 。这意味着,在 SendBufferMemory第一次设置之前,如果您尝试检索其值,您将获得一个空结果,如下所示:

mcm> get SendBufferMemory mycluster2;
Empty set (0.18 sec)

mcm> get --include-defaults SendBufferMemory mycluster2;
Empty set (0.93 sec)

要将 SendBufferMemory数据节点和 SQL 节点之间的所有 TCP 连接设置为 4 MB,您可以使用此处显示的命令:

mcm> set SendBufferMemory:ndbd+mysqld=4M mycluster2;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (6.44 sec)

如果您随后使用 来检查属性的值 get,您可以看到该值应用于两个ndbd进程中的每一个和中的两个 mysqld进程中 的每一个之间的所有可能连接mycluster2,因此输出中有四行:

mcm> get SendBufferMemory mycluster2;
+------------------+-------+----------+-----+----------+-----+---------+---------+
| Name             | Value | Process1 | Id1 | Process2 | Id2 | Level   | Comment |
+------------------+-------+----------+-----+----------+-----+---------+---------+
| SendBufferMemory | 4M    | ndbd     | 2   | mysqld   | 4   | Process |         |
| SendBufferMemory | 4M    | ndbd     | 2   | mysqld   | 5   | Process |         |
| SendBufferMemory | 4M    | ndbd     | 3   | mysqld   | 4   | Process |         |
| SendBufferMemory | 4M    | ndbd     | 3   | mysqld   | 5   | Process |         |
+------------------+-------+----------+-----+----------+-----+---------+---------+
4 rows in set (1.63 sec)

要仅针对具有进程 ID 的数据节点与2mysqld 进程(进程 ID 4)之间的连接覆盖此设置,您可以在进程规范的两个部分中的每一个部分中包含进程 ID,如下所示:

mcm> set SendBufferMemory:ndbd:2+mysqld:4=8M mycluster2;
+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+
1 row in set (7.95 sec)

当您使用 get命令检查结果时,您可以看到新设置适用于实例级别,并且仅适用于具有 ID2 和; 的进程之间的连接4;之前进行的进程级设置仍然适用于其余 3 个连接:

mcm> get SendBufferMemory mycluster2;
+------------------+-------+----------+-----+----------+-----+---------+---------+
| Name             | Value | Process1 | Id1 | Process2 | Id2 | Level   | Comment |
+------------------+-------+----------+-----+----------+-----+---------+---------+
| SendBufferMemory | 8M    | ndbd     | 2   | mysqld   | 50  |         |         |
| SendBufferMemory | 4M    | ndbd     | 2   | mysqld   | 51  | Process |         |
| SendBufferMemory | 4M    | ndbd     | 3   | mysqld   | 50  | Process |         |
| SendBufferMemory | 4M    | ndbd     | 3   | mysqld   | 51  | Process |         |
+------------------+-------+----------+-----+----------+-----+---------+---------+
4 rows in set (0.24 sec)

您不能在流程规范的一部分(即连接的一端)的流程级别上设置连接属性,而在另一部分的实例级别上设置连接属性。尝试这样做失败并出现错误,如下所示:

mcm> set SendBufferMemory:ndbd+mysqld:4=2M mycluster2;
ERROR 3 (00MGR): Illegal syntax
mcm> set SendBufferMemory:ndbd:2+mysqld=2M mycluster2;
ERROR 3 (00MGR): Illegal syntax

设置mysqld连接池

可以通过将 属性设置为所需的连接数来 为mysqld 启用连接池,但在创建集群时还需要一个额外的步骤。ndb-cluster-connection-pool

因为mysqld进程在启用连接池时尝试与集群建立多个连接,所以集群必须配置 备用连接。您可以通过 ndbapi在命令中使用的 process_host 列表中添加(否则)未使用的条目来执行此操作create cluster ,如下所示:

mcm> create cluster -P mypackage 
   > -R ndb_mgmd@10.100.10.97,ndbd@10.100.10.98,ndbd@10.100.10.99, \
        mysqld@10.100.10.100,ndbapi@10.100.10.100, \
        ndbapi@10.100.10.100,ndbapi@10.100.10.100
   > mycluster;
+------------------------------+
| Command result               |
+------------------------------+
| Cluster created successfully |
+------------------------------+
1 row in set (6.58 sec)

在此之后,您可以使用这样的set命令根据文件中可用的超额连接数来设置连接池的大小 config.ini

mcm> set ndb_cluster_connection_pool:mysqld=4;
笔记

不支持尝试为mysqlduser进程设置属性 ,并导致将警告写入 MySQL Cluster Manager 日志。

设置加密

NDBNDB Cluster 8.0.31 及更高版本支持对存储在表 中的用户数据进行透明数据加密(TDE) (请参阅NDB Cluster 的文件系统加密);MySQL Cluster Manager 8.0.31 及更高版本也支持此功能。EncryptedFileSystem 通过在所有数据节点上将配置参数设置为 1,在数据节点上启用文件系统加密 。(通过将参数设置为 0 来禁用加密。)

加密和解密数据需要数据节点具有加密密码,该密码必须存储在数据节点进程可读的文件中。set 您可以使用使用该 filesystem-password-file 选项的命令(在 MySQL Cluster Manager 8.0.31 中引入)将其提供给数据节点。这必须在设置之前完成EncryptedFileSystem = 1,如本节后面所示。

以下示例使用集群 运行,如mcm客户端中此命令mycluster的输出所示: show status

mcm> show status -r mycluster;

+--------+----------+--------+---------+-----------+-----------+
| NodeId | Process  | Host   | Status  | Nodegroup | Package   |
+--------+----------+--------+---------+-----------+-----------+
| 145    | ndb_mgmd | myndb3 | running |           | mypackage |
| 1      | ndbmtd   | myndb1 | running | 0         | mypackage |
| 2      | ndbmtd   | myndb2 | running | 0         | mypackage |
| 146    | mysqld   | myndb3 | running |           | mypackage |
| 147    | mysqld   | myndb4 | running |           | mypackage |
| 148    | ndbapi   | *      | added   |           |           |
+--------+----------+--------+---------+-----------+-----------+

不支持 直接从 mcm客户端中的命令行设置密码。如果文件系统访问权限足够严格,则使用磁盘上的文件有助于防止非特权用户访问。(在 Linux 和类似平台上,此文件的权限必须设置为 0600。)此文件应仅包含加密密码,它遵循与加密 NDB 备份的密码相同的规则;有关详细信息,请参阅 使用 NDB Cluster Management Client 创建备份

假设密码文件存在并具有适当的权限,您可以使用以下set命令将密码提供给数据节点:

mcm> set filesystem-password-file:ndbmtd=/opt/mcm_data/my.pwd mycluster;

+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+

设置密码文件的路径后,您可以启用加密,如下所示:

mcm> set EncryptedFileSystem:ndbmtd=1 mycluster;

+-----------------------------------+
| Command result                    |
+-----------------------------------+
| Cluster reconfigured successfully |
+-----------------------------------+

如果没有设置加密密码文件, set刚才显示的命令将被错误拒绝。

get您可以使用类似于以下命令 的命令验证是否启用了加密 :

mcm> get -d filesystem-pass*,encrypt* mycluster;

+--------------------------+---------------------------+----------+---------+----------+---------+---------+----------+
| Name                     | Value                     | Process1 | NodeId1 | Process2 | NodeId2 | Level   | Comment  |
+--------------------------+---------------------------+----------+---------+----------+---------+---------+----------+
| EncryptedFileSystem      | 1                         | ndbmtd   | 1       |          |         | Process |          |
| filesystem-password-file | /opt/mcm_data/my.pwd      | ndbmtd   | 1       |          |         | Process | MCM only |
| EncryptedFileSystem      | 1                         | ndbmtd   | 2       |          |         | Process |          |
| filesystem-password-file | /opt/mcm_data/my.pwd      | ndbmtd   | 2       |          |         | Process | MCM only |
+--------------------------+---------------------------+----------+---------+----------+---------+---------+----------+

您还可以在 MySQL Cluster Manager 甚至正在运行的 NDB Cluster 之外验证集群数据文件是否已使用 NDB Cluster 提供的 ndbxfrm实用程序进行加密,类似于此处显示的内容:

$> ndbxfrm -i /home/mcm/clusters/mycluster/1/data/ndb_1_fs/LCP/0/T10F0.Data 

File=/home/mcm/clusters/mycluster/1/data/ndb_1_fs/LCP/0/T10F0.Data, compression=no, encryption=yes

您可以通过更改现有文件(或设置新文件)来轮换文件系统密码,然后发布 以触发初始滚动重启。或者,您可以使用 后跟 来替换每个数据节点进程使用的密码,一次一个。 set --retry EncryptedFilesystem:ndbmtd=1stop processstart process --initial