如何在Ubuntu 18.04上创建多节点MySQL集群

MySQL Cluster分布式数据库为MySQL数据库管理系统提供高可用性和吞吐量。本教程演示如何在Ubuntu 18.04服务器上安装和配置3节点MySQL Cluster。

介绍

MySQL Cluster分布式数据库为MySQL数据库管理系统提供高可用性和吞吐量。 MySQL Cluster由一个或多个管理节点( ndb_mgmd )组成,这些节点存储集群的配置并控制存储集群数据的数据节点( ndbd )。 与管理节点通信后,客户端(MySQL客户端,服务器或本机API)直接连接到这些数据节点。

使用MySQL Cluster,通常不会复制数据,而是数据节点同步。 为此,必须使用特殊的数据引擎 - NDBCluster(NDB)。 将集群视为具有冗余组件的单个逻辑MySQL环境是有帮助的。 因此,MySQL Cluster可以与其他MySQL群集一起参与复制。

MySQL Cluster在无共享环境中运行最佳。 理想情况下,没有两个组件应该共享相同的硬件。 出于简化和演示的目的,我们仅限于使用三台服务器。 我们将设置两个服务器作为数据节点,在它们之间同步数据。 第三台服务器将用于Cluster Manager以及MySQL服务器/客户端。 如果启动其他服务器,则可以向群集添加更多数据节点,将群集管理器与MySQL服务器/客户端分离,并将更多服务器配置为群集管理器和MySQL服务器/客户端。

先决条件

要完成本教程,您将需要总共三台服务器:两台服务器用于冗余MySQL数据节点( ndbd ),一台服务器用于Cluster Manager( ndb_mgmd )和MySQL服务器/客户机( mysqldmysql )。

同一个DigitalOcean数据中心中 ,创建以下启用专用网络的 Droplet:

请务必记下三个Droplet的私有 IP地址。 在本教程中,我们的群集节点具有以下私有IP地址:

  • 198.51.100.0将是第一个MySQL Cluster数据节点
  • 198.51.100.1将是第二个数据节点
  • 198.51.100.2将是Cluster Manager和MySQL服务器节点

一旦您启动了Droplet,配置了非root用户,并记下3个节点的IP地址,您就可以开始学习本教程了。

第1步 - 安装和配置Cluster Manager

我们首先下载并安装MySQL Cluster Manager, ndb_mgmd

要安装Cluster Manager,我们首先需要从官方MySQL Cluster 下载页面获取相应的.deb安装程序文件。

在此页面的“ 选择操作系统”下,选择“ Ubuntu Linux” 然后,在Select OS Version下 ,选择Ubuntu Linux 18.04(x86,64位)

向下滚动,直到看到DEB Package,NDB Management Server ,然后单击包含dbgsym下载链接(除非您需要调试符号)。 您将进入“ 开始下载”页面。 在这里,右键单击“ 不,谢谢”,开始下载。 并将链接复制到.deb文件。

现在,登录到Cluster Manager Droplet(在本教程中, 198.51.100.2 ),并下载此.deb文件:

cd ~
wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-7.6/mysql-cluster-community-management-server_7.6.6-1ubuntu18.04_amd64.deb

使用dpkg安装ndb_mgmd

sudo dpkg -i mysql-cluster-community-management-server_7.6.6-1ubuntu18.04_amd64.deb

我们现在需要在首次运行之前配置ndb_mgmd ; 正确的配置将确保数据节点之间的正确同步和负载分配。

Cluster Manager应该是在任何MySQL集群中启动的第一个组件。 它需要一个配置文件,作为参数传递给它的可执行文件。 我们将创建并使用以下配置文件: /var/lib/mysql-cluster/config.ini

在Cluster Manager Droplet上,创建此文件所在的/var/lib/mysql-cluster目录:

sudo mkdir /var/lib/mysql-cluster

然后使用首选的文本编辑器创建和编辑配置文件:

sudo nano /var/lib/mysql-cluster/config.ini

将以下文本粘贴到编辑器中:

/var/lib/mysql-cluster/config.ini
[ndbd default]
# Options affecting ndbd processes on all data nodes:
NoOfReplicas=2  # Number of replicas

[ndb_mgmd]
# Management process options:
hostname=198.51.100.2 # Hostname of the manager
datadir=/var/lib/mysql-cluster  # Directory for the log files

