Mysql5.7(Docker环境)实现主从复制

文章目录

  • 前言
  • 一、MySQL主从数据库同步如何实现?(理论)
    • 1.1 为什么要使用数据库主从
    • 1.2 数据库主从实现原理是什么?
  • 二、Docker环境配置MySQL5.7主从(实践)
    • 2.1 配置安装Master
    • 2.2 配置安装Slave


前言

本文章将以MySQL5.7版本来讲诉MySQL主从复制的原理以及在Docker环境中如何实现主从复制。


一、MySQL主从数据库同步如何实现?(理论)

想必大家知道要实现数据同步,那么肯定就是先建立通信,一台服务器上的系统去实时监听拉取另一个台服务器上系统的数据,拉取数据后进行存储,这就实现了数据实时同步。当然,我说的这个是最简单最基础的思路。但是想要实现数据同步,那么必不可少的就是建立通信,主动拉取或者被动推送这两种模式。

1.1 为什么要使用数据库主从

对于访问并发不高、使用人数不多的系统来说,使用主从确实没这个必要。但是如果对于并发量高、使用人数多的系统而言,主从可以大大提高系统性能,绝大多情况下一个系统读数据的操作占八成甚至九层,而数据库往往是一个系统的性能瓶颈,读操作很多,但是面临高并发的读取数据,I/O访问频率过高,那么效率必受影响。而如果使用数据库主从,主(master)可以负责写和查询,从(slave)只负责查询,那么对于高频发的读就可以很好的分摊到每个从(slave)数据库上。减轻主(master)数据库的I/O压力,更专注于写数据。也就是说读写分离,可以更好的支持更大的并发。除此之外,使用主从可以方便做数据的热备份,即使哪天master不小心挂点或者硬盘损坏导致整个服务器瘫痪,那么可以快速将服务切换到slave那台服务器。

1.2 数据库主从实现原理是什么?

主从的意思就是选择一个数据库作为master,然后剩余的数据库可以作为slave,主库(master)下面挂多个从库(slave),然后我们写数据时只往master写,master会把数据自动同步到slave库,slave只负责查询数据,不能直接操作slave写数据,写数据是由master同步负责,这种也叫做数据库的读写分离。
我们知道将数据写入数据库时,binlog日志会更新存储本次写操作,数据库的主从实现就是基于binlog日志来实现的。当有一条数据写入数据库时,master会将变更写入binlog日志,当slavemaster建立好连接以后,slave有一个I/O线程对masterbinlog进行拉取写入一个叫relay的中续日志中。这里简单介绍一下relay日志:

中续日志(relay)只会存在与slave服务器,slave服务器为了与master服务器数据保持一致,slave要从master读取二进制日志(binlog)文件,并且把读取到的信息写入到本地日志中,这个本地日志就叫relay日志,写入relay日志后,slave从中续日志中读取数据,根据中续日志中的内容对服务器的数据进行更新,完成主从服务器数据同步,中续日志就起到一个中间过渡作用,中继日志充当缓冲,这样master不必等待slave执行完成就可以发送下一个binlog
搭建好主从服务器之后,中继日志默认会保存在从服务器的数据目录(data)下。
文件名的格式是:从服务器名 - relay-bin.序号。中继日志还有一个索引文件:从服务器名 - relay-bin.index,用来定位当前正在使用的中继日志

在这里插入图片描述
这里要注意的是,slave同步master数据是串行化的,并不像master可以并行操作,也就是slaverelay读取数据进行执行SQL时,只能单条执行。那么高并发的时候,slave的数据就会比master慢一些。是有延时的。所以经常出现,刚写入主库的数据可能是读不到的,要过几十毫秒,甚至几百毫秒才能读取到,这里还有另外一个问题,就是如果主库突然宕机,然后恰好数据还没同步到从库,那么有些数据可能在从库上是没有的,有些数据可能就丢失了。此时就引入另一个点,就是MySQL的复制机制。
MySQL 有两个机制,一个是半同步复制,用来解决主库数据丢失问题,一个是并行复制,用来解决主从同步延时问题。

半同步复制(semi-sync):指的就是主库写入 binlog
日志之后,就会将强制此时立即将数据同步到从库,从库将日志写入自己本地的 relay log 之后,接着会返回一个 ack
给主库,主库接收到至少一个从库的 ack 之后才会认为写操作完成了。
并行复制:指的是从库开启多个线程,并行读取 relay log中不同库的日志,然后并行重放不同库的日志,这是库级别的并行。

