数据库复制  在多数IT人士看来,也经常会把它同多份相同数据的拷贝相关联,以保证在系统硬件故障以及数据损坏时不会丢失数据。在某种程度上来讲,这种概念是正确的,但是实际的数据库复制却比它具有更加丰富的内涵,几乎涉及数据库备份和高可用的各个环节。

在具备主从数据库复制的系统中,我们需要着重提及以下几点优势:

  • 从属数据库的备份操作不影响也不受主数据库服务器写操作的影响
  • 资源密集型操作(例如数据分析)可以在从属服务器上执行,而不影响主服务器的整体性能

本文将详细讲解如何设置MariaDB 10.3 主从数据库复制系统。与传统的数据库复制不同的是,MariaDB 自10.0版本后引入了全局事务ID(GTIDs)的概念,这让从属服务器在不同主服务器间进行数据复制时变得更加容易;除此之外,对于从属状态的记录也会采用更为安全的方式(对状态的更新和对数据的更新在同一事务中完成)。

1]  CentOS/RHEL 7 和 Debian 9 系统安装MariaDB 10.3

本教程使用的实验环境将包含两台主机,均采用CentOS 7:

Master: 172.16.200.1
Slave: 172.16.200.2

为了安装最新版的MariaDB,需要在服务器添加相应的软件库。如果已经使用了旧版本的MariaDB数据库,可以参照本教程卸载之前的数据库再进行安装。

CentOS/RHEL 7系统

同时在”Master”和”Slave”主机上的”/etc/yum.repos.d”目录添加一个名为”MariaDB.repo”的文件,文件内容如下:

# MariaDB10.3CentOSrepositorylist-created2019-05-2407:18UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]name = MariaDB
baseurl = http://yum.mariadb.org/10.3/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1

保存文件后使用在每台服务器均使用”yum”命令安装MariaDB数据库软件包:

# yum install MariaDB-server MariaDB-client

Debian 系统

使用如下命令将软件包密钥和MariaDB包添加到软件库:

# apt-get install software-properties-common dirmngr
# apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xF1656F24C74CD1D8
# add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/10.3/debian stretch main'

以上命令使用的是清华大学镜像软件库,当然也可以采用其它镜像。对于采用”https”文件传输的镜像,需要首先执行如下命令以免出错:

# apt-get install apt-transport-https

最后,执行以下命令安装MariaDB:

# apt-get update
# apt-get install mariadb-server

数据库安装完成后,使用mysql_secure_installation程序进行数据库安全性设置。

图.1  MariaDB主从服务器信息

2]  在Master主机创建一个示例数据库

为演示起见,我们将创建一个名为”employees”  的数据库,将如下内容保存为”employees.sql”文件:

DROP DATABASE IF EXISTS employees;
CREATE DATABASE IF NOT EXISTS employees;
USE employees;

SELECT 'CREATING DATABASE STRUCTURE' as 'INFO';

DROP TABLE IF EXISTS employees;

CREATE TABLE employees (
    emp_no      INT             NOT NULL,
    birth_date  DATE            NOT NULL,
    first_name  VARCHAR(14)     NOT NULL,
    last_name   VARCHAR(16)     NOT NULL,
    gender      ENUM ('M','F')  NOT NULL,    
    hire_date   DATE            NOT NULL,
    PRIMARY KEY (emp_no)
);

然后执行如下命令:

# mysql -u root -p < employees.sql

如果未出现错误的话,示例数据库就创建完成了。

3]  配置主用MariaDB  数据库启用数据库复制

按照如下步骤配置MariaDB主用服务器。

步骤1.  修改配置文件”/etc/my.cnf.d/server.cnf”,在”[mysqld]”章节添加如下内容:

log-bin
server_id=1
replicate-do-db=employees
bind-address=172.16.200.1

修改好配置后,使用如下命令重新启动MariaDB服务:

# systemctl restart mariadb

步骤2.  以 root  用户登录到主用服务器,创建从属服务器用户并对其进行授权:

MariaDB [(none)]> CREATE USER 'slave'@'localhost' IDENTIFIED BY 'slave';
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO slave IDENTIFIED BY 'slave' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;
MariaDB [(none)]> SHOW MASTER STATUS;

