介绍
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服务器/客户机( mysqld
和mysql
)。
在同一个DigitalOcean数据中心中 ,创建以下启用了专用网络的 Droplet:
- 三个Ubuntu 18.04 Droplet启用了专用网络
- 为每个Droplet配置了sudo权限的非root用户。 您可以在使用Ubuntu 18.04的初始服务器设置中学习如何执行此操作。
请务必记下三个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
将以下文本粘贴到编辑器中:
[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
您应该看到以下输出:
OutputMySQL 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
粘贴以下代码:
[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
输入这些命令后,您应该看到以下输出:
OutputRule 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
将以下配置参数添加到文件中:
[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
您应该看到以下输出:
Output2018-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
输入这些命令后,您应该看到以下输出:
OutputRule added
您的MySQL数据节点Droplet现在可以通过专用网络与Cluster Manager和其他数据节点进行通信。
最后,我们还希望数据节点守护进程在服务器引导时自动启动。 我们将遵循与Cluster Manager相同的过程,并创建systemd服务。
在我们创建服务之前,我们将ndbd
正在运行的ndbd
进程:
sudo pkill -f ndbd
现在,使用您喜欢的编辑器打开并编辑以下systemd单元文件:
sudo nano /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
您应该看到以下输出:
Output● 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
您应该看到以下文本:
# 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/
将以下配置附加到其中:
. . .
[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
。
您应该看到类似于的输出:
OutputWelcome 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集群引擎的信息,从连接参数开始:
Output
*************************** 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
您应该看到以下输出:
Output-- NDB Cluster -- Management Client --
ndb_mgm>
进入控制台后,输入命令SHOW
ENTER
:
SHOW
您应该看到以下输出:
OutputConnected 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版本:
OutputNode 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文档 。