如何在Debian 9服务器上使用MariaDB配置Galera集群

在本指南中,您将配置一个主动 - 活动的MariaDB Galera集群。出于演示目的,您将配置并测试三个将充当群集中节点的Debian 9 Droplet。 MariaDB是一个开源的关系数据库系统,与流行的MySQL RDBMS系统完全兼容。 Galera是一种数据库集群解决方案,使您可以使用同步复制设置多主集群。

作者选择了自由和开源基金作为Write for DOnations计划的一部分进行捐赠。

介绍

群集通过将更改分发到不同的服务器来为数据库添加高可用性。 如果其中一个实例失败,其他实例可以快速继续提供服务。

集群有两种常规配置, 主动 - 被动主动 - 主动 在主动 - 被动群集中,所有写入都在单个活动服务器上完成,然后复制到一个或多个被动服务器,这些服务器只有在活动服务器发生故障时才能接管。 一些主动 - 被动群集还允许在被动节点上进行SELECT操作。 在主动 - 主动群集中,每个节点都是读写的,对一个节点的更改将复制到所有节点。

MariaDB是一个开源的关系数据库系统,与流行的MySQL RDBMS系统完全兼容。 您可以在此页面上阅读MariaDB的官方文档。 Galera是一种数据库集群解决方案,使您可以使用同步复制设置多主集群。 Galera自动处理保持不同节点上的数据同步,同时允许您向集群中的任何节点发送读写查询。 您可以在官方文档页面上了解有关Galera的更多信息。

在本指南中,您将配置一个主动 - 活动的MariaDB Galera集群。 出于演示目的,您将配置并测试三个将充当群集中节点的Debian 9 Droplet。 这是最小的可配置群集。

先决条件

要继续,除了以下内容之外,您还需要一个DigitalOcean帐户

  • 启用了私有网络的三个Debian 9 Droplet,每个Droplet都有一个具有sudo权限的非root用户。

虽然本教程中的步骤是针对DigitalOcean Droplet编写和测试的,但其中大部分步骤也适用于启用了专用网络的非DigitalOcean服务器。

第1步 - 将MariaDB存储库添加到所有服务器

在此步骤中,您将相关的MariaDB软件包存储库添加到三个服务器中的每个服务器,以便您能够安装本教程中使用的正确版本的MariaDB。 在所有三台服务器上更新存储库后,您就可以安装MariaDB了。

有关MariaDB的一点需要注意的是它起源于MySQL的替代品,所以在许多配置文件和启动脚本中,你会看到mysql而不是mariadb 为了保持一致性,我们将在本指南中使用mysql ,其中任何一个都可以工作。

在本教程中,您将使用MariaDB版本10.4 由于此版本未包含在默认的Debian存储库中,因此您首先要将MariaDB项目维护的外部Debian存储库添加到所有三个服务器中。

要添加存储库,首先需要安装dirmngrsoftware-properties-common软件包。 dirmngr是用于管理存储库证书和密钥的服务器。 software-properties-common是一个允许轻松添加和更新源存储库位置的包。 通过运行安装两个包:

sudo apt install dirmngr software-properties-common

注意: MariaDB是一个备受推崇的提供商,但并非所有外部存储库都是可靠的。 请务必仅从受信任的来源安装。

您将使用apt-key命令添加MariaDB存储库密钥,APT包管理器将使用该命令来验证包是否可信:

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

在数据库中拥有可信密钥后,可以使用以下命令添加存储库:

sudo add-apt-repository 'deb [arch=amd64] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.4/debian stretch main'

添加存储库后,运行apt update以包含新存储库中的包清单:

sudo apt update

在第一台服务器上完成此步骤后,请重复第二台和第三台服务器。

既然您已经在所有三台服务器上成功添加了软件包存储库,那么您已准备好在下一节中安装MariaDB。

第2步 - 在所有服务器上安装MariaDB

在此步骤中,您将在三台服务器上安装实际的MariaDB软件包。

从版本10.1开始,MariaDB Server和MariaDB Galera Server软件包组合在一起,因此安装mariadb-server将自动安装Galera和几个依赖项:

sudo apt install mariadb-server

系统将要求您确认是否要继续安装。 输入yes继续安装。

从MariaDB版本10.4开始,默认情况下 MariaDB用户没有密码。 要为root用户设置密码,请首先登录MariaDB:

sudo mysql -uroot

进入MariaDB shell后,通过执行以下语句更改密码:

set password = password("your_password");

您将看到以下输出,表明密码设置正确:

Query OK, 0 rows affected (0.001 sec)

通过运行以下命令退出MariaDB shell:

quit;

如果您想了解有关SQL的更多信息或需要快速复习,请查看我们的MySQL教程

您现在拥有开始配置群集所需的所有部分,但由于您将在以后的步骤中依赖rsync ,因此请确保已安装:

sudo apt install rsync

