mysql在服务器中的主从复制Linux下
- 为什么要进行主从复制
- 主从复制的原理
- 主从复制执行流程
- 操作步骤
- 主库创建
- 从库创建
- 测试
为什么要进行主从复制
- 在业务中通常会有情况,在sql执行时,将表锁住,导致不能进行查询,这样就会影响业务的正常运行,这个时候可以使用主从复制,用主库负责写,用从库进行读,这样即使出现锁表的情况也不影响正常的业务。
- 主从复制可以进行数据的热备份,主库宕机后,从库可以切换,保证业务的正常执行。
- 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘的I\O,提高单个库的性能。
主从复制的原理
-
主数据库
MySQL主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。
binlog:主库中保存所有更新事件日志的二进制文件。binlog是数据库服务启动的一刻起,保存数据库所有变更记录(数据库结构和内容)的文件。
-
从数据库
在从库中,当复制开始时,从库就会创建从库I/O线程和从库的SQL线程进行复制处理。
从库I/O线程:当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。 从库I/O线程读取主库的binlog输出线程发送的更新并拷 贝这些更新到本地文件,其中包括relay log文件。
主从复制执行流程
- 主库db的更新事件(update、insert、delete)被写到binlog的日志中去
- 从库启动并发起连接,连接到主库
- 主库创建一个binlog dump thread,把binlog的内容发送到从库
- 从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
- 从库启动之后,创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db
此案例中规定主库端口号为3306,从库为3307
操作步骤
主库创建
在操作之前先安装docker(Linux中有);然后在docker中获取mysql8的镜像:
docker pull daocloud.io/library/mysql:8.0.16
查看mysql是否安装
docker images
创建环境目录
1、进入usr下的local下
cd /usr/local
2、创建mysql目录
mkdir mysql
3、进入mysql目录
cd mysql
4、创建master-data目录
mkdir ,aster-data
主mysql容器运行
mysql]# docker run --name mysql-master --privileged=true -v /usr/local/mysql/master-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d (docker image中的imageId) --character-set-server=utf8 --server-id=1 --lower_case_table_names=1
参数:
–privileged指定了当前容器是否真正的具有root权限
-p表示宿主机上的某个端口映射到docker容器内的某个端口
-d参数指定了当前容器是在后台运行
–server-id 设置服务器的编号,主从复制的每一个服务的编号都不能相同
配置mysql权限账户
docker exec -it mysql-master /bin/bash
登录主服务器mysql
mysql -uroot -p
注:此时密码为root
修改密码和设置从服务器登录用户
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
CREATE USER 'slave_one'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave_one'@'%';
查看主mysql的master节点的binlog状态
show master status;
至此主服务器搭建完毕,下面开始搭建从服务器
从库创建
创建环境目录
cd /usr/local/mysql
mkdir slave_one-data
从mysql容器运行
docker run --name mysql-slave_one --privileged=true -v /usr/local/mysql/slave_one-data:/var/lib/mysql -p 3307:3306 --link mysql-master:master -e MYSQL_ROOT_PASSWORD=root -d df8662dadd4f --character-set-server=utf8 --server-id=2 --lower_case_table_names=1
配置mysql权限账户
docker exec -it mysql-slave_one /bin/bash
登录从服务器mysql
mysql -uroot -p
注:密码为root
修改密码登录用户
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
切换当前服务的状态,使其能够连接上master服务器,并且复制其数据
change master to master_host='master', master_user='slave_one', master_password='123456', master_port=3306, master_log_file='binlog.000002', master_log_pos=1409, master_connect_retry=30;解释:
change master to master_host='master', master_user='slave_one', master_password='123456',
master_port=3306, master_log_file='master中binlog日志文件名', master_log_pos=master中binlog日志位置,
master_connect_retry=30;
启动日志同步
start slave;
查看状态
show slave status\G;
测试
在测试之前首先要保证服务器中的3306he3307的两个端口号防火墙开启
连接两个数据库
主数据库连接
从数据库连接
主库中的数据
从库不做任何库、表、数据的操作,刷新后有相同的数据
测试成功。