如何在Ubuntu 16.04上创建多节点MySQL集群
介绍
MySQL集群是一种提供高可用性和吞吐量的软件技术。如果您已经熟悉其他集群技术,您会发现MySQL集群与它们类似。简而言之,有一个或多个管理节点控制数据节点(存储数据的地方)。咨询管理节点后,客户端(MySQL客户端,服务器或本机API)直接连接到数据节点。
您可能想知道MySQL复制是如何与MySQL集群相关的。对于群集,没有典型的数据复制,而是存在数据节点的同步。为此,必须使用特殊的数据引擎 - NDBCluster(NDB)。将集群视为具有冗余组件的单个逻辑MySQL环境。因此,MySQL集群可以与其他MySQL集群一起参与复制。
MySQL集群在无共享环境中运行最佳。理想情况下,没有两个组件应该共享相同的硬件。为简单起见和演示目的,我们仅限于使用三个Droplet。将有两个Droplet充当数据节点,它们之间正在同步数据。第三个Droplet将用于集群管理器,同时用于MySQL服务器/客户端。如果您有更多的Droplet,您可以添加更多数据节点,将集群管理器与MySQL服务器/客户端分开,甚至可以添加更多Droplet作为集群管理器和MySQL服务器/客户端。
先决条件
您将需要总共三个Droplet - 一个用于MySQL集群管理器和MySQL服务器/客户端的Droplet以及两个用于冗余MySQL数据节点的Droplet。
在同一个DigitalOcean数据中心中,创建以下启用了专用网络的 Droplet :
三个Ubuntu 16.04 Droplet,至少具有1 GB RAM和专用网络功能
具有每个Droplet的sudo权限的非root用户(使用Ubuntu 16.04的初始服务器设置解释了如何设置它。)
MySQL集群在RAM中存储了大量信息。每个Droplet应至少有1GB的RAM。
如私人网络教程中所述,请务必为3 Droplet设置自定义记录。为了简单和方便起见,我们将为/etc/hosts
文件中的每个Droplet使用以下自定义记录:
10.XXX.XX.X node1.mysql.cluster
10.YYY.YY.Y node2.mysql.cluster
10.ZZZ.ZZ.Z manager.mysql.cluster
请相应地将突出显示的IP替换为Droplet的私有IP。
除非另有说明,否则本教程中需要root权限的所有命令都应作为具有sudo权限的非root用户运行。
第1步 - 下载和安装MySQL Cluster
在编写本教程时,MySQL集群的最新GPL版本是7.4.11。该产品构建于MySQL 5.6之上,它包括:
集群管理器软件
数据节点管理器软件
MySQL 5.6服务器和客户端二进制文件
您可以从官方MySQL集群下载页面下载免费的,通用可用(GA)MySQL集群版本。从这个页面,选择Debian Linux平台包,它也适用于Ubuntu。还要确保根据Droplet的体系结构选择32位或64位版本。将安装包上传到每个Droplet。
所有Droplet的安装说明都是相同的,因此请在所有3个Droplet上完成这些步骤。
在开始安装之前,libaio1
必须安装软件包,因为它是依赖项:
$ sudo apt-get install libaio1
之后,安装MySQL集群包:
$ sudo dpkg -i mysql-cluster-gpl-7.4.11-debian7-x86_64.deb
现在,您可以在目录中找到MySQL群集安装/opt/mysql/server-5.6/
。我们将特别使用/opt/mysql/server-5.6/bin/
所有二进制文件所在的bin目录()。
应对所有三个Droplet执行相同的安装步骤,而不管每个Droplet是否具有不同的功能 - 管理器或数据节点。
接下来,我们将在每个Droplet上配置MySQL集群管理器。
步骤2 - 配置和启动Cluster Manager
在这一步中,我们将配置MySQL集群管理器(manager.mysql.cluster
)。其正确的配置将确保数据节点之间的正确同步和负载分配。所有命令都应该在Droplet上执行manager.mysql.cluster
。
集群管理器是必须在任何集群中启动的第一个组件。它需要一个配置文件作为参数传递给它的二进制文件。为方便起见,我们将使用该文件/var/lib/mysql-cluster/config.ini
进行配置。
在manager.mysql.cluster
Droplet上,首先创建此文件所在的目录(/var/lib/mysql-cluster
):
$ sudo mkdir /var/lib/mysql-cluster
然后创建一个文件并开始用nano编辑它:
$ sudo nano /var/lib/mysql-cluster/config.ini
该文件应包含以下代码: /var/lib/mysql-cluster/config.ini
[ndb_mgmd] # Management process options: hostname=manager.mysql.cluster # Hostname of the manager datadir=/var/lib/mysql-cluster # Directory for the log files [ndbd] hostname=node1.mysql.cluster # Hostname of the first data node datadir=/usr/local/mysql/data # Remote directory for the data files [ndbd] hostname=node2.mysql.cluster # Hostname of the second data node datadir=/usr/local/mysql/data # Remote directory for the data files [mysqld] # SQL node options: hostname=manager.mysql.cluster # In our case the MySQL server/client is on the same Droplet as the cluster manager
对于上述每个组件,我们定义了一个hostname
参数。这是一项重要的安全措施,因为只允许指定的主机名连接到管理器并按照其指定的角色参与集群。
此外,hostname
参数指定服务将在哪个接口上运行。这很重要,对安全性很重要,因为在我们的例子中,上面的主机名指向我们在/etc/hosts
文件中指定的私有IP 。因此,您无法从专用网络外部访问任何上述服务。
在上面的文件中,您可以通过以完全相同的方式定义其他实例来添加更多冗余组件,例如数据节点(ndbd)或MySQL服务器(mysqld)。
现在,您可以通过执行ndb_mgmd
二进制文件并使用如下-f
参数指定配置文件来首次启动管理器:
$ sudo /opt/mysql/server-5.6/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
您应该看到类似于此的成功启动消息:
Output of ndb_mgmd MySQL Cluster Management Server mysql-5.6.29 ndb-7.4.11
您可能希望自动启动管理服务与服务器。GA集群版本没有合适的启动脚本,但有一些在线可用。首先,您只需将start命令添加到/etc/rc.local
文件中,服务将在引导期间自动启动。首先,您必须确保/etc/rc.local
在服务器启动期间执行该操作。在Ubuntu 16.04中,这需要运行一个额外的命令:
$ sudo systemctl enable rc-local.service
然后打开文件/etc/rc.local
进行编辑:
$ sudo nano /etc/rc.local
exit
在行之前添加start命令,如下所示:在/etc/rc.local
... /opt/mysql/server-5.6/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini exit 0
保存并退出该文件。
集群管理器不必一直运行。它可以在没有群集停机的情况下启动,停止和重新启动。仅在群集节点和MySQL服务器/客户端的初始启动期间才需要它。
第3步 - 配置和启动数据节点
接下来,我们将配置数据节点(node1.mysql.cluster
和node2.mysql.cluster
)以存储数据文件并正确支持NDB引擎。应在两个节点上执行所有命令。您可以先启动node1.mysql.cluster
,然后重复完全相同的步骤node2.mysql.cluster
。
数据节点从标准MySQL配置文件中读取配置/etc/my.cnf
,更具体地说是在行之后的部分[mysql_cluster]
。使用nano创建此文件并开始编辑它:
$ sudo nano /etc/my.cnf
像这样指定管理器的主机名:/etc/my.cnf中
[mysql_cluster] ndb-connectstring=manager.mysql.cluster
保存并退出该文件。
指定管理器的位置是节点引擎启动所需的唯一配置。其余配置将直接从经理处获取。在我们的示例中,数据节点将发现其数据目录是/usr/local/mysql/data
根据管理器的配置。必须在节点上创建此目录。您可以使用以下命令执行此操作:
$ sudo mkdir -p /usr/local/mysql/data
之后,您可以使用以下命令首次启动数据节点:
$ sudo /opt/mysql/server-5.6/bin/ndbd
成功启动后,您应该看到类似的输出:
Output of ndbd
2016-05-11 16:12:23 [ndbd] INFO -- Angel connected to 'manager.mysql.cluster:1186' 2016-05-11 16:12:23 [ndbd] INFO -- Angel allocated nodeid: 2
您应该自动启动服务器的ndbd服务。GA集群版本没有为此提供合适的启动脚本。就像我们为集群管理器所做的那样,让我们将启动命令添加到/etc/rc.local
文件中。同样,您必须确保/etc/rc.local
在服务器启动期间使用以下命令执行:
$ sudo systemctl enable rc-local.service
然后打开文件/etc/rc.local
进行编辑:
$ sudo nano /etc/rc.local
exit
在行之前添加start命令,如下所示:
在/etc/rc.local
... /opt/mysql/server-5.6/bin/ndbd exit 0
保存并退出该文件。
完成第一个节点后,在另一个节点上重复完全相同的步骤,这node2.mysql.cluster
在我们的示例中。
第4步 - 配置和启动MySQL服务器和客户端
标准的MySQL服务器,例如Ubuntu的默认apt存储库中提供的服务器,不支持MySQL集群引擎NDB。这就是您需要自定义MySQL服务器安装的原因。我们已经在三个Droplet上安装的集群包也带有一个MySQL服务器和一个客户端。如前所述,我们将在管理节点(manager.mysql.cluster
)上使用MySQL服务器和客户端。
配置再次存储为默认/etc/my.cnf
文件。在manager.mysql.cluster
,打开配置文件:
$ sudo nano /etc/my.cnf
然后添加以下内容:
/etc/my.cnf中
[mysqld] ndbcluster # run NDB storage engine ...
保存并退出该文件。
根据最佳实践,MySQL服务器应该在其自己的user(mysql
)下运行,该user()属于它自己的组(再次mysql
)。那么让我们先创建一个组:
$ sudo groupadd mysql
然后创建mysql
属于该组的用户,并通过将其shell路径设置为这样来确保它不能使用shell /bin/false
:
$ sudo useradd -r -g mysql -s /bin/false mysql
自定义MySQL服务器安装的最后一个要求是创建默认数据库。您可以使用以下命令执行此操作:
$ sudo /opt/mysql/server-5.6/scripts/mysql_install_db --user=mysql
为了启动MySQL服务器,我们将使用启动脚本/opt/mysql/server-5.6/support-files/mysql.server
。将其复制到默认的init脚本目录下,名称mysqld
如下:
$ sudo cp /opt/mysql/server-5.6/support-files/mysql.server /etc/init.d/mysqld
启用启动脚本并使用以下命令将其添加到默认运行级别:
$ sudo systemctl enable mysqld.service
现在我们可以使用以下命令首次手动启动MySQL服务器:
$ sudo systemctl start mysqld
作为MySQL客户端,我们将再次使用集群安装附带的自定义二进制文件。它有以下路径:/opt/mysql/server-5.6/bin/mysql
。为方便起见,我们在默认/usr/bin
路径中创建一个符号链接:
$ sudo ln -s /opt/mysql/server-5.6/bin/mysql /usr/bin/
现在,只需键入以下内容即可从命令行启动客户端mysql
:
$ mysql
您应该看到类似于的输出:
Output of ndb_mgmd
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.6.29-ndb-7.4.11-cluster-gpl MySQL Cluster Community Server (GPL)
要退出MySQL提示,只需键入quit
或同时按下即可CTRL-D
。
以上是第一次检查,表明MySQL集群,服务器和客户端正在运行。接下来,我们将进行更详细的测试以确认群集正常运行。
测试群集
此时,我们的简单MySQL集群应该是一个客户端,一个服务器,一个管理器和两个数据节点。从集群管理器Droplet(manager.mysql.cluster
)使用以下命令打开管理控制台:
$ sudo /opt/mysql/server-5.6/bin/ndb_mgm
现在,提示应更改为群集管理控制台。它看起来像这样:
Inside the ndb_mgm console
-- NDB Cluster -- Management Client -- ndb_mgm>
进入控制台后,执行如下命令SHOW
:
SHOW
您应该看到与此类似的输出:
Output of ndb_mgm
Connected to Management Server at: manager.mysql.cluster:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @10.135.27.42 (mysql-5.6.29 ndb-7.4.11, Nodegroup: 0, *) id=3 @10.135.27.43 (mysql-5.6.29 ndb-7.4.11, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @10.135.27.51 (mysql-5.6.29 ndb-7.4.11) [mysqld(API)] 1 node(s) id=4 @10.135.27.51 (mysql-5.6.29 ndb-7.4.11)
上面显示有两个数据节点带有ID 2和3.它们是活动的并且是连接的。还有一个ID为1的管理节点和一个ID为4的MySQL服务器。您可以通过以下命令键入其编号来查找有关每个ID的更多信息STATUS
:
2 STATUS
上面的命令将显示节点2及其MySQL和NDB版本的状态:
Output of ndb_mgm
Node 2: started (mysql-5.6.29 ndb-7.4.11)
退出管理控制台类型quit
。
管理控制台功能非常强大,为管理群集及其数据提供了许多其他选项,包括创建在线备份。有关更多信息,请查看官方文档。
现在让我们对MySQL客户端进行测试。从同一个Droplet中,使用mysql
MySQL root用户的命令启动客户端。请记住,我们之前已经创建了一个符号链接。
mysql -u root
\您的控制台将更改为MySQL客户端控制台。进入MySQL客户端后,运行命令:
SHOW ENGINE NDB STATUS \G
现在,您应该从连接详细信息开始,查看有关NDB集群引擎的所有信息:
Output of mysql
*************************** 1. row *************************** Type: ndbcluster Name: connection Status: cluster_node_id=4, connected_host=manager.mysql.cluster, connected_port=1186, number_of_data_nodes=2, number_of_ready_data_nodes=2, connect_count=0 ...
上面最重要的信息是就绪节点的数量 - 2.这种冗余将允许您的MySQL集群继续运行,即使其中一个数据节点发生故障。同时,您的SQL查询将负载平衡到两个节点。
您可以尝试关闭其中一个数据节点以测试群集稳定性。最简单的方法就是重新启动整个Droplet,以便对恢复过程进行全面测试。重新启动节点时,您将看到number_of_ready_data_nodes
更改的值1
并2
再次返回。
使用NDB引擎
要了解集群是如何工作的,让我们使用NDB引擎创建一个新表并将一些数据插入其中。请注意,要使用群集功能,引擎必须是NDB。如果使用InnoDB(默认)或NDB以外的任何其他引擎,则不会使用群集。
首先,让我们创建一个cluster
使用以下命令调用的数据库:
CREATE DATABASE cluster;
接下来,切换到新数据库:
USE cluster;
现在,创建一个名为cluster_test
这样的简单表:
CREATE TABLE cluster_test (name VARCHAR(20), value VARCHAR(20)) ENGINE=ndbcluster;
我们在引擎上面明确指定了ndbcluster
以便使用集群。接下来,我们可以开始使用如下查询插入数据:
INSERT INTO cluster_test (name,value) VALUES('some_name','some_value');
要验证是否已插入数据,请运行如下所示的选择查询:
SELECT * FROM cluster_test;
当您插入并选择这样的数据时,您将在所有可用数据节点之间对查询进行负载平衡,在我们的示例中这两个节点是两个。通过这种扩展,您可以在稳定性和性能方面获益。
结论
正如我们在本文中看到的,设置MySQL集群可以简单易行。当然,在将集群引入生产环境之前,还有许多更高级的选项和功能值得掌握。一如既往,确保有足够的测试过程,因为以后可能很难解决一些问题。有关更多信息和进一步阅读,请转到MySQL集群的官方文档。