#### 23.4.3.12 NDB 集群共享内存连接

[](<>)[](<>)[](<>)[](<>)

NDB 集群节点之间的通信通常使用 TCP/IP 处理。共享内存 (SHM) 传输器的区别在于信号是通过写入内存而不是套接字来传输的。当在同一主机上同时运行 API 节点（通常是 SQL 节点）和数据节点时，共享内存传输器 (SHM) 可以通过减少高达 20% 的 TCP 连接所需开销来提高性能。您可以通过此处列出的两种方式之一启用共享内存连接：

-   通过设置[`使用Shm`](mysql-cluster-ndbd-definition.html#ndbparam-ndbd-useshm)数据节点配置参数`1`, 并设置[`主机名`](mysql-cluster-ndbd-definition.html#ndbparam-ndbd-hostname)对于数据节点和[`主机名`](mysql-cluster-api-definition.html#ndbparam-api-hostname)为 API 节点设置相同的值。

-   通过使用`[嘘]`集群配置文件中的部分，每个部分都包含以下设置[`节点 ID1`](mysql-cluster-shm-definition.html#ndbparam-shm-nodeid1)和[`节点Id2`](mysql-cluster-shm-definition.html#ndbparam-shm-nodeid2).本节稍后将更详细地描述此方法。

    假设一个集群在 10.0.0.1 的同一台主机上运行一个节点 ID 为 1 的数据节点和一个节点 ID 为 51 的 SQL 节点。要在这两个节点之间启用 SHM 连接，只需确保集群配置文件中包含以下条目：


```
[ndbd]
NodeId=1
HostName=10.0.0.1
UseShm=1

[mysqld]
NodeId=51
HostName=10.0.0.1
```

重要的

刚刚显示的两个条目是对集群所需的任何其他条目和参数设置的补充。本节稍后将显示一个更完整的示例。

在启动使用 SHM 连接的数据节点之前，还需要确保托管此类数据节点的每台计算机上的操作系统都有足够的内存分配给共享内存段。有关这方面的信息，请参阅您的操作平台的文档。在多个主机分别运行一个数据节点和一个 API 节点的设置中，可以通过设置在所有此类主机上启用共享内存`使用Shm`在里面`[ndbd 默认]`配置文件的部分。这将在本节后面的示例中显示。

虽然不是严格要求，但可以通过在`[shm 默认]`集群配置部分（`配置文件`） 文件：

-   [`大小`](mysql-cluster-shm-definition.html#ndbparam-shm-shmsize): 共享内存大小

-   [`ShmSpinTime`](mysql-cluster-shm-definition.html#ndbparam-shm-shmspintime)：睡眠前旋转的时间（以 µs 为单位）

-   [`发送缓冲区内存`](mysql-cluster-shm-definition.html#ndbparam-shm-sendbuffermemory)：从该节点发送的信号的缓冲区大小，以字节为单位。

-   [`发送信号 ID`](mysql-cluster-shm-definition.html#ndbparam-shm-sendsignalid)：表示通过transporter发送的每个信号中都包含一个信号ID。

-   [`校验和`](mysql-cluster-shm-definition.html#ndbparam-shm-checksum)：表示通过传输器发送的每个信号中都包含一个校验和。

-   [`预发送校验和`](mysql-cluster-shm-definition.html#ndbparam-shm-presendchecksum)：在发送信号之前检查校验和；还必须启用校验和才能使其正常工作

    此示例显示了一个简单的设置，其中在多个主机上定义了 SHM 连接，在 NDB 集群中使用此处按主机名列出的 3 台计算机，托管显示的节点类型：

1.  `10.0.0.0`: 管理服务器

2.  `10.0.0.1`：一个数据节点和一个SQL节点

3.  `10.0.0.2`：一个数据节点和一个SQL节点

    在这种情况下，每个数据节点都使用 TCP 传输器与管理服务器和其他数据节点进行通信；每个 SQL 节点使用共享内存传输器与本地数据节点通信，并使用 TCP 传输器与远程数据节点通信。反映此设置的基本配置由 config.ini 文件启用，其内容如下所示：


```
[ndbd default]
DataDir=/path/to/datadir
UseShm=1

[shm default]
ShmSize=8M
ShmSpintime=200
SendBufferMemory=4M

[tcp default]
SendBufferMemory=8M

[ndb_mgmd]
NodeId=49
Hostname=10.0.0.0
DataDir=/path/to/datadir

[ndbd]
NodeId=1
Hostname=10.0.0.1
DataDir=/path/to/datadir

[ndbd]
NodeId=2
Hostname=10.0.0.2
DataDir=/path/to/datadir

[mysqld]
NodeId=51
Hostname=10.0.0.1

[mysqld]
NodeId=52
Hostname=10.0.0.2

[api]
[api]
```

影响所有共享内存传输器的参数在`[shm 默认]`部分;这些可以在一个或多个连接的基础上被覆盖`[嘘]`部分。每个这样的部分都必须与给定的 SHM 连接相关联，使用[`节点 ID1`](mysql-cluster-shm-definition.html#ndbparam-shm-nodeid1)和[`节点Id2`](mysql-cluster-shm-definition.html#ndbparam-shm-nodeid2);这些参数所需的值是传输器连接的两个节点的节点 ID。您还可以使用主机名识别节点[`主机名1`](mysql-cluster-shm-definition.html#ndbparam-shm-hostname1)和[`主机名2`](mysql-cluster-shm-definition.html#ndbparam-shm-hostname2)，但这些参数不是必需的。

未设置主机名的 API 节点使用 TCP 传输器与数据节点进行通信，而与它们启动的主机无关；中设置的参数和值`[tcp 默认]`配置文件的部分适用于集群中的所有 TCP 传输器。

为获得最佳性能，您可以定义 SHM 转运器的旋转时间 ([`ShmSpinTime`](mysql-cluster-shm-definition.html#ndbparam-shm-shmspintime)范围）;这会影响数据节点接收线程和轮询所有者（接收线程或用户线程）`新开发银行`.

-   [](<>) `校验和`

    [](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 布尔值 |
    | 默认 | 真的 |
    | 范围 | 真假 |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    此参数是一个布尔值 (`是`/`ñ`) 参数，默认情况下禁用。启用后，所有消息的校验和都会在放入发送缓冲区之前进行计算。

    此功能可防止消息在发送缓冲区中等待时被损坏。它还可以检查数据在传输过程中是否损坏。

-   [](<>) `团体`

    [](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 未签名 |
    | 默认 | 35 |
    | 范围 | 0 - 200 |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    确定组邻近度；较小的值被解释为更接近。对于大多数情况，默认值就足够了。

-   [](<>) `主机名1`

    [](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 名称或 IP 地址 |
    | 默认 | [...] |
    | 范围 | ... |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    这`主机名1`和[`主机名2`](mysql-cluster-shm-definition.html#ndbparam-shm-hostname2)参数可用于指定用于两个节点之间给定 SHM 连接的特定网络接口。用于这些参数的值可以是主机名或 IP 地址。

-   [](<>) `主机名2`

    [](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 名称或 IP 地址 |
    | 默认 | [...] |
    | 范围 | ... |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    这[`主机名1`](mysql-cluster-shm-definition.html#ndbparam-shm-hostname1)和`主机名2`参数可用于指定用于两个节点之间给定 SHM 连接的特定网络接口。用于这些参数的值可以是主机名或 IP 地址。

-   [](<>) `节点 ID1`

    [](<>)[](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 数字 |
    | 默认 | [没有] |
    | 范围 | 1 - 255 |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    为了识别两个节点之间的连接，有必要为每个节点提供节点标识符，如`节点 ID1`和[`节点Id2`](mysql-cluster-shm-definition.html#ndbparam-shm-nodeid2).

-   [](<>) `节点Id2`

    [](<>)[](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 数字 |
    | 默认 | [没有] |
    | 范围 | 1 - 255 |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    为了识别两个节点之间的连接，有必要为每个节点提供节点标识符，如[`节点 ID1`](mysql-cluster-shm-definition.html#ndbparam-shm-nodeid1)和`节点Id2`.

-   [](<>) `节点ID服务器`

    [](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 数字 |
    | 默认 | [没有] |
    | 范围 | 1 - 63 |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    识别共享内存连接的服务器端。默认情况下，这是数据节点的节点 ID。

-   [](<>) `过载限制`

    [](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 字节 |
    | 默认 | 0 |
    | 范围 | 0 - 4294967039 (0xFFFFFEFF) |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    当发送缓冲区中的未发送字节数超过此数量时，则认为连接过载。看[第 23.4.3.14 节，“配置 NDB 集群发送缓冲区参数”](mysql-cluster-config-send-buffers.html)， 和[第 23.6.14.64 节，“ndbinfo 传输器表”](mysql-cluster-ndbinfo-transporters.html)， 了解更多信息。

-   [](<>) [`预发送校验和`](mysql-cluster-shm-definition.html#ndbparam-shm-presendchecksum)

    [](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 布尔值 |
    | 默认 | 错误的 |
    | 范围 | 真假 |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    如果这个参数和[`校验和`](mysql-cluster-shm-definition.html#ndbparam-shm-checksum)都启用，执行预发送校验和检查，并检查节点之间的所有 SHM 信号是否有错误。如果没有效果`校验和`也未启用。

-   [](<>) [`发送缓冲区内存`](mysql-cluster-shm-definition.html#ndbparam-shm-sendbuffermemory)

    [](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 整数 |
    | 默认 | 2M |
    | 范围 | 256K - 4294967039 (0xFFFFFEFF) |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    使用共享内存连接从该节点发送的信号的共享内存缓冲区大小（以字节为单位）。

-   [](<>) `发送信号 ID`

    [](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 布尔值 |
    | 默认 | 错误的 |
    | 范围 | 真假 |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    为了追溯分布式消息的路径，有必要为每条消息提供一个唯一的标识符。将此参数设置为`是`导致这些消息 ID 也通过网络传输。此功能在生产版本中默认禁用，并在`-调试`构建。

-   [](<>) [`ShmKey`](mysql-cluster-shm-definition.html#ndbparam-shm-shmkey)

    [](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 未签名 |
    | 默认 | 0 |
    | 范围 | 0 - 4294967039 (0xFFFFFEFF) |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    在设置共享内存段时，使用整数表示的节点 ID 来唯一标识要用于通信的共享内存段。没有默认值。如果[`使用Shm`](mysql-cluster-ndbd-definition.html#ndbparam-ndbd-useshm)启用时，共享内存密钥由下式自动计算`新开发银行`.

-   [](<>) [`大小`](mysql-cluster-shm-definition.html#ndbparam-shm-shmsize)

    [](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 字节 |
    | 默认 | 4M |
    | 范围 | 64K - 4294967039 (0xFFFFFEFF) |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    每个 SHM 连接都有一个共享内存段，其中节点之间的消息由发送者放置并由阅读器读取。该段的大小由下式定义[`大小`](mysql-cluster-shm-definition.html#ndbparam-shm-shmsize).默认值为 4MB。

-   [](<>) [`ShmSpinTime`](mysql-cluster-shm-definition.html#ndbparam-shm-shmspintime)

    [](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 整数 |
    | 默认 | 0 |
    | 范围 | 0 - 2000 |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    接收时，休眠前等待的时间，以微秒为单位。

-   [](<>) [`签名号`](mysql-cluster-shm-definition.html#ndbparam-shm-signum)

    [](<>)

    [](<>)

    | 版本（或更高版本） | 新开发银行 8.0.13 |
    | --------- | ------------ |
    | 类型或单位 | 未签名 |
    | 默认 | [...] |
    | 范围 | 0 - 4294967039 (0xFFFFFEFF) |
    | 已弃用 | 是（在 NDB 7.6 中） |
    | [重启类型](mysql-cluster-shm-definition.html#mysql-cluster-shm-definition-restart-types) | N（新开发银行 8.0.13） |

    该参数以前用于覆盖操作系统信号编号；在 NDB 8.0 中，不再使用它，并且忽略它的任何设置。

[](<>)**重启类型。**本节参数说明使用的重启类型信息如下表所示：

[](<>)

**表 23.22 NDB 集群重启类型**

| 象征 | 重启类型 | 描述 |
| --- | ---- | --- |
| ñ | 节点 | 可以使用滚动重启来更新参数（请参阅[第 23.6.5 节，“执行 NDB 集群的滚动重启”](mysql-cluster-rolling-restart.html)) |
| 小号 | 系统 | 必须完全关闭所有集群节点，然后重新启动，才能更改此参数 |
| 一世 | 最初的 | 数据节点必须使用[`- 最初的`](mysql-cluster-programs-ndbd.html#option_ndbd_initial)选项 |
