如何在Ubuntu 18.04上创建多节点MySQL集群
介绍
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,我们首先需要.deb
从官方MySQL Cluster 下载页面获取相应的安装程序文件。
在此页面的“ 选择操作系统”下,选择“ 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
安装ndb_mgmd
使用dpkg
:
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
粘贴在本文中后,请务必hostname
使用您配置的Droplet的正确IP地址替换上面的值。设置此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
您应该看到以下输出:
Output
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节点的传入连接。
如果ufw
在设置此Droplet时未配置防火墙,则可以跳到下一部分。
我们将添加规则以允许来自两个数据节点的本地传入连接:
sudo ufw allow from 198.51.100.0
sudo ufw allow from 198.51.100.1
输入这些命令后,您应该看到以下输出:
Output
Rule added
现在,Cluster Manager应该已启动并正在运行,并且能够通过专用网络与其他Cluster节点进行通信。
第2步 - 安装和配置数据节点
注意:本节中的所有命令都应在两个数据节点上执行。
在此步骤中,我们将安装ndbd
MySQL Cluster数据节点守护程序,并配置节点以便它们可以与Cluster Manager通信。
要安装数据节点二进制文件,我们首先需要.deb
从官方MySQL 下载页面获取相应的安装程序文件。
在此页面的“ 选择操作系统”下,选择“ 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
您应该看到以下输出:
Output
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节点的传入连接。
如果ufw
在设置此Droplet时未配置防火墙,则可以跳过为设置systemd服务ndbd
。
我们将添加规则以允许来自Cluster Manager和其他数据节点的传入连接:
sudo ufw allow from 198.51.100.0
sudo ufw allow from 198.51.100.2
输入这些命令后,您应该看到以下输出:
Output
Rule added
您的MySQL数据节点Droplet现在可以通过专用网络与Cluster Manager和其他数据节点进行通信。
最后,我们还希望数据节点守护进程在服务器引导时自动启动。我们将遵循与Cluster Manager相同的过程,并创建systemd服务。
在我们创建服务之前,我们将终止正在运行的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
您应该看到以下输出:
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>键完成安装。
我们现在可以安装MySQL服务器二进制文件dpkg
:
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
。
您应该看到类似于的输出:
Output
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集群引擎的信息,从连接参数开始:
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,以便完全测试恢复过程。当节点重新启动并重新连接到Cluster Manager时,您应该会看到number_of_ready_data_nodes
更改的值1
并再次备份2
。
要退出MySQL提示,只需键入quit
或按CTRL-D
。
这是第一个表明MySQL集群,服务器和客户端正在运行的测试。我们现在将进行一项额外的测试,以确认群集是否正常运行。
ndb_mgm
使用以下命令打开群集管理控制台:
ndb_mgm
您应该看到以下输出:
Output
-- NDB Cluster -- Management Client -- ndb_mgm>
进入控制台后,输入命令SHOW
并点击ENTER
:
SHOW
您应该看到以下输出:
Output
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版本:
Output
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数据库安装的稳定性和性能。
您还可以ndbcluster
在my.cnf
我们之前编辑的文件中设置默认存储引擎。如果执行此操作,则无需ENGINE
在创建表时指定选项。要了解更多信息,请参阅MySQL 参考手册。
结论
在本教程中,我们演示了如何在Ubuntu 18.04服务器上设置和配置MySQL Cluster。值得注意的是,这是一个用于演示安装过程的最小化,简化的体系结构,在生产中部署MySQL Cluster之前,有许多高级选项和功能值得学习(例如,执行备份)。要了解更多信息,请参阅官方MySQL Cluster文档。