1.主从复制:就是建立一个和主数据库完全一样的数据库环境,该新建的数据库成为从数据库。
2.复制的作用:
数据分布存放:随着业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘的频率,提供IO性能。
负载均衡读写操作:读写分类,使数据库能支撑更大的高并发
备份:主数据库做热备,作为后备数据库
高可用和故障切换
升级测试
3.主从复制原理图:(所谓主从复制,都是基于二进制数据日志事件完成)
过程分析: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;
创建备份,将生成的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文件
[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,
#用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;
测试:在节点中,创建一个新数据库,然后在从节点中查看该库是否存在。
[root@master ~]#mysql
mysql>create database db1
[root@slave1 ~]#mysql
mysql>show databases;
一如IT深似海,从此妹子是路人; 只要学不死,就往死里学;