二、Docker环境配置MySQL5.7主从(实践)

在实践时,请确保您的环境已经安装了Docker环境

1.查看docker是否时运行状态

systemctl docker status

在这里插入图片描述

2.拉取MySQL5.7版本镜像

docker pull mysql:5.7

在这里插入图片描述

3.查看MySQL5.7版本镜像

docker images

在这里插入图片描述

2.1 配置安装Master

在拉取完MySQL镜像后,需要创建master MySQL所需外部挂载文件,文件夹包括data(存放数据),logs(存放日志),conf(存放配置信息)。如果你对挂载还不熟,你可以参考Docker Volume 看这一篇就够了

登录Linux,在根目录建立一个data文件夹

cd /
mkdir data

在建立的data文件夹建立一个mysql-master文件夹,用于存储master MySQL的数据、日志、配置

cd /data
mkdir mysql-master
cd mysql-master
mkdir data
mkdir logs
mkdir conf
在这里插入图片描述

进入conf文件,然后新建一个文件,名字叫my.cnf,将以下信息复制到文件里:

[mysql]
#mysql以socket方式运行时的sock文件路径
socket=/var/lib/mysql/mysqld.sock
[mysqld]
#lower_case_table_names=0,表示区分大小写,创建的库表会原样大小写保存在磁盘上
#lower_case_table_names=1,表示不区分大小写,创建库表时MySQL会将所有的库表名转换成小写字母保存在磁盘上
#,且SQL语句中涉及到库表无论写成大写或者小写,都会被转化成小写进行查询和写入
lower_case_table_names=1
#mysql运行的端口
port=3306
#mysql5.7以后的不兼容问题处理
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#打开log-bin日志
log-bin=mysql-bin
#存放数据的路径
datadir=/var/lib/mysql
#mysql以socket方式运行时的sock文件路径
socket=/var/lib/mysql/mysqld.sock
#是否支持符号连接,即数据库或表能够存储在my.cnf
#中指定datadir以外的分区或目录,为0不开启
symbolic-links=0
#mysql服务器分配的ID,在启用主从和集群的时候必须指定,并且不能重复
server-id = 1
#要给从机同步的库
#binlog-do-db=hl
#不给从机同步的库(这里不同步mysql、information_schema、performance_schema、sys库)
#binlog-ignore-db=mysql
#binlog-ignore-db=information_schema
#binlog-ignore-db=performance_schema
#binlog-ignore-db=sys
#mysql允许最大连接数
max_connections=2000
#默认字符集
character-set-server=utf8
#默认存储引擎
default-storage-engine=INNODB
#mysql最大接受的数据包大小
max_allowed_packet=16M
#日志自动过时清理天数
expire_logs_days = 90
# 事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败;参数的时间单位是秒
innodb_lock_wait_timeout=120
#设置时区
default-time_zone='+8:00'
[mysqld_safe]
#进程ID文件
pid-file=/data/var/mysql/mysqld.pid
#错误日志纪录位置  
log-error=/var/log/mysqld.log

配置中启动了log-bin这个配置,该配置会让MySQL开启写二进制日志功能,以便于salve读取该日志进行数据同步。binlog-do-db配置用于指定需要同步的库,如果不写,默认为同步全部库。binlog-ignore-db配置用于指定忽略哪些库不同步。请注意server-id这个配置,在进行主从的时候,这个值不能重复,也就是masterslave不用配置相同的server-idsocket配置用于指定sock文件路径。关于更多配置信息解释,可以参看MySQL5.7配置项最详细的解释

此时Master所需的挂载和配置就已经完成,只需要使用命令启动容器即可:

docker run --name=mysql-master -p 3306:3306 --privileged=true  -v /etc/localtime:/etc/localtime \
-v /data/mysql-master/logs:/logs  \
-v /data/mysql-master/data:/var/lib/mysql \
-v /data/mysql-master/conf/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
-e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
参数解析
- -name指定容器的别名
- p端口映射,[宿主端口:容器端口],当访问主机的3306端口时,会自动映射到容器里的3306端口
- -v容器挂载点,[挂载宿主目录:容器目录],用于容器内部的文件与宿主的文件互通
- -e向容器设置环境变量,这里设置MySQL的密码为root

