MySQL NDB API统计计数器和变量

NDB API统计计数器和变量
与 Ndb 对象执行的操作或影响 Ndb 对象的多种类型的统计计数器可用。此类操作包括启动和关闭(或中止)事务;主键和唯一键操作;表、范 围和修剪扫描;在等待各种操作完成时被阻塞的线程;以及 NDBCLUSTER 发送和接收的数据和事件。每当调用 NDB API 或向数据节点发送或接 收数据时,NDB 内核内部都会递增这些计数器。mysqld 将这些计数器作为系统状态变量公开;其值可以在 SHOW STATUS 的输出中读取,或者通 过查询 INFORMATION_SCHEMA.SESSION_STATUS 或 INFORMATION_SCHEMA.GLOBAL_STATUS 表来获取。通过比较操作 NDB 表的语句执行前后计数器 的值,您可以观察到在 API 级别执行的相应操作,从而了解执行该语句的成本。

你可以使用下面的SHOW STATUS语句列出所有这些状态变量:

mysql> SHOW STATUS LIKE 'ndb_api%';
+----------------------------------------------+----------------+
| Variable_name                                | Value          |
+----------------------------------------------+----------------+
| Ndb_api_wait_exec_complete_count             | 576            |
| Ndb_api_wait_scan_result_count               | 432            |
| Ndb_api_wait_meta_request_count              | 1292           |
| Ndb_api_wait_nanos_count                     | 80154431380927 |
| Ndb_api_bytes_sent_count                     | 250968         |
| Ndb_api_bytes_received_count                 | 2080340        |
| Ndb_api_trans_start_count                    | 409            |
| Ndb_api_trans_commit_count                   | 332            |
| Ndb_api_trans_abort_count                    | 2              |
| Ndb_api_trans_close_count                    | 409            |
| Ndb_api_pk_op_count                          | 475            |
| Ndb_api_uk_op_count                          | 0              |
| Ndb_api_table_scan_count                     | 95             |
| Ndb_api_range_scan_count                     | 0              |
| Ndb_api_pruned_scan_count                    | 0              |
| Ndb_api_scan_batch_count                     | 147            |
| Ndb_api_read_row_count                       | 348            |
| Ndb_api_trans_local_read_row_count           | 108            |
| Ndb_api_adaptive_send_forced_count           | 225            |
| Ndb_api_adaptive_send_unforced_count         | 457            |
| Ndb_api_adaptive_send_deferred_count         | 0              |
| Ndb_api_event_data_count                     | 78             |
| Ndb_api_event_nondata_count                  | 7              |
| Ndb_api_event_bytes_count                    | 26756          |
| Ndb_api_wait_exec_complete_count_slave       | 0              |
| Ndb_api_wait_scan_result_count_slave         | 0              |
| Ndb_api_wait_meta_request_count_slave        | 0              |
| Ndb_api_wait_nanos_count_slave               | 0              |
| Ndb_api_bytes_sent_count_slave               | 0              |
| Ndb_api_bytes_received_count_slave           | 0              |
| Ndb_api_trans_start_count_slave              | 0              |
| Ndb_api_trans_commit_count_slave             | 0              |
| Ndb_api_trans_abort_count_slave              | 0              |
| Ndb_api_trans_close_count_slave              | 0              |
| Ndb_api_pk_op_count_slave                    | 0              |
| Ndb_api_uk_op_count_slave                    | 0              |
| Ndb_api_table_scan_count_slave               | 0              |
| Ndb_api_range_scan_count_slave               | 0              |
| Ndb_api_pruned_scan_count_slave              | 0              |
| Ndb_api_scan_batch_count_slave               | 0              |
| Ndb_api_read_row_count_slave                 | 0              |
| Ndb_api_trans_local_read_row_count_slave     | 0              |
| Ndb_api_adaptive_send_forced_count_slave     | 0              |
| Ndb_api_adaptive_send_unforced_count_slave   | 0              |
| Ndb_api_adaptive_send_deferred_count_slave   | 0              |
| Ndb_api_event_data_count_injector            | 78             |
| Ndb_api_event_nondata_count_injector         | 7              |
| Ndb_api_event_bytes_count_injector           | 26756          |
| Ndb_api_wait_exec_complete_count_session     | 131            |
| Ndb_api_wait_scan_result_count_session       | 142            |
| Ndb_api_wait_meta_request_count_session      | 480            |
| Ndb_api_wait_nanos_count_session             | 1672752063     |
| Ndb_api_bytes_sent_count_session             | 162512         |
| Ndb_api_bytes_received_count_session         | 1019116        |
| Ndb_api_trans_start_count_session            | 87             |
| Ndb_api_trans_commit_count_session           | 64             |
| Ndb_api_trans_abort_count_session            | 0              |
| Ndb_api_trans_close_count_session            | 87             |
| Ndb_api_pk_op_count_session                  | 101            |
| Ndb_api_uk_op_count_session                  | 0              |
| Ndb_api_table_scan_count_session             | 29             |
| Ndb_api_range_scan_count_session             | 0              |
| Ndb_api_pruned_scan_count_session            | 0              |
| Ndb_api_scan_batch_count_session             | 19             |
| Ndb_api_read_row_count_session               | 55             |
| Ndb_api_trans_local_read_row_count_session   | 14             |
| Ndb_api_adaptive_send_forced_count_session   | 76             |
| Ndb_api_adaptive_send_unforced_count_session | 88             |
| Ndb_api_adaptive_send_deferred_count_session | 0              |
+----------------------------------------------+----------------+
69 rows in set (0.01 sec)

这些状态变量也可以从INFORMATION_SCHEMA数据库的SESSION_STATUS和GLOBAL_STATUS表中获得,如下所示:

mysql> SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS  WHERE VARIABLE_NAME LIKE 'ndb_api%';
ERROR 3167 (HY000): The 'INFORMATION_SCHEMA.SESSION_STATUS' feature is disabled; see the documentation for  'show_compatibility_56'

这个错误是由于MySQL 5.7.6及以上版本中,INFORMATION_SCHEMA.SESSION_STATUS视图已被弃用,默认情况下该功能被禁用导致的?,下面临时
启用一下:

mysql> SET GLOBAL show_compatibility_56=ON;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS  WHERE VARIABLE_NAME LIKE 'ndb_api%';
+----------------------------------------------+----------------+
| VARIABLE_NAME                                | VARIABLE_VALUE |
+----------------------------------------------+----------------+
| NDB_API_WAIT_EXEC_COMPLETE_COUNT             | 576            |
| NDB_API_WAIT_SCAN_RESULT_COUNT               | 432            |
| NDB_API_WAIT_META_REQUEST_COUNT              | 1293           |
| NDB_API_WAIT_NANOS_COUNT                     | 80408736595437 |
| NDB_API_BYTES_SENT_COUNT                     | 251028         |
| NDB_API_BYTES_RECEIVED_COUNT                 | 2080368        |
| NDB_API_TRANS_START_COUNT                    | 409            |
| NDB_API_TRANS_COMMIT_COUNT                   | 332            |
| NDB_API_TRANS_ABORT_COUNT                    | 2              |
| NDB_API_TRANS_CLOSE_COUNT                    | 409            |
| NDB_API_PK_OP_COUNT                          | 475            |
| NDB_API_UK_OP_COUNT                          | 0              |
| NDB_API_TABLE_SCAN_COUNT                     | 95             |
| NDB_API_RANGE_SCAN_COUNT                     | 0              |
| NDB_API_PRUNED_SCAN_COUNT                    | 0              |
| NDB_API_SCAN_BATCH_COUNT                     | 147            |
| NDB_API_READ_ROW_COUNT                       | 348            |
| NDB_API_TRANS_LOCAL_READ_ROW_COUNT           | 108            |
| NDB_API_ADAPTIVE_SEND_FORCED_COUNT           | 225            |
| NDB_API_ADAPTIVE_SEND_UNFORCED_COUNT         | 457            |
| NDB_API_ADAPTIVE_SEND_DEFERRED_COUNT         | 0              |
| NDB_API_EVENT_DATA_COUNT                     | 78             |
| NDB_API_EVENT_NONDATA_COUNT                  | 7              |
| NDB_API_EVENT_BYTES_COUNT                    | 26756          |
| NDB_API_WAIT_EXEC_COMPLETE_COUNT_SLAVE       | 0              |
| NDB_API_WAIT_SCAN_RESULT_COUNT_SLAVE         | 0              |
| NDB_API_WAIT_META_REQUEST_COUNT_SLAVE        | 0              |
| NDB_API_WAIT_NANOS_COUNT_SLAVE               | 0              |
| NDB_API_BYTES_SENT_COUNT_SLAVE               | 0              |
| NDB_API_BYTES_RECEIVED_COUNT_SLAVE           | 0              |
| NDB_API_TRANS_START_COUNT_SLAVE              | 0              |
| NDB_API_TRANS_COMMIT_COUNT_SLAVE             | 0              |
| NDB_API_TRANS_ABORT_COUNT_SLAVE              | 0              |
| NDB_API_TRANS_CLOSE_COUNT_SLAVE              | 0              |
| NDB_API_PK_OP_COUNT_SLAVE                    | 0              |
| NDB_API_UK_OP_COUNT_SLAVE                    | 0              |
| NDB_API_TABLE_SCAN_COUNT_SLAVE               | 0              |
| NDB_API_RANGE_SCAN_COUNT_SLAVE               | 0              |
| NDB_API_PRUNED_SCAN_COUNT_SLAVE              | 0              |
| NDB_API_SCAN_BATCH_COUNT_SLAVE               | 0              |
| NDB_API_READ_ROW_COUNT_SLAVE                 | 0              |
| NDB_API_TRANS_LOCAL_READ_ROW_COUNT_SLAVE     | 0              |
| NDB_API_ADAPTIVE_SEND_FORCED_COUNT_SLAVE     | 0              |
| NDB_API_ADAPTIVE_SEND_UNFORCED_COUNT_SLAVE   | 0              |
| NDB_API_ADAPTIVE_SEND_DEFERRED_COUNT_SLAVE   | 0              |
| NDB_API_EVENT_DATA_COUNT_INJECTOR            | 78             |
| NDB_API_EVENT_NONDATA_COUNT_INJECTOR         | 7              |
| NDB_API_EVENT_BYTES_COUNT_INJECTOR           | 26756          |
| NDB_API_WAIT_EXEC_COMPLETE_COUNT_SESSION     | 131            |
| NDB_API_WAIT_SCAN_RESULT_COUNT_SESSION       | 142            |
| NDB_API_WAIT_META_REQUEST_COUNT_SESSION      | 481            |
| NDB_API_WAIT_NANOS_COUNT_SESSION             | 1672988157     |
| NDB_API_BYTES_SENT_COUNT_SESSION             | 162572         |
| NDB_API_BYTES_RECEIVED_COUNT_SESSION         | 1019144        |
| NDB_API_TRANS_START_COUNT_SESSION            | 87             |
| NDB_API_TRANS_COMMIT_COUNT_SESSION           | 64             |
| NDB_API_TRANS_ABORT_COUNT_SESSION            | 0              |
| NDB_API_TRANS_CLOSE_COUNT_SESSION            | 87             |
| NDB_API_PK_OP_COUNT_SESSION                  | 101            |
| NDB_API_UK_OP_COUNT_SESSION                  | 0              |
| NDB_API_TABLE_SCAN_COUNT_SESSION             | 29             |
| NDB_API_RANGE_SCAN_COUNT_SESSION             | 0              |
| NDB_API_PRUNED_SCAN_COUNT_SESSION            | 0              |
| NDB_API_SCAN_BATCH_COUNT_SESSION             | 19             |
| NDB_API_READ_ROW_COUNT_SESSION               | 55             |
| NDB_API_TRANS_LOCAL_READ_ROW_COUNT_SESSION   | 14             |
| NDB_API_ADAPTIVE_SEND_FORCED_COUNT_SESSION   | 76             |
| NDB_API_ADAPTIVE_SEND_UNFORCED_COUNT_SESSION | 88             |
| NDB_API_ADAPTIVE_SEND_DEFERRED_COUNT_SESSION | 0              |
+----------------------------------------------+----------------+
69 rows in set, 1 warning (0.00 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS  WHERE VARIABLE_NAME LIKE 'ndb_api%';
+----------------------------------------------+----------------+
| VARIABLE_NAME                                | VARIABLE_VALUE |
+----------------------------------------------+----------------+
| NDB_API_WAIT_EXEC_COMPLETE_COUNT             | 576            |
| NDB_API_WAIT_SCAN_RESULT_COUNT               | 432            |
| NDB_API_WAIT_META_REQUEST_COUNT              | 1293           |
| NDB_API_WAIT_NANOS_COUNT                     | 80505790466465 |
| NDB_API_BYTES_SENT_COUNT                     | 251028         |
| NDB_API_BYTES_RECEIVED_COUNT                 | 2080368        |
| NDB_API_TRANS_START_COUNT                    | 409            |
| NDB_API_TRANS_COMMIT_COUNT                   | 332            |
| NDB_API_TRANS_ABORT_COUNT                    | 2              |
| NDB_API_TRANS_CLOSE_COUNT                    | 409            |
| NDB_API_PK_OP_COUNT                          | 475            |
| NDB_API_UK_OP_COUNT                          | 0              |
| NDB_API_TABLE_SCAN_COUNT                     | 95             |
| NDB_API_RANGE_SCAN_COUNT                     | 0              |
| NDB_API_PRUNED_SCAN_COUNT                    | 0              |
| NDB_API_SCAN_BATCH_COUNT                     | 147            |
| NDB_API_READ_ROW_COUNT                       | 348            |
| NDB_API_TRANS_LOCAL_READ_ROW_COUNT           | 108            |
| NDB_API_ADAPTIVE_SEND_FORCED_COUNT           | 225            |
| NDB_API_ADAPTIVE_SEND_UNFORCED_COUNT         | 457            |
| NDB_API_ADAPTIVE_SEND_DEFERRED_COUNT         | 0              |
| NDB_API_EVENT_DATA_COUNT                     | 78             |
| NDB_API_EVENT_NONDATA_COUNT                  | 7              |
| NDB_API_EVENT_BYTES_COUNT                    | 26756          |
| NDB_API_WAIT_EXEC_COMPLETE_COUNT_SLAVE       | 0              |
| NDB_API_WAIT_SCAN_RESULT_COUNT_SLAVE         | 0              |
| NDB_API_WAIT_META_REQUEST_COUNT_SLAVE        | 0              |
| NDB_API_WAIT_NANOS_COUNT_SLAVE               | 0              |
| NDB_API_BYTES_SENT_COUNT_SLAVE               | 0              |
| NDB_API_BYTES_RECEIVED_COUNT_SLAVE           | 0              |
| NDB_API_TRANS_START_COUNT_SLAVE              | 0              |
| NDB_API_TRANS_COMMIT_COUNT_SLAVE             | 0              |
| NDB_API_TRANS_ABORT_COUNT_SLAVE              | 0              |
| NDB_API_TRANS_CLOSE_COUNT_SLAVE              | 0              |
| NDB_API_PK_OP_COUNT_SLAVE                    | 0              |
| NDB_API_UK_OP_COUNT_SLAVE                    | 0              |
| NDB_API_TABLE_SCAN_COUNT_SLAVE               | 0              |
| NDB_API_RANGE_SCAN_COUNT_SLAVE               | 0              |
| NDB_API_PRUNED_SCAN_COUNT_SLAVE              | 0              |
| NDB_API_SCAN_BATCH_COUNT_SLAVE               | 0              |
| NDB_API_READ_ROW_COUNT_SLAVE                 | 0              |
| NDB_API_TRANS_LOCAL_READ_ROW_COUNT_SLAVE     | 0              |
| NDB_API_ADAPTIVE_SEND_FORCED_COUNT_SLAVE     | 0              |
| NDB_API_ADAPTIVE_SEND_UNFORCED_COUNT_SLAVE   | 0              |
| NDB_API_ADAPTIVE_SEND_DEFERRED_COUNT_SLAVE   | 0              |
| NDB_API_EVENT_DATA_COUNT_INJECTOR            | 78             |
| NDB_API_EVENT_NONDATA_COUNT_INJECTOR         | 7              |
| NDB_API_EVENT_BYTES_COUNT_INJECTOR           | 26756          |
| NDB_API_WAIT_EXEC_COMPLETE_COUNT_SESSION     | 131            |
| NDB_API_WAIT_SCAN_RESULT_COUNT_SESSION       | 142            |
| NDB_API_WAIT_META_REQUEST_COUNT_SESSION      | 481            |
| NDB_API_WAIT_NANOS_COUNT_SESSION             | 1672988157     |
| NDB_API_BYTES_SENT_COUNT_SESSION             | 162572         |
| NDB_API_BYTES_RECEIVED_COUNT_SESSION         | 1019144        |
| NDB_API_TRANS_START_COUNT_SESSION            | 87             |
| NDB_API_TRANS_COMMIT_COUNT_SESSION           | 64             |
| NDB_API_TRANS_ABORT_COUNT_SESSION            | 0              |
| NDB_API_TRANS_CLOSE_COUNT_SESSION            | 87             |
| NDB_API_PK_OP_COUNT_SESSION                  | 101            |
| NDB_API_UK_OP_COUNT_SESSION                  | 0              |
| NDB_API_TABLE_SCAN_COUNT_SESSION             | 29             |
| NDB_API_RANGE_SCAN_COUNT_SESSION             | 0              |
| NDB_API_PRUNED_SCAN_COUNT_SESSION            | 0              |
| NDB_API_SCAN_BATCH_COUNT_SESSION             | 19             |
| NDB_API_READ_ROW_COUNT_SESSION               | 55             |
| NDB_API_TRANS_LOCAL_READ_ROW_COUNT_SESSION   | 14             |
| NDB_API_ADAPTIVE_SEND_FORCED_COUNT_SESSION   | 76             |
| NDB_API_ADAPTIVE_SEND_UNFORCED_COUNT_SESSION | 88             |
| NDB_API_ADAPTIVE_SEND_DEFERRED_COUNT_SESSION | 0              |
+----------------------------------------------+----------------+
69 rows in set, 1 warning (0.00 sec)

每个 ndb 对象都有其自身的计数器。NDB API 应用程序可以读取这些计数器的值,用于优化或监控。对于使用多个 Ndb 对象并发运行的多线程 客户端,还可以从属于给定 ndb_cluster_connection 的所有 Ndb 对象中获取计数器的汇总视图。

暴露了四组这样的计数器。一组只适用于当前会话;另外3个是全局性的。尽管它们的值可以在mysql客户端中作为会话或全局状态变量获得。这 意味着使用SHOW STATUS指定SESSION或GLOBAL关键字对NDB API统计状态变量报告的值没有影响,并且这些变量的值无论从SESSION_STATUS或 GLOBAL_STATUS表的等效列中获得的值都是相同的。
.会话计数器(特定于会话)
会话计数器与(仅)当前会话使用的Ndb对象相关。其他MySQL客户端使用这些对象不会影响这些计数。

为了尽量减少与标准MySQL会话变量的混淆,我们将与这些NDB API会话计数器对应的变量称为“_session变量”,前面有下划线。

.从属计数器(全局)
这组计数器与复制从SQL线程使用的Ndb对象相关(如果有的话)。如果这个mysqld不作为复制从,或者不使用NDB表,那么所有这些计数都是0。

我们将相关的状态变量称为“_slave变量”(前面有下划线)。

.注入器计数器(全局)
注入器计数器与用于侦听二进制日志注入器线程的集群事件的Ndb对象相关。即使不写二进制日志,附加到NDB集群的mysqld进程也会继续侦听一 些事件,比如模式更改。
我们把对应于NDB API注入器计数器的状态变量称为“_injector variables”。(以下划线开头)。

.服务器(全局)计数器(全局)
这组计数器与当前mysqld使用的所有Ndb对象相关。这包括所有MySQL客户端应用程序、从SQL线程(如果有的话)、binlog注入器和NDB实用程序 线程。
我们将与这些计数器对应的状态变量称为“全局变量”或“mysqld级变量”。

你可以通过额外过滤变量名中的子字符串session、slave或injector(以及常用的前缀Ndb_api)来获得一组特定变量的值。对于_session变量 ,可以这样做:

mysql> SHOW STATUS LIKE 'ndb_api%session';
+----------------------------------------------+------------+
| Variable_name                                | Value      |
+----------------------------------------------+------------+
| Ndb_api_wait_exec_complete_count_session     | 131        |
| Ndb_api_wait_scan_result_count_session       | 142        |
| Ndb_api_wait_meta_request_count_session      | 481        |
| Ndb_api_wait_nanos_count_session             | 1672988157 |
| Ndb_api_bytes_sent_count_session             | 162572     |
| Ndb_api_bytes_received_count_session         | 1019144    |
| Ndb_api_trans_start_count_session            | 87         |
| Ndb_api_trans_commit_count_session           | 64         |
| Ndb_api_trans_abort_count_session            | 0          |
| Ndb_api_trans_close_count_session            | 87         |
| Ndb_api_pk_op_count_session                  | 101        |
| Ndb_api_uk_op_count_session                  | 0          |
| Ndb_api_table_scan_count_session             | 29         |
| Ndb_api_range_scan_count_session             | 0          |
| Ndb_api_pruned_scan_count_session            | 0          |
| Ndb_api_scan_batch_count_session             | 19         |
| Ndb_api_read_row_count_session               | 55         |
| Ndb_api_trans_local_read_row_count_session   | 14         |
| Ndb_api_adaptive_send_forced_count_session   | 76         |
| Ndb_api_adaptive_send_unforced_count_session | 88         |
| Ndb_api_adaptive_send_deferred_count_session | 0          |
+----------------------------------------------+------------+
21 rows in set (0.00 sec)

要获取NDB API mysqld级别状态变量的列表,请过滤以ndb_api开头、以_count结尾的变量名,如下所示:

mysql> SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS  WHERE VARIABLE_NAME LIKE 'ndb_api%count';
+--------------------------------------+----------------+
| VARIABLE_NAME                        | VARIABLE_VALUE |
+--------------------------------------+----------------+
| NDB_API_WAIT_EXEC_COMPLETE_COUNT     | 578            |
| NDB_API_WAIT_SCAN_RESULT_COUNT       | 432            |
| NDB_API_WAIT_META_REQUEST_COUNT      | 1293           |
| NDB_API_WAIT_NANOS_COUNT             | 81348847300579 |
| NDB_API_BYTES_SENT_COUNT             | 251124         |
| NDB_API_BYTES_RECEIVED_COUNT         | 2080408        |
| NDB_API_TRANS_START_COUNT            | 411            |
| NDB_API_TRANS_COMMIT_COUNT           | 334            |
| NDB_API_TRANS_ABORT_COUNT            | 2              |
| NDB_API_TRANS_CLOSE_COUNT            | 411            |
| NDB_API_PK_OP_COUNT                  | 477            |
| NDB_API_UK_OP_COUNT                  | 0              |
| NDB_API_TABLE_SCAN_COUNT             | 95             |
| NDB_API_RANGE_SCAN_COUNT             | 0              |
| NDB_API_PRUNED_SCAN_COUNT            | 0              |
| NDB_API_SCAN_BATCH_COUNT             | 147            |
| NDB_API_READ_ROW_COUNT               | 348            |
| NDB_API_TRANS_LOCAL_READ_ROW_COUNT   | 108            |
| NDB_API_ADAPTIVE_SEND_FORCED_COUNT   | 225            |
| NDB_API_ADAPTIVE_SEND_UNFORCED_COUNT | 459            |
| NDB_API_ADAPTIVE_SEND_DEFERRED_COUNT | 0              |
| NDB_API_EVENT_DATA_COUNT             | 78             |
| NDB_API_EVENT_NONDATA_COUNT          | 7              |
| NDB_API_EVENT_BYTES_COUNT            | 26756          |
+--------------------------------------+----------------+
24 rows in set, 1 warning (0.00 sec)

并非所有计数器都反映在所有4组状态变量中。对于事件计数器DataEventsRecvdCount、NondataEventsRecvdCount和EventBytesRecvdCount,只 有_injector和mysqld级别的NDB API状态变量可用:


mysql> SHOW STATUS LIKE 'ndb_api%event%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| Ndb_api_event_data_count             | 78    |
| Ndb_api_event_nondata_count          | 7     |
| Ndb_api_event_bytes_count            | 26756 |
| Ndb_api_event_data_count_injector    | 78    |
| Ndb_api_event_nondata_count_injector | 7     |
| Ndb_api_event_bytes_count_injector   | 26756 |
+--------------------------------------+-------+
6 rows in set (0.00 sec)

_injector状态变量,如下所示:

mysql> SHOW STATUS LIKE 'ndb_api%injector%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| Ndb_api_event_data_count_injector    | 78    |
| Ndb_api_event_nondata_count_injector | 7     |
| Ndb_api_event_bytes_count_injector   | 26756 |
+--------------------------------------+-------+
3 rows in set (0.00 sec)

要查看所有已提交事务的计数,也就是所有TransCommitCount计数器状态变量,你可以为SHOW STATUS加上子字符串trans_commit_count进行过滤 ,如下所示:

mysql> SHOW STATUS LIKE '%trans_commit_count%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| Ndb_api_trans_commit_count         | 334   |
| Ndb_api_trans_commit_count_slave   | 0     |
| Ndb_api_trans_commit_count_session | 64    |
+------------------------------------+-------+
3 rows in set (0.00 sec)

由此,你可以确定在当前mysql客户端会话中已经提交了334个事务,并且自上次重新启动以来,这个mysqld上已经提交了64个事务。

通过比较执行语句前后对应的_session状态变量的值,可以看到给定SQL语句如何增加各种NDB API计数器。在这个例子中,在得到SHOW STATUS 的初始值之后,我们在jycs数据库中创建了一个名为t的NDB表,它只有一列:

mysql> SHOW STATUS LIKE 'ndb_api%session%';
+----------------------------------------------+------------+
| Variable_name                                | Value      |
+----------------------------------------------+------------+
| Ndb_api_wait_exec_complete_count_session     | 131        |
| Ndb_api_wait_scan_result_count_session       | 142        |
| Ndb_api_wait_meta_request_count_session      | 481        |
| Ndb_api_wait_nanos_count_session             | 1672988157 |
| Ndb_api_bytes_sent_count_session             | 162572     |
| Ndb_api_bytes_received_count_session         | 1019144    |
| Ndb_api_trans_start_count_session            | 87         |
| Ndb_api_trans_commit_count_session           | 64         |
| Ndb_api_trans_abort_count_session            | 0          |
| Ndb_api_trans_close_count_session            | 87         |
| Ndb_api_pk_op_count_session                  | 101        |
| Ndb_api_uk_op_count_session                  | 0          |
| Ndb_api_table_scan_count_session             | 29         |
| Ndb_api_range_scan_count_session             | 0          |
| Ndb_api_pruned_scan_count_session            | 0          |
| Ndb_api_scan_batch_count_session             | 19         |
| Ndb_api_read_row_count_session               | 55         |
| Ndb_api_trans_local_read_row_count_session   | 14         |
| Ndb_api_adaptive_send_forced_count_session   | 76         |
| Ndb_api_adaptive_send_unforced_count_session | 88         |
| Ndb_api_adaptive_send_deferred_count_session | 0          |
+----------------------------------------------+------------+
21 rows in set (0.00 sec)

mysql> use jycs;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> CREATE TABLE t (c INT) ENGINE NDBCLUSTER;
Query OK, 0 rows affected (0.08 sec)

现在,您可以执行新的SHOW STATUS语句并观察更改,如下所示(在输出中突出显示更改的行):

mysql> SHOW STATUS LIKE 'ndb_api%session%';
+----------------------------------------------+------------+
| Variable_name                                | Value      |
+----------------------------------------------+------------+
| Ndb_api_wait_exec_complete_count_session     | 139        |
| Ndb_api_wait_scan_result_count_session       | 142        |
| Ndb_api_wait_meta_request_count_session      | 497        |
| Ndb_api_wait_nanos_count_session             | 1714790150 |
| Ndb_api_bytes_sent_count_session             | 164632     |
| Ndb_api_bytes_received_count_session         | 1051308    |
| Ndb_api_trans_start_count_session            | 91         |
| Ndb_api_trans_commit_count_session           | 68         |
| Ndb_api_trans_abort_count_session            | 0          |
| Ndb_api_trans_close_count_session            | 91         |
| Ndb_api_pk_op_count_session                  | 107        |
| Ndb_api_uk_op_count_session                  | 0          |
| Ndb_api_table_scan_count_session             | 29         |
| Ndb_api_range_scan_count_session             | 0          |
| Ndb_api_pruned_scan_count_session            | 0          |
| Ndb_api_scan_batch_count_session             | 19         |
| Ndb_api_read_row_count_session               | 57         |
| Ndb_api_trans_local_read_row_count_session   | 14         |
| Ndb_api_adaptive_send_forced_count_session   | 78         |
| Ndb_api_adaptive_send_unforced_count_session | 94         |
| Ndb_api_adaptive_send_deferred_count_session | 0          |
+----------------------------------------------+------------+
21 rows in set (0.00 sec)

类似地,你可以看到在t中插入一行所引起的NDB API统计计数器的变化:插入行,然后运行与前面示例中相同的SHOW STATUS语句,如下所示:

mysql> INSERT INTO t VALUES (100);
Query OK, 1 row affected (0.01 sec)

mysql> SHOW STATUS LIKE 'ndb_api%session%';
+----------------------------------------------+------------+
| Variable_name                                | Value      |
+----------------------------------------------+------------+
| Ndb_api_wait_exec_complete_count_session     | 142        |
| Ndb_api_wait_scan_result_count_session       | 146        |
| Ndb_api_wait_meta_request_count_session      | 498        |
| Ndb_api_wait_nanos_count_session             | 1715762929 |
| Ndb_api_bytes_sent_count_session             | 164928     |
| Ndb_api_bytes_received_count_session         | 1051540    |
| Ndb_api_trans_start_count_session            | 94         |
| Ndb_api_trans_commit_count_session           | 70         |
| Ndb_api_trans_abort_count_session            | 0          |
| Ndb_api_trans_close_count_session            | 94         |
| Ndb_api_pk_op_count_session                  | 109        |
| Ndb_api_uk_op_count_session                  | 0          |
| Ndb_api_table_scan_count_session             | 30         |
| Ndb_api_range_scan_count_session             | 0          |
| Ndb_api_pruned_scan_count_session            | 0          |
| Ndb_api_scan_batch_count_session             | 19         |
| Ndb_api_read_row_count_session               | 58         |
| Ndb_api_trans_local_read_row_count_session   | 15         |
| Ndb_api_adaptive_send_forced_count_session   | 81         |
| Ndb_api_adaptive_send_unforced_count_session | 95         |
| Ndb_api_adaptive_send_deferred_count_session | 0          |
+----------------------------------------------+------------+
21 rows in set (0.00 sec)

我们可以从这些结果中得出一些观察结果:
.虽然我们没有使用显式的主键创建t,但在此过程中执行了6个主键操作(Ndb_api_pk_op_count_session的“before”和“after”值之差,即 107减106)。这反映了隐藏主键的创建,这是使用NDB存储引擎的所有表的一个特性。

.通过比较Ndb_api_wait_nanos_count_session的连续值,我们可以看到,实现CREATE TABLE语句的NDB API操作等待数据节点响应的时间 (1714790150-1672988157 = 41801993 纳秒,或大约0.04秒)要比INSERT (1715762929-1714790150 = 972779 纳秒或大约0.001秒)长得多。 mysql客户端中报告的这些语句的执行时间与这些图大致相关。

在没有足够(纳秒)时间分辨率的平台上,由于SQL语句执行非常快而导致的WaitNanosCount NDB API计数器值的微小变化可能并不总是在 Ndb_api_wait_nanos_count_session, Ndb_api_wait_nanos_count_slave或Ndb_api_wait_nanos_count的值中可见。

.INSERT语句增加了NDB API统计计数器的ReadRowCount和TransLocalReadRowCount,正如Ndb_api_read_row_count_session和 Ndb_api_trans_local_read_row_count_session增加的值所反映的那样。

MySQL 为NDB集群分发MySQL用户和权限

为NDB集群分发MySQL用户和权限
NDB集群支持在一个NDB集群中的所有SQL节点上分配MySQL用户和权限。默认情况下不启用此支持;为了这样做,您应该遵循以下过程。

通常,MySQL数据库中的每个MySQL服务器的用户权限表必须使用MyISAM存储引擎,这意味着在一个SQL节点上创建的用户帐户及其相关权限在集群的其他SQL节点上不可用。SQL文件ndb_dist_priv。在MySQL安装目录的share目录下可以找到NDB Cluster发行版提供的sql文件。

[root@mysqld share]# pwd
/usr/local/mysql/share
[root@mysqld share]# ll ndb*
-rw-r--r--. 1 root mysql 12442 Sep 26  2024 ndb_dist_priv.sql

启用分布式权限的第一步是将此脚本加载到作为SQL节点的MySQL服务器中(在此之后我们将其称为目标SQL节点或MySQL服务器)。您可以在目标SQL节点的系统shell中执行以下命令,然后将其更改为MySQL安装目录(其中options表示连接到该SQL节点所需的任何附加选项):

[root@mysqld share]# mysql -uroot -p123456 < /usr/local/mysql/share/ndb_dist_priv.sql
mysql: [Warning] Using a password on the command line interface can be insecure.

导入 ndb_dist_priv.sql 会在目标 SQL 节点的 mysql 数据库中创建多个存储例程(六个存储过程和一个存储函数)。在 mysql 客户端连接到

SQL 节点(以 MySQL 根用户身份)后,您可以按如下所示验证这些例程是否已创建:

mysql> SELECT ROUTINE_NAME, ROUTINE_SCHEMA, ROUTINE_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME LIKE

'mysql_cluster%' ORDER BY ROUTINE_TYPE;
+---------------------------------------------+----------------+--------------+
| ROUTINE_NAME                                | ROUTINE_SCHEMA | ROUTINE_TYPE |
+---------------------------------------------+----------------+--------------+
| mysql_cluster_privileges_are_distributed    | mysql          | FUNCTION     |
| mysql_cluster_backup_privileges             | mysql          | PROCEDURE    |
| mysql_cluster_move_grant_tables             | mysql          | PROCEDURE    |
| mysql_cluster_move_privileges               | mysql          | PROCEDURE    |
| mysql_cluster_restore_local_privileges      | mysql          | PROCEDURE    |
| mysql_cluster_restore_privileges            | mysql          | PROCEDURE    |
| mysql_cluster_restore_privileges_from_local | mysql          | PROCEDURE    |
+---------------------------------------------+----------------+--------------+
7 rows in set (0.03 sec)

名为mysql_cluster_move_privileges的存储过程创建现有权限表的备份副本,然后将它们转换为NDB。

mysql_cluster_move_privileges分两步执行备份和转换。第一步是调用mysql_cluster_backup_privileges,这将在mysql数据库中创建两组副本:
.一组使用 MyISAM 存储引擎的本地副本。它们的名称是在原始权限表名后添加 _backup 后缀生成的。

.一组使用NDBCLUSTER存储引擎的分布式副本。这些表通过在原始表的名称前加上ndb_前缀和_backup来生成的。

副本创建后,mysql_cluster_move_privileges调用mysql_cluster_move_grant_tables,其中包含ALTER TABLE…ENGINE =NDB将mysql系统表转换为NDB。

通常,您不应该手动调用mysql_cluster_backup_privileges或mysql_cluster_move_grant_tables;这些存储过程仅供mysql_cluster_move_privileges调用。

虽然原始权限表是自动备份的,但在继续之前,最好在所有受影响的SQL节点上手动创建现有权限表的备份。你可以使用mysqldump来实现这个目的,如下所示:

[root@mysqld /]# mysqldump  -uroot -p123456 mysql user db tables_priv columns_priv procs_priv proxies_priv > backup_file
mysqldump: [Warning] Using a password on the command line interface can be insecure.

要执行转换,必须使用mysql客户端连接到目标SQL节点(同样,作为mysql root用户)。像这样调用存储过程:

mysql> CALL mysql.mysql_cluster_move_privileges();
Query OK, 0 rows affected (2.22 sec)

根据权限表中的行数,此过程可能需要一些时间来执行。如果某些权限表是空的,那么当mysql_cluster_move_privileges返回时,您可能会看到一个或多个No data – zero rows fetched, selected, or processed 警告。在这种情况下,可以安全地忽略警告。为了验证转换是否成功,

你可以使用存储函数mysql_cluster_priviles_are_distributed,如下所示:

mysql> SELECT CONCAT( 'Conversion ',IF(mysql.mysql_cluster_privileges_are_distributed(), 'succeeded', 'failed'), '.') AS

Result;
+-----------------------+
| Result                |
+-----------------------+
| Conversion succeeded. |
+-----------------------+
1 row in set (0.01 sec)

mysql_cluster_privile_are_distributed检查是否存在分布式权限表,如果所有的权限表都是分布式的,则返回1;否则,返回0。

您可以使用如下查询来验证备份是否已经创建:

mysql> SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME LIKE '%backup'

ORDER BY ENGINE;
+-------------------------+------------+
| TABLE_NAME              | ENGINE     |
+-------------------------+------------+
| db_backup               | MyISAM     |
| user_backup             | MyISAM     |
| columns_priv_backup     | MyISAM     |
| tables_priv_backup      | MyISAM     |
| proxies_priv_backup     | MyISAM     |
| procs_priv_backup       | MyISAM     |
| ndb_tables_priv_backup  | ndbcluster |
| ndb_proxies_priv_backup | ndbcluster |
| ndb_procs_priv_backup   | ndbcluster |
| ndb_db_backup           | ndbcluster |
| ndb_columns_priv_backup | ndbcluster |
| ndb_user_backup         | ndbcluster |
+-------------------------+------------+
12 rows in set (0.01 sec)

一旦转换为分布式权限,任何时候在任何SQL节点上创建、删除MySQL用户帐户或更新其权限,这些更改都会立即对连接到集群的所有其他MySQL服务器生效。一旦分配了权限,任何连接到集群的新MySQL服务器都会自动参与分配。

对于在执行mysql_cluster_move_privileges时连接到SQL节点的客户端,您可能需要在这些SQL节点上执行FLUSH PRIVILEGES,或者断开连接,然后重新连接客户端,以便这些客户端能够看到权限的变化。

所有MySQL用户权限分布在所有连接的MySQL服务器上。这包括与视图和存储过程相关的任何权限,尽管当前不支持视图和存储过程本身的分发。

在mysql_cluster_move_privileges运行期间,如果一个SQL节点与集群断开连接,必须在重新连接到集群后使用DROP TABLE IF EXISTS mysql.user mysql.db mysql.tables_priv mysql.columns_priv mysql.procs_priv语句删除它的权限表,这将导致SQL节点使用共享权限表,而 不是自己的本地版本。第一次将新的SQL节点连接到集群时不需要这样做。

如果初始重新启动整个集群(关闭所有数据节点,然后使用–initial重新启动),则共享权限表将丢失。如果发生这种情况,您可以使用原始 目标SQL节点从mysql_cluster_move_privileges所做的备份或mysqldump创建的转储文件中恢复它们。如果你需要使用一个新的MySQL服务器来执 行恢复,你应该在第一次连接到集群时用–skip-grant-tables启动它;在此之后,您可以在本地恢复权限表,然后使用 mysql_cluster_move_privileges再次分发它们。在恢复和分发表之后,您应该重新启动这个MySQL服务器,不使用–skip-grant-tables选项。

还可以使用ndb_restore –restore-privilege-tables从ndb_mgm客户端中使用START BACKUP进行的备份中恢复分布式表。 (mysql_cluster_move_privileges创建的MyISAM表不通过START BACKUP命令进行备份)ndb_restore默认不恢复权限表;使用–restore- privilege-tables选项才会执行恢复。

您可以使用两个过程中的任何一个来恢复SQL节点的本地权限。mysql_cluster_restore_privileges的工作原理如下:
1.如果mysql.ndb_*_backup表的副本可用,试图从这些副本中来还原系统表。
2.否则,试图从命名为*_backup(没有ndb_前缀)的本地备份中还原系统表

另一个过程名为mysql_cluster_restore_local_privileges,它只从本地备份恢复系统表,而不检查ndb_*备份。

mysql_cluster_restore_privileges或mysql_cluster_restore_local_privileges重新创建的系统表使用MySQL服务器默认的存储引擎;它们不 以任何方式共享或分发,也不使用NDB Cluster的NDB存储引擎。

额外的存储过程mysql_cluster_restore_privile_from_local用于使用mysql_cluster_restore_privileges和 mysql_cluster_restore_local_privileges。它不应该被直接调用。

MySQL 在线添加NDB集群数据节点

在线添加NDB集群数据节点

在向NDB集群添加新数据节点所需的基本步骤。无论您是为数据节点进程使用ndbd还是ndbmtd二进制文件,此过程都适用。
假设您已经有一个正在运行的NDB集群,在线添加数据节点需要以下步骤:
1.编辑集群配置config.ini文件,添加与要添加的节点相对应的新[ndbd]部分。在集群使用多个管理服务器的情况下,需要对管理服务器使用的 所有config.ini文件进行这些更改。

必须注意,在config.ini文件中添加的任何新数据节点的节点id不能与现有节点使用的节点id重叠。如果您的API节点使用动态分配的节点id, 并且这些id与您想要用于新数据节点的节点id相匹配,则可以强制任何此类API节点“迁移”,如本过程后面所述。

2.滚动重启所有NDB Cluster管理服务器。
必须使用–reload或–initial选项重新启动所有管理服务器,以强制读取新配置。

3.对所有现有的NDB Cluster数据节点执行滚动重启。在重新启动现有数据节点时,没有必要(通常甚至不希望)使用–initial。
如果您使用的API节点具有动态分配的id,与您希望分配给新数据节点的任何节点id相匹配,则在此步骤中重新启动任何数据节点进程之前,必 须重新启动所有API节点(包括SQL节点)。这将导致具有先前未显式分配的节点id的任何API节点放弃这些节点id并获取新的节点id。

4.对连接到NDB集群的所有SQL或API节点执行滚动重启。

5.启动新的数据节点。
新的数据节点可以按任何顺序启动。它们也可以并发地启动,只要它们是在所有现有数据节点的滚动重启完成之后,并且在继续下一步之前启动 的。

6.在NDB集群管理客户端中执行一个或多个CREATE NODEGROUP命令,创建新数据节点所属的新节点组。

7.在所有数据节点(包括新节点)之间重新分配集群的数据。通常,这是通过在mysql客户端为每个NDBCLUSTER表,发出ALTER TABLE… ALGORITHM=INPLACE,REORGANIZE PARTITION语句。

异常:对于使用MAX_ROWS选项创建的表,此语句不起作用;相反,使用AALTER TABLE … ALGORITHM=INPLACE MAX_ROWS=…重新整理这样的表 您还应该记住,不赞成以这种方式使用MAX_ROWS来设置分区数量,
NDB 7.5.4及以后的版本,应该使用PARTITION_BALANCE;

只需要对添加新节点组时已经存在的表执行此操作。添加新节点组后创建的表中的数据将自动分布;但是,添加到任何给定表TBL中的在添加新 节点之前就存在的数据,在重新组织该表之前不会使用新节点进行分发。

8.
ALTER ONLINE TABLE … REORGANIZE PARTITION重新组织分区,但不回收“旧”节点上释放的空间。您可以通过在mysql客户端中为每个 NDBCLUSTER表发出一个OPTIMIZE table语句来实现这一点。

这适用于内存中NDB表的可变宽度列所使用的空间。内存表的固定宽度列不支持OPTIMIZE TABLE;磁盘数据表也不支持。

您可以添加所需的所有节点,然后连续发出几个CREATE NODEGROUP命令,将新的节点组添加到集群中。

在线添加NDB集群数据节点示例
提供一个详细的示例,说明如何在线添加新的NDB集群数据节点,从在单个节点组中具有2个数据节点的NDB集群开始,到在两 个节点组中具有4个数据节点的集群结束。

开始配置
为了说明,我们假设一个最小的配置,并且集群使用config.ini文件,该文件只包含以下信息:

[root@mgmd mysql-cluster]# cat config.ini
[ndbd default]
# Options affecting ndbd processes on all data nodes:
NoOfReplicas=2      # Number of replicas
DataMemory=1024M    # How much memory to allocate for data storage
IndexMemory=256M    # How much memory to allocate for index storage
                    # For DataMemory and IndexMemory, we have used the
                    # default values. Since the "world" database takes up
                    # only about 500KB, this should be more than enough for
                    # this example NDB Cluster setup.
ServerPort=2202     # This the default value; however, you can use any
                    # port that is free for all the hosts in the cluster
                    # Note1: It is recommended that you do not specify the port
                    # number at all and simply allow the default value to be used
                    # instead
                    # Note2: The port was formerly specified using the PortNumber
                    # TCP parameter; this parameter is no longer available in NDB
                    # Cluster 7.5.
[ndb_mgmd]
# Management process options:
HostName=10.10.10.102            # Hostname or IP address of MGM node
DataDir=/var/lib/mysql-cluster     # Directory for MGM node log files
[ndbd]
# Options for data node "A":
HostName=10.10.10.104            # Hostname or IP address
NodeId=2                           # Node ID for this data node
DataDir=/usr/local/mysql/data      # Directory for this data node's data files
[ndbd]
# Options for data node "B":
HostName=10.10.10.105            # Hostname or IP address
NodeId=3                           # Node ID for this data node
DataDir=/usr/local/mysql/data      # Directory for this data node's data files
[mysqld]
# SQL node options:
HostName=10.10.10.103            # Hostname or IP address
                                   # (additional mysqld connections can be
                                   # specified for this node for various
                                   # purposes such as running ndb_restore)


我们还假设您已经使用适当的命令行或my.cnf选项启动了集群,并且在管理客户端中运行SHOW会产生类似于下面所示的输出:

[root@mgmd /]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @10.10.10.104  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0, *)
id=3    @10.10.10.105  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.10.10.102  (mysql-5.7.48 ndb-7.5.36)

