Java开发 - MySQL主从复制初体验

APP爬虫:Airtest的使用和爬取实战详解 Airtest是一个跨平台的自动化测试工具,主要用于移动应用和游戏的UI自动化测试。它支持图像识别、触摸操作、文本输入等功能,能够模拟真实用户的操作行为。此外,Airtest还具备强大的日志记录和报告生成功能,方便开发者进行调试和分析。图像识别:通过截图匹配元素,无需依赖 UI 层次结构。跨平台支持:支持 Android、iOS 和 Windows 应用。简单易用:提供 IDE 和脚本录制功能,降低使用门槛。 阅读详情

前言

前面已经学到了很多知识,大部分也都是偏向于应用方面,在应用实战这条路上,博主一直觉得只有实战才是学习中最快的方式。今天带来主从复制给大家,在刚刚开始动手写的时候,才想到似乎忽略了一些重要的东西,不过还好,既然想到了,就会在本文中体现出来,争取让大家学完之后明白主从复制的原理和怎么去做主从复制。

什么是主从复制

MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的 二进制日志 功能。就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制,然后再解析日志并应用到自身,最终实现 从库 的数据和 主库 的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。

​二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复起着极其重要的作用,MySQL的主从复制, 就是通过该binlog实现的。默认MySQL是未开启该日志的。

主从复制分为三步完成:

  • MySQL master 将数据变更的SQL语句写入二进制日志( binary log)
  • slave将master的binary log拷贝到它的中继日志(relay log),说是拷贝,其实是读取过来,也可以理解成拷贝,内容拷贝
  • slave读取中继日志中的事件,将数据变更反映它自己的数据库中

Docker模拟多服务器准备

博主没有办法在真正的两台云端服务器上给大家做演示,所以就在本地给大家模拟一下做法,有虚拟机的使用虚拟机复制出来一个使用,没有虚拟机的可以使用Docker来模拟。

使用Docker模拟时,需要创建两个mysql的容器:

Master(主):

docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql

Slave(从):

docker run -p 3309:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql

博主没有指定版本,因为博主Image内已经存在一个最新的版本,如果使用的版本略低,可手动指定: 

docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:x.x.x

这里需要说明一下端口,由于非生产环境,本地模拟时,端口需要映射,不能全都用3306,所以slave中映射了3309,否则容器启动会因为端口冲突报错。

此时在Docker内,已经有两个运行中的mysql了:

docker ps可以查看运行中的容器:

配置数据库主从

配置Master

docker exec -it 8e46c78ba828 /bin/bash

输入上面的命令,进入master容器内部,8e46c78ba828是容器id,也可以使用容器名mysql进入:

docker exec -it mysql /bin/bash

输入:

cd /etc/mysql

进入mysql的配置文件目录下,对my.cnf进行编辑:

vi my.cnf

正常是会报错的,会提示:

bash: vi: command not found

需要我们在docker内安装vim,这个我们在前面的博客中有提到,为了方便,此处再写一下解决步骤:

输入

apt-get install vim

提示:

Reading package lists... Done

Building dependency tree       

Reading state information... Done

E: Unable to locate package vim

输入

apt-get update

 

然后输入

apt-get install vim

等待vim安装完成即可。

注意里面会有一个提示,输入Y。安装过程可能会有点慢,稍安勿躁。

安装完成,此时再输入以下命令:

vi my.cnf

在最下面增加配置:

log-bin=mysql-bin   #[必须]启用二进制日志
server-id=100       #[必须]服务器唯一ID(唯一即可)

然后退出保存即可。下面要重启mysql服务,让配置生效:

你可以选择使用命令行

service mysql restart

甚至你还需要重启mysql容器:

docker start mysql

但博主这里偷懒,直接在docker内部重启mysql容器,哈哈!!!

特别注意:你目前所在的文件夹是:root@8e46c78ba828:/etc/mysql

你需要通过两次cd ..回到顶端目录,然后使用:

mysql -uroot -pxxxx

u后面跟账号,p后面跟密码,登录到mysql内:

以上启动sql的命令运行在root@8e46c78ba828:/etc/mysql目录下是不行的,需要你退出docker容器运行才可以,这个是常识哈,我当大家都知道的。

