如何在Ubuntu16.04上使用MySQL5.6配置Galera集群
介绍
集群通过将更改分布在不同的服务器上,为您的数据库增加了高可用性。 如果其中一个实例失败,其他实例已经可以继续服务。
集群有两种通用配置,主动-被动和主动-主动。 在主动-被动集群中,所有写入都在单个主动服务器上完成,然后复制到一个或多个被动服务器,这些被动服务器准备仅在主动服务器发生故障时接管。 一些主动-被动集群还允许在被动节点上进行 SELECT
操作。 在主动-主动集群中,每个节点都是可读写的,对一个节点所做的更改会复制到所有节点。
在本指南中,我们将配置一个双活 MySQL Galera 集群。 出于演示目的,我们将配置和测试三个节点,即最小的可配置集群。
先决条件
接下来,您将需要三台 Ubuntu 16.04 服务器,每台服务器:
- 至少 1GB 的 RAM。 为您的数据集提供足够的内存是必不可少的 ,以防止性能下降和崩溃 。 集群的内存使用很难预测,所以一定要留出足够的空间。
- 具有 sudo 权限的非 root 用户。 这可以按照我们的 Initial Server Setup with Ubuntu 16.04 指南进行配置。
- 启用了简单的防火墙。 按照我们的 Initial Server Setup with Ubuntu 16.04 指南的最后一步,使用
ufw
进行配置。 - 私有网络,如果你可以使用的话。 按照我们关于 如何设置和使用 DigitalOcean 专用网络 的指南进行配置。
一旦所有这些先决条件都到位,我们就可以安装软件了。
第 1 步 — 将 Galera 存储库添加到所有服务器
MySQL 已修补以包含 Galera 集群,不包含在默认的 Ubuntu 存储库中,因此我们将首先将 Galera 项目维护的外部 Ubuntu 存储库添加到我们的所有三台服务器。
注意: Codership 是 Galera Cluster 背后的公司,维护着这个存储库,但请注意,并非所有外部存储库都是可靠的。 请务必仅从受信任的来源安装。
在每台服务器上,使用 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 包管理器:
/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 集群所需的软件补丁版本。 为此,请在 /etc/apt/preferences.d/
目录中创建另一个名为 galera.pref
的新文件:
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
在所有三台服务器上运行以下命令来安装一个修补了与 Galera 一起使用的 MySQL 版本,以及 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 Cluster Configuration”部分定义集群,通过IP地址或可解析的域名识别集群成员,并为集群创建名称以确保成员加入正确的组。 您可以将
wsrep_cluster_name
更改为比test_cluster
更有意义的内容或保持原样,但您 必须 使用您三个的地址更新wsrep_cluster_address
服务器。 如果您的服务器有私有 IP 地址,请在此处使用它们。 - “Galera 同步配置”部分 定义了集群如何在成员之间进行通信和同步数据。 这仅用于节点上线时发生的状态传输。 对于我们的初始设置,我们使用
rsync
,因为它通常可用并且可以满足我们现在的需要。 - “Galera Node Configuration”部分明确了当前服务器的IP地址和名称。 这在尝试诊断日志中的问题以及以多种方式引用每个服务器时很有帮助。
wsrep_node_address
必须与您所在机器的地址匹配,但您可以选择任何您想要的名称,以帮助您识别日志文件中的节点。
当您对集群配置文件感到满意时,将内容复制到剪贴板,然后保存并关闭文件。
现在第一台服务器已经配置好了,我们将继续接下来的两个节点。
第 4 步 — 配置剩余节点
在剩余的每个节点上,打开配置文件:
sudo nano /etc/mysql/conf.d/galera.cnf
粘贴您从第一个节点复制的配置,然后更新“Galera 节点配置”以使用您正在设置的特定节点的 IP 地址或可解析域名。 最后,更新其名称,您可以将其设置为任何有助于您在日志文件中识别节点的名称:
/etc/mysql/conf.d/galera.cnf
. . . # Galera Node Configuration wsrep_node_address="this_node_ip" wsrep_node_name="this_node_name" . . .
保存并退出每个服务器上的文件。
我们几乎已准备好启动集群,但在此之前,我们需要确保适当的端口已打开。
第 5 步 — 在每台服务器上打开防火墙
在每台服务器上,让我们检查防火墙的状态:
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
注意: 根据您的服务器上运行的其他内容,您可能希望立即限制访问。 UFW Essentials: Common Firewall Rules and Commands 指南可以帮助解决这个问题。
第 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 加密。