复制是一种功能,允许将一台或者多台服务器(称为主服务器)的内容镜像到一台或者多台服务器(称为从服务器)上。
复制中使用的主要机制是二进制日志。
从站从每个主站读取二进制日志,以便访问要复制的数据。
在从服务器上创建一个中继日志,使用与二进制日志相同的格式,用于执行复制。
测试 MariaDB 数据库复制
在主服务器中,使用以下命令向雇员表添加一条记录:
MariaDB [(none)]> INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES (500000, '1986-07-14', 'Lotfi', 'Waderni', 'M', '2015-01-01'); MariaDB [(none)]> INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES (500001, '1986-08-04', 'Mario', 'rossi', 'M', '2015-01-01');
在主服务器添加一些记录后,转到从服务器并验证数据是否被复制:
MariaDB [(none)]> SELECT * FROM employees.employees WHERE emp_no=500000;
要检查从服务器复制的状态,请使用 SHOW SLAVE STATUS 命令:
MariaDB [(none)]> SHOW SLAVE STATUS\G;
主配置
安装 MariaDB
[jack@onitroad ~]# yum install mariadb-server mariadb -y [jack@onitroad ~]# systemctl enable mariadb [jack@onitroad ~]# systemctl start mariadb
允许防火墙上的 mysql 端口
[jack@onitroadlmaster ~]# firewall-cmd --permanent --add-service=mysql [jack@onitroad ~]# firewall-cmd --reload
安装完成后,执行 mysql_secure_installation 设置 root 密码
[jack@onitroad ~]# mysql_secure_installation
为了测试复制,我们将从 github 设置一个示例 MySQL 数据库
[jack@onitroad ~]# git clone https://github.com/datacharmer/test_db [jack@onitroad ~]# cd test_db/ [jack@onitroad ~]# mysql -u root -p < employees.sql
编辑 /etc/my.cnf 文件并在 [mysqld] 部分下,添加以下四行:
[jack@onitroad ~]# vi /etc/my.cnf [mysqld] server_id=1 log-basename=master log-bin binlog-format=row binlog-do-db= employees #databasename
编辑 /etc/my.cnf 文件后重新启动 MariaDB 服务。
[jack@onitroad ~]# systemctl restart mariadb
创建复制用户:
[jack@onitroad ~]# mysql -u root -p MariaDB [(none)]> STOP SLAVE; MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'Password'; MariaDB [(none)]> FLUSH PRIVILEGES;
现在我们需要获取二进制日志的当前位置,从站将使用它来启动复制,为此我们需要在使用以下命令获取二进制日志位置时防止对数据进行任何更改:
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK; MariaDB [(none)]> SHOW MASTER STATUS; +--------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | mariadb-bin.000001 | 245 | employees | | +--------------------+----------+--------------+------------------+ MariaDB [(none)]> EXIT;
在开始配置slave之前,让我们使用mysqldump工具将数据从master备份并复制到slave。
[jack@onitroad ~]# mysqldump -u root -p employees > employees-backup.sql [jack@onitroad ~]# scp employees-backup.sql jack@onitroad:/root/
从机配置
安装 MariaDB
[jack@onitroad ~]# yum install mariadb-server mariadb -y [jack@onitroad ~]# systemctl enable mariadb [jack@onitroad ~]# systemctl start mariadb
安装完成后,执行 mysql_secure_installation 以设置 root 密码
[jack@onitroad ~]# mysql_secure_installation
连接到 Slave 数据库服务器,创建用户和一个空数据库,并授予“repl”用户权限
MariaDB [(none)]> CREATE DATABASE employees; MariaDB [(none)]> GRANT ALL PRIVILEGES ON employees.* TO 'repl'@'localhost' WITH GRANT OPTION; MariaDB [(none)]> FLUSH PRIVILEGES;
在开始从配置之前,让我们导入之前在主服务器中创建的转储:
[jack@onitroad ~]# mysql -u root -p employees < /root/employees-backup.sql
现在编辑 /etc/my.cnf 文件并在 [mysqld] 部分下添加以下行:
[jack@onitroad ~]# vi /etc/my.cnf [mysqld] server-id = 2 replicate-do-db=employees # name_databe_to_replicate
使用以下命令重新启动 MariaDB 服务:
[jack@onitroad ~]# systemctl restart mariadb
导入数据后,现在我们需要运行 CHANGE MASTER TO 命令,我们将其中添加一些设置: MASTER_HOST 、 MASTER_USER 、...、 MASTER_LOG_FILE 和 MASTER_LOG_POS 由 master 中的 SHOW MASTER STATUS 命令返回。
[jack@onitroad ~]# mysql -u root -p MariaDB [(none)]> STOP SLAVE; MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.1.13', MASTER_USER='repl', MASTER_PASSWORD='Password', MASTER_PORT=3306, MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245, MASTER_CONNECT_RETRY=10;
现在使用 START SLAVE 命令启动从站,如果你想检查从站的状态,请使用 SHOW SLAVE STATUS 命令:
MariaDB [(none)]> SLAVE START; MariaDB [(none)]> SHOW SLAVE STATUS\G;
使用复制的目的
- 高可用性
- 向外扩展
- 备份服务器
- 灾难恢复
- 报告服务器
在本文中,我们将介绍如何在 CentOS 7/RHEL 7 上的 MariaDB 中设置主从复制。
在本教程中,我们将使用 CentOS 7 服务器的 2 个节点,我们将其中安装 MariaDB。