下一步在Master数据库创建数据同步用户,授予slave的访问用户,比如slave,授权 REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据,分两步完成:

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

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

到这里,主库的配置就算是完成了,你可以输入:

show master status;

 来查看主库的状态:此时主库什么都不要动,这里的File和Position我们后面有用。

配置Salva

接下来我们来配置从库,整体步骤和主库差不多,但是为了让大家不出错,这里还是一步步带着大家操作。

首先新开一个终端窗口:

docker exec -it e2476006aeb4 /bin/bash

输入上面的命令,进入slave容器内部,e2476006aeb4是容器id,也可以使用容器名mysql-slave进入:

docker exec -it mysql-slave /bin/bash

输入:

cd /etc/mysql

进入mysql的配置文件目录下,对my.cnf进行编辑:

vi my.cnf

不出意外的又报错了,还是和主库一样,这是因为两个容器互不相关,所以还需要在此容器安装vim,步骤一样,大家照着上面来。

安装完成,此时再输入以下命令:

vi my.cnf

在最下面增加配置:

log-bin=mysql-bin   #[必须]启用二进制日志
server-id=101       #[必须]服务器唯一ID(唯一即可)

然后退出保存即可。下面要重启mysql服务和容器,让配置生效。这里注意,id变了,主库是100,此处是101。

关联主从数据库

进入从数据库中,登陆了从数据库,执行以下命令,设置主库地址及同步位置:

change master to master_host='172.17.0.2',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=721;

来解释下这里的数据来源。

ip通过以下命令获得:

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器id/容器名

master_log_file='mysql-bin.000001',master_log_pos=721;还记得我们通过show master status获得的表格吗?

看看数据对不对的上。

然后执行:

start slave;

为了验证主从关联是否完成,在从库Slave中输入以下命令:

show slave status \G;

\G是因为让显示是一行一行的,否则表格太长,无法直观的看到想要的信息。 

查看SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。

 此时,SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,查看错误:

error connecting to master 'slave@172.17.0.2:3306' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

提示我们授权有问题,详情可查看此篇博客:Authentication plugin 'caching_sha2_password' reported error:Authentication..我们采用这篇博客说的第三种办法去解决这个问题,避免使用caching_sha2_password插件,所以我们需要重新创建一个用户:

CREATE USER 'repl'@'%' IDENTIFIED WITH 'mysql_native_password' BY '123456';

前面做的时候没有做远程授权,也会报错,所以这里加上了授权远程访问的权限: 

GRANT ALL PRIVILEGES ON *.* TO 'repl'@'%'  WITH GRANT OPTION;

我们查看下数据库中用户的列表:

一定要有远程访问的权限才可以,Grant_priv就是,虽然slave用户也授权了远程权限,但是使用了caching_sha2_password,也不可用,所以才新建了repl用户。接着,我们要查看主库的状态,重新获取关键信息:

show master status;

查看主库状态:

发现原来的 721变了,File的文件后缀名也变为02了。这里要注意,一定要用新的,到这里,主库千万不要再去动了,否则会出别的问题。

下面在从库重新关联主从,在这之前,需要先停止slave:

stop slave;
reset slave;

然后执行此命令关联:

change master to master_host='172.17.0.2',master_user='repl',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=2819;

注意参数改为2819,接着启动slave:

start slave;

 查看关联状态:

show slave status \G;

看到两个YES,就说明主从已经配置好了。  

关于mysql的授权相关命令,推荐一篇博客给大家:MySql 授权命令grant

测试主从

我们在使用Docker内部IP访问数据库的时候发现无法连接,这是因为这个IP是docker内部id,博主查了很多资料,都没有很好的解决这个问题,但是,也看到了一些说法:

如何访问docker容器ip-Docker-PHP中文网

根据这篇博客,最终得到的结论就是,虽然无法直接访问docker内部ip,但是我们已经通过端口映射到了localhost的端口上,所以,可以把docker内部ip地址换成主机地址,也可以直接用localhost,port使用映射的端口就可以。

