JavaEE技术之MySql高级-搭建主从复制(主从同步原理、一主多从配置)

文章目录

  • MySQL主从同步
    • 1、MySQL主从同步原理
    • 2、一主多从配置
      • 2.1、准备主服务器
      • 2.2、准备从服务器
      • 2.3、启动主从同步
      • 2.4、实现主从同步
      • 2.5、停止和重置
      • 2.6、常见问题
        • 问题1
        • 问题2

MySQL主从同步

1、MySQL主从同步原理

在这里插入图片描述

基本原理:

slave会从master读取binlog来进行数据同步

具体步骤:

  • step1:master将数据改变记录到二进制日志(binary log)中。这些记录过程叫做二进制日志事件(binary log events)。
  • step2:当slave连接master时,master会创建一个 log dump 线程,用于发送 binlog 的内容。在读取 binlog 的内容的操作中,会对主节点上的 binlog 加锁,当读取完成并发送给从服务器后解锁。
  • step3: 当slave上执行 start slave 命令之后,slave会创建一个 IO 线程用来连接master,请求master中的binlog。IO 线程接收主节点 binlog dump 进程发来的更新之后,保存到 relay log 中。
  • step4:slave的SQL线程,读取relay log日志,并解析成具体操作,从而实现主从操作一致,最终数据一致。

2、一主多从配置

服务器规划:使用docker方式创建,主从服务器IP一致,端口号不一致

在这里插入图片描述

  • 主服务器:容器名atguigu-mysql-master,端口3316
  • 从服务器:容器名atguigu-mysql-slave1,端口3317
  • 从服务器:容器名atguigu-mysql-slave2,端口3318

**注意:**如果此时防火墙是开启的,则先关闭防火墙,并重启docker,否则后续安装的MySQL无法启动

#关闭docker
systemctl stop docker
#关闭防火墙
systemctl stop firewalld
#启动docker
systemctl start docker

2.1、准备主服务器

  • step1:在docker中创建并启动MySQL主服务器:端口3306
docker run -d \
-p 3306:3306 \
-v /atguigu/mysql/master/conf:/etc/mysql/conf.d \
-v /atguigu/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name atguigu-mysql-master \
mysql:8.0.29
  • step2:创建MySQL主服务器配置文件:

默认情况下MySQL的binlog日志是自动开启的,可以通过如下配置定义一些可选配置

vim /atguigu/mysql/master/conf/my.cnf

配置如下内容

[mysqld]
# 服务器唯一id,默认值1
server-id=1
# 设置日志格式,默认值ROW
binlog_format=STATEMENT
# 二进制日志名,默认binlog
# log-bin=binlog
# 设置需要复制的数据库,默认复制全部数据库
binlog-do-db=mydb
# 设置不需要复制的数据库
binlog-ignore-db=mysql
#binlog-ignore-db=infomation_schema

重启MySQL容器

docker restart atguigu-mysql-master

binlog格式说明:

  • binlog_format=STATEMENT:日志记录的是主机数据库的写指令,性能高,但是now()之类的函数以及获取系统参数的操作会出现主从数据不同步的问题。
  • binlog_format=ROW(默认):日志记录的是主机数据库的写后的数据,批量操作时性能较差,解决now()或者 user()或者 @@hostname 等操作在主从机器上不一致的问题。
  • binlog_format=MIXED:是以上两种level的混合使用,有函数用ROW,没函数用STATEMENT,但是无法识别系统变量

binlog-ignore-db和binlog-do-db的优先级问题:

在这里插入图片描述

  • step3:使用命令行登录MySQL主服务器:
#进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码
docker exec -it atguigu-mysql-master env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p
#修改默认密码插件
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  • step4:主机中创建slave用户:
-- 创建slave用户
CREATE USER 'atguigu_slave'@'%';
-- 设置密码
ALTER USER 'atguigu_slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'atguigu_slave'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
  • step5:主机中查询master状态:

执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

SHOW MASTER STATUS;

记下FilePosition的值。执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化。

在这里插入图片描述

2.2、准备从服务器

可以配置多台从机slave1、slave2…,这里以配置slave1为例

  • step1:在docker中创建并启动MySQL从服务器:端口3307
docker run -d \
-p 3317:3306 \
-v mysql-slave1-conf:/etc/mysql/conf.d \
-v mysql-slave1-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name atguigu-mysql-slave1 \
mysql:8
  • step2:创建MySQL从服务器配置文件:
vim /var/lib/docker/volumes/mysql-slave1-conf/_data/my.cnf

配置如下内容:

[mysqld]
# 服务器唯一id,每台服务器的id必须不同,如果配置其他从机,注意修改id
server-id=2
# 中继日志名,默认xxxxxxxxxxxx-relay-bin
#relay-log=relay-bin

重启MySQL容器

docker restart atguigu-mysql-slave1
  • step3:使用命令行登录MySQL从服务器:
