1.主从复制:就是建立一个和主数据库完全一样的数据库环境,该新建的数据库成为从数据库。

2.复制的作用:

  数据分布存放:随着业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘的频率,提供IO性能。

  负载均衡读写操作:读写分类,使数据库能支撑更大的高并发

  备份:主数据库做热备,作为后备数据库

  高可用和故障切换

  升级测试

 

3.主从复制原理图:(所谓主从复制,都是基于二进制数据日志事件完成)

mysql mariadb在哪里 mysql8 mariadb_sql

 

 

 

过程分析:1. 数据库有个bin-log二进制文件,记录了所有sql语句

     2.而我们的目标时将一个数据库的bin-log二进制日志文件复制到子节点中(从数据库服务器)

     3.在子节点服务器上重读该二进制数据库文件

其中主从复制相关的线程:

  主节点:dump thread:为每个slave(从节点)的I/O Thread启动一个dump线程,用于向其发送binary log events

  从节点:I/O Thread:向Master(主节点)请求二进制日志事件,并保存与中继日志中

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

 

具体实现步骤,这里以centos8,mysql8.0;一主一从为例演示

主节点ip:10.0.0.110     从节点ip:10.0.0.112

主从两台机器环境准备:

[root@ldl ~]# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)

[root@ldl ~]# mysql --version
mysql Ver 8.0.21 for Linux on x86_64 (Source distribution)

[root@ldl ~]#hostnamectl set-hostname master.org;exit  #为了便于标识,修改主机名

[root@master ~]# yum install -y mysql-server    #cnetos8系通仓库默认带有mysql8.0包。

 

过程大纲:主节点配置,从节点配置,测试

 

主节点配置

#新建文件夹,以及修改文件夹的属主,属组。(新建改文件的目的是,为了不让二进制日志文件不与数据库文件放在一个位置)

[root@master ~]#mkdir  /data/logbin ;chown mysql.mysql /data/logbin 

 

#修改/etc/my.conf.d/mysql-server.conf文件

[root@master ~]#vim /etc/my.conf.d/mysql-server.conf

[mysql]

 

 

server_id=2   #必须项,为当前节点设置一个全局唯一的id号(因为主从复制时时靠server_id来区分),如果不设置默认为1(mysql>select @@server_id;可以查看id)

 log_bin=/data/logbin/mysq-lbin    #必须项,启用二进制日志功能,并且指定二进制日志保存的位置(该位置就是前面创建的目录)

log-basename=master        #可选项,设置datadir中日志名称,确保不依赖主机名

 

#启动mysqld服务,连接mysql,创建一个账号并授权,用于主从复制,mysql安装后默认账户root,密码为空

[root@master ~]#systemctl start mysqld                 #可通过ss -tnl 看3306/tcp  端口是否打开。如果启动失败,检查selinx,iptables是否关闭(selinux临时关闭方法:setenforce 0;查看方法:getenforce 。)

[root@master ~]#mysql

mysql>CREATE USER  'repluser'@'10.0.0.%'  IDENTIFIED BY '123456' ; #创建账户:'repluser'@'10.0.0.%' ,密码为:123456

mysql>GRANT replication slave ON  *.*  TO  'repluser'@'10.0.0.%' ;# 授权账户:'repluser'@'10.0.0.%' ,在所有数据库(*.*)有权限

 

查看二进制日志位置以及文件名称:

mysql>show master logs;

mysql mariadb在哪里 mysql8 mariadb_二进制日志_02

 

 

创建备份,将生成的sql文件以日期的格式保存于当前目录下

 

 [root@master ~]#mysqldump -uroot --single-transaction  --master-data=1 -F -A > all-`date +%F`.sql

[root@master ~]#scp  all-2021-02-23.sql  10.0.0.112: 

 

 

从节点配置

#修改/etc/my.conf.d/mysql-server.conf文件

mysql mariadb在哪里 mysql8 mariadb_mysql mariadb在哪里_03

 

 

 

[root@slave1 ~]#vim /etc/my.conf.d/mysql-server.conf

[mysql]

server_id=3  

read_only       #从节点设置只读权限

 

#启动mysqld服务

[root@slave1 ~]#systemctl start mysqld

 

#打开all-2021-02-23.sql  文件找到change master to在后面加上如下内容

[root@slave1 ~]#vim  all-2021-02-23.sql  

MASTER_HOST='10.0.0.110',                #主节点的ip
MASTER_USER='repluser',      #用于主从复制的账户
MASTER_PASSWORD='123456',
MASTER_PORT=3306,

mysql mariadb在哪里 mysql8 mariadb_mysql mariadb在哪里_04

 

 

 

#用root账户连接mysql,执行如下命令

[root@slave1 ~]#mysql

mysql>select @@sql_log_bin;  #查看二进制日志功能开启状态,这里我们不希望导入过程记录在二进制日志中,故将其关闭

mysql>set  sql_log_bin=off ;

mysql>source   /root/ all-2021-02-23.sql  ;     #导入二进制日志文件

mysql>set  sql_log_bin=on;   #开启二进制日志功能

mysql> show slave status\G;                   #查看slave进程状态,如果未开启,就执行如下命令,

mysql> start slave;

mysql mariadb在哪里 mysql8 mariadb_mysql_05

 

 

 

 

 测试:在节点中,创建一个新数据库,然后在从节点中查看该库是否存在。

[root@master ~]#mysql 

mysql>create database db1

 

[root@slave1 ~]#mysql

mysql>show databases;

 

 

 

 

 

  

 

一如IT深似海,从此妹子是路人; 只要学不死,就往死里学;