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_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 Cluster System Variables。