技术教程 · 2019年12月5日 0

如何使用Debian 10设置MariaDB Galera多主同步复制

MariaDB提供两种不同的高可用性(HA)和群集解决方案。第一个是标准的MariaDB主/从复制,可以将其配置为各种拓扑,主要用于负载平衡,HA和备份。第二个是MariaDB Galera,这是一个多主同步群集解决方案。其主要特点如下:

  • 多主机:Galera群集中的所有节点都可以执行读写操作,从而提供了更好的可伸缩性。
  • 节点可以自动加入集群,并在出现故障时被逐出。
  • Galera复制是同步的,这意味着可以保证一个节点上的更改将应用​​于其他节点。从理论上讲,这可确保在节点发生故障时不会丢失任何数据。

本指南将指导您完成在Galera集群中安装MariaDB及其配置。我们将使用三个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守护程序仅在localhost上侦听连接。为了使群集工作,应将其更改为外部可访问的地址。为此,请编辑选项文件/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','WS;

健康的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_LATENCYmin / 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 Cluster System Variables