1、主从复制原理及相关概念:mysql
一、主从复制原理:master将操做记录保存至其二进制日志中,经过dump线程传输给slave,而后slave把master的二进制日志经过slave的IO线程复制至slave的中继日志中,最后经过slave的SQL线程读取中继日志中的事件还原数据库操做,以达到复制的目的,默认为异步模式。sql
二、主从复制中相关线程:数据库
所在节点vim |
线程名称服务器 |
线程做用负载均衡 |
master异步 |
Dump线程socket |
为每一个slave的IO线程启动一个dump线程,并向其发送二进制日志事件ide |
slave性能 |
IO线程 SQL线程 |
从master请求二进制日志事件,并保存至本地中继日志中 从中继日志中读取日志事件,并在本地完成重放 |
三、异步模式:当master收到写请求时,只保证master本地写入二进制日志完成,就返回给客户端写入操做完成,无需等待slave反馈已经收到master二进制日志中的写入事件,性能好。
四、主从复制做用:辅助实现数据备份、高可用、异地容灾、负载均衡读操做等
五、slave数据目录/var/lib/mysql中与主从复制相关的文件:
(1)master.info:保存slave链接至master时所需的用户、密码、服务器地址等相关信息
(2)relay-log.info:保存slave已经复制的当前master二进制日志文件名称、事件位置和当前slave本地中继日志文件名称、事件位置的对应关系
2、配置异步主从复制:
一、演示环境:
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 |
二、两个节点的服务器时间同步
三、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
四、master建立具备复制权限的用户:
MariaDB [(none)]> grant replication slave,replication client on *.* to 'repluser'@'192.168.1.146' identified by '123456';
MariaDB [(none)]> flush privileges;
五、master查看正在使用的二进制日志文件名称及事件位置:
MariaDB [(none)]> show master status;
六、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不做为其它slave的master,则无需开启其二进制日志
(3)中继日志默认不存在,只有当复制启动时才会自动生成
七、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
备注:
(1)Slave_IO_Running和Slave_SQL_Running的值,默认为No
(2)自动在数据目录/var/lib/mysql中建立relay-log.000001、relay-log.index和relay-log.info文件
(3)Master_Log_File的值为master的二进制日志文件名称
(4)Read_Master_Log_Pos的值为master二进制日志事件的位置
八、slave启动复制线程:
MariaDB [(none)]> start slave;
备注:
(1)start slave等同于分别执行start slave io_thread和start slave sql_thread
(2)stop slave表示中止主从复制线程
(3)重启slave所在的服务器,复制线程会自动启动
MariaDB [(none)]> show slave status\G
备注:
(1)只有当Slave_IO_Running和Slave_SQL_Running的值都为Yes时,复制线程才算启动成功
(2)Seconds_Behind_Master的值为0,说明slave没有落后于master
(3)复制时的详细信息记录在slave的错误日志/var/log/mariadb.log中
九、master查看slave相关信息:
MariaDB [(none)]> show slave hosts;
3、测试异步主从复制:
一、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;
MariaDB [db1]> show master status;
二、slave查看测试数据:
MariaDB [(none)]> show databases;
MariaDB [(none)]> use db1;
MariaDB [db1]> show tables;
MariaDB [db1]> desc tb1;
MariaDB [db1]> select * from tb1;
MariaDB [db1]> show slave status\G
4、实现过滤复制:
slave的SQL线程在重放中继日志中的事件时,仅读取与指定数据库(特定表)相关的事件,并应用于本地。
一、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=db2:slave的SQL线程在重放中继日志中的事件时,仅读取指定db2数据库中相关的事件,并应用于本地
(2)可以使用的选项:replicate_do_db、replicate_ignore_db、replicate_do_table、replicate_ignore_table、replicate_wild_do_table、replicate_wild_ignore_table
# systemctl restart mariadb.service
二、查看Replicate_Do_DB的值:
MariaDB [db1]> show slave status\G
备注:Replicate_Do_DB的值,默认为空,现已改成db2
5、测试过滤复制:
一、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;
MariaDB [db2]> show master status;
二、slave查看测试数据:
MariaDB [db1]> show databases;
MariaDB [db1]> use db2;
MariaDB [db2]> show tables;
MariaDB [db2]> desc tb2;
MariaDB [db2]> select * from tb2;
MariaDB [db2]> show slave status\G
三、master在db1.tb1中插入新数据:
MariaDB [db2]> use db1;
MariaDB [db1]> insert into tb1(age) values(66),(88);
MariaDB [db1]> select * from tb1;
MariaDB [db1]> show master status;
四、slave查看db1.tb1中的数据:
MariaDB [db2]> select * from db1.tb1;
备注:因为slave的SQL线程在重放中继日志中的事件时,仅读取指定db2数据库中相关的事件,并应用于本地,并不会读取db1数据库中相关的事件,因此slave并不会更新db1数据库中的数据
MariaDB [db2]> show slave status\G