在这里插入图片描述
此时master就已经安装好,可以通过docker ps查看master容器是否已经运行
在这里插入图片描述
可以看到已经运行启动了,此时进入master容器中,尝试登录MySQL,注意containerId是随机生成的,比如上图我的MySQ的容器ID为715a47510c72,你需要根据自己的ID进行输入

docker exec -it containerId  bash

此时已经进入到M有SQL容器中
在这里插入图片描述
尝试登录MySQL,输入一下命令,然后输入密码成功登录:

mysql -uroot -p

在这里插入图片描述
此时表明数据库已经安装成功,可以选择使用Navicat连接数据库。创建一个用户,用于slave使用该用户连接master建立通信,从而实时拉取bin-log日志。如果你对MySQL用户权限管理还不熟悉,你可以参考Mysql用户权限分配详解

CREATE USER 'slave'@'%' IDENTIFIED BY 'root';

创建完账号后,给该账号赋予权限,并刷新权限

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;

在这里插入图片描述

参数解释
REPLICATION SLAVE拥有此权限可以查看从服务器,从主服务器读取二进制日志
REPLICATION CLIENT拥有此权限可以查询master server、slave server状态

使用SHOW MASTER STATUS查看MySQL master状态:

SHOW MASTER STATUS;

在这里插入图片描述

参数解析
file指定是当前log-bin日志文件,每次安装可能都不一样
Position数据同步的位置
Binlog-Do_DB要同步数据的数据库,默认为空,表示全部同步
Binlog-Ignore_DB忽略不同步的库,默认为空,表示都不忽略

master安装到此结束,现在等待slave来连接进行通信,同步数据。

2.2 配置安装Slave

如果你已经安装完成master,那么slave的安装就没什么问题了。操作与master几乎一致。因为我只有一台服务器,所以我将master和slave都安装到这个服务器上,如果你有多台服务器,你可以将master与slave分开安装
一样的步骤,在根目录下建立data文件夹,进入data文件夹,建立mysql-slave文件夹,进入mysql-slave文件夹创建三个文件夹,分别是conf、data、logs。
在这里插入图片描述

进入conf文件夹,建立一个叫my.cnf的文件,将一下内容复制到文件中并保存:

[mysql]
#mysql以socket方式运行时的sock文件路径
socket=/var/lib/mysql/mysqld.sock
[mysqld]
#lower_case_table_names=0,表示区分大小写,创建的库表会原样大小写保存在磁盘上
#lower_case_table_names=1,表示不区分大小写,创建库表时MySQL会将所有的库表名转换成小写字母保存在磁盘上
#,且SQL语句中涉及到库表无论写成大写或者小写,都会被转化成小写进行查询和写入
lower_case_table_names=1
#mysql运行的端口
port=3306
#mysql5.7以后的不兼容问题处理
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#打开log-bin日志
#log-bin=mysql-bin
#存放数据的路径
datadir=/var/lib/mysql
#mysql以socket方式运行时的sock文件路径
socket=/var/lib/mysql/mysqld.sock
#是否支持符号连接,即数据库或表能够存储在my.cnf
#中指定datadir以外的分区或目录,为0不开启
symbolic-links=0
#mysql服务器分配的ID,在启用主从和集群的时候必须指定,并且不能重复
server-id = 2
#要给从机同步的库
#binlog-do-db=hl
#不给从机同步的库(这里不同步mysql、information_schema、performance_schema、sys库)
#binlog-ignore-db=mysql
#binlog-ignore-db=information_schema
#binlog-ignore-db=performance_schema
#binlog-ignore-db=sys
#mysql允许最大连接数
max_connections=2000
#默认字符集
character-set-server=utf8
#默认存储引擎
default-storage-engine=INNODB
#mysql最大接受的数据包大小
max_allowed_packet=16M
#日志自动过时清理天数
expire_logs_days = 90
# 事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败;参数的时间单位是秒
innodb_lock_wait_timeout=120
#设置时区
default-time_zone='+8:00'
[mysqld_safe]
#进程ID文件
pid-file=/data/var/mysql/mysqld.pid
#错误日志纪录位置  
log-error=/var/log/mysqld.log

该文件内容与master的几乎一致,只是把log-bin配置关闭,因为slave不需要开启binlog日志,server-id值改为与master不一致的就行.

启动slave数据库:

