作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
Clustering 通过将更改分发到不同的服务器来增加数据库的高可用性. 如果其中一个实例失败,其他实例可以快速继续提供服务。
集群分为两种一般配置, active-passive 和 active-active. 在活跃-passive 集群中,所有写作都是在一个活跃的服务器上完成的,然后被复制到一个或多个被动的服务器上,这些服务器只有在活跃的服务器故障的情况下才能接管。
[MariaDB] (https://mariadb.org/)是一个开源关系数据库系统,与受欢迎的MySQL RDBMS系统完全兼容. 您可以在此page阅读MariaDB的官方文档. [Galera] (http://galeracluster.com/)是一个数据库集群解决方案,可以使您使用同步复制设置多主集群. Galera 自动处理将不同节点上的数据保持同步,同时允许您向集群中的任何节点发送读取和写入查询. 您可以在官方[documentation page] (http://galeracluster.com/library/documentation/)上了解更多关于加勒拉的信息.
在本指南中,您将配置一个活跃的MariaDB Galera群集。为了演示目的,您将配置和测试三个Ubuntu 18.04 Droplets,这些将作为群集中的节点。
前提条件
要跟进,你需要一个 DigitalOcean帐户,除了以下内容:
- 三个Ubuntu 18.04 Droplets与私人网络启用,每个具有
sudo
特权的非根用户 - 要在三个 Droplets上设置私人网络,请遵循我们的 私人网络快速启动指南 - 要帮助设置具有sudo
特权的非根用户,请遵循我们的 [Ubuntu 18.04的初始服务器设置]教程。
虽然本教程中的步骤是针对DigitalOcean Droplets编写和测试的,但其中许多步骤也适用于非DigitalOcean服务器,允许私人网络。
步骤 1 — 将 MariaDB 存储库添加到所有服务器
在此步骤中,您将为您的三台服务器添加相应的MariaDB包库,以便您能够安装本教程中使用的MariaDB的正确版本。
关于MariaDB的一点值得注意的是,它起源于MySQL的 drop-in替代品,所以在许多配置文件和启动脚本中,你会看到mysql
而不是mariadb
。
在本教程中,您将使用 MariaDB 版本 10.4。由于此版本不包括在默认的 Ubuntu 存储库中,您将通过将 MariaDB 项目维护的外部 Ubuntu 存储库添加到您的三个服务器开始。
<$>[注] 注: MariaDB 是一个受人尊敬的提供商,但并非所有外部存储库都是可靠的。
首先,您将使用apt-key
命令添加 MariaDB 存储密钥,该命令将被 APT 包管理器用来验证该包是否真实:
1sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
一旦您在数据库中有信任密钥,您可以使用以下命令添加存储库:
1sudo add-apt-repository 'deb [arch=amd64] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.4/ubuntu bionic main'
添加仓库后,运行apt update
以包括来自新仓库的包 manifests:
1sudo apt update
在您的第一个服务器上完成此步骤后,重复您的第二和第三服务器。
现在,您已经成功地在您的三台服务器上添加了包存储库,您已经准备好在下一节安装 MariaDB。
第2步:在所有服务器上安装MariaDB
在此步骤中,您将在您的三台服务器上安装实际的 MariaDB 包。
從「10.1」版本開始,MariaDB Server 和 MariaDB Galera Server 包組合在一起,因此安裝「mariadb-server」會自動安裝 Galera 和幾個依賴:
1sudo apt install mariadb-server
您将被要求确认是否想继续安装. 输入是
以继续安装。
从 MariaDB 版本 10.4
开始, root MariaDB 用户默认没有密码. 要为 ** root** 用户设置密码,请通过登录 MariaDB 开始:
1sudo mysql -uroot
一旦您在 MariaDB 壳中,请通过执行以下语句来更改密码:
1set password = password("your_password");
您将看到以下输出,表示密码设置正确:
1[secondary_label Output]
2Query OK, 0 rows affected (0.001 sec)
通过运行以下命令离开 MariaDB 壳:
1quit;
如果您想了解更多关于 SQL 的信息或需要快速更新,请查看我们的 MySQL 教程。
您现在拥有开始配置集群所需的所有部件,但由于您将在以后的步骤中依赖rsync
,请确保它已安装:
1sudo apt install rsync
这将确认rsync
的最新版本已经可用,或者提示您升级或安装它。
安裝 MariaDB 並在您的第一個伺服器上設定根密碼後,對其他兩個伺服器重複這些步驟。
现在,您已经在三个服务器中成功安装了 MariaDB,您可以继续下一节的配置步骤。
步骤 3 – 配置第一个节点
在此步骤中,您将配置您的第一个节点. 群集中的每个节点需要有一个几乎相同的配置. 由于此,您将在第一个机器上完成所有配置,然后将其复制到其他节点。
默认情况下,MariaDB 配置为检查 /etc/mysql/conf.d
目录以获取从 .cnf
结束的文件中获得额外的配置设置。
1sudo nano /etc/mysql/conf.d/galera.cnf
将下列配置添加到文件中. 配置指定了不同的集群选项、当前服务器和集群中的其他服务器的详细信息以及与复制相关的设置。
1[label /etc/mysql/conf.d/galera.cnf]
2[mysqld]
3binlog_format=ROW
4default-storage-engine=innodb
5innodb_autoinc_lock_mode=2
6bind-address=0.0.0.0
7
8# Galera Provider Configuration
9wsrep_on=ON
10wsrep_provider=/usr/lib/galera/libgalera_smm.so
11
12# Galera Cluster Configuration
13wsrep_cluster_name="test_cluster"
14wsrep_cluster_address="gcomm://First_Node_IP,Second_Node_IP,Third_Node_IP"
15
16# Galera Synchronization Configuration
17wsrep_sst_method=rsync
18
19# Galera Node Configuration
20wsrep_node_address="This_Node_IP"
21wsrep_node_name="This_Node_Name"
- 联合国 ** 第一节** 修改或重新加载 MariaDB/MySQL 设置,使集群能够正确运行。 例如,Galera不会与MyISAM或类似的非交易存储引擎合作,而
Mysqld ' 不得与
localhost'的IP地址相接。 您可以在 Galera 集群 [系统配置页] (http://galeracluster.com/documentation-webpages/configuration.html) 上更详细地了解设置. - "Galera Provider配置"部分 配置提供了WriteSet复制API的MariaDB组件. 这意味着 Galera 在您的情况下, 因为 Galera 是 _ wsrep_ (WriteSet Review) 提供者 。 您指定配置初始复制环境的一般参数 。 这不需要任何定制,但你可以更多地了解Galera配置选项.
- "加莱拉集群配置"部分 定义了集群,通过IP地址或可解域名来识别集群成员,并创建集群名称,以确保成员加入正确的集群. 您可以将
wsrep_ cluster_name
修改为比test_ cluster
更有意义的内容, 或将其保留在原地, 但您必须更新wsrep_ cluster_address
, 使用您三个服务器的私人IP地址 。 - "Galera Syncronization Control"部分 定义了集群将如何在成员之间沟通并同步数据. 这只用于一个节点上线时发生的状态传输. 对于你的初始设置,你使用"rsync",因为它是常用的,并且做你现在需要做的.
- "加来拉节点配置"部分 澄清了IP地址和当前服务器的名称. 这在试图诊断日志中的问题和以多种方式引用每个服务器时很有帮助. `wsrep_node_address' 必须与您开着的机器的地址相匹配, 但您可以选择您想要的任何名称, 以便帮助您识别日志文件中的节点 。 .
当您对集群配置文件满意时,请将内容复制到剪辑板中,保存并关闭该文件. 使用纳米文本编辑器,您可以通过按CTRL+X
,键入y
,然后按ENTER
来完成此操作。
现在您已经成功配置了第一个节点,您可以继续在下一节中配置剩余的节点。
步骤 4 – 配置剩余节点
在此步骤中,您将配置剩余的两个节点. 在您的第二个节点上,打开配置文件:
1[environment second]
2sudo nano /etc/mysql/conf.d/galera.cnf
粘贴您从第一个节点复制的配置,然后更新Galera Node Configuration
,以使用您正在设置的特定节点的IP地址或可解除的域名。
1[label /etc/mysql/conf.d/galera.cnf]
2. . .
3# Galera Node Configuration
4wsrep_node_address="This_Node_IP"
5wsrep_node_name="This_Node_Name"
6. . .
保存和退出文件。
完成这些步骤后,在第三节点重复它们。
您几乎准备好将群集带上,但在您做之前,请确保您的防火墙中有相应的端口。
第5步:在每个服务器上打开防火墙
在此步骤中,您将配置您的防火墙,以便为节点间通信所需的端口打开。
1sudo ufw status
在这种情况下,只有通过SSH才允许:
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
6OpenSSH ALLOW Anywhere
7OpenSSH (v6) ALLOW Anywhere (v6)
由于在这种情况下仅允许 SSH 流量,您将需要为 MySQL 和 Galera 流量添加规则. 如果您试图启动集群,则会因为防火墙规则而失败。
Galera可以使用四个端口:
3306
对于使用mysqldump
方法的 MySQL 客户端连接和 State Snapshot 传输。 *4567
对于 Galera 集群复制流量。
在此示例中,当您完成设置时,您将打开所有四个端口.一旦确认复制工作,您希望关闭您实际上不使用的任何端口,并限制流量仅限于集群中的服务器。
使用以下命令打开端口:
1sudo ufw allow 3306,4567,4568,4444/tcp
2sudo ufw allow 4567/udp
<$>[注] 注: 根据您的服务器上正在运行的其他内容,您可能希望立即限制访问。
在第一个节点上配置防火墙后,在第二个和第三个节点上创建相同的防火墙设置。
现在你已经成功配置了防火墙,你准备在下一步启动集群。
步骤6 - 启动集群
在此步骤中,您将启动您的 MariaDB 集群. 首先,您需要停止运行 MariaDB 服务,以便您可以将集群带到网上。
在所有三個伺服器上停止 MariaDB
在所有三台服务器上使用以下命令来阻止 MariaDB,以便您可以将其备份到一个集群中:
1sudo systemctl stop mysql
「systemctl」不會顯示所有服務管理指令的結果,所以要確定您成功,請使用下列指令:
1sudo systemctl status mysql
如果最后一行看起来如下,则命令成功:
1[secondary_label Output]
2. . .
3Apr 26 03:34:23 galera-node-01 systemd[1]: Stopped MariaDB 10.4.4 database server.
一旦你关闭了所有服务器上的mysql
,你已经准备好继续。
带上第一个节点
要创建第一个节点,你需要使用一个特殊的启动脚本. 您已经配置你的集群的方式,每个节点来在线尝试连接到其 galera.cnf
文件中指定的至少一个节点,以获得其初始状态. 没有使用 galera_new_cluster
脚本,允许 systemd 通过 --wsrep-new-cluster
参数,一个正常的 systemctl start mysql
会失败,因为没有节点运行第一节点连接。
1sudo galera_new_cluster
此命令不会在成功执行时显示任何输出。当此脚本成功时,节点被注册为集群的一部分,您可以使用以下命令查看:
1mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
您将看到以下输出,表示集群中有一个节点:
1[secondary_label Output]
2+--------------------+-------+
3| Variable_name | Value |
4+--------------------+-------+
5| wsrep_cluster_size | 1 |
6+--------------------+-------+
在剩余的节点上,你可以正常地开始mysql
。他们会搜索在线的集群列表中的任何成员,所以当他们找到一个时,他们会加入集群。
带上第二个节点
现在你可以带来第二个节点. 开始 mysql
:
1[environment second]
2sudo systemctl start mysql
成功執行時不會顯示任何輸出,隨著每個節點上線,您將看到集群大小增加:
1[environment second]
2mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
您将看到以下输出,表示第二个节点已加入集群,总共有两个节点。
1[secondary_label Output]
2[environment second]
3+--------------------+-------+
4| Variable_name | Value |
5+--------------------+-------+
6| wsrep_cluster_size | 2 |
7+--------------------+-------+
带上第三个节点
现在是时候引进第三个节点了. 开始 mysql
:
1[environment third]
2sudo systemctl start mysql
运行以下命令来查找集群大小:
1[environment third]
2mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
您将看到以下输出,这表明第三个节点已加入集群,集群中的总数节点为三。
1[secondary_label Output]
2[environment third]
3+--------------------+-------+
4| Variable_name | Value |
5+--------------------+-------+
6| wsrep_cluster_size | 3 |
7+--------------------+-------+
在此时,整个集群都在在线并成功沟通,接下来,您可以通过测试下一节的复制来确保工作设置。
第7步:测试复制
您已经通过了步骤,以便您的集群可以执行从任何节点复制到任何其他节点,称为活跃复制。
写到第一个节点
下列命令将创建一个名为游戏场所
的数据库和一个名为设备
的数据库内部的表。
1mysql -u root -p -e 'CREATE DATABASE playground;
2CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));
3INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'
在之前的命令中,CREATE DATABASE
声明创建了一个名为Playground
的数据库。CREATE
声明创建了一个名为设备
的表,在Playground
数据库中有一个名为id
的自动增量标识列和其他列。
你现在在你的桌子上有一个值。
在第二节点上阅读和写作
接下来,看看第二个节点来验证复制工作:
1[environment second]
2mysql -u root -p -e 'SELECT * FROM playground.equipment;'
如果复制工作,则您在第一个节点上输入的数据将在第二个节点上可见:
1[secondary_label Output]
2[environment second]
3+----+-------+-------+-------+
4| id | type | quant | color |
5+----+-------+-------+-------+
6| 1 | slide | 2 | blue |
7+----+-------+-------+-------+
从同一个节点,您可以将数据写入集群:
1[environment second]
2mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'
在第三节点上阅读和写作
从第三节点,您可以通过重新查询表来读取所有这些数据:
1[environment third]
2mysql -u root -p -e 'SELECT * FROM playground.equipment;'
您将看到以下输出显示两个行:
1[secondary_label Output]
2[environment third]
3 +----+-------+-------+--------+
4 | id | type | quant | color |
5 +----+-------+-------+--------+
6 | 1 | slide | 2 | blue |
7 | 2 | swing | 10 | yellow |
8 +----+-------+-------+--------+
再次,您可以从此节点中添加另一个值:
1[environment third]
2mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'
在第一个节点上阅读:
回到第一个节点,您可以验证您的数据在任何地方都可用:
1mysql -u root -p -e 'SELECT * FROM playground.equipment;'
您将看到以下输出,该输出表示第一节点上的行可用。
1[secondary_label Output]
2 +----+--------+-------+--------+
3 | id | type | quant | color |
4 +----+--------+-------+--------+
5 | 1 | slide | 2 | blue |
6 | 2 | swing | 10 | yellow |
7 | 3 | seesaw | 3 | green |
8 +----+--------+-------+--------+
您已成功验证,您可以写入所有节点,并正确执行复制。
结论
在此时,您已经配置了运行的三节点的 Galera 测试集群. 如果您计划在生产情况下使用一个 Galera 集群,建议您从不少于五节点开始。
在生产使用之前,您可能想看看一些 其他状态快照传输(sst)代理],如 xtrabackup ,这允许您非常快速地设置新节点,而不会对您的活跃节点造成大干扰。
您也可能对其他集群解决方案(如MySQL集群)感兴趣,在这种情况下,您可以查看我们的教程(How To Create a Multi-Node MySQL Cluster on Ubuntu 18.04)。