原作者:梅丽莎安德森 转载翻译:https://www.digitalocean.com/community/tutorials/how-to-configure-a-galera-cluster-with-mysql-5-6-on-ubuntu-16-04
如何在Ubuntu 16.04上使用MySQL 5.6配置Galera集群
介绍
群集通过跨不同服务器分发更改来为数据库添加高可用性。如果其中一个实例失败,则其他实例已可用于继续投放。
集群有两种常规配置,主动 - 被动和主动 - 主动。在主动 - 被动群集中,所有写入都在单个活动服务器上完成,然后复制到一个或多个被动服务器,这些服务器只有在活动服务器发生故障时才能接管。一些主动 - 被动群集还允许SELECT在被动节点上进行操作。在主动 - 主动群集中,每个节点都是读写的,对一个节点的更改将复制到所有节点。
在本指南中,我们将配置一个主动 - 主动MySQL Galera集群。出于演示目的,我们将配置和测试三个节点,即最小的可配置集群。
先决条件
要继续,你需要三台Ubuntu 16.04服务器,每台服务器都有:
- 至少1GB的RAM。为数据集配置足够的内存对于防止性能下降和崩溃至关重要。群集的内存使用很难预测,所以一定要充足。
- 具有
sudo权限的非root用户。这可以通过使用Ubuntu 16.04指南进行初始服务器设置来配置。 - 启用了简单的防火墙。按照我们的初始服务器设置的最后一步,使用Ubuntu 16.04指南进行配置
ufw。 - 私人网络,如果它可供你使用。按照我们的如何设置和使用DigitalOcean专用网络的指南进行配置。
一旦满足所有这些先决条件,我们就可以安装该软件了。
步骤1 - 将Galera存储库添加到所有服务器
修补包含Galera集群的MySQL未包含在默认的Ubuntu存储库中,因此我们首先将Galera项目维护的外部Ubuntu存储库添加到我们所有的三个服务器中。
注意: Galera Cluster背后的公司Codership维护着这个存储库,但请注意并非所有外部存储库都是可靠的。请务必仅从受信任的来源安装。
在每台服务器上,使用apt-key命令添加存储库密钥,该命令apt将用于验证软件包是否可信。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA
一旦我们在每个服务器的数据库中拥有可信密钥,我们就可以添加存储库。要做到这一点,创建一个名为新文件galera.list中的/etc/apt/sources.list.d/每台服务器上:
sudo nano /etc/apt/sources.list.d/galera.list
在文本编辑器中,添加以下行,这些行将使适当的存储库可供APT包管理器使用:/etc/apt/sources.list.d/galera.list
# /etc/apt/sources.list.d/galera.list
deb http://releases.galeracluster.com/mysql-wsrep-5.6/ubuntu xenial main
deb http://releases.galeracluster.com/galera-3/ubuntu xenial main
保存并关闭文件(新闻CTRL + X,Y话ENTER)。
Codership存储库现在可供所有三台服务器使用。但是,您必须指示apt更喜欢Codership的存储库而不是其他存储库,以确保它安装创建Galera集群所需的软件的修补版本。为此,请galera.pref在/etc/apt/preferences.d/目录中创建另一个新文件:
sudo nano /etc/apt/preferences.d/galera.pref
将以下行添加到文本编辑器:/etc/apt/preferences.d/galera.pref
# Prefer Codership repository
Package: *
Pin: origin releases.galeracluster.com
Pin-Priority: 1001
保存并关闭该文件,然后运行sudo apt-get update以包含新存储库中的包清单:
sudo apt-get update
您可能会看到签名警告uses weak digest algorithm (SHA1)。GitHub上存在一个未解决的问题。与此同时,继续进行是可以的。
一旦在所有三台服务器上更新了存储库,我们就可以安装MySQL和Galera了。
第2步 - 在所有服务器上安装MySQL和Galera
在所有三台服务器上运行以下命令,以安装修补的版本的MySQL,以便与Galera以及Galera和几个依赖项一起使用:
sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.6
在安装过程中,系统会要求您为MySQL管理用户设置密码。
我们应该拥有开始配置集群所需的所有部分,但由于我们将rsync在后面的步骤中依赖,所以我们确保它们都安装在所有这三个部分上:
sudo apt-get install rsync
这将确认最新版本rsync已经可用,提示您升级您的版本或安装它。
一旦我们在三台服务器上安装了MySQL,我们就可以开始配置了。
第3步 - 配置第一个节点
集群中的每个节点都需要具有几乎相同的配置。因此,我们将在第一台机器上执行所有配置,然后将其复制到其他节点。
默认情况下,MySQL配置为检查/etc/mysql/conf.d目录以从结尾的文件中获取其他配置设置.cnf。我们将在此目录中创建一个包含所有特定于集群的指令的文件:
sudo nano /etc/mysql/conf.d/galera.cnf
将以下配置添加到文件中。您需要更改以红色突出显示的设置。我们将在下面解释每个部分的含义。
# /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_ip,second_ip,third_ip"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="this_node_ip"
wsrep_node_name="this_node_name"
-
第一部分修改或重新设置允许群集正常运行的MySQL设置。例如,Galera Cluster不能与MyISAM或类似的非事务性存储引擎一起使用,也
mysqld不能绑定到localhost的IP地址。您可以在Galera Cluster 系统配置页面上更详细地了解这些设置。 -
“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必须你在机器的地址相匹配,但你可以选择你,以帮助您识别在日志文件中的节点想要的任何名称。
如果对群集配置文件感到满意,请将内容复制到剪贴板中,然后保存并关闭该文件。
现在配置了第一台服务器,我们将继续前两个节点。
步骤4 - 配置剩余节点
在每个剩余节点上,打开配置文件:
sudo nano /etc/mysql/conf.d/galera.cnf
粘贴从第一个节点复制的配置,然后更新“Galera节点配置”以使用您正在设置的特定节点的IP地址或可解析的域名。最后,更新其名称,您可以将其设置为帮助您识别日志文件中的节点的任何内容:
. . .
# Galera Node Configuration
wsrep_node_address="this_node_ip"
wsrep_node_name="this_node_name"
. . .
保存并退出每台服务器上的文件。
我们几乎准备好调出集群,但在此之前,我们需要确保适当的端口是开放的。
步骤5 - 在每个服务器上打开防火墙
在每台服务器上,让我们检查防火墙的状态:
sudo ufw status
在这种情况下,只允许SSH通过:
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
您可能有其他规则或根本没有防火墙规则。由于在这种情况下只允许SSH流量,因此您需要为MySQL和Galera流量添加规则。
Galera可以使用四个端口:
3306用于MySQL客户端连接和使用mysqldump方法的状态快照传输。4567Galera Cluster用于复制流量,多播复制在此端口上同时使用UDP传输和TCP。4568用于增量状态转移。4444用于所有其他状态快照转移。
在我们的示例中,我们将在设置时打开所有四个端口。一旦我们确认复制正常,我们将关闭我们实际上没有使用的任何端口,并将流量限制在集群中的服务器上。
使用以下命令打开端口:
sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp
注意:根据服务器上运行的其他内容,您可能希望立即限制访问。该UFW要领:通用防火墙规则和命令指南可以帮助这一点。
第6步 - 启动群集
首先,我们需要停止运行MySQL服务,以便我们的集群可以联机。
在所有三台服务器上停止MySQL:
在所有三台服务器上使用以下命令来停止mysql,以便我们可以将它们备份到集群中:
sudo systemctl stop mysql
systemctl 不显示所有服务管理命令的结果,因此为了确保我们成功,请运行以下命令:
sudo systemctl status mysql
如果最后一行看起来如下所示,则命令成功。
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参数传递给我们开始的第一个节点。但是,此时既不会systemd也service不会正确接受--wsrep-new-cluster参数,所以我们需要使用启动脚本启动第一个节点/etc/init.d。完成此操作后,您可以启动其余节点systemctl.
注意:如果您希望将它们全部启动systemd,则在启动另一个节点后,您可以终止初始节点。由于第二个节点可用,因此当您重新启动第一个节点时,sudo systemctl start mysql它将能够加入正在运行的集群
sudo /etc/init.d/mysql start --wsrep-new-cluster
此脚本完成后,该节点将注册为群集的一部分,我们可以使用以下命令查看它:
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"Output+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 1 | +--------------------+-------+
在剩余的节点上,我们可以mysql正常启动。他们将搜索联机的群集列表中的任何成员,因此当他们找到一个时,他们将加入群集。
打开第二个节点:
开始mysql:
sudo systemctl start mysql
随着每个节点上线,我们应该看到我们的簇大小增加:
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"Output+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+
打开第三个节点:
开始mysql:
sudo systemctl start mysql
如果一切正常,则群集大小应设置为三:
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"Output+--------------------+-------+ | 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");'
我们现在在表中有一个值。
在第二个节点上读写:
接下来,我们将查看第二个节点以验证复制是否正常:
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
如果复制正常,我们在第一个节点上输入的数据将在第二个节点上显示:
Output
+----+-------+-------+-------+
| 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;'Output+----+-------+-------+--------+ | 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;'Output+----+--------+-------+--------+ | id | type | quant | color | +----+--------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | | 3 | seesaw | 3 | green | +----+--------+-------+--------+
我们已经测试过,我们可以写入所有节点,并且正在正确执行复制。
结论
此时,您应该配置一个有效的三节点Galera测试集群。如果您计划在生产环境中使用Galera集群,建议您从不少于五个节点开始。
在生产使用之前,您可能需要查看一些其他状态快照传输(sst)代理,例如“xtrabackup”,它允许您非常快速地设置新节点,而不会对您的活动节点造成大的中断。这不会影响实际的复制,但在初始化节点时是一个问题。最后,为了保护数据在服务器之间移动时,您还应该设置SSL加密。

752

被折叠的 条评论
为什么被折叠?