docker run --name=mysql-slave -p 3307:3306 --privileged=true \
-v /etc/localtime:/etc/localtime \
-v /data/mysql-slave/logs:/logs  \
-v /data/mysql-slave/data:/var/lib/mysql \
-v /data/mysql-slave/conf/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
-e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

这里我为什么使用3307端口,因为我的master和slave安在同一台服务器上,3306已经被master占用,如果你是分开安装,那么建议还是使用3306端口
安装完成后,进入slave数据库,建立主从关系:

CHANGE MASTER TO master_host = '124.71.8.46',\
master_user = 'slave',\
master_password = 'root',\
master_port = 3306,\
master_log_file = 'mysql-bin.000001',\
master_log_pos = 154,\
master_connect_retry = 30;
参数解析
master_hostmaster主机地址
master_user主从连接的用户名
master_password主从连接的密码
master_hostmaster的端口
master_log_filemaster的bin-log文件
master_log_posmaster数据同步的位置

master_log_file和master_log_pos可以在master上输入SHOW MASTER STATUS;指令查询到,这个两个参数必须与master上一致。
在这里插入图片描述
使用 START SLAVE启动slave功能:

START SLAVE;

查看slave状态,SHOW SLAVE STATUS;

SHOW SLAVE STATUS;

在这里插入图片描述
看到Slave_IO_State显示Waiting for master to send event表示主从已经建立成功,此时MySQL主从配置到此完毕。

在master新建一个数据库test,刷新slave后发现,slave已经同步完成。代表主从数据同步成功
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/76271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】UDP数据包是如何在网络中传输的?

List item 创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多计算机网络知识专栏&#xff1a;计算机网络&#x1f525;…

【uni-app】

准备工作&#xff08;Hbuilder&#xff09; 1.下载hbuilder&#xff0c;插件使用Vue3的uni-app项目 2.需要安装编译器 3.下载微信开发者工具 4.点击运行->微信开发者工具 5.打开微信开发者工具的服务端口 效果图 准备工作&#xff08;VScode&#xff09; 插件 uni-cr…

Android窗口层级(Window Type)分析

前言 Android的窗口Window分为三种类型&#xff1a; 应用Window&#xff0c;比如Activity、Dialog&#xff1b;子Window&#xff0c;比如PopupWindow&#xff1b;系统Window&#xff0c;比如Toast、系统状态栏、导航栏等等。 应用Window的Z-Ordered最低&#xff0c;就是在系…

Codeforces Round 827 (Div. 4) D 1e5+双重for循环技巧

Codeforces Round 827 (Div. 4) D 做题链接&#xff1a;Codeforces Round 827 (Div. 4) 给定一个由 n个正整数 a1,a2,…,an&#xff08;1≤ai≤1000&#xff09;组成的数组。求ij的最大值&#xff0c;使得ai和aj共质&#xff0c;否则−1&#xff0c;如果不存在这样的i&#…

Jetsonnano B01 笔记3:GPIO上拉下拉-输入输出读取

今日继续我的jetsonnano学习之路&#xff0c;今日学习的是GPIO的上拉下拉&#xff0c;输入输出的读取&#xff0c;文章贴出完整操作步骤过程&#xff0c;贴出源码。 目录 Linux常用文件命令&#xff1a; ls&#xff08;list&#xff09;列表&#xff1a; man&#xff1a; …

页面页脚部分CSS分享

先看效果&#xff1a; CSS部分&#xff1a;&#xff08;查看更多&#xff09; <style>body {display: grid;grid-template-rows: 1fr 10rem auto;grid-template-areas: "main" "." "footer";overflow-x: hidden;background: #F5F7FA;min…

【微服务】五. Nacos服务注册

Nacos服务注册 5.1 Nacos服务分级存储模型Nacos服务分级存储模型&#xff1a;服务集群属性&#xff1a;总结&#xff1a; 5.2 根据集群负载均衡总结 5.3 Nacos服务实例的权重设置总结&#xff1a; 5.6 环境隔离namespace总结 5.7 Nacos和Eureka的对比总结 5.1 Nacos服务分级存储…

科技云报道:AI时代,对构建云安全提出了哪些新要求?

科技云报道原创。 随着企业上云的提速&#xff0c;一系列云安全问题也逐渐暴露出来&#xff0c;云安全问题得到重视&#xff0c;市场不断扩大。 Gartner 发布“2022 年中国 ICT 技术成熟度曲线”显示&#xff0c;云安全已处于技术萌芽期高点&#xff0c;预期在2-5年内有望达到…

