跳至内容

第四部分.3 MariaDB 数据库复制

带 MariaDB 的辅助服务器

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


目标:您将学会如何

✔ 在服务器上激活二进制日志;
✔ 设置辅助服务器以从主服务器复制数据。

🏁 MariaDB, 复制, 主服务器, 辅助服务器

知识⭐ ⭐
复杂性: ⭐ ⭐ ⭐

阅读时间:10 分钟


带 MariaDB 的辅助服务器概述

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

这可以通过多种方式完成

  • 将写请求分发到主服务器,将读请求分发到辅助服务器。
  • 在辅助服务器上执行数据库备份,这可以避免备份期间主服务器的写操作阻塞。

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

带 MariaDB 的辅助服务器配置

如何激活二进制日志

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

[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 选项允许您为二进制日志文件指定一个前缀。如果不这样做,您将无法重命名您的服务器。

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

sudo systemctl restart mariadb

您可以检查二进制日志文件是否已正确创建

$ 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 和您之前记录的 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 的辅助服务器研讨会

对于本次研讨会,您将需要两台安装、配置和保护了 MariaDB 服务的服务器,如前几章所述。

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

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

  • 服务器 1:192.168.1.100
  • 服务器 2: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