mysql在服务器中的主从复制Linux下

为什么要进行主从复制

  1. 在业务中通常会有情况,在sql执行时,将表锁住,导致不能进行查询,这样就会影响业务的正常运行,这个时候可以使用主从复制,用主库负责写,用从库进行读,这样即使出现锁表的情况也不影响正常的业务。
  2. 主从复制可以进行数据的热备份,主库宕机后,从库可以切换,保证业务的正常执行。
  3. 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘的I\O,提高单个库的性能。

主从复制的原理

  • 主数据库

    MySQL主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。

    binlog:主库中保存所有更新事件日志的二进制文件。binlog是数据库服务启动的一刻起,保存数据库所有变更记录(数据库结构和内容)的文件。

  • 从数据库

    在从库中,当复制开始时,从库就会创建从库I/O线程和从库的SQL线程进行复制处理。
    从库I/O线程:当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。 从库I/O线程读取主库的binlog输出线程发送的更新并拷 贝这些更新到本地文件,其中包括relay log文件。

主从复制执行流程

  1. 主库db的更新事件(update、insert、delete)被写到binlog的日志中去
  2. 从库启动并发起连接,连接到主库
  3. 主库创建一个binlog dump thread,把binlog的内容发送到从库
  4. 从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
  5. 从库启动之后,创建一个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的两个端口号防火墙开启

在这里插入图片描述

连接两个数据库

主数据库连接

在这里插入图片描述

从数据库连接

在这里插入图片描述

主库中的数据
在这里插入图片描述

从库不做任何库、表、数据的操作,刷新后有相同的数据

在这里插入图片描述
测试成功。

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值