如何使用 Debian 10 设置 MariaDB Galera 多主同步复制
在此页
- 要求
- 第 1 步:安装 MariaDB
- 第 2 步:配置 MariaDB
- 第 3 步:引导集群
- 第 4 步:测试
- 第 5 步:故障排除提示
- 更多信息
MariaDB 提供两种不同的高可用性 (HA) 和集群解决方案。第一个是标准的 MariaDB 主/从复制,可以在不同的拓扑结构中配置,主要用于负载平衡、HA 和备份目的。第二个是 MariaDB Galera,一个多主机同步集群解决方案。其主要特点如下:
- 多主机:Galera 集群中的所有节点都可以执行读取和写入操作,提供更好的可扩展性。
- 节点可以自动加入集群,并在失败时被逐出。
- Galera 复制是同步的,这意味着一个节点上的更改保证会应用到其他节点上。从理论上讲,这可以确保在节点出现故障时不会丢失任何数据。
本指南将引导您完成 MariaDB 的安装及其在 Galera 集群中的配置。我们将使用三个 Debian 10 节点进行演示,但可以使用任意数量(≥3)的节点。在 Galera 集群中设置两个节点在技术上是可行的,但不提供容错,因为一个故障节点将导致另一个节点停止。
要求
- 三个或更多 Debian 10 实例。
- 访问 root 用户或任何具有 sudo 权限的用户。
- 应该设置 $EDITOR 环境变量。
注意:Galera 集群可以在 WAN 或 LAN 上工作。如果您的节点共享专用网络,请在适用的情况下使用专用 IP 地址。否则,应使用 WAN 地址。
如果使用 sudo 用户,请使用以下命令打开并使用 root shell 来完成此设置的长度:
sudo -s
第 1 步:安装 MariaDB
此步骤应在所有节点上执行。
使用以下命令安装 MariaDB、Galera 库和 Rsync。后者由 Galera 使用。
apt update
apt install -y mariadb-server mariadb-client galera-3 rsync
确保已启用 MariaDB 服务:
systemctl enable mariadb.service
使用 mysql_secure_installation 脚本保护您的 MariaDB 实例:
mysql_secure_installation
回答如下所示的问题,并确保为 MySQL root 用户选择一个强密码。
Enter current password for root (enter for none): Press <Enter>
Set root password? [Y/n] y
New password: your_password
Re-enter new password: your_password
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
第 2 步:配置 MariaDB
此步骤应在所有节点上执行。
停止所有节点上的 MariaDB 服务:
systemctl stop mariadb.service
默认情况下,MariaDB 守护进程只监听本地主机上的连接。为了使集群正常工作,应将其更改为外部可访问的地址。为此,编辑选项文件 /etc/mysql/mariadb.conf.d/50-server.cnf:
$EDITOR /etc/mysql/mariadb.conf.d/50-server.cnf
找到以下行:
bind-address = 127.0.0.1
如果您正在为集群使用专用网络并且您不想将 MariaDB 暴露给其他网络(即 WAN),请为每个节点指定本地 IPv4 地址。否则,使用 0.0.0.0 指示 MariaDB 监听所有接口。例如:
bind-address = 0.0.0.0
保存更改并退出文本编辑器。
我们现在将配置与集群相关的选项。创建一个新的选项文件:
$EDITOR /etc/mysql/mariadb.conf.d/99-cluster.cnf
在文件中输入以下合理的配置,替换 IP 地址。它在所有节点上应该是相同的。
[galera]
wsrep_on = on
wsrep_provider = /lib/galera/libgalera_smm.so
wsrep_cluster_address = gcomm://192.0.2.1,192.0.2.2,192.0.2.3
wsrep_cluster_name = galera_cluster_0
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
innodb_doublewrite = 1
binlog_format = ROW
- wsrep_on=on 启用写入集复制,这是 Galera 使用的基础功能。
- wsrep_provider 指定 galera 库的路径。它由位于 Debian 10 上 /lib/galera/libgalera_smm.so 的 galera-3 软件包提供。
- wsrep_cluster_address 应该至少包含另一个集群成员的地址。建议列出集群的所有成员。不需要特别的顺序。
- wsrep_cluster_name 对于集群来说应该是唯一的,并且在同一个 galera 集群的所有节点上应该是相同的。
- 其余选项是 Galera 正常工作所必需的,不应更改。
第 3 步:引导集群
在继续之前确保所有节点上的 MariaDB 已停止/处于非活动状态:
systemctl status mariadb.service
要启动集群,首先需要一个节点创建它。在 Debian 10 上,这可以通过 galera_new_cluster 脚本来完成。该脚本应该只在一个节点上执行,并且只执行一次以初始化集群。
galera_new_cluster
这将在当前节点上启动 MariaDB。确保它正在运行:
systemctl status mariadb.service
然后在其他节点上启动 MariaDB:
systemctl start mariadb.service
集群现在应该可以运行了。
第 4 步:测试
为确保集群按预期工作,请选择任何节点并登录到 MariaDB:
mysql -u root -p
发出以下语句以创建数据库:
> CREATE DATABASE test0;
> \q
然后在所有其他节点上检查这个新数据库:
mysql -u root -p -e "SHOW DATABASES;"
上面的命令应该返回一个包含 test0 的列表:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test0 |
+--------------------+
您可能希望通过从每个节点写入集群来进行更彻底的测试。一旦您对测试感到满意,请从集群中清除所有不需要的数据库。可以使用任何节点。
mysql -u root -p -e "DROP DATABASE test0;"
第 5 步:故障排除提示
使用以下查询查看有关节点/集群当前状态的信息:
mysql -u root -p -e "SELECT * FROM information_schema.global_status WHERE variable_name IN ('WSREP_CLUSTER_STATUS','WSREP_LOCAL_STATE_COMMENT','WSREP_CLUSTER_SIZE','WSREP_EVS_REPL_LATENCY','WSREP_EVS_DELAYED','WSREP_READY');"
健康的 3 节点集群应返回以下内容:
+---------------------------+----------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+---------------------------+----------------+
| WSREP_CLUSTER_SIZE | 3 |
| WSREP_CLUSTER_STATUS | Primary |
| WSREP_EVS_DELAYED | |
| WSREP_EVS_REPL_LATENCY | 0/0/0/0/0 |
| WSREP_LOCAL_STATE_COMMENT | Synced |
| WSREP_READY | ON |
+---------------------------+----------------+
- WSREP_CLUSTER_SIZE 表示集群组件中的当前节点数。
- WSREP_CLUSTER_STATUS 表示集群组件的状态,而不是整个集群的状态。
- WSREP_EVS_DELAYED 显示延迟的节点列表。健康集群需要一个空值。
- WSREP_EVS_REPL_LATENCY 以 min/avg/max/stddev/samplesize 格式显示复制延迟。这些值以秒为单位显示。非常高的延迟可能会导致性能下降。
- WSREP_LOCAL_STATE_COMMENT 显示当前节点状态。
- WSREP_READY 表示节点是否可以接受查询。
当 3 节点集群中的一个节点失去连接时,该集群将被划分为一个由 2 个节点组成的主要组件和一个非主要组件。主要组件不受中断影响并继续正常运行。从非主组件的角度来看,上面显示的查询将返回以下内容:
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------+
| WSREP_CLUSTER_SIZE | 1 |
| WSREP_CLUSTER_STATUS | non-Primary |
| WSREP_EVS_DELAYED | 6b7864f2-fe7d-11e9-84ab-93e58c0d2907:tcp://192.0.2.1:4567:3,a421be89-fe7d-11e9-a91e-7e62f7562e58:tcp://192.0.2.3:4567:2 |
| WSREP_EVS_REPL_LATENCY | 0/0/0/0/0 |
| WSREP_LOCAL_STATE_COMMENT | Initialized |
| WSREP_READY | OFF |
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------+
请注意 WSREP_EVS_DELAYED 值,它指示与其他节点的连接问题。
在主要组件节点上,相同的查询返回:
+---------------------------+----------------------------------------------------------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+---------------------------+----------------------------------------------------------------+
| WSREP_CLUSTER_SIZE | 2 |
| WSREP_CLUSTER_STATUS | Primary |
| WSREP_EVS_DELAYED | a2217526-fe7d-11e9-8692-1f2f0cdb403d:tcp://192.0.2.2:4567:2 |
| WSREP_EVS_REPL_LATENCY | 0/0/0/0/0 |
| WSREP_LOCAL_STATE_COMMENT | Synced |
| WSREP_READY | ON |
+---------------------------+----------------------------------------------------------------+
要从单节点故障中恢复,不需要手动干预。当故障节点重新连接到集群时,它会自动与集群同步。
更多信息
有关高级配置选项,请参阅 Galera 集群系统变量。