这将确认最新版本的rsync已经可用或提示您升级或安装它。

安装MariaDB并在第一台服务器上设置root密码后,请对其他两台服务器重复这些步骤。

现在您已经在三台服务器上的每台服务器上成功安装了MariaDB,您可以继续执行下一节中的配置步骤。

第3步 - 配置第一个节点

在此步骤中,您将配置第一个节点。 群集中的每个节点都需要具有几乎相同的配置。 因此,您将在第一台计算机上执行所有配置,然后将其复制到其他节点。

默认情况下,MariaDB配置为检查/etc/mysql/conf.d目录以从以.cnf结尾的文件中获取其他配置设置。 使用所有特定于集群的指令在此目录中创建一个文件:

sudo nano /etc/mysql/conf.d/galera.cnf

将以下配置添加到文件中。 配置指定不同的群集选项,有关当前服务器和群集中其他服务器的详细信息,以及与复制相关的设置。 请注意,配置中的IP地址是各自服务器的专用地址; 用适当的IP地址替换突出显示的行。

/etc/mysql/conf.d/galera.cnf
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so

# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://First_Node_IP,Second_Node_IP,Third_Node_IP"

# Galera Synchronization Configuration
wsrep_sst_method=rsync

# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
  • 第一部分修改或重新声明将允许群集正常运行的MariaDB / MySQL设置。 例如,Galera不能与MyISAM或类似的非事务性存储引擎一起使用,并且mysqld不能绑定到localhost的IP地址。 您可以在Galera Cluster 系统配置页面上更详细地了解这些设置。
  • “Galera Provider Configuration”部分配置提供WriteSet复制API的MariaDB组件。 这意味着Galera在您的情况下,因为Galera是一个wsrep (WriteSet复制)提供程序。 您可以指定用于配置初始复制环境的常规参数。 这不需要任何自定义,但您可以了解有关Galera配置选项的更多信息。
  • “Galera群集配置”部分定义群集,通过IP地址或可解析的域名标识群集成员,并为群集创建名称以确保成员加入正确的群组。 您可以将wsrep_cluster_name更改为比test_cluster更有意义的test_cluster或保持原样,但必须使用三台服务器的专用IP地址更新wsrep_cluster_address
  • “Galera同步配置”部分定义了集群如何在成员之间进行通信和同步数据。 这仅用于节点联机时发生的状态转移。 对于初始设置,您使用的是rsync ,因为它通常可用并且可以完成您现在需要的操作。
  • “Galera节点配置”部分阐明了IP地址和当前服务器的名称。 在尝试诊断日志中的问题以及以多种方式引用每个服务器时,这很有用。 wsrep_node_address必须与您所在机器的地址匹配,但您可以选择所需的任何名称,以帮助您识别日志文件中的节点。

如果对群集配置文件感到满意,请将内容复制到剪贴板,保存并关闭该文件。 使用nano文本编辑器,您可以通过按CTRL+X ,键入y ,然后按ENTER来完成此操作。

现在您已成功配置了第一个节点,您可以继续在下一节中配置其余节点。

第4步 - 配置剩余节点

在此步骤中,您将配置其余两个节点。 在第二个节点上,打开配置文件:

sudo nano /etc/mysql/conf.d/galera.cnf

粘贴从第一个节点复制的配置,然后更新Galera Node Configuration以使用您正在设置的特定节点的IP地址或可解析的域名。 最后,更新其名称,您可以将其设置为帮助您识别日志文件中的节点的任何内容:

/etc/mysql/conf.d/galera.cnf
. . .
# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
. . .

保存并退出该文件。

完成这些步骤后,在第三个节点上重复这些步骤。

您几乎已准备好启动群集,但在此之前,请确保在防火墙中打开了相应的端口。

第5步 - 在每台服务器上打开防火墙

在此步骤中,您将配置防火墙,以便打开节点间通信所需的端口。 在每台服务器上,运行以下命令检查防火墙的状态:

sudo ufw status

在这种情况下,只允许SSH通过:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

由于在这种情况下只允许SSH流量,因此您需要为MySQL和Galera流量添加规则。 如果您尝试启动群集,则会因防火墙规则而失败。

Galera可以使用四个端口:

  • 3306对于使用mysqldump方法的MySQL客户端连接和状态快照传输。
  • 4567对于Galera Cluster复制流量。 多播复制在此端口上同时使用UDP传输和TCP。
  • 4568增量国家转移。
  • 4444用于所有其他状态快照转移。

在此示例中,您将在进行设置时打开所有四个端口。 确认复制正常后,您需要关闭任何实际未使用的端口,并将流量限制为仅限群集中的服务器。

使用以下命令打开端口:

sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp

注意:根据服务器上运行的其他内容,您可能希望立即限制访问。 UFW Essentials:通用防火墙规则和命令指南可以为此提供帮助。

在第一个节点上配置防火墙后,在第二个和第三个节点上创建相同的防火墙设置。

