_ 作者选择了 免费和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
Clustering 通过将更改分发到不同的服务器来增加数据库的高可用性. 如果其中一个实例失败,其他实例可以快速继续提供服务。
集群分为两种一般配置, active-passive 和 active-active. 在活跃-passive 集群中,所有写作都是在一个活跃的服务器上完成的,然后被复制到一个或多个被动的服务器上,这些服务器只有在活跃的服务器故障的情况下才能接管。
[MySQL] (https://www.mysql.com/)是一个开源关系数据库管理系统,是SQL数据库的流行选择. [Galera] (http://galeracluster.com/)是一个数据库集群解决方案,可以使您使用同步复制设置多主集群. Galera 自动处理将不同节点上的数据保持同步,同时允许您向集群中的任何节点发送读取和写入查询. 您可以在官方[documentation page] (http://galeracluster.com/library/documentation/)上了解更多关于加勒拉的信息.
在本指南中,您将配置一个活跃的MySQL Galera群集。为了演示目的,您将配置和测试三个Ubuntu 18.04 Droplets将作为群集中的节点。这个节点数量是最小的可配置群集。
前提条件
要跟上,你需要一个 DigitalOcean帐户,除了以下内容:
- 三个Ubuntu 18.04 已启用私有网络的 Dropplets, 每个都有
sudo
权限的非源用户 。
- 在三个Droplets上建立私人网络,遵循我们的[私人网络快速启动]指南(https://www.digitalocean.com/docs/networking/private-networking/quickstart/)。
- 协助建立一个拥有 " sudo " 权限的非基层用户,请遵循我们的[Ubuntu 18.04的初始服务器设置(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-18-04)教程。 .
虽然本教程中的步骤已为DigitalOcean Droplets编写并测试,但其中许多步骤也适用于非DigitalOcean服务器,允许私人网络。
第1步:将MySQL存储库添加到所有服务器
在此步骤中,您将添加相关的 MySQL 和 Galera 包存储库到您的三台服务器中,以便您能够安装本教程中使用的正确版本的 MySQL 和 Galera。
<$>[注] 注: Codership,Galery Cluster背后的公司,维护了Galery仓库,但请注意,并非所有外部仓库都是可靠的。
在本教程中,您将使用 MySQL 版本 5.7.您将通过将 Galera 项目维护的外部 Ubuntu 存储库添加到您的三台服务器开始。
一旦在所有三台服务器上更新了存储库,您将准备好与Galera一起安装MySQL。
首先,在您的三台服务器上,添加apt-key
命令的 Galera 存储密钥,该命令将被 APT 包管理器用来验证该包是否真实:
1sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA
几秒钟后,您将收到以下输出:
1[secondary_label Output]
2Executing: /tmp/apt-key-gpghome.RG5cTZjQo0/gpg.1.sh --keyserver keyserver.ubuntu.com --recv BC19DDBA
3gpg: key D669017EBC19DDBA: public key "Codership Oy <[email protected]>" imported
4gpg: Total number processed: 1
5gpg: imported: 1
一旦你在每个服务器的数据库中有信任密钥,你可以添加存储库。 要做到这一点,在每个服务器的 /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.7/ubuntu bionic main
3deb http://releases.galeracluster.com/galera-3/ubuntu bionic 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
保存并关闭该文件,然后在每个服务器上运行以下命令,以包括来自新存储库的包宣言:
1sudo apt update
现在,您已经成功地在您的三台服务器上添加了包库,您已经准备好在下一节安装MySQL了。
第2步:在所有服务器上安装MySQL
在此步骤中,您将在您的三台服务器上安装MySQL包。
在所有三個伺服器上執行下列命令,以安裝與 Galera 合作的 MySQL 版本,以及 Galera 套件。
1sudo apt install galera-3 mysql-wsrep-5.7
您将被要求确认是否想继续安装。输入Y
以继续安装。在安装过程中,您还将被要求为MySQL管理用户设置密码。
一旦安装 MySQL,您将禁用默认 AppArmor 配置文件,以确保 Galera 正常工作,根据 官方 Galera 文档。
通过在每个服务器上执行以下操作来禁用 AppArmor:
1sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
此命令将MySQL配置文件的象征链接添加到禁用
目录中,该目录在启动时被禁用。
然后,运行以下命令删除已在内核中加载的MySQL定义。
1sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
安装 MySQL 并在您的第一个服务器上禁用 AppArmor 配置文件后,对其他两个服务器重复这些步骤。
现在,您已在三台服务器上成功安装 MySQL,您可以继续下一节的配置步骤。
步骤 3 – 配置第一个节点
在此步骤中,您将配置您的第一个节点. 群集中的每个节点需要有一个几乎相同的配置. 由于此,您将在第一个机器上完成所有配置,然后将其复制到其他节点。
默认情况下,MySQL被配置为检查/etc/mysql/conf.d
目录,以便从以.cnf
结束的文件中获得额外的配置设置。
1sudo nano /etc/mysql/conf.d/galera.cnf
将下列配置添加到文件中. 配置指定了不同的集群选项、当前服务器和集群中的其他服务器的详细信息以及与复制相关的设置。
1[label /etc/mysql/conf.d/galera.cnf]
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_Node_IP,Second_Node_IP,Third_Node_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不会与MyISAM或类似的非交易存储引擎合作,而
Mysqld ' 不得与
localhost'的IP地址相接。 您可以在 Galera 集群 [系统配置页] (http://galeracluster.com/documentation-webpages/configuration.html) 上更详细地了解设置. - **
Galera 提供者配置
部分 ** 配置提供 WriteSet 复制 API 的 MySQL 组件 。 这意味着 Galera 在您的情况下, 因为 Galera 是 _ wsrep_ (WriteSet Review) 提供者 。 您指定配置初始复制环境的一般参数 。 这不需要任何定制,但你可以更多地了解文档中的Galera配置选项. - "加莱拉集群配置"部分 定义了集群,通过IP地址或可解域名来识别集群成员,并创建集群名称,以确保成员加入正确的集群. 您可以将
wsrep_ cluster_name
修改为比test_ cluster
更有意义的内容, 或将其保留在原地, 但您必须更新wsrep_ cluster_address
, 使用您三个服务器的私人IP地址 。 - ** `加来拉同步配置 ' 部分** 界定了分组如何在成员之间沟通和同步数据。 这只用于一个节点上线时发生的状态传输. 对于您的初始设置, 您正在使用 ['rsync' (https://andsky.com/tech/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps]] , 因为它是常用的, 并做您现在需要的 。
- **
Galera节点配置 ' 部分** 澄清了IP地址和当前服务器的名称。 这在试图诊断日志中的问题和以多种方式引用每个服务器时很有帮助.
wsrep_node_address' 必须与您开着的机器的地址相匹配, 但您可以选择您想要的任何名称, 以便帮助您识别日志文件中的节点 。 .
当您对集群配置文件满意时,将内容复制到剪辑板中,然后保存并关闭文件。
现在您已经成功配置了第一个节点,您可以继续在下一节中配置剩余的节点。
步骤 4 – 配置剩余节点
在此步骤中,您将配置剩余的两个节点. 在您的第二个节点上,打开配置文件:
1[environment second]
2sudo 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
对于使用mysqldump
方法的 MySQL 客户端连接和 State Snapshot 传输。 *4567
对于 Galera 集群复制流量。
在此示例中,当您完成设置时,您将打开所有四个端口.一旦确认复制工作,您希望关闭您实际上不使用的任何端口,并限制流量仅限于集群中的服务器。
使用以下命令打开端口:
1sudo ufw allow 3306,4567,4568,4444/tcp
2sudo ufw allow 4567/udp
<$>[注] 注: 根据您的服务器上正在运行的其他内容,您可能希望立即限制访问。
在第一个节点上配置防火墙后,在第二个和第三个节点上创建相同的防火墙设置。
现在你已经成功配置了防火墙,你准备在下一步启动集群。
步骤6 - 启动集群
在此步骤中,您将启动您的MySQL Galera集群,但首先,您将启用MySQLsystemd
服务,以便MySQL在重新启动服务器时自动启动。
允许MySQL在所有三个服务器上启动
在所有三個伺服器上使用以下命令來啟用 MySQL systemd
服務:
1sudo systemctl enable mysql
您将看到以下输出,显示该服务已成功链接到启动服务列表:
1[secondary_label Output]
2Created symlink /etc/systemd/system/multi-user.target.wants/mysql.service → /lib/systemd/system/mysql.service.
现在你已经启用了mysql
在所有服务器上启动,你已经准备好继续将集群引入。
带上第一个节点
要创建第一个节点,你需要使用一个特殊的启动脚本. 您已经配置了群集的方式,每个连接到线的节点都会尝试连接到其galera.cnf
文件中指定的至少一个节点,以获得其初始状态。
在您的第一个服务器上运行以下操作:
1sudo mysqld_bootstrap
此命令不会在成功执行时显示任何输出。当此脚本成功时,节点被注册为集群的一部分,您可以使用以下命令查看:
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
:
1[environment second]
2sudo systemctl start mysql
成功執行時不會顯示任何輸出,隨著每個節點上線,您將看到集群大小增加:
1[environment second]
2mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
您将看到以下输出,表示第二个节点已加入集群,总共有两个节点。
1[secondary_label Output]
2[environment second]
3+--------------------+-------+
4| Variable_name | Value |
5+--------------------+-------+
6| wsrep_cluster_size | 2 |
7+--------------------+-------+
带上第三个节点
现在是时候引进第三个节点了. 开始 mysql
:
1[environment third]
2sudo systemctl start mysql
运行以下命令来查找集群大小:
1[environment third]
2mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
您将看到以下输出,这表明第三个节点已加入集群,集群中的节点总数为三。
1[secondary_label Output]
2[environment third]
3+--------------------+-------+
4| Variable_name | Value |
5+--------------------+-------+
6| wsrep_cluster_size | 3 |
7+--------------------+-------+
此时,整个集群已在线并成功通信,接下来,您可以通过在下一节中测试复制来确保工作设置。
第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");'
在之前的命令中,CREATE DATABASE
声明创建了一个名为Playground
的数据库。CREATE
声明创建了一个名为设备
的表,在Playground
数据库中有一个名为id
的自动增量标识列和其他列。
你现在在你的桌子上有一个值。
在第二节点上阅读和写作
接下来,看看第二个节点来验证复制工作:
1[environment second]
2mysql -u root -p -e 'SELECT * FROM playground.equipment;'
您在第一个节点上输入的数据将在第二个节点上可见,证明复制工作:
1[secondary_label Output]
2[environment second]
3+----+-------+-------+-------+
4| id | type | quant | color |
5+----+-------+-------+-------+
6| 1 | slide | 2 | blue |
7+----+-------+-------+-------+
从同一个节点,将数据写入集群:
1[environment second]
2mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'
在第三节点上阅读和写作
从第三节点,您可以通过重新查询表来读取所有这些数据:
1[environment third]
2mysql -u root -p -e 'SELECT * FROM playground.equipment;'
您将看到以下输出显示两个行:
1[secondary_label Output]
2[environment third]
3 +----+-------+-------+--------+
4 | id | type | quant | color |
5 +----+-------+-------+--------+
6 | 1 | slide | 2 | blue |
7 | 2 | swing | 10 | yellow |
8 +----+-------+-------+--------+
再次,您可以从此节点中添加另一个值:
1[environment third]
2mysql -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)代理],如 xtrabackup ,这允许您快速地设置新的节点,而无需对活跃节点进行大规模中断。
您也可能对 MySQL 的其他集群解决方案感兴趣,在这种情况下,您可以查看我们的 如何在 Ubuntu 18.04 上创建多节点 MySQL 集群教程。