1、主从复制介绍及原理
主从复制用于提高mysql数据的安全性。
主从复制是mysql架构的基石。
主从复制原理
1.在每个事务更新数据完成之前,master将这些改变记录进二进制日志。写入二进制日志完成后,master通知存储引擎提交事务。
2.slave将master的binary log复制到其中继日志(relay log)。首先,slave开始一个工作线程--i/o线程,i/o线程在master上打开一个普通的连接,然后开始binlog dump process。binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。i/o线程将这些时间写入中继日志。
3.sql slave thread(sql 从线程)处理该过程的最后一步。sql线程从中级日志读取事件,并重放其中的事件而更新slave数据,使其与master中的数据保持一致。只要该线程与i/o线程保持一致,中继日志通常会位于os的缓存中,所以中继日志的开销很小。复制过程有一个很重要的限制,即复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。
2、示范
mysql8.0主从复制
一、实验环境:
Euler101 master 关闭防火墙及selinux
Euler102 slave1 关闭防火墙及selinux
Euler103 slave2 关闭防火墙及selinux
systemctl stop firewalld
setenforce 0
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
二、101.102.103安装mysql8.0
tar zxf mysql-8.0.33-linux-glibc2.28-x86_64.tar.gz -C /usr/local/ # 解压到指定目录
cd /usr/local/ # 切换到解压目录
ls # 查看文件
mv mysql-8.0.33-linux-glibc2.28-x86_64/ mysql # 重命名文件夹
groupadd mysql # 创建运行组
useradd -M -s /sbin/nologin -g mysql mysql # 创建运行用户
/usr/local/mysql/bin/mysqld --initialize --user=mysql --
basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ # 初始化mysql,最后一行会生成随机密码 root@localhost: rfHhKaMEy6=%
注意:如果初始化失败,显示“No such ... directory” 说明缺少依赖包,用dnf -y install libaio安装即可。
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile #增加环境变量,在任何地方都可使用mysql
. /etc/profile # 重载环境变量
vim /etc/my.cnf # 编写启动文件
[mysqld]
basedir=/usr/local/mysql/ # 软件所在目录
datadir=/usr/local/mysql/data/ # 数据所在目录
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld #将mysql启动脚本复制到系统服务下命名为mysqld
vim /etc/init.d/mysqld
basedir=/usr/local/mysql/ # 添加内容
datadir=/usr/local/mysql/data/ # 添加内容
chmod +x /etc/init.d/mysqld # 给启动脚本执行权限
chkconfig --add mysqld # 增加系统服务mysqld
chkconfig mysqld on # 开机自启动系统服务mysqld
service mysqld start # 启动mysql
# 启动成功显示的信息
Starting MySQL.Logging to '/usr/local/mysql/data/localhost.localdomain.err'.
.. SUCCESS!
mysql -uroot -p # 使用上面生成的随机密码登录
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd123'; # 修改root密码为pwd123
mysql -uroot -ppwd123 # 登录验证,成功。
三、配置主从复制
101(主)
vim /etc/my.cnf
server-id=11 # 服务id
log-bin=master-bin # 日志文件名字为master
service mysqld restart # 重启mysql
/usr/local/mysql/data/ # 这里能看到master-bin.000001。
create user 'ooos'@'192.168.10.%' identified with mysql_native_password by '123456'; # 创建用户ooos,密码为123456
grant replication slave on *.* to 'ooos'@'192.168.10.%'; # 授予从复制权限
flush privileges; # 刷新权限
show master status; # 查看主状态
102、103(从1,从2)
vim /etc/my.cnf
server-id=22 # 服务id与主不同即可
service mysqld restart # 重启mysql
change master to master_host='192.168.10.101',master_port=3306,master_user='ooos',master_password='123456',master_log_file='master-bin.000001',master_log_pos=849; # 连接主
start slave; # 开启从
show slave status\G # 查看从状态
Slave_IO_Running: Yes # IO线程
Slave_SQL_Running: Yes # SQL线程
注意:如果IO线程显示为no,先停止从,再重载从,最后启动从就可以。
stop slave
reset slave
start slave
四、验证主从复制
主,从1,从2:
show databases # 查看数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
主:
create database ooos; # 创建数据库
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| ooos |
| performance_schema |
| sys |
+--------------------+
use ooos; # 使用数据库
create table t_user(id int,name varchar(20)); # 创建表t_user
insert into t_user values(1,'ooos'); # 插入数据'1','ooos'
select * from t_user; # 查询t_user数据
+------+------+
| id | name |
+------+------+
| 1 | ooos |
+------+------+
从1,从2:
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| ooos |
| performance_schema |
| sys |
+--------------------+
select * from ooos.t_user;
+------+------+
| id | name |
+------+------+
| 1 | ooos |
+------+------+