如何在 Debian 11 上设置 MariaDB 主-主复制
在此页
- 先决条件
- 设置 fqdn 和 /etc/hosts 文件
- 使用 Chrony 同步时间
- 安装 MariaDB 服务器
- 设置 UFW 防火墙
- 设置 master1 MariaDB 服务器
- 设置 master2 MariaDB 服务器
- 在 master1 MariaDB 服务器上启动主-主复制
- 测试数据库复制
- 结论
本教程将介绍如何在 Debian 11 服务器上设置 MariaDB Master-Master 复制。此外,我们将讨论如何使用 Chrony 在 MariaDB 服务器之间同步时间。
先决条件
要完成本教程,您需要满足以下要求:
- 两台或多台 Debian 11 服务器。该演示使用了两个 Debian 服务器。
- 具有根/管理员权限的非根用户。
设置 fqdn 和 /etc/hosts 文件
要在多个服务器之间设置 MariaDB Master-Master,您需要确保每个系统主机名都解析为正确的 IP 地址。要配置它,您需要在每个服务器上设置 fqdn 和 /etc/hosts 文件。
在此演示中,我们将使用下面的两个 Debian 服务器:
IP Address Hostname FQDN
---------------------------------------------------
192.168.5.10 master1 master1.localdomain.io
192.168.5.11 master2 master2.localdomain.io
要设置正确的 fqdn(完全限定域名),请运行下面的 hostnamectl 命令。
为 \master1\ 服务器设置 fqdn。
sudo hostnamectl set-hostname master1.localdomain.io
为 \master2\ 服务器设置 fqdn。
sudo hostnamectl set-hostname master2.localdomain.io
接下来,使用以下命令编辑每台服务器上的 /etc/hosts 文件。
sudo nano /etc/hosts
将以下配置添加到文件中。
192.168.5.10 master1.localdomain.io master1
192.168.5.11 master2.localdomain.io master2
完成后保存并关闭文件。
最后,运行下面的 \ping\ 命令来检查和验证 fqdn 和 /etc/hosts 文件。
现在您应该看到主机名 \master1\ 指向 fqdn \master1.localdomain.io\,IP 地址为 \192.168.5.10\。主机名“master2”将指向 fqdn“master2.localdomain.io”,IP 地址为“192.168.5.11”。
ping master1
ping master2
使用 Chrony 同步时间
MariaDB Master-Master Replication 部署的时间同步至关重要。为了在服务器之间同步时间,您需要在每个 MariaDB 服务器上将 Chrony 设置为 NTP 客户端。
要安装 Chrony 包,请运行以下 \apt install\ 命令。输入Y确认安装,回车,开始安装。
sudo apt install chrony

安装完成后,运行下面的\systemctl\命令启动并启用Chrony服务。
sudo systemctl start chrony
sudo systemctl enable chrony
现在使用以下命令检查并验证 Chrony 服务。您应该会看到 Chrony 服务正在运行。此外,您会看到 Chrony 服务已\启用\,这意味着它将在系统启动时自动运行。
sudo systemctl status chronyd

接下来,运行下面的 \timedatectl\ 命令以使用特定时区调整您的系统时间,并使其能够使用 NTP 服务 Chrony。
sudo timedatectl set-timezone Europe/Stockholm --adjust-system-clock
sudo timedatectl set-ntp yes
最后,运行下面的 \timedatectl\ 命令来检查和验证系统时钟和时间的当前设置。确保时间在所有 MariaDB 服务器之间同步。
timedatectl

安装 MariaDB 服务器
默认的 Debian 存储库提供 MariaDB 服务器包。但是,对于本次演示,我们将从官方 MariaDB 存储库安装 MariaDB 服务器。
在安装 MariaDB 服务器之前,请运行下面的“apt install”命令来安装一些基本的包依赖项。输入 Y 确认安装,然后按 ENTER 继续。
sudo apt install gnupg2 apt-transport-https software-properties-common