[ndbd]
hostname=198.51.100.0 # Hostname/IP of the first data node
NodeId=2            # Node ID for this data node
datadir=/usr/local/mysql/data   # Remote directory for the data files

[ndbd]
hostname=198.51.100.1 # Hostname/IP of the second data node
NodeId=3            # Node ID for this data node
datadir=/usr/local/mysql/data   # Remote directory for the data files

[mysqld]
# SQL node options:
hostname=198.51.100.2 # In our case the MySQL server/client is on the same Droplet as the cluster manager

粘贴在本文中后,请确保使用您配置的Droplet的正确IP地址替换上面的hostname值。 设置此hostname参数是一项重要的安全措施,可防止其他服务器连接到Cluster Manager。

保存文件并关闭文本编辑器。

这是一个用于MySQL Cluster的简化配置文件。 您应该根据生产需要自定义此文件中的参数。 有关完整配置的ndb_mgmd配置文件的示例,请参阅MySQL Cluster 文档

在上面的文件中,您可以通过将实例附加到相应的部分来添加其他组件,如数据节点( ndbd )或MySQL服务器节点( mysqld )。

我们现在可以通过执行ndb_mgmd二进制文件并使用-f标志指定其配置文件来启动管理器:

sudo ndb_mgmd -f /var/lib/mysql-cluster/config.ini

您应该看到以下输出:

MySQL Cluster Management Server mysql-5.7.22 ndb-7.6.6
2018-07-25 21:48:39 [MgmtSrvr] INFO     -- The default config directory '/usr/mysql-cluster' does not exist. Trying to create it...
2018-07-25 21:48:39 [MgmtSrvr] INFO     -- Successfully created config directory

这表明MySQL Cluster Management服务器已成功安装,现在正在您的Droplet上运行。

理想情况下,我们希望在启动时自动启动Cluster Management服务器。 为此,我们将创建并启用systemd服务。

在我们创建服务之前,我们需要终止正在运行的服务器:

sudo pkill -f ndb_mgmd

现在,使用您喜欢的编辑器打开并编辑以下systemd单元文件:

sudo nano /etc/systemd/system/ndb_mgmd.service

粘贴以下代码:

/etc/systemd/system/ndb_mgmd.service
[Unit]
Description=MySQL NDB Cluster Management Server
After=network.target auditd.service

[Service]
Type=forking
ExecStart=/usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

在这里,我们添加了一组最小的选项,指导systemd如何启动,停止和重启ndb_mgmd进程。 要了解有关本机配置中使用的选项的更多信息,请参阅systemd 手册

保存并关闭文件。

现在,使用daemon-reload加载systemd的管理器配置:

sudo systemctl daemon-reload

我们将启用刚创建的服务,以便MySQL Cluster Manager在重启时启动:

sudo systemctl enable ndb_mgmd

最后,我们将启动该服务:

sudo systemctl start ndb_mgmd

您可以验证NDB群集管理服务是否正在运行:

sudo systemctl status ndb_mgmd

您应该看到以下输出:

