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

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

MariaDB提供两种不同的高可用性(HA)和群集解决方案。一种是标准的MariaDB主/从复制,可以在不同的拓扑中进行配置,主要用于负载平衡,HA和备份。其次是MariaDB Galera,这是一个多主同步集群解决方案。主要功能如下。

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

本指南介绍了Galera群集上MariaDB的安装和配置。可以使用任意数量(≥3个)的节点,但是该演示使用了三个Debian 10节点。从技术上讲,可以在Galera群集中设置两个节点,但是不能提供容错功能,因为发生故障的节点会导致其他节点宕机。

要求条件

  • 3个或更多Debian 10实例。
  • 访问root用户或具有sudo特权的用户。
  • $编辑器 您需要设置环境变量。

注意事项: 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根用户选择一个强密码。

Enter current password for root (enter for none): Press 
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正常运行所必需的,不应更改。

第三步:集群引导

在继续之前,请确保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');"

成功的三节点群集返回:

+---------------------------+----------------+
| 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指示节点是否可以接受查询。

如果三节点群集中的一个节点失去连接,则群集将分为两个节点的主要和非主要组件。主要组件不受故障影响,并继续正常运行。从非主要组件的角度来看,上述查询返回:

+---------------------------+--------------------------------------------------------------------------------------------------------------------------------+
| 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系统变量

Source

Sidebar