接下来,运行以下命令为 MariaDB 存储库导入 GPG 密钥。完整的密钥指纹是“1993 69E5 404B D5FC 7D2F E43B CBCB 082A 1BB9 43DB”。
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
现在运行以下命令为 Debian 11 服务器添加 MariaDB 存储库。然后,更新并刷新服务器上的包索引。
sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://sfo1.mirrors.linux教程/mariadb/repo/10.8.3/debian bullseye main'
sudo apt update

要安装 \mariadb-server\ 包,请运行下面的 \apt install\ 命令。输入Y确认,回车,安装开始。
sudo apt install mariadb-server

在 Debian 系统上,MariaDB 服务会自动启动并启用。运行下面的 \systemctl\ 命令来检查和验证 MariaDB 服务。
您应该会看到 MariaDB 服务已\启用\,这意味着它将在系统启动时自动运行。而 MariaDB 服务的当前状态是\running\。
sudo systemctl is-enabled mariadb
sudo systemctl status mariadb

设置 UFW 防火墙
建议在所有 MariaDB 服务器之间使用防火墙。这将确保只有允许的 IP 地址或网络才能访问和到达 MariaDB 服务端口。在这个演示中,我们将使用 UFW 防火墙。
运行下面的“apt install”命令来安装“ufw”包。输入 Y 确认安装,然后按 ENTER 继续。
sudo apt install ufw
安装完成后,运行下面的 \ufw\ 命令添加 \OpenSSH\ 应用程序配置文件。然后,运行并启用 UFW 防火墙服务。
系统将提示您确认并启用 UFW 防火墙,输入“y”并按 ENTER。 UFW 防火墙已启动并正在运行。
sudo ufw allow "OpenSSH"
sudo ufw enable
接下来,为 MariaDB Master-Master Replication 部署打开一些端口。 MariaDB 复制部署的一些 TCP 端口是“3306”、“4567”、“4568”和“4444”。
在此示例中,仅允许网络“192.168.5.0/24”访问 MariaDB 服务器 TCP 端口。
对于 IP 地址为“192.168.5.10\”的“master1\”服务器,运行以下“ufw”命令。
sudo ufw allow from 192.168.5.0/24 to 192.168.5.10 port 3306 proto tcp
sudo ufw allow from 192.168.5.0/24 to 192.168.5.10 port 4567 proto tcp
sudo ufw allow from 192.168.5.0/24 to 192.168.5.10 port 4568 proto tcp
sudo ufw allow from 192.168.5.0/24 to 192.168.5.10 port 4444 proto tcp
对于 IP 地址为 \192.168.5.11\ 的 \master2\ 服务器,运行以下 \ufw\ 命令。
sudo ufw allow from 192.168.5.0/24 to 192.168.5.11 port 3306 proto tcp
sudo ufw allow from 192.168.5.0/24 to 192.168.5.11 port 4567 proto tcp
sudo ufw allow from 192.168.5.0/24 to 192.168.5.11 port 4568 proto tcp
sudo ufw allow from 192.168.5.0/24 to 192.168.5.11 port 4444 proto tcp
最后,使用以下命令检查并验证 UFW 防火墙的状态以及所有启用的规则。您应该看到 \OpenSSH\ 应用程序配置文件,其中包含 UFW 防火墙上可用的所有 MariaDB 复制端口 \3306\、\4567\、\4568\ 和 \4444\。
sudo ufw status

设置 master1 MariaDB 服务器
您已经为 MariaDB Master-Master Replication 部署完成了 Debian 服务器的基本配置。现在,让我们开始配置 MariaDB 服务器。
首先,您将在“master1”服务器上设置 MariaDB 服务器。登录到“master1”服务器外壳。
运行下面的 \systemctl\ 命令来停止 MariaDB 服务。这是在您设置 MariaDB 服务器之前需要的。
sudo systemctl stop mariadb
现在使用以下命令编辑 MariaDB 服务器配置文件 \/etc/mysql/mariadb.conf.d/50-server.cnf\。
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
将默认的“listen-address”更改为内部 IP 地址。在此示例中,\master1\ 服务器的 IP 地址为 \192.168.5.10\。接下来,为 MariaDB 服务器启用 \binary_log\,这允许您在 MariaDB 服务器上设置复制。请务必将以下配置放在 \[mysqld]\ 选项下。
[mysqld]
bind-address = 192.168.5.10
server-id = 1
report_host = master1
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
relay_log = /var/log/mysql/relay-bin
relay_log_index = /var/log/mysql/relay-bin.index
完成后保存并关闭文件。
接下来,运行下面的 \systemctl\ 命令来启动 MariaDB 服务并应用新的更改。然后,检查并验证 MariaDB 正在运行的 IP 地址。您应该看到 MariaDB 服务现在正在内部 IP 地址 \192.168.5.10\ 上运行。
sudo systemctl start mariadb
ss -plnt