#进入容器:
docker exec -it atguigu-mysql-slave1 env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p
#修改默认密码插件
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  • step4:在从机上配置主从关系:

从机上执行以下SQL操作

CHANGE MASTER TO MASTER_HOST='192.168.100.201', 
MASTER_USER='atguigu_slave',MASTER_PASSWORD='123456', MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000003',MASTER_LOG_POS=1357; 

2.3、启动主从同步

启动从机的复制功能,执行SQL:

START SLAVE;
-- 查看状态(不需要分号)
SHOW SLAVE STATUS\G

**两个关键进程:**下面两个参数都是Yes,则说明主从配置成功!

在这里插入图片描述

2.4、实现主从同步

在主机中执行以下SQL,在从机中查看数据库、表和数据是否已经被同步

CREATE DATABASE mydb;
USE mydb;
CREATE TABLE t_user (id BIGINT AUTO_INCREMENT,uname VARCHAR(30),PRIMARY KEY (id)
);
INSERT INTO t_user(uname) VALUES('zhang3');
INSERT INTO t_user(uname) VALUES(@@hostname);

2.5、停止和重置

需要的时候,可以使用如下SQL语句

-- 在从机上执行。功能说明:停止I/O 线程和SQL线程的操作。
stop slave; -- 在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。
reset slave;-- 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。
-- 用于第一次进行搭建主从库时,进行主库binlog初始化工作;
reset master;

2.6、常见问题

问题1

启动主从同步后,常见错误是Slave_IO_Running: No 或者 Connecting 的情况,此时查看下方的 Last_IO_ERROR错误日志,根据日志中显示的错误信息在网上搜索解决方案即可

在这里插入图片描述

典型的错误例如:Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from position > file size'

解决方案:

-- 在从机停止slave
SLAVE STOP;-- 在主机查看mater状态
SHOW MASTER STATUS;
-- 在主机刷新日志
FLUSH LOGS;
-- 再次在主机查看mater状态(会发现File和Position发生了变化)
SHOW MASTER STATUS;
-- 修改从机连接主机的SQL,并重新连接即可
问题2

启动docker容器后提示 WARNING: IPv4 forwarding is disabled. Networking will not work.

在这里插入图片描述

此错误,虽然不影响主从同步的搭建,但是如果想从远程客户端通过以下方式连接docker中的MySQL则没法连接

C:\Users\administrator>mysql -h 192.168.100.201 -P 3306 -u root -p

解决方案:

#修改配置文件:
vim /usr/lib/sysctl.d/00-system.conf
#追加
net.ipv4.ip_forward=1
#接着重启网络
systemctl restart network

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

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

相关文章

Vue3:介绍

Vue 3 相较于 Vue 2 在多个方面进行了改进和优化,主要优势包括但不限于以下几个方面: 响应式系统优化: Vue 3 引入了基于 Proxy 的响应式系统,取代了 Vue 2 中基于 Object.defineProperty 的实现。Proxy 可以直接监听整个对象&…

一文掌握nodejs中的核心概念

1. 事件循环与非阻塞 I/O 概述: 允许 Node.js 在单线程的情况下执行非阻塞 I/O 的机制。 组成部分: 调用栈: 执行同步代码。回调队列: 存放在异步操作完成后等待执行的回调函数。事件循环: 检查调用栈是否为空&…

WHAT - 浏览器缓存机制系列(二)

目录 一、介绍二、强缓存三、协商缓存今天主要介绍 HTTP请求缓存中的强缓存和协商缓存。 一、介绍 浏览器每次发起请求时,会先在浏览器缓存中查找请求的缓存结果和缓存标识。 当浏览器第一次向服务器发起请求后,浏览器缓存肯定是没有对应缓存的,所以向服务器发起请求,服…

AI换人视频制作

AI换人视频制作 举例: 让潘金莲和唐僧一起让奥特曼打孙悟空 工具 需要魔法上网自行百度https://discord.com/invite/viggle接受邀请后进入频道 输入 / 选择mix 选择mix 分别上传对应的图片 和视频 选择 背景设置为 白色 和fintune 为on等待几分钟 搜索 下载对应视…

实现WPF中的数据更新 属性通知界面:INotifyPropertyChanged接口

在WPF (Windows Presentation Foundation) 应用程序中,当数据发生变化时,通常希望UI能够自动更新以反映这些变化。为了实现这一功能,WPF 提供了数据绑定机制,并且配合 INotifyPropertyChanged 接口使用,可以在数据模型…

docker安装与重装

docker安装与重装 docker安装 https://blog.csdn.net/lyqhf153/article/details/79585976 参考上面的方式 cat /etc/issueuname -r uname -acat /proc/versiondf -hyum list docker-ce --showduplicates | sort -r 查看docker-ce的版本列表sudo yum install -y docker 没有…

Mesa3D图形库与NIR(New Intermediate Representation)

