一、主从复制原理及相关概念:

1、主从复制原理:master将操作记录保存至其二进制日志中,通过dump线程传输给slave,然后slavemaster的二进制日志通过slaveIO线程复制至slave的中继日志中,最后通过slaveSQL线程读取中继日志中的事件还原数据库操作,以达到复制的目的,默认为异步模式。

CentOS 7.6安装配置MariaDB异步主从复制_第1张图片

2、主从复制中相关线程:

所在节点

线程名称

线程作用

master

Dump线程

为每个slaveIO线程启动一个dump线程,并向其发送二进制日志事件

slave

IO线程

SQL线程

master请求二进制日志事件,并保存至本地中继日志中

从中继日志中读取日志事件,并在本地完成重放

3、异步模式:当master收到写请求时,只保证master本地写入二进制日志完成,就返回给客户端写入操作完成,无需等待slave反馈已经收到master二进制日志中的写入事件,性能好。

4、主从复制作用:辅助实现数据备份、高可用、异地容灾、负载均衡读操作等

5、slave数据目录/var/lib/mysql中与主从复制相关的文件:

(1)master.info:保存slave连接至master时所需的用户、密码、服务器地址等相关信息

(2)relay-log.info:保存slave已经复制的当前master二进制日志文件名称、事件位置和当前slave本地中继日志文件名称、事件位置的对应关系


二、配置异步主从复制:

1、演示环境:

IP

操作系统

数据库版本

安装方式

角色

192.168.1.145

CentOS   7.6 x86_64

MariaDB-10.3.15

yum

master

192.168.1.146

CentOS   7.6 x86_64

MariaDB-10.3.15

yum

slave

2、两个节点的服务器时间同步

3、master修改server.cnf配置文件:# vim /etc/my.cnf.d/server.cnf

[mysqld]

port=3306

socket=/var/lib/mysql/mysql.sock

datadir=/var/lib/mysql

log_error=/var/log/mariadb.log

lower_case_table_names=1

character_set_server=utf8mb4

collation_server=utf8mb4_general_ci

innodb_file_per_table=1

skip_name_resolve=1

slow_query_log=1

slow_query_log_file=mariadb-slow.log

log_bin=master-bin

log_bin_index=master-bin.index

binlog_format=mixed

server_id=1

sync_binlog=1

innodb_flush_log_at_trx_commit=1

4、master创建具有复制权限的用户:

MariaDB [(none)]> grant replication slave,replication client on *.* to 'repluser'@'192.168.1.146' identified by '123456';

MariaDB [(none)]> flush privileges;

5、master查看正在使用的二进制日志文件名称及事件位置:

MariaDB [(none)]> show master status;

image.png

6、slave修改server.cnf配置文件:# vim /etc/my.cnf.d/server.cnf

[mysqld]

port=3306

socket=/var/lib/mysql/mysql.sock

datadir=/var/lib/mysql

log_error=/var/log/mariadb.log

lower_case_table_names=1

character_set_server=utf8mb4

collation_server=utf8mb4_general_ci

innodb_file_per_table=1

skip_name_resolve=1

slow_query_log=1

slow_query_log_file=mariadb-slow.log

relay_log=relay-log

relay_log_index=relay-log.index

server_id=2

read_only=1

备注:

(1)slave只能读不能写

(2)如果slave不作为其它slavemaster,则无需开启其二进制日志

(3)中继日志默认不存在,只有当复制启动时才会自动生成

7、slave使用具有复制权限的用户连接至master

MariaDB [(none)]> change master to master_host='192.168.1.145',master_user='repluser',master_password='123456',master_port=3306,master_log_file='master-bin.000001',master_log_pos=2034;

MariaDB [(none)]> show slave status\G

CentOS 7.6安装配置MariaDB异步主从复制_第2张图片

备注:

(1)Slave_IO_RunningSlave_SQL_Running的值,默认为No

(2)自动在数据目录/var/lib/mysql中创建relay-log.000001relay-log.indexrelay-log.info文件

(3)Master_Log_File的值为master的二进制日志文件名称

(4)Read_Master_Log_Pos的值为master二进制日志事件的位置

8、slave启动复制线程:

MariaDB [(none)]> start slave;

备注:

(1)start slave等同于分别执行start slave io_threadstart slave sql_thread

(2)stop slave表示停止主从复制线程

(3)重启slave所在的服务器,复制线程会自动启动

MariaDB [(none)]> show slave status\G

