如何在 Ubuntu 16.04 上使用 MySQL 5.6 配置 Galera 集群

介绍

Clustering 通过在不同的服务器上分发更改,为您的数据库增加高可用性. 如果其中一个实例失败,其他实例已经可继续提供服务。

集群有两种一般配置,活跃被动和活跃被动。在活跃被动集群中,所有写作都是在一个活跃的服务器上完成的,然后被复制到一个或多个被动的服务器上,这些服务器只有在活跃的服务器故障的情况下才能接管。

在本指南中,我们将配置一个活跃的MySQL Galera集群. 为演示目的,我们将配置和测试三个节点,最小的可配置集群。

前提条件

要做到这一点,你需要三个Ubuntu 16.04服务器,每个服务器具有:

  • ** 内存至少1GB** 。 为数据集提供足够的内存对于[防止性能退化和碰撞]至关重要(http://galeracluster.com/documentation-webpages/configuration.html)。 集群的内存使用难以预测,所以必须允许大量使用.
  • ** 一个具有 " sudo " 特权的非根本用户** 。 这可以通过遵循我们的 [Initial Server setup with Ubuntu 16.04] (https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-16-04) 指南来配置 。
  • ** 启用了一个简单的防火墙** 。 遵循我们[使用Ubuntu 16.04的初始服务器设置(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-16-04)指南的最后一步,用 " ufw " 配置它。 如果有私人网络, 配置此功能时遵循我们的指南 。 .

一旦所有这些前提条件都满足了,我们就可以安装软件了。

步骤 1 — 将 Galera 存储库添加到所有服务器

MySQL 被修补以包括 Galera 集群,不包括在默认的 Ubuntu 存储库中,所以我们将首先将 Galera 项目维护的外部 Ubuntu 存储库添加到我们的三台服务器中。

<$>[注] 注: Codership,Galery Cluster背后的公司,维护此存储库,但请注意,并非所有外部存储库都是可靠的。

在每个服务器上,添加apt-key命令的存储库密钥,而apt将使用它来验证包的真实性。

1sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA

一旦我们在每个服务器的数据库中获得了可信密钥,我们就可以添加存储库,然后在每个服务器上的/etc/apt/sources.list.d/中创建一个名为galera.list的新文件:

1sudo nano /etc/apt/sources.list.d/galera.list

在文本编辑器中,添加以下行,使适当的存储库可供 APT 包管理器使用:

1[label /etc/apt/sources.list.d/galera.list]
2deb http://releases.galeracluster.com/mysql-wsrep-5.6/ubuntu xenial main
3deb http://releases.galeracluster.com/galera-3/ubuntu xenial main

保存并关闭文件(按CTRL + X,Y,然后按ENTER).

Codership 存储库现在可用于您的三台服务器,但重要的是要指示 apt 优先选择 Codership 存储库,以确保它安装了创建 Galera 集群所需的软件的修补版本。

1sudo nano /etc/apt/preferences.d/galera.pref

将以下行添加到文本编辑器中:

1[label /etc/apt/preferences.d/galera.pref]
2# Prefer Codership repository
3Package: *
4Pin: origin releases.galeracluster.com
5Pin-Priority: 1001

保存并关闭该文件,然后运行sudo apt-get update以包括来自新存储库的包宣言:

1sudo apt-get update

您可能会看到一个警告,即签名使用弱消化算法(SHA1)。在GitHub上存在一个开放的问题(https://github.com/codership/mysql-wsrep/issues/272)。

一旦所有三台服务器上都更新了存储库,我们就可以安装MySQL和Galera。

第2步:在所有服务器上安装MySQL和Galera

在所有三個伺服器上執行下列命令,以安裝與 Galera 以及 Galera 和幾個依賴的 MySQL 版本:

1sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.6

在安装过程中,您将被要求为MySQL管理用户设置密码。

我们应该有所有必要的部件来开始配置集群,但由于我们将在以后的步骤中依赖于rsync,让我们确保它安装在所有三个方面:

1sudo apt-get install rsync

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

一旦我们在三台服务器上安装了MySQL,我们就可以开始配置。

步骤 3 – 配置第一个节点

集群中的每个节点都需要有一个几乎相同的配置,因此,我们将在第一台机器上完成所有配置,然后将其复制到其他节点。

默认情况下,MySQL被配置为检查/etc/mysql/conf.d目录以获取从.cnf结束的文件中获得额外的配置设置。

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

将下列配置添加到文件中. 您需要更改红色突出的设置. 我们将在下面解释每个部分的含义。

 1[label /etc/mysql/conf.d/galera.cnf on the first node]
 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_ip,second_ip,third_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"
  • 联合国 ** 第一节** 修改或重置 MySQL 设置,使组能正确运行。 例如,Galera Cluster将不与MyISAM或类似的非交易存储引擎合作,而`mysqld'不得与本地主机的IP地址相接。 您可以在 Galera 集群 [系统配置页] (http://galeracluster.com/documentation-webpages/configuration.html) 上更详细地了解设置.
  • ** Galera 提供者配置 部分 ** 配置 MySQL 组件, 提供一个写集复制 API 。 这意味着Galera在我们的情况下,因为Galera是一个wsrep(write-set复制)提供者. 我们指定了配置初始复制环境的一般参数。 这不需要任何定制,但你可以更多地了解Galera配置选项.
  • "加来拉集群配置"部分 定义了集群,通过IP地址或可解域名来识别集群成员,并创建集群名称,以确保成员加入正确的集群. 您可以将 wsrep_ cluster_name 更改为比 test_ cluster 更有意义的东西, 或者把它留在原地, 但是您必须使用您三个服务器的地址更新 wsrep_ cluster_address 。 如果您的服务器有私人IP地址, 请在这里使用 。
  • "Galera Syncronization Control"部分 定义了集群将如何在成员之间沟通并同步数据. 这只用于一个节点上线时发生的状态传输. 在我们最初的设置中,我们正在使用`rsync',因为它是常用的,并且满足了我们现在的需要。
  • "加来拉节点配置"部分 澄清了IP地址和当前服务器的名称. 这在试图诊断日志中的问题和以多种方式引用每个服务器时很有帮助. `wsrep_node_address' 必须与您开着的机器的地址相匹配, 但您可以选择您想要的任何名称, 以便帮助您识别日志文件中的节点 。 .

当您对集群配置文件满意时,将内容复制到剪辑板,然后保存并关闭文件。

现在第一个服务器已配置,我们将继续到下一个两个节点。

步骤 4 – 配置剩余节点

在每一个剩余节点上,打开配置文件:

1sudo 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 用于 MySQL 客户端连接和使用 mysqldump 方法的 State Snapshot 传输 * 4567' 被 Galera 集群用于复制流量,多重传输在该端口使用 UDP 传输和 TCP. * 4568' 用于增量状态传输. * `4444' 用于所有其他 State Snapshot 传输。

在我们的示例中,当我们完成设置时,我们将打开所有四个端口. 一旦我们确认复制工作,我们将关闭我们实际上不使用的任何端口,并限制流量仅限于集群中的服务器。

使用以下命令打开端口:

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

<$>[注] 注: 根据您的服务器上正在运行的其他内容,您可能希望立即限制访问。

步骤6 - 启动集群

首先,我们需要停止运行MySQL服务,以便我们的集群可以在线。

在所有三个服务器上停止MySQL:

在所有三台服务器上使用下面的命令来阻止 mysql,以便我们可以将其备份到一个集群中:

1sudo systemctl stop mysql

「systemctl」不會顯示所有服務管理指令的結果,所以要確定我們成功,請執行以下命令:

1sudo systemctl status mysql

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

1[secondary_label Output]
2. . .
3Sep 02 22:17:56 galera-02 systemd[1]: Stopped LSB: start and stop MySQL.

一旦我们关闭了所有服务器上的mysql,我们已经准备好继续。

将第一个节点引入:

每一个上线的节点都试图连接到它galera.cnf文件中指定的至少另一个节点, 一个正常的systemctl start mysql将失败,因为第一个节点有节点可以连接,所以我们需要将wsrep-new-cluster参数传递到我们开始的第一个节点。 然而, " 系统化的 " 或 " 服务 " 目前都不会适当接受[-wsrep-new-cluster ' 论点(https://github.com/codership/mysql-wsrep/issues/266),因此我们需要用/etc/init.d'中的启动脚本开始第一个节点。 完成后,可以以'systemctl'启动其余的节点. ,

<$>[注] 注: 如果您更喜欢所有这些都用systemd开始,一旦您有另一个节点,您可以杀死最初的节点. 由于第二个节点可用,当您使用sudo systemctl start mysql重新启动第一个节点时,它将能够加入正在运行的集群 <$>

1sudo /etc/init.d/mysql start --wsrep-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:

1sudo systemctl start mysql

我们应该看到我们的集群大小随着每个节点在线而增加:

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 | 2     |
6+--------------------+-------+

带上第三个节点:

开始Mysql:

1sudo systemctl start mysql

如果一切顺利,则集群大小应设置为三个:

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 | 3     |
6+--------------------+-------+

在此时,整个集群应该在线和通信,这样我们就可以测试集群的每个节点之间的复制。

第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");'

我们现在在我们的桌子上有一个价值。

在第二节点上阅读和写作:

接下来,我们将查看第二节点,以验证复制工作:

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+----+-------+-------+-------+

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

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

在第三节点上阅读和写作:

从第三节点,我们可以通过重新查询数据库来读取所有这些数据:

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  +----+-------+-------+--------+

再一次,我们可以从这个节点中添加另一个值:

1mysql -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)代理)(http://galeracluster.com/documentation-webpages/sst.html)),例如extrabackup,它允许您非常快地设置新节点,而不会对您的活跃节点造成大的中断。

Published At
Categories with 技术
comments powered by Disqus