现在您需要创建一个新的 MariaDB 用户,用于在 MariaDB 服务器之间复制数据。使用下面的 \mysql\ 命令以 \root\ 身份登录到 MariaDB shell。
sudo mysql -u root -p
运行以下查询以创建新的 MariaDB 用户和密码 \replusr\。然后,授予用户正确的权限。
CREATE USER 'replusr'@'%' IDENTIFIED BY 'replusr';
GRANT REPLICATION SLAVE ON *.* TO 'replusr'@'%';
FLUSH PRIVILEGES;

接下来,运行以下查询来检查当前二进制日志及其确切位置。在此示例中,MariaDB 服务器的二进制日志文件为 \mariadb-bin.000001\,位置为 \773\。这些输出将在下一阶段用于设置“master2”服务器。
SHOW MASTER STATUS;

输入 \quit\ 退出 MariaDB shell。
设置 master2 MariaDB 服务器
现在移动到“master2”服务器并开始配置 MariaDB 服务器。 MariaDB Master-Master Replication 的配置对于所有 MariaDB 服务器并没有特别不同。
运行以下命令停止 MariaDB 服务。
sudo systemctl stop mariadb
使用以下命令编辑 MariaDB 配置文件 \/etc/mysql/mariadb.conf.d/50-server.cnf\。
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
将 \bind-address\ 更改为 \master2\ 服务器的本地 IP 地址。然后,在 MariaDB 服务器 \master2\ 上启用二进制日志以启用复制。请务必在 \[mysqld]\ 选项下添加以下配置。
[mysqld]
bind-address = 192.168.5.11
server-id = 2
report_host = master2
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
relay_log = /var/log/mysql/relay-bin
relay_log_index = /var/log/mysql/relay-bin.index
完成后保存并关闭文件。
接下来,启动 MariaDB 服务以应用新更改。然后,检查并验证当前运行MariaDB服务器的IP地址。如果您的配置正确,您将看到 MariaDB 服务器未在 \master2\ 服务器的内部 IP 地址上运行,即 \192.168.5.11\。
sudo systemctl start mariadb
ss -plnt

MariaDB服务运行后,运行以下命令以“root”用户登录MariaDB shell。
sudo mysql -u root -p
运行以下查询以创建一个新的 MariaDB 用户,该用户将用于在所有 MariaDB 服务器之间复制数据。此用户必须与您刚刚在“master1”服务器上创建的用户相匹配。
CREATE USER 'replusr'@'%' IDENTIFIED BY 'replusr';
GRANT REPLICATION SLAVE ON *.* TO 'replusr'@'%';
FLUSH PRIVILEGES;

之后,您需要在 MariaDB \master2\ 服务器上进行更改,并使用 MariaDB \master1\ 服务器的详细配置定义 \Master\ 节点。
运行以下查询以停止从站。然后,添加有关 MariaDB \master1\ 服务器的详细信息。在此示例中,MariaDB \master1\ 服务器使用主机名 \master1\,数据复制的用户和密码为 \replusr\,最后的 binlog 文件为 \mariadb-bin.000001\位置为“773”。
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='replusr', MASTER_PASSWORD='replusr', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=773;

