集群通过不同服务器分发更改来为数据库添加高可用性。如果其中一个实例失败,则其他已可以的实例还能继续服务。
集群有两种常规配置,主动 - 被动(active-passive)和主动 - 主动(active-active)。在主动 - 被动集群中,所有写入都在单个活动服务器上完成,然后复制到一个或多个被动服务器中,这些服务器只有在活动服务器发生故障时才能接管。一些主动 - 被动集群还允许在被动节点上进行SELECT
操作。在主动 - 主动集群中,每个节点都是可读写的,对一个节点的更改将复制到所有节点。
在本教程中,我们将配置一个主动 - 主动MySQL Galera集群。出于演示目的,我们将配置和测试三个节点,即最小的可配置集群。
要完成本教程,你需要三台Ubuntu 16.04服务器,每台服务器都有:
ufw
进行配置。一旦满足所有这些准备条件,我们就可以安装该软件了。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
修补Galera集群中未包含在默认的Ubuntu存储库中的MySQL,因此我们首先将Galera项目维护的外部Ubuntu存储库添加到我们所有的三个服务器中。
注意: Galera Cluster背后的公司Codership维护着这个存储库,但请注意并非所有外部存储库都是可靠的。请务必仅从受信任的来源安装。
在每台服务器上,使用apt-key
命令添加存储库密钥,该命令apt
将用于验证软件包是否可信。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA
一旦我们在每个服务器的数据库中拥有可信密钥,我们就可以添加存储库。要做到这一点,在每台服务器的/etc/apt/sources.list.d/
下创建一个名为galera.list
的新文件:
sudo nano /etc/apt/sources.list.d/galera.list
在文本编辑器中,添加以下行,这些行可供APT包管理器使用适当的存储库:
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集群所需的软件的修补版本。为此,请在/etc/apt/preferences.d/
目录中创建另一个新文件galera.pref
:
sudo nano /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了。
在所有三台服务器上运行以下命令,以安装修补的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,我们就可以开始配置了。
集群中的每个节点都需要具有几乎相同的配置。因此,我们将在第一台机器上执行所有配置,然后将其复制到其他节点。
默认情况下,MySQL配置是检查/etc/mysql/conf.d
目录中以从.cnf
结尾的文件中获取其他配置设置。我们将在此目录中创建一个包含所有特定于集群的指令的文件:
sudo nano /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" // 需要更改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
mysqld
也不能绑定到localhost的IP地址。wsrep_cluster_name
更改为比test_cluster
更有意义的内容或保持原样,但必须使用三台服务器的地址进行更新wsrep_cluster_address
。如果您的服务器具有专用IP地址,请在此处使用它们。rsync
,因为它通常可用并且做我们现在需要的。wsrep_node_address
必须与你在机器的地址相匹配,但你可以选择任何名称以帮助您在日志文件中识别出你想要的节点。如果对群集配置文件感到满意,请将内容复制到剪贴板中,然后保存并关闭该文件。
现在配置了第一台服务器,我们将继续配置剩下的两个节点。
在每个剩余节点上,打开配置文件:
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"
. . .
保存并退出每台服务器上的文件。
我们几乎已经准备好集群,但在我们开始之前,我们需要确保端口是开放的。
在每台服务器上,让我们检查防火墙的状态:
sudo ufw status
在这种情况下,只允许SSH通过:
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
用于所有其他状态快照转移。在我们的示例中,我们将在设置时打开所有四个端口。一旦我们确认复制正常,我们将关闭我们实际上没有使用的任何端口,并限制其在集群中的服务器上通行。
使用以下命令打开端口:
sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp
注意:根据服务器上运行的其他内容,您可能希望立即限制访问。
首先,我们需要停止运行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
如果一切正常,则群集大小应该为3:
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
此时,整个群集应该在线并进行通信。有了它,我们可以测试每个集群节点之间的复制情况。
到目前为止,我们已经完成的步骤,以便我们的集群可以执行从任何节点到任何其他节点的复制,称为主动 - 主动复制。让我们测试复制是否按预期工作。
我们首先在第一个节点上进行数据库更改。以下命令将创建一个名为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加密。
想要了解更多关于配置集群等开源信息教程,请前往腾讯云+社区学习更多知识。
参考文献:《How To Configure a Galera Cluster with MySQL 5.6 on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有