最后一条命令”SHOW MASTER STATUS”返回二进制日志文件的当前位置,即从服务器复制的起始位置。

图.2  查看主用服务器状态

步骤3.  退出MariaDB数据库,使用如下命令对”employees”数据制作一个备份快照:

# mysqldump -u root -p employees > employees.dump

快照制作完成后,重新登录数据库,使用如下命令打开表锁定:

MariaDB [(none)]> UNLOCK TABLES;

步骤4.  使用如下命令将快照文件拷贝到从属服务器:

# scp employees.dump root@172.16.200.2:/root/

步骤5. 运行”mysql_upgrade”命令更新系统表:

# mysql_upgrade -u root -p

步骤6. 主用服务器打开防火墙允许MariaDB数据库:

# firewall-cmd --add-service=mysql
# firewall-cmd --add-service=mysql --permanent
# firewall-cmd --reload

以上就完成了主用服务器的配置,下面我们将配置从属服务器。

4]  配置MariaDB从属服务器

配置从属服务器需要经过如下步骤。

步骤1.  登录MariaDB数据库,创建操作复制的用户:

# mysql -u root -p
MariaDB [(none)]> CREATE USER 'slave'@'localhost' IDENTIFIED BY 'slave';

步骤2. 登录成功后,使用如下命令创建复制数据库并进行授权:

MariaDB [(none)]> CREATE DATABASE employees;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON employees.* TO 'slave'@'localhost' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;

步骤3. 将快照数据导入数据库:

# mysql -u root -p employees < employees.dump

步骤4. 修改配置文件”/etc/my.cnf.d/server.cnf”,为从属服务器分配ID。注意我们之前已经将1分配给主用了服务器,此时需要为从属服务器分配其它ID值。同样在”[mysqld]”章节增加如下内容:

server_id=2
replicate-do-db=employees

修改完成后重新启动MariaDB数据库以使配置生效:

# systemctl restart mariadb

步骤5. 执行mysql_upgrade命令更新系统表:

# mysql_upgrade -u root -p

步骤6. 一旦数据库快照成功导入从属服务器,我们就可以通过简单几步进行数据库复制了。登录数据库后,在MariaDB命令提示符下输入如下命令设置主用服务器。需要特别注意的是,”MASTER_LOG_FILE” 和 “MASTER_LOG_POS” 设定值要与之前在主用服务器上”SHOW MASTER STATUS” 输出的值一致,以免出错:

MariaDB [(none)]> CHANGE MASTER TO
  MASTER_HOST='172.16.200.1',
  MASTER_USER='slave',
  MASTER_PASSWORD='slave',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='master-bin.000001',
  MASTER_LOG_POS=808,
  MASTER_CONNECT_RETRY=10,
  MASTER_USE_GTID=current_pos;

步骤7. 在MariaDB命令提示符下启动从属服务器并查看状态:

MariaDB [(none)]> START SLAVE;
MariaDB [(none)]> SHOW SLAVE STATUS\G;

如果查看从属服务器状态时出现任何报错信息,以根据其内容进行相关故障排查,没有报错则说明数据库复制准备就绪。
当然,想要停止从属服务也很简单,只需要在MariaDB命令提示符下输入如下命令即可:

MariaDB [(none)]> STOP SLAVE;

5] 验证MariaDB数据库复制功能

首先在主用服务器插入一条记录:

MariaDB [(none)]> USE employees;
MariaDB [employees]> INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES (500000, '1990-01-01', 'Rultr', 'Null', 'M', '2018-12-12');

之后,在从属服务器查询该数据库,看在主用服务器上添加的记录是否已经自动复制到从属服务器:

MariaDB [(none)]> USE employees;
MariaDB [employees]> SELECT * FROM employees WHERE emp_no=500000;

结果如下图所示:

图.3  验证MariaDB数据库复制功能

可以看到,在主用主机上所做的数据库操作会被同时复制到从属服务器上,MariaDB数据库复制功能工作正常。

发表评论

您的电子邮箱地址不会被公开。