[mysqld(API)]   1 node(s)
id=4    @10.10.10.103  (mysql-5.7.48 ndb-7.5.36)

最后,我们假设集群中创建了以下数据表,如下所示:

mysql> use jycs
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-----------------+
| Tables_in_jycs  |
+-----------------+
| btest           |
| city            |
| country         |
| countrylanguage |
| ctest           |
| example         |
| fish            |
+-----------------+
7 rows in set (0.01 sec)

mysql> select count(*) from btest;
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from city;
+----------+
| count(*) |
+----------+
|     4079 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from country;
+----------+
| count(*) |
+----------+
|      239 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from countrylanguage;
+----------+
| count(*) |
+----------+
|      984 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from ctest;
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.01 sec)

mysql> select count(*) from example;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from fish;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)

在本例中,我们展示了用于数据节点进程的单线程ndbd。如果您正在使用多线程的ndbmtd,您也可以应用这个示例,方法是将ndbmtd替换为后面 步骤中出现的ndbd。

步骤1:更新配置文件。
在文本编辑器中打开集群全局配置文件,并添加与2个新数据节点对应的[ndbd]部分。(我们给这些数据节点的id为5和6,并假设它们将分别运 行在地址为10.10.10.106和10.10.10.107的主机上。)在你添加了新的部分之后,config.ini文件的内容应该如下所示:

[root@mgmd mysql-cluster]# cat config.ini
[ndbd default]
# Options affecting ndbd processes on all data nodes:
NoOfReplicas=2      # Number of replicas
DataMemory=1024M    # How much memory to allocate for data storage
IndexMemory=256M    # How much memory to allocate for index storage
                    # For DataMemory and IndexMemory, we have used the
                    # default values. Since the "world" database takes up
                    # only about 500KB, this should be more than enough for
                    # this example NDB Cluster setup.
ServerPort=2202     # This the default value; however, you can use any
                    # port that is free for all the hosts in the cluster
                    # Note1: It is recommended that you do not specify the port
                    # number at all and simply allow the default value to be used
                    # instead
                    # Note2: The port was formerly specified using the PortNumber
                    # TCP parameter; this parameter is no longer available in NDB
                    # Cluster 7.5.
[ndb_mgmd]
# Management process options:
HostName=10.10.10.102            # Hostname or IP address of MGM node
DataDir=/var/lib/mysql-cluster     # Directory for MGM node log files
[ndbd]
# Options for data node "A":
HostName=10.10.10.104            # Hostname or IP address
NodeId=2                           # Node ID for this data node
DataDir=/usr/local/mysql/data      # Directory for this data node's data files
[ndbd]
# Options for data node "B":
HostName=10.10.10.105            # Hostname or IP address
NodeId=3                           # Node ID for this data node
DataDir=/usr/local/mysql/data      # Directory for this data node's data files
[ndbd]
# Options for data node "C":
HostName=10.10.10.106            # Hostname or IP address
NodeId=5                           # Node ID for this data node
DataDir=/usr/local/mysql/data      # Directory for this data node's data files
[ndbd]
# Options for data node "D":
HostName=10.10.10.107            # Hostname or IP address
NodeId=6                           # Node ID for this data node
DataDir=/usr/local/mysql/data      # Directory for this data node's data files
[mysqld]
# SQL node options:
HostName=10.10.10.103            # Hostname or IP address
                                   # (additional mysqld connections can be
                                   # specified for this node for various
                                   # purposes such as running ndb_restore)

完成必要的更改后,保存文件。

步骤2:重新启动管理服务器。
重新启动集群管理服务器需要发出单独的命令来停止管理服务器,然后重新启动它,如下所示:
1.使用管理客户端Stop命令停止管理服务器,如下所示

ndb_mgm> 1 stop
Node 1 has shutdown.
Disconnecting to allow Management Server to shutdown

ndb_mgm>

2.由于关闭管理服务器将导致管理客户端终止,因此必须从系统shell启动管理服务器。为简单起见,我们假设config.ini与管理服务器二进制 文件位于同一目录中,但实际上,您必须为配置文件提供正确的路径。您还必须提供–reload或–initial选项,以便管理服务器从文件而不是 其配置缓存中读取新配置。如果您的shell的当前目录与管理服务器二进制文件所在的目录相同,那么您可以调用管理服务器,如下所示:

ndb_mgmd -f  config.ini --reload --configdir=/var/lib/mysql-cluster

如果您的shell的当前目录与管理服务器二进制文件所在的目录不相同那么您可以调用管理服务器,如下所示:

[root@mgmd /]# ndb_mgmd -f /var/lib/mysql-cluster/config.ini --reload --configdir=/var/lib/mysql-cluster
MySQL Cluster Management Server mysql-5.7.48 ndb-7.5.36

如果你在重启ndb_mgm进程后在管理客户端检查SHOW的输出,你现在应该看到如下所示:

[root@mgmd /]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     4 node(s)
id=2    @10.10.10.104  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0, *)
id=3    @10.10.10.105  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0)
id=5 (not connected, accepting connect from 10.10.10.106)
id=6 (not connected, accepting connect from 10.10.10.107)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.10.10.102  (mysql-5.7.48 ndb-7.5.36)

[mysqld(API)]   1 node(s)
id=7 (not connected, accepting connect from 10.10.10.103)

步骤3:执行现有数据节点的滚动重启。
这一步完全可以在集群管理客户端中使用RESTART命令完成,如下所示:

在重启数据节点之前需要先关闭SQL节点,否则在重启数据节点时会出现如下错误

ndb_mgm> 2 restart
Node 2: Node shutdown initiated
Node 2: Node shutdown completed, restarting, no start.
Node 2 is being restarted

ndb_mgm> Node 2: Start initiated (version 7.5.36)
Node 2: Forced node shutdown completed. Occured during startphase 5. Caused by error 2303: 'System error, node killed during  node restart by other node(Internal error, programming error or missing error message, please report a bug). Temporary error,  restart node'.

查看数据节点日志:

2025-07-01 19:27:47 [ndbd] INFO     -- Node 2 killed this node because it could not copy a subscription during node restart.  Copy subscrip
2025-07-01 19:27:47 [ndbd] INFO     -- NDBCNTR (Line: 303) 0x00000002
2025-07-01 19:27:47 [ndbd] INFO     -- Error handler shutting down system
2025-07-01 19:27:47 [ndbd] INFO     -- Error handler shutdown completed - exiting
2025-07-01 19:27:47 [ndbd] ALERT    -- Node 2: Forced node shutdown completed. Occured during startphase 5. Caused by error  2303: 'System error, node killed during node restart by other node(Internal error, programming error or missing error message,  please report a bug). Temporary error, restart node'.

从Node 2 killed this node because it could not copy a subscription during node restart. 可知是在复制订阅时出现,就是因为SQL节 点还在运行。

关闭SQL节点:

[root@mysqld data]# service mysql.server stop
Shutting down MySQL..... SUCCESS!

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     4 node(s)
id=2    @10.10.10.104  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0)
id=3    @10.10.10.105  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0, *)
id=5 (not connected, accepting connect from 10.10.10.106)
id=6 (not connected, accepting connect from 10.10.10.107)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.10.10.102  (mysql-5.7.48 ndb-7.5.36)

[mysqld(API)]   1 node(s)
id=7 (not connected, accepting connect from 10.10.10.103)

重启数据节点:

ndb_mgm> 2 restart
Node 2: Node shutdown initiated
Node 2: Node shutdown completed, restarting, no start.
Node 2 is being restarted

ndb_mgm> Node 2: Start initiated (version 7.5.36)
Node 2: Started (version 7.5.36)

ndb_mgm> 3 restart
Node 3: Node shutdown initiated
Node 3: Node shutdown completed, restarting, no start.
Node 3 is being restarted

ndb_mgm> Node 3: Start initiated (version 7.5.36)
Node 3: Started (version 7.5.36)

ndb_mgm>

步骤4:执行所有集群API节点的滚动重启。

[root@mysqld data]# service mysql.server restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL.. SUCCESS!
[root@mysqld data]#

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     4 node(s)
id=2    @10.10.10.104  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0, *)
id=3    @10.10.10.105  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0)
id=5 (not connected, accepting connect from 10.10.10.106)
id=6 (not connected, accepting connect from 10.10.10.107)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.10.10.102  (mysql-5.7.48 ndb-7.5.36)

[mysqld(API)]   1 node(s)
id=7    @10.10.10.103  (mysql-5.7.48 ndb-7.5.36)

步骤5:执行新数据节点的初始启动。
从新数据节点的每个主机上的系统shell中,使用–initial选项启动数据节点,如下所示:

[root@ndbdc /]# ndbd -c 10.10.10.102 --initial
2025-07-01 19:49:26 [ndbd] INFO     -- Angel connected to '10.10.10.102:1186'
2025-07-01 19:49:26 [ndbd] INFO     -- Angel allocated nodeid: 5

[root@ndbdd /]#  ndbd -c 10.10.10.102 --initial
2025-07-01 19:49:34 [ndbd] INFO     -- Angel connected to '10.10.10.102:1186'
2025-07-01 19:49:34 [ndbd] INFO     -- Angel allocated nodeid: 6

与重新启动现有数据节点的情况不同,您可以并发地启动新的数据节点;你不需要等待一个开始后再开始另一个。

等到两个新数据节点都启动后,再继续下一步。一旦新的数据节点已经启动,您可以在管理客户端的SHOW命令的输出中看到,它们还不属于任何 节点组(如此处粗体所示):

ndb_mgm> Node 5: Started (version 7.5.36)
Node 6: Started (version 7.5.36)

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     4 node(s)
id=2    @10.10.10.104  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0, *)
id=3    @10.10.10.105  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0)
id=5    @10.10.10.106  (mysql-5.7.48 ndb-7.5.36, no nodegroup)
id=6    @10.10.10.107  (mysql-5.7.48 ndb-7.5.36, no nodegroup)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.10.10.102  (mysql-5.7.48 ndb-7.5.36)

[mysqld(API)]   1 node(s)
id=7    @10.10.10.103  (mysql-5.7.48 ndb-7.5.36)

步骤6:创建一个新的节点组。
可以通过在集群管理客户端中发出CREATE NODEGROUP命令来实现这一点。该命令将包含在新节点组中的数据节点的节点id的逗号分隔列表作为参 数,如下所示:

ndb_mgm> CREATE NODEGROUP 5,6
Nodegroup 1 created

通过再次发出SHOW,您可以验证数据节点5和6已经加入了新的节点组:

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     4 node(s)
id=2    @10.10.10.104  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0, *)
id=3    @10.10.10.105  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0)
id=5    @10.10.10.106  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 1)
id=6    @10.10.10.107  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 1)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.10.10.102  (mysql-5.7.48 ndb-7.5.36)

[mysqld(API)]   1 node(s)
id=7    @10.10.10.103  (mysql-5.7.48 ndb-7.5.36)

步骤7:重新分配集群数据。
创建节点组时,现有数据和索引不会自动分发到新节点组的数据节点,这可以通过发出适当的在管理客户端中使用REPORT命令:

ndb_mgm> ALL REPORT MEMORY
Node 2: Data usage is 0%(173 32K pages of total 32768)
Node 2: Index usage is 0%(80 8K pages of total 32800)
Node 3: Data usage is 0%(173 32K pages of total 32768)
Node 3: Index usage is 0%(80 8K pages of total 32800)
Node 5: Data usage is 0%(17 32K pages of total 32768)
Node 5: Index usage is 0%(0 8K pages of total 32800)
Node 6: Data usage is 0%(17 32K pages of total 32768)
Node 6: Index usage is 0%(0 8K pages of total 32800)