● ndb_mgmd.service - MySQL NDB Cluster Management Server
   Loaded: loaded (/etc/systemd/system/ndb_mgmd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-07-26 21:23:37 UTC; 3s ago
  Process: 11184 ExecStart=/usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini (code=exited, status=0/SUCCESS)
 Main PID: 11193 (ndb_mgmd)
    Tasks: 11 (limit: 4915)
   CGroup: /system.slice/ndb_mgmd.service
           └─11193 /usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini

这表示ndb_mgmd MySQL Cluster Management服务器现在作为systemd服务运行。

设置Cluster Manager的最后一步是允许来自我们专用网络上其他MySQL Cluster节点的传入连接。

如果在设置此Droplet时未配置ufw防火墙,则可以跳到下一部分。

我们将添加规则以允许来自两个数据节点的本地传入连接:

sudo ufw allow from 198.51.100.0
sudo ufw allow from 198.51.100.1

输入这些命令后,您应该看到以下输出:

Rule added

现在,Cluster Manager应该已启动并正在运行,并且能够通过专用网络与其他Cluster节点进行通信。

第2步 - 安装和配置数据节点

注意:本节中的所有命令都应在两个数据节点上执行。

在此步骤中,我们将安装ndbd MySQL Cluster数据节点守护程序,并配置节点以便它们可以与Cluster Manager进行通信。

要安装数据节点二进制文件,我们首先需要从官方MySQL 下载页面获取相应的.deb安装程序文件。

在此页面的“ 选择操作系统”下,选择“ Ubuntu Linux” 然后,在Select OS Version下 ,选择Ubuntu Linux 18.04(x86,64位)

向下滚动,直到看到DEB包,NDB数据节点二进制文件 ,然后单击包含dbgsym下载链接(除非您需要调试符号)。 您将进入“ 开始下载”页面。 在这里,右键单击“ 不,谢谢”,开始下载。 并将链接复制到.deb文件。

现在,登录到您的第一个数据节点Droplet(在本教程中, 198.51.100.0 ),并下载此.deb文件:

cd ~
wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-7.6/mysql-cluster-community-data-node_7.6.6-1ubuntu18.04_amd64.deb

在我们安装数据节点二进制文件之前,我们需要安装一个依赖项libclass-methodmaker-perl

sudo apt update
sudo apt install libclass-methodmaker-perl

我们现在可以使用dpkg安装数据备注二进制文件:

sudo dpkg -i mysql-cluster-community-data-node_7.6.6-1ubuntu18.04_amd64.deb

数据节点从MySQL的标准位置/etc/my.cnf提取其配置。 使用您喜欢的文本编辑器创建此文件并开始编辑它:

sudo nano /etc/my.cnf

将以下配置参数添加到文件中:

/etc/my.cnf中
[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=198.51.100.2  # location of cluster manager

指定Cluster Manager节点的位置是ndbd启动所需的唯一配置。 其余配置将直接从管理器中提取。

保存并退出该文件。

在我们的示例中,数据节点将根据管理器的配置发现其数据目录是/usr/local/mysql/data 在启动守护程序之前,我们将在节点上创建此目录:

sudo mkdir -p /usr/local/mysql/data

现在我们可以使用以下命令启动数据节点:

sudo ndbd

您应该看到以下输出:

2018-07-18 19:48:21 [ndbd] INFO     -- Angel connected to '198.51.100.2:1186'
2018-07-18 19:48:21 [ndbd] INFO     -- Angel allocated nodeid: 2

NDB数据节点守护程序已成功安装,现在正在您的服务器上运行。

我们还需要通过专用网络允许来自其他MySQL Cluster节点的传入连接。

如果在设置此Droplet时未配置ufw防火墙,则可以跳过为ndbd设置systemd服务。

我们将添加规则以允许来自Cluster Manager和其他数据节点的传入连接:

sudo ufw allow from 198.51.100.0
sudo ufw allow from 198.51.100.2

输入这些命令后,您应该看到以下输出:

Rule added

您的MySQL数据节点Droplet现在可以通过专用网络与Cluster Manager和其他数据节点进行通信。

最后,我们还希望数据节点守护进程在服务器引导时自动启动。 我们将遵循与Cluster Manager相同的过程,并创建systemd服务。

在我们创建服务之前,我们将ndbd正在运行的ndbd进程:

sudo pkill -f ndbd

现在,使用您喜欢的编辑器打开并编辑以下systemd单元文件:

sudo nano /etc/systemd/system/ndbd.service

粘贴以下代码:

/etc/systemd/system/ndbd.service
[Unit]
Description=MySQL NDB Data Node Daemon
After=network.target auditd.service

[Service]
Type=forking
ExecStart=/usr/sbin/ndbd
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

在这里,我们添加了一组最小的选项,指导systemd如何启动,停止和重启ndbd进程。 要了解有关本机配置中使用的选项的更多信息,请参阅systemd 手册

保存并关闭文件。

现在,使用daemon-reload加载systemd的管理器配置:

sudo systemctl daemon-reload

我们现在将启用刚刚创建的服务,以便数据节点守护程序在重新启动时启动:

sudo systemctl enable ndbd

最后,我们将启动该服务:

sudo systemctl start ndbd

您可以验证NDB群集管理服务是否正在运行:

sudo systemctl status ndbd

您应该看到以下输出:

● ndbd.service - MySQL NDB Data Node Daemon
   Loaded: loaded (/etc/systemd/system/ndbd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-07-26 20:56:29 UTC; 8s ago
  Process: 11972 ExecStart=/usr/sbin/ndbd (code=exited, status=0/SUCCESS)
 Main PID: 11984 (ndbd)
    Tasks: 46 (limit: 4915)
   CGroup: /system.slice/ndbd.service
           ├─11984 /usr/sbin/ndbd
           └─11987 /usr/sbin/ndbd

这表示ndbd MySQL Cluster数据节点守护程序现在作为systemd服务运行。 您的数据节点现在应该功能齐全,并且能够连接到MySQL Cluster Manager。

完成第一个数据节点的设置后,在其他数据节点上重复本节中的步骤(本教程中为198.51.100.1 )。

第3步 - 配置和启动MySQL服务器和客户端

标准的MySQL服务器,例如Ubuntu的APT存储库中提供的服务器,不支持MySQL Cluster引擎NDB。 这意味着我们需要安装与我们在本教程中安装的其他MySQL Cluster软件一起打包的自定义SQL服务器。

我们将再次从官方MySQL Cluster 下载页面中获取MySQL Cluster Server二进制文件

在此页面的“ 选择操作系统”下,选择“ Ubuntu Linux” 然后,在Select OS Version下 ,选择Ubuntu Linux 18.04(x86,64位)

向下滚动直到看到DEB Bundle ,然后单击Download链接(它应该是列表中的第一个)。 您将进入“ 开始下载”页面。 在这里,右键单击“ 不,谢谢”,开始下载。 并将链接复制到.tar存档。

现在,登录到Cluster Manager Droplet(在本教程中, 198.51.100.2 ),然后下载.tar存档(回想一下我们在与Cluster Manager相同的节点上安装MySQL Server) - 在生产环境中你应该运行这些不同节点上的守护进程):

cd ~
wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-7.6/mysql-cluster_7.6.6-1ubuntu18.04_amd64.deb-bundle.tar

我们现在将此存档解压缩到名为install的目录中。 首先,创建目录:

mkdir install

现在将存档解压缩到此目录中:

tar -xvf mysql-cluster_7.6.6-1ubuntu18.04_amd64.deb-bundle.tar -C install/

进入此目录,其中包含解压缩的MySQL Cluster组件二进制文件:

cd install

在我们安装MySQL服务器二进制文件之前,我们需要安装几个依赖项:

sudo apt update
sudo apt install libaio1 libmecab2

现在,我们需要安装MySQL Cluster依赖项,捆绑在我们刚提取的tar存档中:

sudo dpkg -i mysql-common_7.6.6-1ubuntu18.04_amd64.deb
sudo dpkg -i mysql-cluster-community-client_7.6.6-1ubuntu18.04_amd64.deb
sudo dpkg -i mysql-client_7.6.6-1ubuntu18.04_amd64.deb
sudo dpkg -i mysql-cluster-community-server_7.6.6-1ubuntu18.04_amd64.deb

安装mysql-cluster-community-server ,应出现配置提示,要求您为MySQL数据库的root帐户设置密码。 选择一个强大的安全密码,然后点击<确定> 出现提示时重新输入此root密码,再次按<Ok>键完成安装。

我们现在可以使用dpkg安装MySQL服务器二进制文件:

mysql-server_7.6.6-1ubuntu18.04_amd64.deb

我们现在需要配置此MySQL服务器安装。

MySQL Server的配置存储在默认的/etc/mysql/my.cnf文件中。

使用您喜欢的编辑器打开此配置文件:

sudo nano /etc/mysql/my.cnf

您应该看到以下文本:

/etc/mysql/my.cnf
# Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

#
# The MySQL Cluster Community Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

将以下配置附加到其中:

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

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

保存并退出该文件。

重新启动MySQL服务器以使这些更改生效:

sudo systemctl restart mysql

默认情况下,MySQL应在服务器重新启动时自动启动。 如果没有,则以下命令应解决此问题:

sudo systemctl enable mysql

现在,SQL Server应在Cluster Manager / MySQL Server Droplet上运行。

在下一步中,我们将运行一些命令来验证我们的MySQL Cluster安装是否按预期运行。

第4步 - 验证MySQL群集安装

要验证MySQL Cluster安装,请登录到Cluster Manager / SQL Server节点。

我们将从命令行打开MySQL客户端,并通过输入以下命令连接到我们刚刚配置的root帐户:

mysql -u root -p 

出现提示时输入密码,然后按ENTER

您应该看到类似于的输出:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.22-ndb-7.6.6 MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

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客户端后,运行以下命令:

SHOW ENGINE NDB STATUS \G

您现在应该看到有关NDB集群引擎的信息,从连接参数开始:


*************************** 1. row ***************************
  Type: ndbcluster
  Name: connection
Status: cluster_node_id=4, connected_host=198.51.100.2, connected_port=1186, number_of_data_nodes=2, number_of_ready_data_nodes=2, connect_count=0
. . .

这表明您已成功连接到MySQL群集。

请注意ready_data_nodes的数量:2。这种冗余允许MySQL集群继续运行,即使其中一个数据节点出现故障。 它还意味着您的SQL查询将在两个数据节点之间进行负载平衡。

您可以尝试关闭其中一个数据节点以测试群集稳定性。 最简单的测试是重新启动数据节点Droplet,以便完全测试恢复过程。 您应该看到number_of_ready_data_nodes的值更改为1并在节点重新启动并重新连接到Cluster Manager时再次返回到2

要退出MySQL提示,只需键入quit或按CTRL-D

这是第一个表明MySQL集群,服务器和客户端正在运行的测试。 我们现在将进行一项额外的测试,以确认群集是否正常运行。

使用以下命令打开群集管理控制台ndb_mgm

ndb_mgm

您应该看到以下输出:

-- NDB Cluster -- Management Client --
ndb_mgm>

进入控制台后,输入命令SHOW ENTER

SHOW

您应该看到以下输出:

Connected to Management Server at: 198.51.100.2:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2    @198.51.100.0  (mysql-5.7.22 ndb-7.6.6, Nodegroup: 0, *)
id=3    @198.51.100.1  (mysql-5.7.22 ndb-7.6.6, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @198.51.100.2  (mysql-5.7.22 ndb-7.6.6)

[mysqld(API)]   1 node(s)
id=4    @198.51.100.2  (mysql-5.7.22 ndb-7.6.6)

以上显示有两个数据节点与node-id s 2和3相连。还有一个管理节点具有node-id 1和一个MySQL服务器具有node-id 4.您可以通过键入显示有关每个id的更多信息它的编号与STATUS命令如下:

2 STATUS

以上命令显示节点2的状态,MySQL版本和NDB版本:

Node 2: started (mysql-5.7.22 ndb-7.6.6)

要退出管理控制台,请键入quit ,然后按ENTER

管理控制台功能非常强大,为管理群集及其数据提供了许多其他选项,包括创建在线备份。 有关更多信息,请参阅MySQL官方文档

此时,您已经完全测试了MySQL Cluster安装。 本指南的结束步骤向您展示如何创建测试数据并将其插入此MySQL群集。

第5步 - 将数据插入MySQL群集

为了演示集群的功能,让我们使用NDB引擎创建一个新表,并将一些示例数据插入其中。 请注意,为了使用群集功能,必须将引擎明确指定为NDB 如果使用InnoDB(默认)或任何其他引擎,则不会使用群集。

首先,让我们使用以下命令创建一个名为clustertest的数据库:

CREATE DATABASE clustertest;

接下来,切换到新数据库:

USE clustertest;

现在,创建一个名为test_table的简单表,如下所示:

CREATE TABLE test_table (name VARCHAR(20), value VARCHAR(20)) ENGINE=ndbcluster;

我们已经明确指定了引擎ndbcluster以便使用集群。

现在,我们可以使用此SQL查询开始插入数据:

INSERT INTO test_table (name,value) VALUES('some_name','some_value');

要验证是否已插入数据,请运行以下select查询:

SELECT * FROM test_table;

ndbcluster表中插入数据并从中选择数据时,群集负载平衡所有可用数据节点之间的查询。 这样可以提高MySQL数据库安装的稳定性和性能。

您还可以在我们之前编辑的my.cnf文件中将默认存储引擎设置为ndbcluster 如果执行此操作,则在创建表时不需要指定ENGINE选项。 要了解更多信息,请参阅MySQL 参考手册

结论

在本教程中,我们演示了如何在Ubuntu 18.04服务器上设置和配置MySQL Cluster。 值得注意的是,这是一个用于演示安装过程的最小化,简化的体系结构,在生产中部署MySQL Cluster之前,有许多高级选项和功能值得学习(例如,执行备份)。 要了解更多信息,请参阅官方MySQL Cluster文档