在这篇文章中,我们将看到如何从 docker 镜像设置 MySQL NDB 集群。我假设读者对 docker 及其术语有一些基本的了解。
安装 MySQL NDB Cluster 的步骤:
让我们使用以下环境创建一个 MySQL NDB Cluster:
- MySQL NDB Cluster 版本(最新 GA 版本)
- 1个管理节点
- 4 个数据节点
- 1个Mysqld服务器
- 最多 4 个附加 API 节点的配置槽
注意: Docker 软件必须安装并运行在我们计划安装 MySQL NDB Cluster 的同一台主机上。还要确保我们有足够的资源分配给 docker,这样我们以后就不会遇到任何问题。
步骤 1:在您的主机上获取 MySQL NDB Cluster docker 映像
用户可以从 github 站点(链接)获取 MySQL NDB Cluster 映像。然后选择您需要的集群版本进行下载。
注意:默认情况下,MySQL NDB Cluster 8.0 GA 版本镜像 docker 将拉取或通过提及tag:latest也指向最新的集群镜像,目前为8.0。如果用户想要拉取旧版本的集群镜像,即 7.5、7.6 然后在标签中提及旧版本(tag:7.5)。docker 支持集群 7.5 及以上版本。
让我们运行下面的命令来获取最新的集群镜像:host > docker pull mysql/mysql-cluster:latest
要么:
主机> docker pull mysql/mysql-cluster主机> docker pull mysql/mysql-cluster:7.5

让我们等待下载完成。

集群镜像已被 docker 成功拉取。检查是否还存在相同版本的旧图像总是好的。在这种情况下,在拉取同一个集群镜像时,docker 会提示“镜像是最新的…(查找下图)”。

第 2 步:创建一个 docker 网络
下一步是创建一个内部 docker 网络,以便所有容器都可以使用它来相互通信。
Host> docker network create cluster_8.0 --subnet=192.168.0.0/16
这里cluster_8.0是新建的docker内部网域。您可以为其指定任何名称。

让我们检查上面的网络是否创建:Host> docker network ls这将列出docker中存在的所有网络。可以看到我们的网络“cluster_8.0”也在列表中。

第 3 步:准备集群特定的配置文件(config.ini、my.cnf)
默认情况下,docker 镜像将有一个名为 my.cnf (/etc/my.cnf) 和 mysql-cluster.cnf (/etc/mysql-cluster.cnf) 的最小配置文件。让我们创建自己的集群配置文件(mysql-cluster.cnf)并让 docker 在我们启动集群时使用它。
示例自定义 mysql-cluster.cnf 文件如下所示:
[NDBD默认]
NoOfReplicas = 2
DataMemory值= 1G
#Below LogLevel的设置将在调试问题帮助
LogLevelStartup = 15
LogLevelShutdown = 15
LogLevelConnection = 15
LogLevelInfo = 15
LogLevelError = 15
LogLevelNodeRestart = 15
LogLevelCheckpoint = 15
[ndb_mgmd]
#Management节点1
的NodeId = 254
主机名= 192.168.0.2
[NDBD]
#DATA节点2
的NodeId = 34
主机名= 192.168.0.4
[NDBD]
#DATA节点3
的NodeId = 35
主机名= 192.168.0.5
[ndbd]
#数据节点4
NodeId = 36
HostName = 192.168.0.6
[mysqld]
#API node 1
NodeId = 24
[mysqld]
#API node 2
NodeId = 25
[mysqld]
#API node 3
NodeId = 26
[mysqld]
#API node 4
NodeId = 27
注意:
应该根据主机的可用空闲内存 (RAM) 仔细分配所有与内存相关的配置参数,如 DataMemory、TransactionMemory、SharedGlobalMemory 等,过多的内存分配可能会导致启动集群时出现问题。如果我们不确定应该使用哪些配置参数,那么我们应该使用默认配置集群文件运行集群,但它会是一个 2 节点集群。每个配置参数都有一些默认值,所以如果有疑问,我们应该只在集群配置文件中提及所需的 HostName 和 NodeId 并保留其他参数(默认)。
第四步:使用自定义集群配置文件(mysql-cluster.cnf)启动管理服务器
下一步是启动管理服务器 (mgmt1)。在下面的命令中,HOST_PATH 是主机上与容器文件映射的所需文件的路径。在我的主机上,HOST_PATH= /Users/sarojtripathy/docker/mysql-tree/8.0 HOST> docker
run -d --net=cluster_8.0 –ip=192.168.0.2
–volume=HOST_PATH/mysql-cluster.cnf:
/etc/mysql-cluster.cnf \ --volume=HOST_PATH/ndb/node1/mgmt1/ndb_254_cluster.log:/ndb_254_cluster.log
–name=mgmt1 mysql/mysql-cluster ndb_mgmd --initial

从上图中:
mysql-cluster.cnf:这是自定义集群配置文件并映射到默认集群配置文件(
/etc/mysql-cluster.cnf)ndb_254_cluster.log:这是我们必须在所需的路径(空文件),然后映射到内部集群日志文件。这个想法是将所有集群日志消息发送到容器外部,以便我们可以在集群中发生任何问题时查看日志。或者,我们可以通过docker命令查看集群日志:HOST> docker logs -f mgmt_container_name让我们通过以下命令检查管理节点的状态:HOST> docker ps -a | grep -i mgmt1