通过对每个NDB表执行ALTER TABLE … ALGORITHM=INPLACE, REORGANIZE PARTITION语句,可以在所有数据节点之间重新分布数据。

mysql> SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE = 'NDBCLUSTER';
+--------------+-----------------------+
| TABLE_SCHEMA | TABLE_NAME            |
+--------------+-----------------------+
| jycs         | btest                 |
| jycs         | city                  |
| jycs         | country               |
| jycs         | countrylanguage       |
| jycs         | ctest                 |
| jycs         | example               |
| jycs         | fish                  |
| mysql        | ndb_apply_status      |
| mysql        | ndb_index_stat_head   |
| mysql        | ndb_index_stat_sample |
| world        | city                  |
| world        | country               |
| world        | countrylanguage       |
+--------------+-----------------------+
13 rows in set (0.02 sec)

mysql> ALTER TABLE jycs.btest ALGORITHM=INPLACE, REORGANIZE PARTITION;
Query OK, 0 rows affected (21.38 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE jycs.city ALGORITHM=INPLACE, REORGANIZE PARTITION;
Query OK, 0 rows affected (8.68 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE jycs.country ALGORITHM=INPLACE, REORGANIZE PARTITION;
Query OK, 0 rows affected (8.50 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE jycs.countrylanguage ALGORITHM=INPLACE, REORGANIZE PARTITION;
Query OK, 0 rows affected (8.56 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE jycs.ctest ALGORITHM=INPLACE, REORGANIZE PARTITION;
Query OK, 0 rows affected (6.97 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE jycs.example ALGORITHM=INPLACE, REORGANIZE PARTITION;
Query OK, 0 rows affected (12.81 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE jycs.fish ALGORITHM=INPLACE, REORGANIZE PARTITION;
Query OK, 0 rows affected (15.82 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE mysql.ndb_apply_status ALGORITHM=INPLACE, REORGANIZE PARTITION;
Query OK, 0 rows affected (4.68 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE mysql.ndb_index_stat_head ALGORITHM=INPLACE, REORGANIZE PARTITION;
Query OK, 0 rows affected (5.17 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE mysql.ndb_index_stat_sample ALGORITHM=INPLACE, REORGANIZE PARTITION;
Query OK, 0 rows affected (6.23 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE world.city ALGORITHM=INPLACE, REORGANIZE PARTITION;
Query OK, 0 rows affected (7.17 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE world.country ALGORITHM=INPLACE, REORGANIZE PARTITION;
Query OK, 0 rows affected (8.48 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE world.countrylanguage ALGORITHM=INPLACE, REORGANIZE PARTITION;
Query OK, 0 rows affected (7.98 sec)
Records: 0  Duplicates: 0  Warnings: 0


ndb_mgm> ALL REPORT MEMORY
Node 2: Data usage is 0%(161 32K pages of total 32768)
Node 2: Index usage is 0%(76 8K pages of total 32800)
Node 3: Data usage is 0%(161 32K pages of total 32768)
Node 3: Index usage is 0%(76 8K pages of total 32800)
Node 5: Data usage is 0%(113 32K pages of total 32768)
Node 5: Index usage is 0%(58 8K pages of total 32800)
Node 6: Data usage is 0%(113 32K pages of total 32768)
Node 6: Index usage is 0%(58 8K pages of total 32800)

此外,对于每个表,应该在ALTER table语句之后加上一个OPTIMIZE table语句来回收浪费的空间。

mysql> OPTIMIZE TABLE jycs.btest ;
+------------+----------+----------+----------+
| Table      | Op       | Msg_type | Msg_text |
+------------+----------+----------+----------+
| jycs.btest | optimize | status   | OK       |
+------------+----------+----------+----------+
1 row in set (0.06 sec)

mysql> OPTIMIZE TABLE jycs.city;
+-----------+----------+----------+----------+
| Table     | Op       | Msg_type | Msg_text |
+-----------+----------+----------+----------+
| jycs.city | optimize | status   | OK       |
+-----------+----------+----------+----------+
1 row in set (0.01 sec)

mysql> OPTIMIZE TABLE jycs.country;
+--------------+----------+----------+----------+
| Table        | Op       | Msg_type | Msg_text |
+--------------+----------+----------+----------+
| jycs.country | optimize | status   | OK       |
+--------------+----------+----------+----------+
1 row in set (0.00 sec)

mysql> OPTIMIZE TABLE jycs.countrylanguage;
+----------------------+----------+----------+----------+
| Table                | Op       | Msg_type | Msg_text |
+----------------------+----------+----------+----------+
| jycs.countrylanguage | optimize | status   | OK       |
+----------------------+----------+----------+----------+
1 row in set (0.00 sec)

mysql> OPTIMIZE TABLE jycs.ctest;
+------------+----------+----------+----------+
| Table      | Op       | Msg_type | Msg_text |
+------------+----------+----------+----------+
| jycs.ctest | optimize | status   | OK       |
+------------+----------+----------+----------+
1 row in set (0.00 sec)

mysql> OPTIMIZE TABLE jycs.example;
+--------------+----------+----------+----------+
| Table        | Op       | Msg_type | Msg_text |
+--------------+----------+----------+----------+
| jycs.example | optimize | status   | OK       |
+--------------+----------+----------+----------+
1 row in set (0.01 sec)

mysql> OPTIMIZE TABLE jycs.fish;
+-----------+----------+----------+----------+
| Table     | Op       | Msg_type | Msg_text |
+-----------+----------+----------+----------+
| jycs.fish | optimize | status   | OK       |
+-----------+----------+----------+----------+
1 row in set (0.07 sec)

mysql> OPTIMIZE TABLE mysql.ndb_apply_status;
+------------------------+----------+----------+----------+
| Table                  | Op       | Msg_type | Msg_text |
+------------------------+----------+----------+----------+
| mysql.ndb_apply_status | optimize | status   | OK       |
+------------------------+----------+----------+----------+
1 row in set (0.01 sec)

mysql> OPTIMIZE TABLE mysql.ndb_index_stat_head;
+---------------------------+----------+----------+----------+
| Table                     | Op       | Msg_type | Msg_text |
+---------------------------+----------+----------+----------+
| mysql.ndb_index_stat_head | optimize | status   | OK       |
+---------------------------+----------+----------+----------+
1 row in set (0.00 sec)

mysql> OPTIMIZE TABLE mysql.ndb_index_stat_sample;
+-----------------------------+----------+----------+----------+
| Table                       | Op       | Msg_type | Msg_text |
+-----------------------------+----------+----------+----------+
| mysql.ndb_index_stat_sample | optimize | status   | OK       |
+-----------------------------+----------+----------+----------+
1 row in set (0.01 sec)

mysql> OPTIMIZE TABLE world.city;
+------------+----------+----------+----------+
| Table      | Op       | Msg_type | Msg_text |
+------------+----------+----------+----------+
| world.city | optimize | status   | OK       |
+------------+----------+----------+----------+
1 row in set (0.01 sec)

mysql> OPTIMIZE TABLE world.country;
+---------------+----------+----------+----------+
| Table         | Op       | Msg_type | Msg_text |
+---------------+----------+----------+----------+
| world.country | optimize | status   | OK       |
+---------------+----------+----------+----------+
1 row in set (0.01 sec)

mysql> OPTIMIZE TABLE world.countrylanguage;
+-----------------------+----------+----------+----------+
| Table                 | Op       | Msg_type | Msg_text |
+-----------------------+----------+----------+----------+
| world.countrylanguage | optimize | status   | OK       |
+-----------------------+----------+----------+----------+
1 row in set (0.01 sec)

在ALL REPORT MEMORY的输出中执行这些语句后,您可以看到数据和索引现在在所有集群数据节点之间重新分布,如下所示:

ndb_mgm> ALL REPORT MEMORY
Node 2: Data usage is 0%(161 32K pages of total 32768)
Node 2: Index usage is 0%(76 8K pages of total 32800)
Node 3: Data usage is 0%(161 32K pages of total 32768)
Node 3: Index usage is 0%(76 8K pages of total 32800)
Node 5: Data usage is 0%(113 32K pages of total 32768)
Node 5: Index usage is 0%(58 8K pages of total 32800)
Node 6: Data usage is 0%(113 32K pages of total 32768)
Node 6: Index usage is 0%(58 8K pages of total 32800)

由于一次只能执行一个对NDBCLUSTER表的DDL操作,因此必须等待每个ALTER TABLE…REORGANIZE PARTITION语句在发出下一个语句之前完成。

对于在添加新数据节点之后创建的 NDBCLUSTER 表,无需发出 ALTER TABLE … REORGANIZE PARTITION 语句;添加到此类表中的数据会自动在 所有数据节点之间进行分配。然而,在添加新节点之前就已存在的 NDBCLUSTER 表中,无论是现有数据还是新数据都不会使用新节点进行分配, 除非使用 ALTER TABLE … REORGANIZE PARTITION 对这些表进行重组。

MySQL 配置NDB集群

配置NDB集群
作为NDB集群一部分的MySQL服务器与普通的(非集群的)MySQL服务器有一个主要的区别,那就是它使用了NDB存储引擎。这个引擎有时也被称为 NDBCLUSTER,不过NDB是首选。

为避免不必要的资源分配,服务器默认配置为关闭NDB存储引擎。要启用NDB,必须修改服务器的my.cnf配置文件,或者使用–ndbcluster选项启 动服务器。这个MySQL服务器是集群的一部分,因此它也必须知道如何访问管理节点以获取集群配置数据。默认行为是在localhost上查找管理节点。但是, 如果您需要指定它的位置在其他地方,可以在my.cnf中完成,或者使用mysql客户端。在使用NDB存储引擎之前,必须保证至少有一个管理节点和 任意一个数据节点处于正常运行状态。

首先,以系统root用户执行如下命令,创建一个配置目录/var/lib/mysql-cluster,例如:

shell> mkdir /var/lib/mysql-cluster

在该目录下,创建一个名为config.ini的文件,该文件包含以下信息。根据系统需要,为HostName和DataDir替换适当的值。

# file "config.ini" - showing minimal setup consisting of 1 data node,
# 1 management server, and 3 MySQL servers.
# The empty default sections are not required, and are shown only for
# the sake of completeness.
# Data nodes must provide a hostname but MySQL Servers are not required
# to do so.
# If you don't know the hostname for your machine, use localhost.
# The DataDir parameter also has a default value, but it is recommended to
# set it explicitly.
# Note: [db], [api], and [mgm] are aliases for [ndbd], [mysqld], and [ndb_mgmd],
# respectively. [db] is deprecated and should not be used in new installations.
[ndbd default]
NoOfReplicas= 1

[mysqld default]
[ndb_mgmd default]
[tcp default]

[ndb_mgmd]
HostName= myhost.example.com

[ndbd]
HostName= myhost.example.com
DataDir= /var/lib/mysql-cluster

[mysqld]
[mysqld]
[mysqld]

现在可以启动ndb_mgmd管理服务器。默认情况下,它尝试读取当前工作目录下的config.ini文件,因此进入文件所在的目录,然后调用ndb_mgmd :

shell> cd /var/lib/mysql-cluster
shell> ndb_mgmd

然后执行命令ndbd启动单个数据节点。

shell> ndbd

默认情况下,ndbd在端口1186的localhost上查找管理服务器。

如果您从二进制tarball安装MySQL,则需要显式指定ndb_mgmd和ndbd服务器的路径。(通常,这些将在/ usr/local/mysql/bin中找到。

最后,将位置更改为MySQL数据目录(通常为/var/lib/mysql或/usr/local/mysql/ data),并确保my.cnf文件包含启用NDB存储引擎所需的选项 :

[mysqld]
ndbcluster

现在你可以像往常一样启动MySQL服务器了:

shell> mysqld_safe --user=mysql &

或者

shell>service mysql.server start

等待片刻,确保MySQL服务器正常运行。如果您看到mysql结束的通知,请检查服务器的.err文件以找出出错的地方。

如果到目前为止一切顺利,那么现在可以开始使用集群了。连接到服务器并验证开启NDBCLUSTER存储引擎:

[root@mysqld /]# mysql -u root -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.48-ndb-7.5.36-cluster-gpl MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW ENGINES\G
*************************** 1. row ***************************
      Engine: ndbcluster
     Support: YES
     Comment: Clustered, fault-tolerant tables
Transactions: YES
          XA: NO
  Savepoints: NO
*************************** 2. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 4. row ***************************
      Engine: ndbinfo
     Support: YES
     Comment: MySQL Cluster system information storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 5. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 8. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
*************************** 10. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 11. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
11 rows in set (0.00 sec)

前面示例输出中显示的行号可能与系统中显示的行号不同,这取决于服务器的配置方式。

尝试创建一个NDBCLUSTER表:

[root@mysqld /]# mysql -u root -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.48-ndb-7.5.36-cluster-gpl MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use jycs
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER;
Query OK, 0 rows affected (0.19 sec)

mysql> SHOW CREATE TABLE ctest \G
*************************** 1. row ***************************
       Table: ctest
Create Table: CREATE TABLE `ctest` (
  `i` int(11) DEFAULT NULL
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
1 row in set (0.01 sec)

mysql>

要检查节点是否正确设置,请启动管理客户端:

[root@mgmd /]# ndb_mgm
-- NDB Cluster -- Management Client --

在管理客户端中使用SHOW命令获取集群状态报告:

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @10.138.130.234  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0, *)
id=3    @10.138.130.235  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.138.130.232  (mysql-5.7.48 ndb-7.5.36)

[mysqld(API)]   1 node(s)
id=4    @10.138.130.233  (mysql-5.7.48 ndb-7.5.36)

至此,你已经成功设置好了一个可以工作的NDB集群。现在,你可以使用ENGINE=NDBCLUSTER或别名ENGINE=NDB创建的表在集群中存储数据。

MySQL NDB集群安全关机和重启

NDB集群安全关机和重启
要关闭集群,请在管理节点所在机器的shell中输入以下命令:

[root@mgmd /]# ndb_mgm -e shutdown
Connected to Management Server at: localhost:1186
3 NDB Cluster node(s) have shutdown.
Disconnecting to allow management server to shutdown.

这里的-e选项用于从shell向ndb_mgm客户端传递命令。该命令将导致ndb_mgm、ndb_mgmd以及任何ndbd或ndbmtd进程正常终止。任何SQL节点都可 以使用mysqladmin shutdown和其他方式终止。在Windows平台上,假设您已经将SQL节点安装为Windows服务,您可以使用。NET STOP MYSQL。

[root@mysqld world-db]# service mysql.server stop
Shutting down MySQL.... SUCCESS!

要在Unix平台上重新启动集群,请运行以下命令:
.在管理主机上:

[root@mgmd /]# ndb_mgmd -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster
MySQL Cluster Management Server mysql-5.7.48 ndb-7.5.36

.在每个数据节点主机上:

[root@ndbda /]# ndbd
2025-05-23 00:43:01 [ndbd] INFO     -- Angel connected to '10.138.130.232:1186'
2025-05-23 00:43:01 [ndbd] INFO     -- Angel allocated nodeid: 2

[root@ndbdb /]# ndbd
2025-05-23 00:43:09 [ndbd] INFO     -- Angel connected to '10.138.130.232:1186'
2025-05-23 00:43:09 [ndbd] INFO     -- Angel allocated nodeid: 3

.使用ndb_mgm客户端验证两个数据节点是否已经成功启动。

[root@mgmd /]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @10.138.130.234  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0, *)
id=3    @10.138.130.235  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.138.130.232  (mysql-5.7.48 ndb-7.5.36)

[mysqld(API)]   1 node(s)
id=4 (not connected, accepting connect from 10.138.130.233)

.在SQL主机上:

[root@mysqld world-db]# service mysql.server start
Starting MySQL.. SUCCESS!

在Windows平台上,假设您已经将所有NDB集群进程安装为Windows服务,使用默认的服务名称可以按照如下步骤重新启动集群:
.在管理主机上,执行以下命令:

C:\> NET START ndb_mgmd

.分别在数据节点主机上执行如下命令:

C:\> NET START ndbd

.在管理节点主机上,使用ndb_mgm客户端验证管理节点和两个数据节点是否已经成功启动

.在SQL节点主机上执行如下命令:

C:\> NET START mysql

在生产环境中,通常不希望完全关闭集群。在许多情况下,即使是在进行配置更改或对集群硬件或软件(或两者)执行升级(这需要关闭单个主 机)时,也可以通过执行集群的滚动重启而不关闭整个集群。

MySQL NDB集群表和数据的示例

NDB集群表和数据的示例

在NDB Cluster中处理数据库表和数据与在标准中这样做没有太大的不同MySQL。有两个关键点需要记住:
.在集群中复制表时,必须使用NDBCLUSTER存储引擎。创建表时可以使用ENGINE=NDBCLUSTER或ENGINE=NDB选项指定:

CREATE TABLE tbl_name (col_name column_definitions) ENGINE=NDBCLUSTER;

或者,对于使用不同存储引擎的现有表,使用ALTER TABLE将表更改为使用NDBCLUSTER:

ALTER TABLE tbl_name ENGINE=NDBCLUSTER;

每个NDBCLUSTER表都有一个主键。如果在创建表时没有用户定义主键,NDBCLUSTER存储引擎会自动生成一个隐藏的主键。这样的键和其他表索引 一样会占用空间。(由于没有足够的内存容纳这些自动创建的索引,遇到问题的情况并不少见。)

如果使用mysqldump的输出从现有数据库中导入表,则可以在文本编辑器中打开SQL脚本,并将ENGINE选项添加到任何表创建语句中,或者替换任 何现有的引擎选项。假设你把world sample数据库放在另一台不支持NDB集群的MySQL服务器上,并且想导出City表:

[root@my239 world-db]# mysqldump -uroot -p123456 --add-drop-table world City > city_table.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

生成的city_table。sql文件将包含这个表创建语句(以及导入表数据所需的INSERT语句):

[root@my239 world-db]# ll
total 568
-rw-r--r--. 1 root root 179242 May 22 19:50 city_table.sql
-rw-r--r--. 1 root root 398629 May  1 06:05 world.sql
[root@my239 world-db]# more city_table.sql
-- MySQL dump 10.13  Distrib 5.7.26, for Linux (x86_64)
--
-- Host: localhost    Database: world
-- ------------------------------------------------------
-- Server version       5.7.26-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `city`
--

DROP TABLE IF EXISTS `city`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `city` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `city`
INSERT INTO `city` VALUES (1,'Kabul','AFG','Kabol',1780000),(2,'Qandahar','AFG','Qandahar',237500), (3,'Herat','AFG','Herat',186800)
...............

你需要确保MySQL对该表使用NDBCLUSTER存储引擎。有两种方法可以实现这一点。其中之一是在将表导入集群数据库之前修改表的定义。以City 表为例,修改定义中的ENGINE选项,如下所示:

[root@mysqld world-db]# vi city_table.sql
-- MySQL dump 10.13  Distrib 5.7.48-ndb-7.5.36, for linux-glibc2.12 (x86_64)
--
-- Host: localhost    Database: world
-- ------------------------------------------------------
-- Server version       5.7.48-ndb-7.5.36-cluster-gpl

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `city`
--

DROP TABLE IF EXISTS `city`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `city` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=NDBCLUSTER AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;


对于要成为集群数据库一部分的每个表的定义,必须这样做。要做到这一点,最简单的方法是在包含定义的文件上进行搜索替换,将 TYPE=engine_name或ENGINE=engine_name的所有实例替换为ENGINE=NDBCLUSTER。如果您不想修改文件,可以使用未修改的文件来创建表,然后 使用ALTER TABLE来更改它们的存储引擎。详情将在本节稍后给出。

假设你已经在集群的SQL节点上创建了一个名为world的数据库,然后可以使用mysql命令行客户端来读取city_table。Sql,并按照通常的方式创 建并填充相应的表:

[root@mysqld world-db]# mysql -uroot -p123456  world < city_table.sql
mysql: [Warning] Using a password on the command line interface can be insecure.

非常重要的是要记住,前面的命令必须在SQL节点正在运行(在本例中,在IP地址为10.138.130.233的机器上)。

要在SQL节点上创建整个world数据库的副本,请在非集群服务器上使用mysqldump将数据库导出为名为world. SQL的文件;例如,在/tmp目录下 。然后修改表定义,并将文件导入集群的SQL节点,如下所示:

shell> mysql -uxxxx -pxxxx world < /tmp/world.sql

如果将文件保存到其他位置,请相应地调整前面的说明。

在SQL节点上运行SELECT查询与在任何其他MySQL服务器实例上运行它们没有什么不同。要在命令行中运行查询,首先需要以通常的方式登录 MySQL监视器(在Enter password:提示符中指定root密码):

[root@mysqld /]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.7.48-ndb-7.5.36-cluster-gpl MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

我们只是简单地使用MySQL服务器的root帐户,并假设你已经遵循了安装MySQL服务器的标准安全预防措施,包括设置一个强的root密码。

值得注意的是,集群节点在访问其他节点时不使用MySQL特权系统。设置或更改MySQL用户帐户(包括root帐户)只影响访问SQL节点的应用程序 ,而不会影响节点之间的交互。

如果在导入SQL脚本之前没有修改表定义中的ENGINE子句,那么此时应该运行以下语句:

mysql> USE world;
mysql> ALTER TABLE City ENGINE=NDBCLUSTER;
mysql> ALTER TABLE Country ENGINE=NDBCLUSTER;
mysql> ALTER TABLE CountryLanguage ENGINE=NDBCLUSTER;

选择一个数据库并对该数据库中的表运行SELECT查询也是以通常的方式完成的,就像退出MySQL Monitor一样:

mysql> use world
Database changed
mysql> SELECT Name, Population FROM city ORDER BY Population DESC LIMIT 5;
+-----------------+------------+
| Name            | Population |
+-----------------+------------+
| Mumbai (Bombay) |   10500000 |
| Seoul           |    9981619 |
| S?o Paulo       |    9968485 |
| Shanghai        |    9696300 |
| Jakarta         |    9604900 |
+-----------------+------------+
5 rows in set (0.03 sec)

mysql> \q
Bye
[root@mysqld /]#

MySQL NDB集群初始配置

NDB集群初始配置
在本节中,我们将通过创建和编辑配置文件来讨论已安装的NDB集群的手动配置。
群集节点和主机。
节点 IP地址

管理节点(mgmd)                        10.10.10.102
SQL节点(mysqld)                       10.10.10.103
数据节点A(ndbd)                       10.10.10.104
数据节点B(ndbd)                       10.10.10.105

NDB Cluster还提供了一个GUI安装程序,可用于执行配置,而无需在单独的应用程序中编辑文本文件。要了解更多信息,请参见第21.2.1 节“NDB集群”Auto-Installer”。

对于我们的四节点、四主机的NDB集群(请参阅集群节点和主机),有必要编写四个配置文件,每个节点主机一个。
.每个数据节点或SQL节点都需要一个my.cnf文件,该文件提供两条信息:一个连接字符串,告诉节点在哪里找到管理节点,另一行告诉该主机( 承载数据节点的机器)上的MySQL服务器启用NDBCLUSTER存储引擎。

.管理节点需要一个config.ini文件,告诉它要维护多少个副本、为每个数据节点上的数据和索引分配多少内存、在哪里找到数据节点、在哪里 将数据保存到每个数据节点的磁盘上,以及在哪里找到SQL节点。

配置数据节点和SQL节点。
数据节点所需的my.cnf文件相当简单。配置文件应该位于/etc目录下,可以使用任何文本编辑器进行编辑。(如果该文件不存在,则创建该文件 。)例如:

shell> vi /etc/my.cnf

对于我们的示例设置中的每个数据节点和SQL节点,my.cnf应该是这样的:

[mysqld]
# Options for mysqld process:
ndbcluster # run NDB storage engine

[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=10.10.10.102 # location of management server

输入上述信息后,保存该文件并退出文本编辑器。对承载数据节点“A”、数据节点“B”和SQL节点的机器执行此操作。
SQL节点:

[root@mysqld /]# vi /etc/my.cnf
[mysqld]
# Options for mysqld process:
ndbcluster # run NDB storage engine

[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=10.10.10.102 # location of management server

数据节点A:

[root@ndbda /]# vi /etc/my.cnf
[mysqld]
# Options for mysqld process:
ndbcluster # run NDB storage engine

[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=10.10.10.102 # location of management server

数据节点B:

[root@ndbdb /]# vi /etc/my.cnf
[mysqld]
# Options for mysqld process:
ndbcluster # run NDB storage engine

[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=10.10.10.102 # location of management server

如前所示,一旦你用my.cnf文件的[mysqld]和[mysql_cluster]部分中的ndbcluster和ndbconnectstring参数启动了mysqld进程,你就不能在没 有实际启动集群之前执行任何CREATE TABLE或ALTER TABLE语句。否则,这些语句将失败并报错。这是设计的结果。

配置管理节点。
配置管理节点的第一步是创建可以找到配置文件的目录,然后创建文件本身。例如(以root身份运行):

[root@mgmd /]# mkdir /var/lib/mysql-cluster
[root@mgmd /]# cd /var/lib/mysql-cluster

对于我们的典型设置,config.ini文件应该如下所示:

[root@mgmd mysql-cluster]# vi config.ini
[ndbd default]
# Options affecting ndbd processes on all data nodes:
NoOfReplicas=2      # Number of replicas
DataMemory=1024M    # How much memory to allocate for data storage
IndexMemory=256M    # How much memory to allocate for index storage
                    # For DataMemory and IndexMemory, we have used the
                    # default values. Since the "world" database takes up
                    # only about 500KB, this should be more than enough for
                    # this example NDB Cluster setup.
ServerPort=2202     # This the default value; however, you can use any
                    # port that is free for all the hosts in the cluster
                    # Note1: It is recommended that you do not specify the port
                    # number at all and simply allow the default value to be used
                    # instead
                    # Note2: The port was formerly specified using the PortNumber
                    # TCP parameter; this parameter is no longer available in NDB
                    # Cluster 7.5.
[ndb_mgmd]
# Management process options:
HostName=10.10.10.102            # Hostname or IP address of MGM node
DataDir=/var/lib/mysql-cluster     # Directory for MGM node log files
[ndbd]
# Options for data node "A":
HostName=10.10.10.104            # Hostname or IP address
NodeId=2                           # Node ID for this data node
DataDir=/usr/local/mysql/data      # Directory for this data node's data files
[ndbd]
# Options for data node "B":
HostName=10.10.10.105            # Hostname or IP address
NodeId=3                           # Node ID for this data node
DataDir=/usr/local/mysql/data      # Directory for this data node's data files
[mysqld]
# SQL node options:
HostName=10.10.10.103            # Hostname or IP address
                                   # (additional mysqld connections can be
                                   # specified for this node for various
                                   # purposes such as running ndb_restore)
~

在创建了所有配置文件并指定了这些最小选项之后,就可以继续启动集群并验证所有进程都在运行。

集群管理节点的默认端口为1186;数据节点默认端口为“2202”。但是,集群可以从已经空闲的端口中自动为数据节点分配端口。

NDB集群初始启动
在配置完集群之后,启动集群并不是很困难。每个集群节点进程必须在其所在的主机上单独启动。首先应该启动管理节点,然后是数据节点,最 后是任何SQL节点:
1.在管理主机上,在系统shell中执行如下命令启动管理节点进程:

[root@mgmd /]# ndb_mgmd -f /var/lib/mysql-cluster/config.ini
MySQL Cluster Management Server mysql-5.7.48 ndb-7.5.36
2025-05-22 18:26:23 [MgmtSrvr] INFO     -- The default config directory '/usr/local/mysql/mysql-cluster' does not exist.  Trying to create it...
Failed to create directory '/usr/local/mysql/mysql-cluster', error: 2
2025-05-22 18:26:23 [MgmtSrvr] ERROR    -- Could not create directory '/usr/local/mysql/mysql-cluster'. Either create it  manually or specify a different directory with --configdir=
[root@mgmd /]# ndb_mgmd -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster
MySQL Cluster Management Server mysql-5.7.48 ndb-7.5.36
[root@mgmd /]# netstat -ltnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1527/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      13043/cupsd
tcp        0      0 0.0.0.0:1186            0.0.0.0:*               LISTEN      26104/ndb_mgmd
tcp6       0      0 :::22                   :::*                    LISTEN      1527/sshd
tcp6       0      0 ::1:631                 :::*                    LISTEN      13043/cupsd

在第一次启动ndb_mgmd时,必须使用-f或——config-file选项告诉它在哪里可以找到它的配置文件

2.在所有数据节点主机上执行如下命令启动ndbd进程:
数据节点A:

[root@ndbda /]# ndbd
2025-05-22 18:34:35 [ndbd] INFO     -- Angel connected to '10.10.10.102:1186'
2025-05-22 18:34:35 [ndbd] INFO     -- Angel allocated nodeid: 2
[root@ndbda /]# netstat -ltnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1527/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      11765/cupsd
tcp        0      0 10.10.10.104:2202     0.0.0.0:*               LISTEN      25455/ndbd
tcp6       0      0 :::22                   :::*                    LISTEN      1527/sshd
tcp6       0      0 ::1:631                 :::*                    LISTEN      11765/cupsd

数据节点B:

[root@ndbdb /]# ndbd
2025-05-22 18:35:08 [ndbd] INFO     -- Angel connected to '10.10.10.102:1186'
2025-05-22 18:35:08 [ndbd] INFO     -- Angel allocated nodeid: 3
[root@ndbdb /]# netstat -ltnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1526/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      13086/cupsd
tcp        0      0 10.10.10.105:2202     0.0.0.0:*               LISTEN      26140/ndbd
tcp6       0      0 :::22                   :::*                    LISTEN      1526/sshd
tcp6       0      0 ::1:631                 :::*                    LISTEN      13086/cupsd

3.如果您使用RPM文件在SQL节点所在的集群主机上安装MySQL,则可以(并且应该)使用提供的启动脚本在SQL节点上启动MySQL服务器进程。

[root@mysqld mysql]# service mysql.server start
Starting MySQL.Logging to '/usr/local/mysql/data/mysqld.err'.
. SUCCESS!

[root@mysqld mysql]# netstat -ltnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1529/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      13038/cupsd
tcp6       0      0 :::3306                 :::*                    LISTEN      26418/mysqld
tcp6       0      0 :::22                   :::*                    LISTEN      1529/sshd
tcp6       0      0 ::1:631                 :::*                    LISTEN      13038/cupsd

如果一切顺利,并且集群已经正确设置,那么集群现在应该可以运行了。你可以通过调用ndb_mgm管理节点客户端来测试这一点。输出应该如下 所示,不过你可能会发现不同版本的MySQL的输出略有不同:

[root@mgmd /]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @10.10.10.104  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0, *)
id=3    @10.10.10.105  (mysql-5.7.48 ndb-7.5.36, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.10.10.102  (mysql-5.7.48 ndb-7.5.36)

[mysqld(API)]   1 node(s)
id=4    @10.10.10.103  (mysql-5.7.48 ndb-7.5.36)

ndb_mgm>

SQL节点在这里被引用为[mysqld(API)],这反映了mysqld进程作为NDB集群API节点的事实。

SHOW命令输出中显示的给定NDB Cluster SQL或其他API节点的IP地址是SQL或API节点连接到集群数据节点的地址,而不是连接到任何管理节点的 地址。

现在您应该已经准备好处理NDB Cluster中的数据库、表和数据了

Linux下安装二进制版本的NDB集群

Linux下安装二进制版本的NDB集群
本节介绍从Oracle提供的预编译二进制文件中为每种类型的Cluster节点安装正确的可执行文件所需的步骤。
群集节点和主机。
节点 IP地址

管理节点(mgmd)                        10.10.10.102
SQL节点(mysqld)                       10.10.10.103
数据节点A(ndbd)                       10.10.10.104
数据节点B(ndbd)                       10.10.10.105

要使用预编译的二进制文件设置集群,安装过程中的第一步是从NDB cluster下载区域(https://dev.mysql.com/downloads/cluster/)下载最新 的NDB cluster 7.5二进制归档文件(mysql-cluster-gpl-7.5.9-linuxi686- glibc23.tar.gz)。我们假设您已经将这个文件放在每台机器 的/var/tmp目录中。

完成安装后,不要启动任何二进制文件。我们将在节点配置之后向您展示如何这样做。

SQL节点。
在指定用于承载SQL节点的每台机器上,以root用户的身份执行以下步骤:
1.检查/etc/passwd和/etc/group文件(或者使用操作系统提供的用于管理用户和组的工具),看看系统上是否已经有mysql组和mysql用户。一 些OS发行版在操作系统安装过程中创建了这些文件。如果没有,创建一个新的mysql用户组,然后添加一个mysql用户到这个组:

shell> groupadd mysql
shell> useradd -g mysql -s /bin/false mysql

useradd和groupadd的语法在不同版本的Unix上可能略有不同,或者它们可能具有不同的名称,例如adduser和addgroup。

2.将位置更改为包含下载文件的目录,解压缩归档文件,并创建一个名为mysql的符号链接到mysql目录。实际的文件和目录名称会根据NDB Cluster的版本号而有所不同。

[root@mysqld /]# cd /soft
[root@mysqld soft]# tar -C /usr/local -xzvf mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64.tar.gz
[root@mysqld soft]# ln -s /usr/local/mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64 /usr/local/mysql
[root@mysqld local]# cd /usr/local
[root@mysqld local]# ll
total 4
drwxr-xr-x.  2 root root    6 May  8  2014 bin
drwxr-xr-x.  2 root root    6 May  8  2014 etc
drwxr-xr-x.  2 root root    6 May  8  2014 games
drwxr-xr-x.  2 root root    6 May  8  2014 include
drwxr-xr-x.  2 root root    6 May  8  2014 lib
drwxr-xr-x.  2 root root    6 May  8  2014 lib64
drwxr-xr-x.  2 root root    6 May  8  2014 libexec
lrwxrwxrwx.  1 root root   58 May 20 18:43 mysql -> /usr/local/mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64
drwxr-xr-x. 10 root root 4096 May 20 18:36 mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64
drwxr-xr-x.  2 root root    6 May  8  2014 sbin
drwxr-xr-x.  5 root root   46 Oct 12  2017 share
drwxr-xr-x.  2 root root    6 May  8  2014 src
[root@mysqld local]#

3.将位置更改为mysql目录,并使用mysqld—initialize设置系统数据库,如下所示:

[root@mysqld local]# cd mysql
[root@mysqld mysql]# bin/mysqld --initialize
2025-05-20T10:55:27.199844Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use -- explicit_defaults_for_timestamp server option (see documentation for more details).
2025-05-20T10:55:27.381088Z 0 [Warning] InnoDB: New log files created, LSN=45790
2025-05-20T10:55:27.419222Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2025-05-20T10:55:27.475136Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this  server has been started. Generating a new UUID: f068b8ae-3568-11f0-89cb-005056a04e7f.
2025-05-20T10:55:27.476044Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2025-05-20T10:55:28.436286Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
2025-05-20T10:55:28.436307Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
2025-05-20T10:55:28.439870Z 0 [Warning] CA certificate ca.pem is self signed.
2025-05-20T10:55:28.910740Z 1 [Note] A temporary password is generated for root@localhost: w9fh;K>W-tH2


[root@mysqld mysql]# ll
total 284
drwxr-xr-x.  2 root root    4096 May 20 18:36 bin
drwxr-x---.  6 root root    4096 May 20 18:55 data
drwxr-xr-x.  2 root root      69 May 20 18:36 docs
drwxr-xr-x.  4 root root    4096 May 20 18:35 include
drwxr-xr-x.  5 root root    4096 May 20 18:36 lib
-rw-r--r--.  1 7161 31415 255108 Sep 26  2024 LICENSE
drwxr-xr-x.  4 root root      28 May 20 18:36 man
drwxr-xr-x. 10 root root    4096 May 20 18:36 mysql-test
-rw-r--r--.  1 7161 31415    566 Sep 26  2024 README
-rw-r--r--.  1 7161 31415    566 Sep 26  2024 README-test
drwxr-xr-x. 29 root root    4096 May 20 18:36 share
drwxr-xr-x.  2 root root      86 May 20 18:36 support-files

这将为MySQL root账户生成一个随机密码。如果不希望生成随机密码,可以用——initialize-insecure选项替换——initialize。

或者,你可以将位置更改为mysql目录,然后运行mysql_install_db来创建系统数据库:

shell> cd mysql
shell> bin/mysql_install_db --user=mysql

但是,由于mysql_install_db已被废弃,因此不推荐使用此方法,因此在未来的版本中可能会被删除。

4.设置MySQL服务器和数据目录的必要权限:

[root@mysqld mysql]# chown -R root .
[root@mysqld mysql]# chown -R mysql data
[root@mysqld mysql]# chgrp -R mysql .
[root@mysqld mysql]# ll
total 284
drwxr-xr-x.  2 root  mysql   4096 May 20 18:36 bin
drwxr-x---.  6 mysql mysql   4096 May 20 18:55 data
drwxr-xr-x.  2 root  mysql     69 May 20 18:36 docs
drwxr-xr-x.  4 root  mysql   4096 May 20 18:35 include
drwxr-xr-x.  5 root  mysql   4096 May 20 18:36 lib
-rw-r--r--.  1 root  mysql 255108 Sep 26  2024 LICENSE
drwxr-xr-x.  4 root  mysql     28 May 20 18:36 man
drwxr-xr-x. 10 root  mysql   4096 May 20 18:36 mysql-test
-rw-r--r--.  1 root  mysql    566 Sep 26  2024 README
-rw-r--r--.  1 root  mysql    566 Sep 26  2024 README-test
drwxr-xr-x. 29 root  mysql   4096 May 20 18:36 share
drwxr-xr-x.  2 root  mysql     86 May 20 18:36 support-files

5.将MySQL启动脚本复制到相应的目录,使其可执行,并设置为在操作系统启动时启动:

[root@mysqld mysql]# cp support-files/mysql.server /etc/rc.d/init.d/
[root@mysqld mysql]# chmod +x /etc/rc.d/init.d/mysql.server
[root@mysqld mysql]# chkconfig --add mysql.server

(启动脚本目录可能因操作系统和版本而异——例如,在某些Linux发行版中,它是/etc/init.d。)

这里我们使用Red Hat的chkconfig来创建指向启动脚本的链接;在您的平台上使用任何适合于此目的的方法,例如在Debian上的update-rc。

请记住,必须在驻留SQL节点的每台机器上重复上述步骤。

数据节点。
数据节点的安装不需要mysqld二进制文件。只需要NDB集群数据节点可执行文件ndbd(单线程)或ndbmtd(多线程)。这些二进制文件也可以 在.tar.gz存档文件中找到。同样,我们假设您已将此归档文件放在/soft中

作为系统root用户(即使用sudo、su root或系统中同等的工具暂时拥有系统管理员帐户的权限),执行以下步骤在数据节点主机上安装数据节 点二进制文件:
数据节点A:
1.将位置更改为/soft目录,并将ndbd和ndbmtd二进制文件从归档文件中提取到合适的目录中,例如/usr/local/bin:

[root@ndbda ~]# cd /soft
[root@ndbda soft]# tar -zxvf mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64.tar.gz
[root@ndbda soft]# cd mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64
[root@ndbda mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64]# cp bin/ndbd /usr/local/bin/ndbd
[root@ndbda mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64]# cp bin/ndbmtd /usr/local/bin/ndbmtd
[root@ndbda mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64]# ll /usr/local/bin/ndb*
-rwxr-xr-x. 1 root root 43410615 May 22 00:28 /usr/local/bin/ndbd
-rwxr-xr-x. 1 root root 43697940 May 22 00:28 /usr/local/bin/ndbmtd

(在将ndb_mgm和ndb_mgmd复制到可执行目录后,您可以通过解压缩下载的存档文件及其包含的文件,从/soft中安全地删除创建的目录。)

2.将位置更改为复制文件的目录,然后使它们都可执行:

[root@ndbda mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64]# cd /usr/local/bin
[root@ndbda bin]# chmod +x ndb*
[root@ndbda bin]# ll ndb*
-rwxr-xr-x. 1 root root 43410615 May 22 00:28 ndbd
-rwxr-xr-x. 1 root root 43697940 May 22 00:28 ndbmtd

上述步骤应在每个数据节点主机上重复执行。
数据节点B:
1.将位置更改为/soft目录,并将ndbd和ndbmtd二进制文件从归档文件中提取到合适的目录中,例如/usr/local/bin:

[root@ndbdb ~]# cd /soft
[root@ndbdb soft]# tar -zxvf mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64.tar.gz
[root@ndbdb soft]# cd mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64
[root@ndbdb mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64]# cp bin/ndbd /usr/local/bin/ndbd
[root@ndbdb mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64]# cp bin/ndbmtd /usr/local/bin/ndbmtd
[root@ndbdb mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64]# ll /usr/local/bin/ndb*
-rwxr-xr-x. 1 root root 43410615 May 22 00:28 /usr/local/bin/ndbd
-rwxr-xr-x. 1 root root 43697940 May 22 00:28 /usr/local/bin/ndbmtd

(在将ndb_mgm和ndb_mgmd复制到可执行目录后,您可以通过解压缩下载的存档文件及其包含的文件,从/soft中安全地删除创建的目录。)

2.将位置更改为复制文件的目录,然后使它们都可执行:

[root@ndbda mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64]# cd /usr/local/bin
[root@ndbda bin]# chmod +x ndb*
[root@ndbdb bin]# ll ndb*
-rwxr-xr-x. 1 root root 43410615 May 22 00:44 ndbd
-rwxr-xr-x. 1 root root 43697940 May 22 00:45 ndbmtd

管理节点。
管理节点的安装不需要mysqld二进制文件。只需要NDB集群管理服务器(ndb_mgmd);您很可能还想安装管理客户端(ndb_mgm)。这两个二进制 文件也可以在.tar.gz存档文件中找到。同样,我们假设您已将此归档文件放在/soft中。

以系统root用户在管理节点主机上安装“ndb_mgmd”和“ndb_mgm”。

1.将位置更改为/soft目录,并将ndb_mgm和ndb_mgmd从归档文件中提取到合适的目录,例如/usr/local/bin:

[root@mgmd /]# cd /soft
[root@mgmd soft]# tar -zxvf mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64.tar.gz
[root@mgmd soft]# cd mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64
[root@mgmd mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64]# cp bin/ndb_mgm* /usr/local/bin
[root@mgmd mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64]# ll /usr/local/bin/ndb_mgm*
-rwxr-xr-x. 1 root root 11862623 May 22 16:41 /usr/local/bin/ndb_mgm
-rwxr-xr-x. 1 root root 21989718 May 22 16:41 /usr/local/bin/ndb_mgmd

(一旦将ndb_mgm和ndb_mgmd拷贝到可执行文件目录,你就可以安全地从/var/tmp目录中删除下载的归档文件及其包含的文件。)

2.将位置更改为复制文件的目录,然后使它们都可执行:

[root@mgmd mysql-cluster-gpl-7.5.36-linux-glibc2.12-x86_64]# cd /usr/local/bin
[root@mgmd bin]# chmod +x ndb_mgm*
[root@mgmd bin]# ll ndb_mgm*
-rwxr-xr-x. 1 root root 11862623 May 22 16:41 ndb_mgm
-rwxr-xr-x. 1 root root 21989718 May 22 16:41 ndb_mgmd

MySQL 5.7 检查InnoDB集群状态

检查InnoDB集群状态
Cluster对象提供了status()方法,让你能够检查集群的运行情况。在你检查InnoDB集群的状态之前,你需要通过连接到它的任何一个实例来 获取对InnoDB集群对象的引用。但是,如果您想要更改集群的配置,则必须连接到“R/W”实例。执行status()函数可以根据所连接的服务器 实例所感知到的集群视图获取集群状态,并输出状态报告。

集群中的实例状态直接影响状态报告中提供的信息。离开集群的实例与属于集群的实例相比,提供了集群的不同视图。因此,请确保连接到的实 例的状态为在线。

要了解InnoDB集群的运行情况,请使用集群的status()方法:

 MySQL  JS > \connect root@localhost:3320
Creating a session to 'root@localhost:3320'
Please provide the password for 'root@localhost:3320': ******
Save password for 'root@localhost:3320'? [Y]es/[N]o/Ne[v]er (default No):
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 35
Server version: 5.7.26-log Source distribution
No default schema selected; type \use  to set one.

 MySQL  localhost:3330  JS > var cluster = dba.getCluster()
WARNING: Support for AdminAPI operations in MySQL version 5.7 is deprecated and will be removed in a future release of MySQL  Shell
 MySQL  localhost:3330  JS > cluster.status()
WARNING: Support for AdminAPI operations in MySQL version 5.7 is deprecated and will be removed in a future release of MySQL  Shell
{
    "clusterName": "testCluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "127.0.0.1:3310",
        "ssl": "DISABLED",
        "status": "OK",
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
        "topology": {
            "127.0.0.1:3310": {
                "address": "127.0.0.1:3310",
                "memberRole": "PRIMARY",
                "mode": "R/W",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE",
                "version": "5.7.26"
            },
            "127.0.0.1:3320": {
                "address": "127.0.0.1:3320",
                "memberRole": "SECONDARY",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE",
                "version": "5.7.26"
            },
            "127.0.0.1:3330": {
                "address": "127.0.0.1:3330",
                "memberRole": "SECONDARY",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE",
                "version": "5.7.26"
            }
        },
        "topologyMode": "Single-Primary"
    },
    "groupInformationSourceMember": "127.0.0.1:3310"
}


cluster.status()的输出信息包括以下信息:
.clusterName:在dba.createCluster()过程中分配给集群的名称。

.ssl:集群是否使用安全连接。显示REQUIRED或DISABLED的值,取决于在createCluster()或addInstance()期间如何配置memberSslMode选项 。此参数返回的值对应于实例上的group_replication_ssl_mode服务器变量的值。

.status:集群中该元素的状态。对于整个集群,本文描述了该集群提供的高可用性。例如,状态参见下面的详细信息

.topology:已加入集群的实例。

.Host name of instance:实例的主机名,例如127.0.0.1:3310。

.mode:请参阅下面对mode的描述。

实例状态是下列之一。
.ONLINE:实例在线并参与集群。

.OFFLINE:实例已失去与其他实例的连接。

.RECOVERING:实例正在通过检索它成为联机成员之前需要的事务来尝试与集群同步。

.UNREACHABLE:实例失去了与集群的通信。

.ERROR:实例在恢复阶段或应用事务时遇到错误。

.(MISSING):一个实例的状态,它是已配置集群的一部分,但目前不可用。

MISSING状态是InnoDB集群特有的,它不是由组复制产生的状态。MySQL Shell使用这种状态来表示在元数据中注册的实例,但在实时集群视图中 找不到。

在实例进入ERROR状态后,super_read_only选项将设置为ON。要脱离ERROR状态,必须手动配置该实例为super_read_only=OFF。

模式为R/W(可读可写)或R/O(只读)。在单主模式下,只有标记为“R/W”的实例才能执行更新数据库的事务,因此它是主模式。如果该实例 由于任何原因(如意外停机)变得不可访问,则剩余的一个“R/O”实例自动取代它的位置,并成为新的“R/W”主实例。在多主模式下,多个实 例被标记为“R/W”,并且没有选举的主实例。

MySQL 5.7 在InnoDB集群中使用MySQL路由器

在InnoDB集群中使用MySQL路由器
在InnoDB集群中使用MySQL Router实现高可用性。不管你部署的是沙盒还是生产集群,MySQL路由器都可以根据InnoDB集群的元数据使用——bootstrap选项来配置自己。这将自动配置MySQL路由器,将连接路由到集群的服务器实例。客户端应用程序连接到MySQL路由器提供的端口,而不需要知道InnoDB集群的拓扑结构。在发生意外故障时,InnoDB集群会自动调整,MySQL路由器会检测到变化。

不要尝试手动配置MySQL路由器来重定向到InnoDB集群的端口。始终使用–bootstrap选项,因为这确保MySQL路由器从InnoDB集群的元数据中获取配置。

MySQL Router推荐和应用部署在同一个主机上。当使用沙盒部署时,所有东西都运行在单个主机上,因此你将MySQL路由器部署到同一个主机上。当使用生产部署时,我们建议在每台主机上部署一个MySQL路由器实例。也可以将MySQL Router部署到应用实例连接的普通机器上。你需要InnoDB集群的主密钥来自动配置MySQL路由器。

假设已经安装了MySQL路由器(参见安装MySQL路由器),使用–bootstrap选项来提供属于InnoDB集群的服务器实例的位置。MySQL路由器使用包含的元数据缓存插件来获取InnoDB集群的元数据,该元数据由组成InnoDB集群的服务器实例地址列表及其在集群中的角色组成。你传入了服务器的URI类型字符串,MySQL路由器应该从该服务器获取InnoDB集群的元数据。例如:

[root@my239 ~]#   mysqlrouter --bootstrap root@my239:3310 --user=mysqlrouter
Please enter MySQL password for root:
WARNING: The MySQL server does not have SSL configured and metadata used by the router may be transmitted unencrypted.
# Bootstrapping system MySQL Router 8.0.41 (MySQL Community - GPL) instance...

- Creating account(s) (only those that are needed, if any)
Failed changing the authentication plugin for account 'mysql_router1_t79nbm0'@'%':  mysql_native_password which is deprecated is the default authentication plugin on this server.
- Verifying account (using it to run SQL queries that would be run by Router)
- Storing account in keyring
- Adjusting permissions of generated files
- Creating configuration /etc/mysqlrouter/mysqlrouter.conf

Existing configuration backed up to '/etc/mysqlrouter/mysqlrouter.conf.bak'

# MySQL Router configured for the InnoDB Cluster 'testCluster'

After this MySQL Router has been started with the generated configuration

    $ /etc/init.d/mysqlrouter restart
or
    $ systemctl start mysqlrouter
or
    $ mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf

InnoDB Cluster 'testCluster' can be reached by connecting to:

## MySQL Classic protocol

- Read/Write Connections: localhost:6446
- Read/Only Connections:  localhost:6447

## MySQL X protocol

- Read/Write Connections: localhost:6448
- Read/Only Connections:  localhost:6449

系统提示您输入MySQL Router使用的实例密码和加密密钥。此加密密钥用于加密MySQL路由器连接到集群时使用的实例密码。可以连接到InnoDB集群的端口也会显示出来。MySQL路由器引导过程创建了一个mysqlrouter.conf文件,该文件的设置基于从传递给–bootstrap选项的地址中检索到的集群元数据,在上面的例子中ic@mic1:3306。根据检索到的InnoDB集群元数据,MySQL Router自动创建了一个配置文件,其中包含一个metadata_cache部分,例如:

[root@my239 ~]# more /etc/mysqlrouter/mysqlrouter.conf
# File automatically generated during MySQL Router bootstrap
[DEFAULT]
name=system
user=mysqlrouter
keyring_path=/var/lib/mysqlrouter/keyring
master_key_path=/etc/mysqlrouter/mysqlrouter.key
connect_timeout=5
read_timeout=30
dynamic_state=/var/lib/mysqlrouter/state.json
client_ssl_cert=/var/lib/mysqlrouter/router-cert.pem
client_ssl_key=/var/lib/mysqlrouter/router-key.pem
client_ssl_mode=PREFERRED
server_ssl_mode=AS_CLIENT
server_ssl_verify=DISABLED
unknown_config_option=error

[logger]
level=INFO

[metadata_cache:bootstrap]
cluster_type=gr
router_id=1
user=mysql_router1_t79nbm0
metadata_cluster=testCluster
ttl=0.5
auth_cache_ttl=-1
auth_cache_refresh_interval=2
use_gr_notifications=0

[routing:bootstrap_rw]
bind_address=0.0.0.0
bind_port=6446
destinations=metadata-cache://testCluster/?role=PRIMARY
routing_strategy=first-available
protocol=classic

[routing:bootstrap_ro]
bind_address=0.0.0.0
bind_port=6447
destinations=metadata-cache://testCluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=classic

[routing:bootstrap_x_rw]
bind_address=0.0.0.0
bind_port=6448
destinations=metadata-cache://testCluster/?role=PRIMARY
routing_strategy=first-available
protocol=x

[routing:bootstrap_x_ro]
bind_address=0.0.0.0
bind_port=6449
destinations=metadata-cache://testCluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=x

[http_server]
port=8443
ssl=1
ssl_cert=/var/lib/mysqlrouter/router-cert.pem
ssl_key=/var/lib/mysqlrouter/router-key.pem

[http_auth_realm:default_auth_realm]
backend=default_auth_backend
method=basic
name=default_realm

[rest_router]
require_realm=default_auth_realm

[rest_api]

[http_auth_backend:default_auth_backend]
backend=metadata_cache

[rest_routing]
require_realm=default_auth_realm

[rest_metadata_cache]
require_realm=default_auth_realm

生成的MySQL路由器配置创建了用于连接到集群的TCP端口。创建了使用经典MySQL协议和X协议与集群通信的端口。要使用X协议,服务器实例必须安装和配置X插件。对于沙盒部署,实例会自动设置X Plugin。对于生产部署,如果你想使用X协议,你需要在每个实例上安装和配置X插件
.6446用于经典的MySQL协议读写会话,MySQL路由器将传入的连接重定向到主服务器实例。

.6447对于经典的MySQL协议只读会话,MySQL路由器将传入的连接重定向到一个辅助服务器实例。

.6448对于X协议读写会话,MySQL路由器将传入的连接重定向到主服务器实例。

.6449对于X Protocol只读会话,MySQL路由器将传入的连接重定向到一个辅助服务器实例。

根据你的MySQL路由器配置,端口号可能与上面不同。例如,如果您使用–conf-base-port选项,或group_replication_single_primary_mode变量。当你启动MySQL路由器时,会列出确切的端口。

传入的连接被重定向的方式取决于所使用的集群类型。当使用单主集群时,读写会话被重定向到单主集群,而在多主集群中,读写会话被重定向到其中一个主集群实例。对于进入的只读连接,MySQL路由器以轮询方式将连接重定向到一个辅助实例。

一旦启动并配置后,启动MySQL路由器:

[root@my239 ~]#  mysqlrouter &
[1] 9670

[root@my239 ~]# netstat -ltnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:33101           0.0.0.0:*               LISTEN      24656/mysqld
tcp        0      0 0.0.0.0:6446            0.0.0.0:*               LISTEN      9670/mysqlrouter
tcp        0      0 0.0.0.0:6447            0.0.0.0:*               LISTEN      9670/mysqlrouter
tcp        0      0 0.0.0.0:6448            0.0.0.0:*               LISTEN      9670/mysqlrouter
tcp        0      0 0.0.0.0:6449            0.0.0.0:*               LISTEN      9670/mysqlrouter
tcp        0      0 0.0.0.0:33201           0.0.0.0:*               LISTEN      27539/mysqld
tcp        0      0 0.0.0.0:33301           0.0.0.0:*               LISTEN      27495/mysqld
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1625/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      2854/cupsd
tcp        0      0 0.0.0.0:8443            0.0.0.0:*               LISTEN      9670/mysqlrouter
tcp6       0      0 :::3306                 :::*                    LISTEN      2566/mysqld
tcp6       0      0 :::33100                :::*                    LISTEN      24656/mysqld
tcp6       0      0 :::3310                 :::*                    LISTEN      24656/mysqld
tcp6       0      0 :::33200                :::*                    LISTEN      27539/mysqld
tcp6       0      0 :::33300                :::*                    LISTEN      27495/mysqld
tcp6       0      0 :::22                   :::*                    LISTEN      1625/sshd
tcp6       0      0 ::1:631                 :::*                    LISTEN      2854/cupsd
tcp6       0      0 :::3320                 :::*                    LISTEN      27539/mysqld
tcp6       0      0 :::3330                 :::*                    LISTEN      27495/mysqld
tcp6       0      0 :::33060                :::*                    LISTEN      2566/mysqld

或者设置一个服务,在系统启动时自动启动MySQL Router,参见启动MySQL Router。你现在可以连接一个MySQL客户端,例如MySQL Shell到一个MySQL路由器端口,如上所述,并看到客户端是如何透明地连接到一个InnoDB集群实例的。

[root@my239 ~]# mysqlsh --log-level=DEBUG3 --uri root@localhost:6446
Please provide the password for 'root@localhost:6446': ******
Save password for 'root@localhost:6446'? [Y]es/[N]o/Ne[v]er (default No):
MySQL Shell 8.0.41

Copyright (c) 2016, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'root@localhost:6446'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 196
Server version: 5.7.26-log Source distribution
No default schema selected; type \use  to set one.
 MySQL  localhost:6446  JS >

要验证您实际连接到的实例,只需对主机名和端口状态变量发出一个SQL查询。

 MySQL  localhost:6446  SQL > SELECT @@hostname AS 'Host Name', @@port AS 'Port';
+-----------------------+------+
| Host Name             | Port |
+-----------------------+------+
| localhost.localdomain | 3310 |
+-----------------------+------+
1 row in set (0.0008 sec)