现在使用以下查询再次启动从站。然后,检查并验证“master2”服务器上的从站状态。如果您得到诸如 \Slave_IO_Running: Yes\ 和 \Slave_SQL_Running: Yes\ 之类的输出,则表示 MariaDB 复制处于活动状态并正在运行。此外,您还可以看到\master2\服务器上的二进制日志文件是\mariadb-bin.000001\,位置为\773 \”。这应该与 \master1\ 服务器上的相同。此外,您可以看到 MariaDB \Master_Host\ 的值为 \master1\。
START SLAVE;
SHOW SLAVE STATUS\G

您还可以使用以下查询验证 master 二进制日志文件和在 \master2\ 服务器上的位置。并且您应该获得与二进制日志文件 \mariadb-bin.000001\ 相同的输出,位置为 \773\ 与在 \master1\ 服务器上。
SHOW MASTER STATUS;

在 master1 MariaDB 服务器上启动主-主复制
因为本指南是设置MariaDB master-master Replication,那么您还需要为“master1”服务器添加和定义“master2”详细配置。
回到 \master1\ 服务器并使用下面的 \mysql\ 命令登录到 MariaDB shell。
sudo mysql -u root -p
使用以下命令停止从站。然后,添加有关“master2”服务器的详细信息,其中包括“master2”服务器主机名、用于复制的 MariaDB 用户和密码以及二进制日志文件和位置。
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='master2', MASTER_USER='replusr', MASTER_PASSWORD='replusr', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=773;

现在使用以下命令再次启动从站。然后,检查并验证\master1\ 服务器上的slave。并且您应该会看到诸如 \Slave_IO_Running: Yes\ 和 \Slave_SQL_Running: Yes\ 之类的输出,这意味着 MariaDB 复制处于活动状态并在\“master1\”MariaDB 服务器。此外,您还可以看到 \Master_Host\ 值是 \master2\ 服务器。
START SLAVE;
SHOW SLAVE STATUS\G

测试数据库复制
要验证 MariaDB Master-Master 复制,请在 \master1\ 服务器上创建一个新数据库并向其中输入一些数据。然后,登录“master2”,验证数据库,输入另一条数据。
移动到 \master1\ 服务器并使用以下命令以 root 用户身份登录到 MariaDB shell。
sudo mysql -u root -p
使用以下查询创建一个新数据库“testdb”。
CREATE DATABASE testdb;
USE testdb;
现在使用以下查询为数据库“testdb”创建一些表。
CREATE TABLE users (id INT AUTO_INCREMENT,
firstname VARCHAR(30),
lastname VARCHAR(30),
date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY(id));

之后,使用下面的 MariaDB 查询将一些数据插入“testdb”。
INSERT INTO users(firstname,lastname) VALUES ('Alice','Wonders');
要检查您在 MariaDB 服务器上的数据,请使用“SELECT”查询,如下所示。您应该会看到刚刚插入的数据。
SELECT * FROM users;

接下来,移动到 \master2\ 服务器并使用下面的 \mysql\ 命令登录到 MariaDB shell。
sudo mysql -u root -p
使用以下查询检查并验证 \master2\ 服务器上的数据库列表。你应该得到你刚刚创建的数据库“testdb”。
SHOW DATABASES;
USE testdb;

接下来,从“master2”服务器向数据库“testdb”插入一些其他数据。然后,使用“SELECT”查询检查并验证数据。并且您应该从“master2”服务器获取插入的新数据。
INSERT INTO users(firstname,lastname) VALUES ('Bob','Burgers');
SELECT * FROM users;

现在回到 \master1\ 检查并验证您刚刚从 \master2\ 服务器插入的新数据。运行以下查询以检查来自 \master1\ 服务器的新数据。并且您应该会看到刚刚从 \master2\ 服务器插入的新数据被复制到 \master1\ 服务器。
select @@hostname;
SELECT * FROM users;

结论
恭喜!您现在已经在 Debian 11 服务器上成功部署了 MariaDB Master-Master Replication。您还使用 Chrony 服务在 MariaDB 服务器上配置了时间同步。此外,您还使用 UFW 防火墙保护了 MariaDB 服务器部署。最后,你有一个 MariaDB 服务器,在两个 MariaDB 服务器之间自动复制,你可以在所有这些 MariaDB 服务器上写入,所有数据都会自动复制。