跳至内容

第 4.3 部分 MariaDB 数据库复制

使用 MariaDB 的辅助服务器

本章将教您如何使用 MariaDB 配置主/辅助系统服务器。


目标: 您将学习如何

✔ 在您的服务器中激活 binlogs;
✔ 设置辅助服务器以从主服务器复制数据。

🏁 MariaDB, 复制, , 辅助

知识: ⭐ ⭐
复杂度: ⭐ ⭐ ⭐

阅读时间: 10 分钟


使用 MariaDB 的辅助服务器概述

一旦您开始更密集地使用数据库,您就必须将数据复制到多个服务器上。

这可以通过多种方式完成

  • 将写入请求分发到主服务器,并将读取请求分发到辅助服务器。
  • 在辅助服务器上执行数据库备份,这避免了在备份期间阻塞对主服务器的写入。

如果您的使用量变得更加苛刻,您可能需要考虑切换到主/主系统:复制然后交叉进行,但要注意阻塞主键唯一性的风险。否则,您需要切换到更高级的集群系统。

使用 MariaDB 的辅助服务器配置

如何激活 binlogs

在主服务器和辅助服务器上执行此操作

[mariadb] 键下,将以下选项添加到 /etc/my.cnf.d/mariadb-server.cnf 文件中

[mariadb]
log-bin
server_id=1
log-basename=server1
binlog-format=mixed

用于主服务器和辅助服务器

[mariadb]
log-bin
server_id=2
log-basename=server2
binlog-format=mixed

server_id 选项在集群中的每个服务器上必须是唯一的,而 log-basename 选项允许您为 binlog 文件指定一个前缀。如果您不这样做,则无法重命名服务器。

现在,您可以重新启动两台服务器上的 MariaDB 服务

sudo systemctl restart mariadb

您可以检查 binlogs 文件是否已成功创建

$ ll /var/lib/mysql/
total 123332
...
-rw-rw----. 1 mysql mysql         0 Jun 21 11:07 multi-master.info
drwx------. 2 mysql mysql      4096 Jun 21 11:07 mysql
srwxrwxrwx. 1 mysql mysql         0 Jun 21 11:16 mysql.sock
-rw-rw----. 1 mysql mysql       330 Jun 21 11:16 server1-bin.000001
-rw-rw----. 1 mysql mysql        21 Jun 21 11:16 server1-bin.index
...

如何配置复制

首先,在主服务器上,您需要创建被授权复制数据的用户(注意限制授权的 IP)

$ sudo mariadb

MariaDB [(none)]> CREATE USER 'replication'@'%' IDENTIFIED BY 'PASSWORD';
Query OK, 0 rows affected (0.002 sec)

MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
Query OK, 0 rows affected (0.002 sec)

或者更好地为了安全(将 '192.168.1.101' 替换为您自己的辅助 IP)

$ sudo mariadb

MariaDB [(none)]> CREATE USER 'replication'@'192.168.1.101' IDENTIFIED BY 'PASSWORD';
Query OK, 0 rows affected (0.002 sec)

MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.101';
Query OK, 0 rows affected (0.002 sec)

如果您主服务器已经包含数据,则必须锁定新的事务。相反,数据导出或导入发生到辅助服务器,并告诉辅助服务器何时开始复制。如果您的服务器还没有包含任何数据,则该过程会大大简化。

在您查看二进制日志位置时,防止对数据进行任何更改

$ sudo mariadb

MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.021 sec)

MariaDB [(none)]> SHOW MASTER STATUS;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| server1-bin.000001 |     1009 |              |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.000 sec)

不要退出您的会话以保持锁定。

记录文件和位置详细信息。

如果您的服务器包含数据,则现在是创建备份并将备份导入到辅助服务器上的时候了。在备份期间保持锁定,并在备份完成后立即释放它。这减少了停机时间(将数据复制和导入辅助服务器所需的时间)。

您现在可以移除锁定

$ sudo mariadb

MariaDB [(none)]> UNLOCK TABLES;
Query OK, 0 rows affected (0.000 sec)

在辅助服务器上,您现在可以使用以下设置来设置主服务器进行复制

MariaDB [(none)]> CHANGE MASTER TO
  MASTER_HOST='192.168.1.100',
  MASTER_USER='replication',
  MASTER_PASSWORD='PASSWORD',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='server1-bin.000001',
  MASTER_LOG_POS=1009,
  MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected, 1 warning (0.021 sec)

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.001 sec)

将主服务器 IP 替换为您自己的 IP,并将 MASTER_LOG_FILEMASTER_LOG_POS 值替换为您之前记录的值。

检查复制是否正常

MariaDB [(none)]> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.1.100
                   Master_User: replication
               Master_Log_File: server1-bin.000001
           Read_Master_Log_Pos: 1009