还有另一篇博客:

 解决docker宿主机不能访问容器的问题_docker宿主机访问不到容器 

这篇博客提出在创建容器的时候,容器与宿主机共享同一个网卡,不过博主没有重新创建容器,有兴趣的小伙伴自行尝试。 

此时我们通过localhost链接主从数据库,由于主数据库源本来就存在其他的数据库,从库是新的,连接上之后,完全没有问题,俩数据库绝对是完全不一样的,我们使用localhost的做法也是正确的,这位我们测试主从提供了良好的环境。

下面开始测试,在主数据库创建数据库,并创建新表:

create database if not exists master_slave character set utf8;
use master_slave;
CREATE TABLE user (
            id bigint(20) primary key auto_increment,
            username varchar(32) not null,
            password  varchar(32) not null,
            age int(3) not null ,
            phone varchar(32) not null
)

 此时用户表已经创建完毕,我们去从库看一下这个表有没有被创建出来:

从库里面已经出现了数据库和用户表,非常棒,主从完美啊,我们在主库用户表添加点数据看看: 

insert into user value(null ,'codingfire','123456',20,'13812345678');

查看主库表:

用户信息已经插入,切换到从库查看:

从库也有了,主从复制测试成功。删除修改大家可以自行测试。 

注意:细心点,你会发现页面左上角的数据库连接对象是不一样的,所以这里连接docker使用localhost是完全没有问题的。另外,如果docker异常关机等,导致同步的游标出现错乱,需要重新配置日志游标:

stop slave;
change master to master_log_file='mysql-bin.00000x', master_log_pos=xxxx;
start slave;

结语

总的来说,mysql的主从还是没那么复杂的,没有代码操作,全都是配置,在真实的服务器上,配置也基本都是这样,这里学会了,真实的服务器也不在话下。虽然主从复制写完了,但是关于主从的只是只是还没有结束,因为还没在项目中引入主从的使用,下一篇,我们将学习主从在项目中的使用——读写分离。觉得不错,就给博主个赞吧。

Access查询中的Dlookup函数的妙用 在Microsoft Access中,处理和分析数据的过程中,常常会遇到需要根据条件从其他记录中提取特定数据的情况。这时候,Dlookup函数就成了开发者和数据分析师的得力助手。今天我们将通过一个具体的实例,详细探讨如何利用Dlookup函数来解决复杂的查询问题。 阅读详情

相关推荐

Fluent新手必看:如何正确解读scaled residuals曲线(附常见问题排查)

本文详细解析了Fluent中scaled residuals曲线的解读方法及常见问题排查技巧。针对continuity残差居高不下、湍流模型收敛困难等典型问题,提供了网格质量检查、边界条件验证和求解策略调整的实用解决方案,帮助CFD新手快速掌握计算收敛性的关键判断标准。

weixin_28698059的博客 379

数据库主从

一.什么是数据库主从分离 主从基本原理 其实就是将数据库分为了主从库,一个主库用于写数据,多个从库完成读数据的操作,主从库之间通过某种机制进行数据的同步,是一种常见的数据库架构。 一个组从同步集群,通常被称为是一个“分组”。 主从数据库的区别 从数据库(Slave)是主数据库的备份,当主数据库(Master)变化时从数据库要更新,这些数据库软件可以设计更新周期。这是提高信息安全的手段。主从数据库...

weixin_45581618的博客 8526

一个大屏掌握港口全部信息的数字孪生技术

智慧港口就是通过整合港口全部数据,将数据通过iot设备与大屏连接,再通过自研3D渲染引擎模拟港口全貌,打造智慧港口大屏,整个系统分为四个模块,分别为港口概览、环境监测、设备运维和安防管理,各个模块独立运行,分别展示港口不同信息,各个模块的数据通过山海鲸内置数据源接口与港口管理系统进行对接。数据源支持实时刷新,模块内容支持自定义修改和定制化开发。接下来带大家详细了解一下各模块情况。

m0_69539341的博客 3064

Mysql 数据库 主从数据库 (主从)(主主)