Material Design系列探究之LinearLayoutCompat

谷歌Material Design推出了许多非常好用的控件&#xff0c;所以我决定写一个专题来讲述MaterialDesign&#xff0c;今天带来Material Design系列的第一弹 LinearLayoutCompat。 以前要在LinearLayout布局之间的子View之间添加分割线&#xff0c;还需要自己去自定义控件进行添加…

自动驾驶多任务框架Hybridnets——同时处理车辆检测、可驾驶区域分割、车道线分割模型部署(C++/Python)

一、多感知任务 在移动机器人的感知系统&#xff0c;包括自动驾驶汽车和无人机&#xff0c;会使用多种传感器来获取关键信息&#xff0c;从而实现对环境的感知和物体检测。这些传感器包括相机、激光雷达、雷达、惯性测量单元&#xff08;IMU&#xff09;、全球导航卫星系统&am…

SpringCloud(二)

1.Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理方案&#…

NIFI实现数据库数据增量同步

说明 nifi版本&#xff1a;1.23.2&#xff08;docker镜像&#xff09; 需求背景 将数据库中的数据同步到另一个数据库中&#xff0c;要求对于新增的数据和历史有修改的数据进行增量同步 模拟数据 建表语句 源数据库和目标数据库结构要保持一致&#xff0c;这样可以避免后…

固定资产管理数据怎么算?

在企业的运营中&#xff0c;固定资产的管理是一个至关重要的环节。然而&#xff0c;对于许多企业来说&#xff0c;理解和管理这些资产的数据却常常是一团迷雾。那么&#xff0c;固定资产管理数据究竟应该如何计算呢&#xff1f;这是一个需要我们深入探讨的问题。  我们需要明…

MySQL——命令行客户端的字符集问题

原因&#xff1a;服务器端认为你的客户端的字符集是utf-8&#xff0c;而实际上你的客户端的字符集是GBK。 查看所有字符集&#xff1a;SHOW VARIABLES LIKE character_set_%; 解决方案&#xff0c;设置当前连接的客户端字符集 “SET NAMES GBK;”

Android12之/proc/pid/status参数含义(一百六十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

php://filter协议在任意文件读取漏洞(附例题)

php://filter php://fiter 中文叫 元器封装&#xff0c;咱也不知道为什么这么翻译&#xff0c;目前我的理解是可以通过这个玩意对上面提到的php IO流进行处理&#xff0c;及现在可以对php的 IO流进行一定操作。 过滤器&#xff1a;及通过php://filter 对php 的IO流进行的具体…

微服务之流控、容错组件sentinel

背景 2012年阿里巴巴研发的流量治理组件&#xff0c;核心功能流控、容错 有什么功能 流量控制 流量控制 网关控制 黑白名单 熔断降级 熔断 保护分布式系统防止因为调用下有服务时产生故障或者请求超时等异常影响上游服务&#xff0c;使用熔断方案&#xff0c;类似断路器…

T2I-Adapter:增强文本到图像生成的控制能力

链接&#xff1a;GitHub - TencentARC/T2I-Adapter: T2I-Adapter 文本到图像生成 (T2I) 是人工智能领域的一个重要研究方向。近年来&#xff0c;随着深度学习技术的发展&#xff0c;T2I 技术取得了显著进展&#xff0c;生成的图像在视觉效果上已经与真实图像难以区分。 然而&…

ILS解析漏洞复现

搭建好ILS后&#xff0c;访问127.0.0.1:8000 写一个phpinfo的脚本 可以看到。现在是不能访问的 赋予 IIS 解析 phpinfo 能力 打开服务器管理器&#xff0c;打开 IIS 管理器 点击处理程序映射 再次访问&#xff0c;发现程序可以访问 将index.php改为index.png 此时php脚本自然是…

【pdf密码】如何限制他人对PDF文件编辑?

制作好的PDF文件&#xff0c;先要设置一个密码防止他人对文件进行编辑&#xff0c;那么我们可以对PDF文件设置限制编辑&#xff0c;设置方法很简单&#xff0c;我们在PDF编辑器中点击文件 – 属性 – 安全&#xff0c;在权限下拉框中选中【密码保护】 然后在密码保护界面中&…