...
         Seconds_Behind_Master: 0
       Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
...
1 row in set (0.001 sec)

Seconds_Behind_Master 是一个值得关注的指标,它可以帮助您识别复制问题。

使用 MariaDB 的 Workshop 辅助服务器

对于本 Workshop,您需要两台已安装、配置并安全化的 MariaDB 服务的服务器,如前几章所述。

您将在辅助服务器上配置复制,创建一个新的数据库,将数据插入其中,并检查它是否可以在辅助服务器上访问。

我们的两台服务器具有以下 IP 地址

  • server1: 192.168.1.100
  • server2: 192.168.1.101

请记住用您自己的值替换这些值。

任务 1:创建一个专用的复制用户

在主服务器上

$ sudo mariadb

MariaDB [(none)]> CREATE USER 'replication'@'192.168.1.101' IDENTIFIED BY 'PASSWORD';
Query OK, 0 rows affected (0.002 sec)

MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.101';
Query OK, 0 rows affected (0.002 sec)

任务 2:记录主服务器的值

$ sudo mariadb

MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.021 sec)

MariaDB [(none)]> SHOW MASTER STATUS;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| server1-bin.000001 |     1009 |              |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.000 sec)

MariaDB [(none)]> UNLOCK TABLES;
Query OK, 0 rows affected (0.000 sec)

任务 3:激活复制

在辅助服务器上

MariaDB [(none)]> CHANGE MASTER TO
  MASTER_HOST='192.168.1.100',
  MASTER_USER='replication',
  MASTER_PASSWORD='PASSWORD',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='server1-bin.000001',
  MASTER_LOG_POS=1009,
  MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected, 1 warning (0.021 sec)

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.001 sec)

检查复制是否正常

MariaDB [(none)]> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.1.100
                   Master_User: replication
               Master_Log_File: server1-bin.000001
           Read_Master_Log_Pos: 1009
...
         Seconds_Behind_Master: 0
       Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
...
1 row in set (0.001 sec)

任务 4:创建一个新的数据库和用户

在主服务器上

MariaDB [(none)]> create database NEW_DATABASE_NAME;
Query OK, 1 row affected (0.002 sec)

MariaDB [(none)]> grant all privileges on NEW_DATABASE_NAME.* TO 'NEW_USER_NAME'@'localhost' identified by 'PASSWORD';
Query OK, 0 rows affected (0.004 sec)

在辅助服务器上,检查数据库是否已创建

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| NEW_DATABASE_NAME  |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

在辅助服务器上,尝试连接在主服务器上创建的新用户

$ mariadb -u NEW_USER_NAME -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| NEW_DATABASE_NAME  |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)

任务 5:插入新数据

在主服务器上插入新数据

MariaDB [(none)]> use NEW_DATABASE_NAME
Database changed

MariaDB [(none)]>  CREATE TABLE users(
    ->     id INT NOT NULL AUTO_INCREMENT,
    ->     first_name VARCHAR(30) NOT NULL,
    ->     last_name VARCHAR(30) NOT NULL,
    ->     age INT DEFAULT NULL,
    ->     PRIMARY KEY (id));

MariaDB [NEW_DATABASE_NAME]> INSERT INTO users (first_name, last_name, age) VALUES ("Antoine", "Le Morvan", 44);
Query OK, 1 row affected (0.004 sec)

在辅助服务器上,检查数据是否已复制

MariaDB [(none)]> use NEW_DATABASE_NAME
Database changed

MariaDB [NEW_DATABASE_NAME]> show tables;
+-----------------------------+
| Tables_in_NEW_DATABASE_NAME |
+-----------------------------+
| users                       |
+-----------------------------+
1 row in set (0.000 sec)

MariaDB [NEW_DATABASE_NAME]> SELECT * FROM users;
+----+------------+-----------+------+
| id | first_name | last_name | age  |
+----+------------+-----------+------+
|  1 | Antoine    | Le Morvan |   44 |
+----+------------+-----------+------+
1 row in set (0.000 sec)

检查您对使用 MariaDB 的辅助服务器的知识

✔ 每台服务器在集群内必须具有相同的 ID。

  • 正确
  • 错误

✔ 必须在激活复制之前启用二进制日志。

  • 正确
  • 错误
  • 视情况而定

关于使用 MariaDB 的辅助服务器的结论

如您所见,创建一台或多台辅助服务器是一个相对简单的操作,但它确实需要在主服务器上中断服务。

但是,它提供了许多优势:高数据可用性、负载均衡和简化的备份。

在中央服务器崩溃的情况下,可以将其中一台辅助服务器提升为主服务器。

作者:Antoine Le Morvan

贡献者:Steven Spencer、Ganna Zhyrnova