一、什么是主从数据库 主从数据库就是把数据库架构分为主数据库和从数据库。从数据库是主数据库的备份,以提高数据的安全性,不至于一个数据库崩掉而导致整个项目也运行不起来。可以有效的防止财产的损失。一般从库只做查询操作,而主库则做更改操作,也就是所谓的读写分离。 二、什么是主主数据库 所谓的主主,其实也就是两个数据库互为主从。两个库都可以对数据库进行更改和读写操作,个人感觉是主从数据库的进化版,更加的实用,但是不足之处就是,如果有自增主键的话,很大可以会产生主键冲突,所以就需要一定的算法进行改进。 三

qq_53840970的博客 1万+

Robocup 仿真2D 学习笔记(二) 球队代码编译和上场

环境的一些问题 最近在使用rcssserver 和 rcssmonitor时可能会遇到./configure失败的问题,可以检查一下文件夹是否有makefile文件,如果是编译后的包直接sudo make install,如果还不行,还可以源码下载编译 rcssserver: https://sourceforge.net/projects/sserver/files/rcssserver/...

markchalse的博客 6015

基于ADS的低噪声放大电路设计

1. 低噪声放大器设计理论基础 1.1 低噪声放大器在通信系统中的作用 低噪声放大器的主要作用是放大天线从空中接收到的微弱信号,减小噪声干扰,以供系统解调出所需的信息数据。当今,人们对于各种无线通信工具的要求越来越高,如功率辐射要小、作用距离要远、覆盖范围要广等,这就对系统的接收灵敏度提出了更高的要求,系统接收灵敏度的计算公式为: Smin⁡=−144(dBmHz)+NF+10lg⁡BW(MHz)+SN(dB) {S_{\min }} = - 144\left( {\frac{{{\rm{dBm}}}}{

ASH_GUARDIAN的博客 4万+

MySQL主从模式的详解

MySQL主从模式是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,从节点可以复制主数据库中的所有数据库,或者特定的数据库,或者特定的表。今天的内容,跟 V 哥一起来聊聊主从复制的那些事。包括主从复制原理、并行复制和读写分离相关内容。实时灾备,用于故障切换(高可用)读写分离,提供查询服务(读扩展)数据备份,避免影响业务(高可用)从库服务器能连通主库主库开启binlog日志(设置log-bin参数)

zybiao2的专栏 1500

BGE-Reranker-v2-M3介绍

重排序模型介绍

吉米_王 5898

MySQL 主从复制

MySQL异步复制并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从库上。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。半同步复制介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relaylog中才返回给客户端。对于需要强一致的场景,将其读请求都操作主库,这样「读写都在主库」,就没有不一致的情况。

name_sakura的博客 529

YOLOv8的Anchor-Free革新:从中心点预测到动态IoU匹配的全面解析

本文深入解析了YOLOv8采用Anchor-Free(无锚框)设计的核心优势与实现机制。通过摒弃预设锚框,模型直接预测目标中心点与宽高,结合解耦头、动态IoU匹配及Varifocal Loss等创新,显著简化了训练流程并提升了检测精度,尤其在小目标检测和模型泛化能力上表现突出。

weixin_29094301的博客 358

十分钟搞定! DeepSeek本地部署详细指南!

保姆级教程,三步搞定deepseek本地部署,不求人!

一个喜欢诗和远方的程序媛 4348

java特种兵读书笔记(6-2)——数据库之主从

主从同步与备份 一套主从库通常会有一个可写的主库(也有双主互备结构的),可写的主库发生数据修改之后,可能会以推的方式发送到从库,或者从库轮询从主库上拉修改的数据。 ① 逻辑模式 基于主库执行的SQL,到从库上去执行相同的SQL,也可能基于主库上执行的SQL时所影响的数据行,进一步根据这些行的主键生成一些列SQL语句到从库上执行。这种粒度最细,最容易识别,但是生成的SQL会比较

xxcupid的博客 560

Dify智能体开发:发布嵌入网站

Dify 支持将你的 AI 应用嵌入到业务网站中,你可以使用该能力在几分钟内制作具有业务数据的官网 AI 客服、业务知识问答等应用。点击 WebApp 卡片上的嵌入按钮,复制嵌入代码,粘贴到你网站的目标位置。

王国平的博客 3246

MySQL主从复制

一、MySQL主从复制原理 在实际的生产中,为了解决Mysql的单点故障已经提高MySQL的整体服务性能,一般都会采用「主从复制」。 比如:在复杂的业务系统中,有一句sql执行后导致锁表,并且这条sql的的执行时间有比较长,那么此sql执行的期间导致服务不可用,这样就会严重影响用户的体验度。 主从复制中分为「主服务器(master)「和」从服务器(slave)」,「主服务器负责写,而从服务器负责读」,Mysql的主从复制的过程是一个「异步的过程」。 这样读写分离的过程能够是整体的服务性能提高,即使写操作时间

m0_62473957的博客 2万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java大佬必知必会——MySQL主从复制

如果你现在有两台MySQL,一台版本是03年的MySQL5.0,另一台是18年的MySQL8.0.11。新版本可以作为老版本的从服务器,但反过来是不可行的。如果二进制文件包含了已存在的数据,就会造成数据重复了。如果从服务器复制该二进制文件后的数据库状态是混乱无序的,那整个复制的过程就没有意义了。如果主、从服务器存储数据的顺序不一样,就会导致每次执行删除的数据都是不同的。,老版本可能无法解析新版本的新特性,甚至复制的文件格式都差异太大。MySQL从库只会复制它本身缺失的最新数据,利用二进制文件里的。

JavaSouth南哥 3077

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Docker实现MySQL主从复制

1)、mysql主从复制用途实时灾备,用于故障切换读写分离,提供查询服务备份,避免影响业务主库开启binlog日志(设置log-bin参数)主从server-id不同从库服务器能连通主库使用docker起两个mysql容器进行主从复制的整个过程就是这样子了,希望能够给大家带来帮助Docker实现Mysql 主从复制实战)下一篇:docker启动redis。

仰望天空,妳我亦是行人. 4552

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

MySQL主从复制与读写分离

目录一、MySQL 主从复制原理1、MySQL 支持的复制类型2、MySQL主从复制的工作过程 前言 在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。 一、MySQL 主从复制原理 1、MySQL 支持的复制类

零下二度的博客 3316

java主从复制

主从复制是一种常见的数据库数据同步技术,可以提高数据库的高可用性、负载均衡和灾难恢复能力。在 Java 开发中,主从复制(Master-Slave Replication)通常指的是数据库中的一种数据复制机制,用于实现数据的高可用性、负载均衡以及故障恢复。主从复制可以确保数据在多个数据库实例之间保持一致,通常应用于 MySQL、PostgreSQL 等关系型数据库。

Flying_Fish_roe的博客 985

Mysql主从复制

Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。使用Sharding-JDBC可以在程序中轻松的实现数据库读写分离。● 适用于任何基于JDBC的ORM框架,如:JPA,Hibernate,Mybatis,Spring JDBC Template或直接使用JDBC。

2401_88481074的博客 977

Mysql 主从复制与读写分离

在实际的生产环境中,如果对MySQL数据库的读和写都在一台数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是不能满足实际需求的。本章将首先讲解MySQL主从复制和MySQL 读写分离的原理,然后介绍如何配置MySQL主从复制和MySQL 读写分离。

xiazhui1的博客 1462

Java开发 - 读写分离初体验

Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。

CodingFire的博客 1329

java mysql主从复制_MySQL主从复制的实现过程

一、什么是主从复制将主数据库中的DDL和DML操作通过二进制日志传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。二、主从复制的作用1、主数据库出现问题,可以切换到从数据库。2、可以进行数据库层面的读写分离。3、可以在从数据库上进行日常备份。三、复制过程Binary log:主数据库的二进制日志。Relay log:从服务器的中继日志。第一步:master...

weixin_42401281的博客 344
上一篇: Java开发 - 公共字段的自动填充
下一篇: Java开发 - 读写分离初体验
CodingFire
CodingFire  2022年度博客之星移动开发领域TOP 5 2022年度博客之星移动开发领域TOP 5 领域专家: 移动开发技术领域 领域专家: 移动开发技术领域
博客等级 码龄11年 7927粉丝 387原创
评论 48
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingFire

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值