CentOS 7.6安装配置MariaDB异步主从复制_第3张图片

image.png

备注:

(1)只有当Slave_IO_RunningSlave_SQL_Running的值都为Yes时,复制线程才算启动成功

(2)Seconds_Behind_Master的值为0,说明slave没有落后于master

(3)复制时的详细信息记录在slave的错误日志/var/log/mariadb.log

9、master查看slave相关信息:

MariaDB [(none)]> show slave hosts;

CentOS 7.6安装配置MariaDB异步主从复制_第4张图片


三、测试异步主从复制:

1、master创建测试数据:

MariaDB [(none)]> create database db1;

MariaDB [(none)]> use db1;

MariaDB [db1]> create table tb1(id int unsigned auto_increment primary key not null,age int not null);

MariaDB [db1]> desc tb1;

MariaDB [db1]> insert into tb1(age) values(35),(40);

MariaDB [db1]> select * from tb1;

CentOS 7.6安装配置MariaDB异步主从复制_第5张图片CentOS 7.6安装配置MariaDB异步主从复制_第6张图片

MariaDB [db1]> show master status;

image.png

2、slave查看测试数据:

MariaDB [(none)]> show databases;

MariaDB [(none)]> use db1;

MariaDB [db1]> show tables;

MariaDB [db1]> desc tb1;

MariaDB [db1]> select * from tb1;

CentOS 7.6安装配置MariaDB异步主从复制_第7张图片

MariaDB [db1]> show slave status\G


四、实现过滤复制:

slaveSQL线程在重放中继日志中的事件时,仅读取与指定数据库(特定表)相关的事件,并应用于本地。

1、slave修改server.cnf配置文件:# vim /etc/my.cnf.d/server.cnf

[mysqld]

port=3306

socket=/var/lib/mysql/mysql.sock

datadir=/var/lib/mysql

log_error=/var/log/mariadb.log

lower_case_table_names=1

character_set_server=utf8mb4

collation_server=utf8mb4_general_ci

innodb_file_per_table=1

skip_name_resolve=1

slow_query_log=1

slow_query_log_file=mariadb-slow.log

relay_log=relay-log

relay_log_index=relay-log.index

server_id=2

read_only=1

replicate_do_db=db2

备注:

(1)replicate_do_db=db2slaveSQL线程在重放中继日志中的事件时,仅读取指定db2数据库中相关的事件,并应用于本地

(2)可使用的选项:replicate_do_dbreplicate_ignore_dbreplicate_do_tablereplicate_ignore_tablereplicate_wild_do_tablereplicate_wild_ignore_table

# systemctl restart mariadb.service

2、查看Replicate_Do_DB的值:

MariaDB [db1]> show slave status\G

CentOS 7.6安装配置MariaDB异步主从复制_第8张图片

备注:Replicate_Do_DB的值,默认为空,现已改为db2


五、测试过滤复制:

1、master创建测试数据:

MariaDB [db1]> create database db2;

MariaDB [db1]> use db2;

MariaDB [db2]> create table tb2(name char(30) not null,age int not null);

MariaDB [db2]> desc tb2;

MariaDB [db2]> insert into tb2 values('keyso',35),('marion',40);

MariaDB [db2]> select * from tb2;

CentOS 7.6安装配置MariaDB异步主从复制_第9张图片

MariaDB [db2]> show master status;

image.png

2、slave查看测试数据:

MariaDB [db1]> show databases;

MariaDB [db1]> use db2;

MariaDB [db2]> show tables;

MariaDB [db2]> desc tb2;

MariaDB [db2]> select * from tb2;

CentOS 7.6安装配置MariaDB异步主从复制_第10张图片

MariaDB [db2]> show slave status\G

3、masterdb1.tb1中插入新数据:

MariaDB [db2]> use db1;

MariaDB [db1]> insert into tb1(age) values(66),(88);

MariaDB [db1]> select * from tb1;

CentOS 7.6安装配置MariaDB异步主从复制_第11张图片

MariaDB [db1]> show master status;

image.png

4、slave查看db1.tb1中的数据:

MariaDB [db2]> select * from db1.tb1;

CentOS 7.6安装配置MariaDB异步主从复制_第12张图片

备注:由于slaveSQL线程在重放中继日志中的事件时,仅读取指定db2数据库中相关的事件,并应用于本地,并不会读取db1数据库中相关的事件,所以slave并不会更新db1数据库中的数据

MariaDB [db2]> show slave status\G