第 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_FILE
和 MASTER_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