Mesa 是一个开源图形库,为 Unix 和 Linux 系统提供了 OpenGL 和 Vulkan API 的实现。它也支持其他图形 API,如OpenCL、OpenGL ES 和 Vulkan。Mesa 项目的目标是为开源社区提供高性能的图形库,使得开源操作系统能够充分利用现代图形硬件。 Me…

containerd的原理及应用详解(一)

本系列文章简介: 随着容器技术的迅猛发展,容器运行时成为了关注的焦点之一。而容器运行时的核心组件之一就是containerd。containerd是一个高度可扩展的容器运行时,它负责管理容器的生命周期、镜像管理以及资源隔离等核心功能。它是由Docker团队开发并开源的,目前已经成为了…

企业活动想联系媒体报道宣传如何联系媒体?

在企业的宣传推广工作中,我曾经历过一段费事费力、效率极低的时期。那时,每当公司有重要活动或新项目需要媒体报道时,我便要一家家地联系媒体,发送邮件、打电话,甚至亲自登门拜访,只为求得一篇报道。然而,这样的过程充满了不确定性和挑战,时常让我感到焦虑和压力山大。 记得有一…

C——单链表

一.前言 我们在前面已经了解了链表中的双向链表,而我们在介绍链表分类的时候就说过常用的链表只有两种——双向带头循环链表和单向不带头不循环链表。下来我来介绍另一种常用的链表——单向不带头不循环链表也叫做单链表。不清楚链表分类的以及不了解双向链表的可以…

【数据结构】第五讲:栈和队列

个人主页:深情秋刀鱼-CSDN博客 数据结构专栏:数据结构与算法 源码获取:数据结构: 上传我写的关于数据结构的代码 (gitee.com) 目录 一、栈 1.栈的定义 2.栈的实现 a.栈结构的定义 b.初始化 c.扩容 d.入栈 e.出栈 f.打印 g.取栈顶元素…

Java中常用类String的构造器与常用方法

Java中常用类String的构造器与常用方法 在Java编程中,String类是一个核心类,用于处理文本数据。掌握String类的构造器和常用方法对于编写涉及文本操作的程序至关重要。本文将为初学者介绍String类的一些常用构造器和常用方法,并通过示例代码…

Git 进行项目开发时新建一个分支作为备份

在使用 Git 进行项目开发时,想要在当前的 master 或其它分支基础上进行代码优化或修改时,并且在优化过程中保留一个当前状态的备份(即新建一个分支作为备份),然后继续在 master 分支上开发,你可以按照以下步…

乐观锁、悲观锁、互斥锁、读写锁

乐观锁和悲观锁是两种不同的锁机制,用于在多线程环境下解决资源竞争问题。互斥锁和读写锁是两种常见的锁类型,它们都可以用来实现乐观锁或悲观锁。 乐观锁 是一种无锁机制,它假设在多线程环境下对共享资源的操作不会发生冲突,因…

【CTF Crypto】XCTF GFSJ0522 base64 Writeup(Base64编码)

base64 元宵节灯谜是一种古老的传统民间观灯猜谜的习俗。 因为谜语能启迪智慧又饶有兴趣,灯谜增添节日气氛,是一项很有趣的活动。 你也很喜欢这个游戏,这不,今年元宵节,心里有个黑客梦的你,约上你青梅竹马…

Git泄露(续)

接上一篇补充 git config --global user.name " " git config --global user.email 邮箱地址 配置用户名和邮箱 git commit 使其处于交互区,没有使用 -m,默认用vim 来编辑和提交信息 输入要提交的内容,然后按ESC建回到命令…

华纳云:美国服务器的几种防火墙类型介绍

美国服务器的防火墙主要是用于在系统的内外网之间构建一道相对隔绝的保护屏障,用来保障美国服务器的网络安全免受恶意流量的影响,与其他地区的服务器并无本质上的不同,通常可以使用以下几种类型的防火墙: 软件防火墙:软…

「 网络安全常用术语解读 」通用配置枚举CCE详解

1. 背景介绍 NIST提供了安全内容自动化协议(Security Content Automation Protocol,SCAP)为漏洞描述和评估提供一种通用语言。SCAP组件包括: 通用漏洞披露(Common Vulnerabilities and Exposures, CVE):提供一个描述…

泰迪智能科技企业数据挖掘流程分析及特色服务优势

企业发展会沉淀大量的数据,数据中囊括了企业业务各种维度指标,通过数据挖掘和数据分析 ,让企业业务了解过去、现在和未来将要发生什么,从而更好的调整企业发展方向。泰迪智能科技企业数据挖掘平台是面向企业级用户快速处理数据构建…

C++学习第二十八课:C++ 中的智能指针详解

在 C 中,内存管理是每个程序员都需要面对的问题。在处理动态分配的内存时,如果忘记释放内存,可能会导致内存泄漏。为了解决这个问题,C11 引入了智能指针的概念。本文将详细介绍 C 中使用智能指针的方法,并结合实际案例…