作者选择了自由和开源基金作为Write for DOnations计划的一部分进行捐赠。
介绍
群集通过将更改分发到不同的服务器来为数据库添加高可用性。 如果其中一个实例失败,其他实例可以快速继续提供服务。
集群有两种常规配置, 主动 – 被动和主动 – 主动 。 在主动 – 被动群集中,所有写入都在单个活动服务器上完成,然后复制到一个或多个被动服务器,这些服务器只有在活动服务器发生故障时才能接管。 一些主动 – 被动群集还允许在被动节点上进行SELECT
操作。 在主动 – 主动群集中,每个节点都是读写的,对一个节点的更改将复制到所有节点。
MariaDB是一个开源的关系数据库系统,与流行的MySQL RDBMS系统完全兼容。 您可以在此页面上阅读MariaDB的官方文档。 Galera是一种数据库集群解决方案,使您可以使用同步复制设置多主集群。 Galera自动处理保持不同节点上的数据同步,同时允许您向集群中的任何节点发送读写查询。 您可以在官方文档页面上了解有关Galera的更多信息。
在本指南中,您将配置一个主动 – 活动的MariaDB Galera集群。 出于演示目的,您将配置并测试三个将充当群集中节点的Debian 9 Droplet。 这是最小的可配置群集。
先决条件
要继续,除了以下内容之外,您还需要一个DigitalOcean帐户 :
- 启用了私有网络的三个Debian 9 Droplet,每个Droplet都有一个具有
sudo
权限的非root用户。- 要在三个Droplet上设置专用网络,请按照我们的专用网络快速入门指南进行操作。
- 有关使用
sudo
权限设置非root用户的帮助,请按照Debian 9教程中的初始服务器设置进行操作 。
虽然本教程中的步骤是针对DigitalOcean Droplet编写和测试的,但其中大部分步骤也适用于启用了专用网络的非DigitalOcean服务器。
第1步 – 将MariaDB存储库添加到所有服务器
在此步骤中,您将相关的MariaDB软件包存储库添加到三个服务器中的每个服务器,以便您能够安装本教程中使用的正确版本的MariaDB。 在所有三台服务器上更新存储库后,您就可以安装MariaDB了。
有关MariaDB的一点需要注意的是它起源于MySQL的替代品,所以在许多配置文件和启动脚本中,你会看到mysql
而不是mariadb
。 为了保持一致性,我们将在本指南中使用mysql
,其中任何一个都可以工作。
在本教程中,您将使用MariaDB版本10.4 。 由于此版本未包含在默认的Debian存储库中,因此您首先要将MariaDB项目维护的外部Debian存储库添加到所有三个服务器中。
要添加存储库,首先需要安装dirmngr
和software-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地址替换突出显示的行。
[mysqld]binlog_format=ROWdefault-storage-engine=innodbinnodb_autoinc_lock_mode=2bind-address=0.0.0.0# Galera Provider Configurationwsrep_on=ONwsrep_provider=/usr/lib/galera/libgalera_smm.so# Galera Cluster Configurationwsrep_cluster_name="test_cluster"wsrep_cluster_address="gcomm://First_Node_IP,Second_Node_IP,Third_Node_IP"# Galera Synchronization Configurationwsrep_sst_method=rsync# Galera Node Configurationwsrep_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地址或可解析的域名。 最后,更新其名称,您可以将其设置为帮助您识别日志文件中的节点的任何内容:
. . .# Galera Node Configurationwsrep_node_address="This_Node_IP"wsrep_node_name="This_Node_Name". . .
保存并退出该文件。
完成这些步骤后,在第三个节点上重复这些步骤。
您几乎已准备好启动群集,但在此之前,请确保在防火墙中打开了相应的端口。
第5步 – 在每台服务器上打开防火墙
在此步骤中,您将配置防火墙,以便打开节点间通信所需的端口。 在每台服务器上,运行以下命令检查防火墙的状态:
sudo ufw status
在这种情况下,只允许SSH通过:
Status: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereOpenSSH (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/tcpsudo 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 ,它允许您非常快速地设置新节点,而不会对您的活动节点造成大的中断。 这不会影响实际复制,但在初始化节点时需要考虑。