现在您已成功配置防火墙,您已准备好在下一步中启动集群。

第6步 - 启动群集

在此步骤中,您将启动MariaDB群集。 首先,您需要停止正在运行的MariaDB服务,以便可以使群集联机。

在所有三台服务器上停止MariaDB

在所有三台服务器上使用以下命令来停止MariaDB,以便您可以将它们备份到群集中:

sudo systemctl stop mysql

systemctl不显示所有服务管理命令的结果,因此为确保您成功,请使用以下命令:

sudo systemctl status mysql

如果最后一行看起来如下所示,则命令成功:

. . . 
Apr 26 03:34:23 galera-node-01 systemd[1]: Stopped MariaDB 10.4.4 database server.

一旦你关闭了所有服务器上的mysql ,你就可以继续了。

打开第一个节点

要调出第一个节点,您需要使用特殊的启动脚本。 您配置群集的方式是,每个联机的节点都会尝试连接到其galera.cnf文件中指定的至少一个其他节点以获取其初始状态。 如果不使用允许systemd传递--wsrep-new-cluster参数的galera_new_cluster脚本,则正常的systemctl start mysql会失败,因为没有节点为第一个节点连接而运行。

sudo galera_new_cluster

成功执行时,此命令不会显示任何输出。 当此脚本成功时,该节点将注册为群集的一部分,您可以使用以下命令查看它:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

您将看到以下输出,指示群集中有一个节点:

+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 1     |
+--------------------+-------+

在其余节点上,您可以正常启动mysql 他们将搜索联机的群集列表中的任何成员,因此当他们找到一个时,他们将加入群集。

打开第二个节点

现在您可以调出第二个节点。 启动mysql

sudo systemctl start mysql

成功执行后不会显示任何输出。 随着每个节点联机,您将看到群集大小增加:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

您将看到以下输出,指示第二个节点已加入群集,并且总共有两个节点。

+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 2     |
+--------------------+-------+

打开第三个节点

现在是时候调出第三个节点了。 启动mysql

sudo systemctl start mysql 

运行以下命令以查找群集大小:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

您将看到以下输出,指示第三个节点已加入群集,并且群集中的总节​​点数为3。

+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

此时,整个群集已联机并成功通信。 接下来,您可以通过在下一节中测试复制来确保工作设置。

第7步 - 测试复制

您已经完成了到目前为止的步骤,以便您的群集可以执行从任何节点到任何其他节点的复制,称为主动 - 主动复制。 按照以下步骤测试并查看复制是否按预期工作。

写入第一个节点

您将首先在第一个节点上进行数据库更改。 以下命令将创建一个名为playground的数据库和一个名为equipment数据库内的表。

mysql -u root -p -e 'CREATE DATABASE playground;
CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));
INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'

在上一个命令中, CREATE DATABASE语句创建一个名为playground的数据库。 CREATE语句在playground数据库中创建一个名为equipment的表,该表具有一个名为id和其他列的自动递增标识符列。 定义type列, quant列和color列以分别存储设备的类型,数量和颜色。 INSERT语句插入一个类型为slide ,数量为2和颜色为blue的条目。

您现在在表中有一个值。

在第二节点上读写

接下来,查看第二个节点以验证复制是否正常工作:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'

如果复制正在运行,则您在第一个节点上输入的数据将在第二个节点上显示:

+----+-------+-------+-------+
| id | type  | quant | color |
+----+-------+-------+-------+
|  1 | slide |     2 | blue  |
+----+-------+-------+-------+

从同一节点,您可以将数据写入集群:

mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'

在第三节点上读写

从第三个节点,您可以通过再次查询表来读取所有这些数据:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'

您将看到以下输出显示两行:

   +----+-------+-------+--------+
   | id | type  | quant | color  |
   +----+-------+-------+--------+
   |  1 | slide |     2 | blue   |
   |  2 | swing |    10 | yellow |
   +----+-------+-------+--------+

同样,您可以从此节点添加另一个值:

mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'

在第一个节点上阅读:

回到第一个节点,您可以验证您的数据在任何地方都可用:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'

您将看到以下输出,指示第一个节点上的行可用。

   +----+--------+-------+--------+
   | id | type   | quant | color  |
   +----+--------+-------+--------+
   |  1 | slide  |     2 | blue   |
   |  2 | swing  |    10 | yellow |
   |  3 | seesaw |     3 | green  |
   +----+--------+-------+--------+

您已成功验证可以写入所有节点并且正在正确执行复制。

结论

此时,您已配置了一个有效的三节点Galera测试集群。 如果您计划在生产环境中使用Galera集群,建议您从不少于五个节点开始。

在生产使用之前,您可能需要查看一些其他状态快照传输(sst)代理,例如xtrabackup ,它允许您非常快速地设置新节点,而不会对您的活动节点造成大的中断。 这不会影响实际复制,但在初始化节点时需要考虑。