前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 16.04上使用MySQL 5.6配置Galera集群

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

原创
作者头像
圣人惠好可爱
修改2018-09-21 09:55:56
1K0
修改2018-09-21 09:55:56
举报
文章被收录于专栏:云计算教程系列

介绍

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

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

在本教程中,我们将配置一个主动 - 主动MySQL Galera集群。出于演示目的,我们将配置和测试三个节点,即最小的可配置集群。

准备

要完成本教程,你需要三台Ubuntu 16.04服务器,每台服务器都有:

  • 至少1GB的RAM。为数据集配置足够的内存对于防止性能下降和崩溃至关重要。集群的内存使用很难预测,所以一定要充足。
  • 具有sudo权限的非root用户。这可以通过使用Ubuntu 16.04教程进行初始服务器设置来配置。
  • 启用了简单的防火墙。按照我们的初始服务器设置的最后一步,使用Ubuntu 16.04教程的ufw进行配置。
  • 私人网络

一旦满足所有这些准备条件,我们就可以安装该软件了。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

第一步 - 将Galera存储库添加到所有服务器

修补Galera集群中未包含在默认的Ubuntu存储库中的MySQL,因此我们首先将Galera项目维护的外部Ubuntu存储库添加到我们所有的三个服务器中。

注意: Galera Cluster背后的公司Codership维护着这个存储库,但请注意并非所有外部存储库都是可靠的。请务必仅从受信任的来源安装。

在每台服务器上,使用apt-key命令添加存储库密钥,该命令apt将用于验证软件包是否可信。

代码语言:javascript
复制
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA

一旦我们在每个服务器的数据库中拥有可信密钥,我们就可以添加存储库。要做到这一点,在每台服务器的/etc/apt/sources.list.d/下创建一个名为galera.list的新文件:

代码语言:javascript
复制
sudo nano /etc/apt/sources.list.d/galera.list

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

代码语言:javascript
复制
deb http://releases.galeracluster.com/mysql-wsrep-5.6/ubuntu xenial main
deb http://releases.galeracluster.com/galera-3/ubuntu xenial main

保存并关闭文件(按CTRL + XY,然后按ENTER)。

Codership存储库现在可供所有三台服务器使用。但是,您必须用apt指向更合适的Codership的存储库而不是其他存储库,以确保它安装创建Galera集群所需的软件的修补版本。为此,请在/etc/apt/preferences.d/目录中创建另一个新文件galera.pref

代码语言:javascript
复制
sudo nano /etc/apt/preferences.d/galera.pref

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

代码语言:javascript
复制
# Prefer Codership repository
Package: *
Pin: origin releases.galeracluster.com
Pin-Priority: 1001

保存并关闭该文件,然后运行sudo apt-get update以包含新存储库中的包清单:

代码语言:javascript
复制
sudo apt-get update

您可能会看到uses weak digest algorithm (SHA1)的警告。GitHub上存在一个未解决的问题。与此同时,继续进行是可以的。

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

第二步 - 在所有服务器上安装MySQL和Galera

在所有三台服务器上运行以下命令,以安装修补的MySQL版本,以便与Galera以及Galera和几个依赖项一起使用:

代码语言:javascript
复制
sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.6

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

我们应该拥有开始配置集群所需的所有部分,但由于我们将在后面的步骤中依赖rsync,所以我们确保它们都安装在这三个部分上:

代码语言:javascript
复制
sudo apt-get install rsync

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

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

第三步 - 配置第一个节点

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

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

代码语言:javascript
复制
sudo nano /etc/mysql/conf.d/galera.cnf

将以下配置添加到此文件中。您需要更改的设置我们在代码中注释了。我们将在下面解释每个部分的含义。