我们可以看到管理节点容器已启动。我们也可以启动 mgmt 客户端(ndb_mgm)来查看管理节点是否启动并运行。
主机> docker run -it --net=cluster_8.0 mysql/mysql-cluster ndb_mgm

我们可以看到管理节点(ID:254)已启动并运行,4 个数据节点尚未启动。
让我们打开日志文件(ndb_254_cluster.log)并检查是否可以看到集群日志。我在我的主机上创建了一个文件 (ndb_254_cluster.log) 来捕获集群日志。

第五步:启动所有数据节点
在每个数据节点中运行以下命令。确保我们已经更改了节点 ID,每个数据节点的名称。
数据节点1:
HOST> docker run -d --net=cluster_8.0
–name=ndbmtd1
-e ‘–ndb-connectstring=192.168.0.2:1186’
mysql/mysql-cluster ndbmtd --nostart - -nodaemon
数据节点2:
HOST>docker run -d --net=cluster_8.0
–name=ndbmtd2
-e ‘–ndb-connectstring=192.168.0.2:1186’
mysql/mysql-cluster ndbmtd – nostart --nodaemon
数据节点3:
HOST>docker run -d --net=cluster_8.0
–name=ndbmtd3
-e ‘–ndb-connectstring=192.168.0.2:1186’
mysql/mysql-cluster ndbmtd --nostart --nodaemon
数据节点 4:
HOST>docker run -d --net=cluster_8。
–name=ndbmtd4
-e ‘–ndb-connectstring=192.168.0.2:1186’
mysql/mysql-cluster ndbmtd --nostart --nodaemon

有必要使用 –nodaemon 选项运行所有数据节点,因为当前不支持在 docker 容器中使用 daemon 选项运行数据节点。所以所有从数据节点生成的日志都被重定向到标准输出。要收集这些日志,我们必须使用docker命令:HOST> docker logs -f ndbmtd_container_name让我们从管理客户端(ndb_mgm)检查数据节点的状态。主机> docker run -it --net=cluster_8.0 mysql/mysql-cluster ndb_mgm

状态“未启动”表明数据节点进程正在运行,但尚未尝试启动。要启动数据节点进程,请从管理客户端发出“启动”命令。我们也可以发出’ all start '命令来启动所有的数据节点。

我们可以看到所有数据节点都处于“开始”状态,然后更改为“开始”状态。让我们再次查看集群状态。

由于数据节点以 —nodaemon 选项启动,因此日志不会在任何文件上累积,而是会重定向到标准输出。因此,将这些日志收集到文件中的唯一方法是使用 docker 命令。
主机> docker 日志-f ndbmtd1 | tee ndbmtd1_log
上面的命令将创建一个名为 'ndbmtd1_log 的文件,并将所有日志重定向到该文件中,同时,在主机终端的 stdout 上显示相同的日志。所以我们可以对所有正在运行的数据节点做同样的事情。这将有助于在集群启动并运行时调试任何问题。

第 6 步:启动 mysqld 服务器
为 mysqld 节点运行以下命令。确保我们已经更改了每个 mysqld 节点的 ip、名称。在我的主机上,HOST_PATH= /Users/sarojtripathy/docker/mysql-tree/8.0/
HOST> docker run -d --net=cluster_8.0
-v HOST_PATH/ndb/node1/mysqld_data1:/var/lib/mysql
-v HOST_PATH/ndb/node1/mysqld.log:/var/log/mysqld. log
–name=mysqld1 --ip=192.168.0.10 -e mysql_random_root_password=true
mysql/mysql-cluster mysqld --log-error=/var/log/mysqld.log

与管理日志文件一样,这里我也在本地主机上创建了一个空的 mysqld.log 文件并映射到 mysqld 容器内部日志文件(/var/log/mysqld.log)。此外,我已将 mysql 数据文件“/var/lib/mysql”映射到本地文件“mysqld_data1”。让我们验证来自主机的 mysqld 日志。

让我们从管理客户端 (ndb_mgm) 检查 mysqld 节点的状态:

从上图中,我们可以看到我们的新集群现在已经启动并运行了…… 😃
步骤 7:启动 mysql 客户端
在启动 mysql 客户
端之前,我们需要获取在 mysqld 初始化阶段已经生成的密码。然后复制这个密码并传递给连接服务器。主机> docker 日志mysqld1 2>&1 | grep PASSWORD上面的命令将显示密码。

然后输入上面的密码连接到mysqld服务器。
HOST> docker exec -it mysqld1 mysql -uroot -p
Enter password: <== 输入我们上面复制的密码。

下一步是将密码更改为我们自己的密码。请查找以下命令:
mysql> ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘root123’;
mysql> 退出;

现在通过使用新密码登录来启动 mysql 客户端。

第 8 步:在 MySQL NDB 集群上创建数据库、表、行事务
让我们创建一个数据库、一个表并向表中插入几行。

让我们在表 ‘t1’ 中插入几行,然后检查行数。


让我们从表中删除一行并再次检查行数。

因此,从上图中,我们看到我们能够对驻留在 MySQL NDB Cluster 中的表执行事务。
最后,让我们在完成所有表操作后检查集群状态。

我们可以看到集群已启动并正在运行。我们对通过 docker 安装 MySQL NDB Cluster 的讨论到此结束。




