第四部分.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_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 的辅助服务器研讨会¶
对于本次研讨会,您将需要两台安装、配置和保护了 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