代码语言:javascript
复制
[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_ip,second_ip,third_ip" // 需要更改first_ip,second_ip,third_ip
​
# Galera Synchronization Configuration
wsrep_sst_method=rsync
​
# Galera Node Configuration
wsrep_node_address="this_node_ip" // 需要更改this_node_ip
wsrep_node_name="this_node_name" // 需要更改this_node_name
  • 第一部分修改或重新设置允许集群正常运行的MySQL设置。例如,Galera Cluster不能与MyISAM或类似的非事务性存储引擎一起使用,mysqld也不能绑定到localhost的IP地址。
  • “Galera Provider Configuration”部分配置提供写集复制API的MySQL组件。在我们的例子中,这意味着Galera,因为Galera是一个wsrep(写集复制)提供程序。我们指定用于配置初始复制环境的常规参数。这不需要任何自定义,但您可以了解有关Galera配置选项的更多信息。
  • “Galera群集配置”部分定义集群,按IP地址或可解析的域名标识集群成员,并为群集创建名称以确保成员加入正确的群组。您可以将wsrep_cluster_name更改为比test_cluster更有意义的内容或保持原样,但必须使用三台服务器的地址进行更新wsrep_cluster_address。如果您的服务器具有专用IP地址,请在此处使用它们。
  • “Galera同步配置”部分定义了集群如何在成员之间进行通信和同步数据。这仅用于节点联机时发生的状态转移。对于我们的初始设置,我们使用的是rsync,因为它通常可用并且做我们现在需要的。
  • “Galera节点配置”部分阐明了IP地址和当前服务器的名称。在尝试诊断日志中的问题以及以多种方式引用每个服务器时,这很有用。wsrep_node_address必须与你在机器的地址相匹配,但你可以选择任何名称以帮助您在日志文件中识别出你想要的节点。

如果对群集配置文件感到满意,请将内容复制到剪贴板中,然后保存并关闭该文件。

现在配置了第一台服务器,我们将继续配置剩下的两个节点。

第四步 - 配置剩余节点

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

代码语言:javascript
复制
sudo nano /etc/mysql/conf.d/galera.cnf

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

代码语言:javascript
复制
. . .
# Galera Node Configuration
wsrep_node_address="this_node_ip"
wsrep_node_name="this_node_name"
. . .

保存并退出每台服务器上的文件。

我们几乎已经准备好集群,但在我们开始之前,我们需要确保端口是开放的。

第五步 - 在每个服务器上打开防火墙

在每台服务器上,让我们检查防火墙的状态:

代码语言:javascript
复制
sudo ufw status

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

代码语言:javascript
复制
OutputStatus: active
​
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

您可能有其他规则或根本没有防火墙规则。由于在这种情况下只允许SSH通过,因此您需要为MySQL和Galera添加规则。

Galera可以使用四个端口:

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

在我们的示例中,我们将在设置时打开所有四个端口。一旦我们确认复制正常,我们将关闭我们实际上没有使用的任何端口,并限制其在集群中的服务器上通行。

使用以下命令打开端口:

代码语言:javascript
复制
sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp

注意:根据服务器上运行的其他内容,您可能希望立即限制访问。

第6步 - 启动群集

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

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

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

代码语言:javascript
复制
sudo systemctl stop mysql

systemctl 不显示所有服务管理命令的结果,因此为了确保我们成功,请运行以下命令:

代码语言:javascript
复制
sudo systemctl status mysql

如果最后一行类似如下所示,则命令成功。

代码语言:javascript
复制
Output. . .
Sep 02 22:17:56 galera-02 systemd[1]: Stopped LSB: start and stop MySQL.

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

打开第一个节点:

我们配置集群的方式是,每个联机的节点都尝试连接到其galera.cnf文件中指定的至少一个其他节点,以获取其初始状态。正常systemctl start mysql会失败,因为第一个节点没有连接的节点,所以我们需要将wsrep-new-cluster参数传递给我们开始的第一个节点。但是,此时systemdservice都不会正确接受--wsrep-new-cluster参数,所以我们需要使用启动脚本/etc/init.d启动第一个节点。完成此操作后,您可以用systemctl启动其余节点。

注意:如果您希望用systemd将它们全部启动,则一旦启用了另一个节点,就可以终止初始节点。由于第二个节点可用,因此当您用sudo systemctl start mysql重新启动第一个节点时,它将能够加入正在运行的集群

代码语言:javascript
复制
sudo /etc/init.d/mysql start --wsrep-new-cluster

此脚本完成后,该节点将注册为集群的一部分,我们可以使用以下命令查看它:

代码语言:javascript
复制
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 1     |
+--------------------+-------+

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

打开第二个节点:

启动mysql

代码语言:javascript
复制
sudo systemctl start mysql

随着每个节点上线,我们应该看到我们的集群节点的数量在增加:

代码语言:javascript
复制
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 2     |
+--------------------+-------+

打开第三个节点:

启动mysql

代码语言:javascript
复制
sudo systemctl start mysql

如果一切正常,则群集大小应该为3:

代码语言:javascript
复制
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

此时,整个群集应该在线并进行通信。有了它,我们可以测试每个集群节点之间的复制情况。

第7步 - 测试复制

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

写入第一个节点:

我们首先在第一个节点上进行数据库更改。以下命令将创建一个名为playground的数据库,并在其中调用一个表equipment

代码语言:javascript
复制
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");'

我们现在在表中有一个值。

在第二个节点上读写:

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

代码语言:javascript
复制
mysql -u root -p -e 'SELECT * FROM playground.equipment;'

如果复制正常,我们在第一个节点上输入的数据将在第二个节点上显示:

代码语言:javascript
复制
Output+----+-------+-------+-------+
| id | type  | quant | color |
+----+-------+-------+-------+
|  1 | slide |     2 | blue  |
+----+-------+-------+-------+

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

代码语言:javascript
复制
mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'

在第三个节点上读写:

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

代码语言:javascript
复制
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Output  +----+-------+-------+--------+
  | id | type  | quant | color  |
  +----+-------+-------+--------+
  |  1 | slide |     2 | blue   |
  |  2 | swing |    10 | yellow |
  +----+-------+-------+--------+

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

代码语言:javascript
复制
mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'

在第一个节点上阅读:

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

代码语言:javascript
复制
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Output  +----+--------+-------+--------+
  | id | type   | quant | color  |
  +----+--------+-------+--------+
  |  1 | slide  |     2 | blue   |
  |  2 | swing  |    10 | yellow |
  |  3 | seesaw |     3 | green  |
  +----+--------+-------+--------+

我们已经测试完成,可以写入所有节点,并且能正确执行复制。

结论

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

在生产使用之前,您可能需要查看一些其他状态快照传输(sst)代理,例如“xtrabackup”,它允许您非常快速地设置新节点,而不会对您的活动节点造成大的中断。这不会影响实际的复制,但在初始化节点时是一个问题。最后,为了在服务器之间移动时保护数据,您还应该设置SSL加密。

想要了解更多关于配置集群等开源信息教程,请前往腾讯云+社区学习更多知识。

参考文献:《How To Configure a Galera Cluster with MySQL 5.6 on Ubuntu 16.04》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 第一步 - 将Galera存储库添加到所有服务器
  • 第二步 - 在所有服务器上安装MySQL和Galera
  • 第三步 - 配置第一个节点
  • 第四步 - 配置剩余节点
  • 第五步 - 在每个服务器上打开防火墙
  • 第6步 - 启动群集
    • 在所有三台服务器上停止MySQL:
      • 打开第一个节点:
        • 打开第二个节点:
          • 打开第三个节点:
          • 第7步 - 测试复制
            • 写入第一个节点:
              • 在第二个节点上读写:
                • 在第三个节点上读写:
                  • 在第一个节点上阅读:
                  • 结论
                  相关产品与服务
                  云数据库 MySQL
                  腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档