docker实战之搭建MYSQL8.0主从同步

目录

  • 环境配置
  • 容器创建
    • 主服务器
      • 创建MYSQL容器
      • 新增my.cnf文件
      • 创建用户并授权
    • 从服务器
      • 创建MYSQL容器
      • 新增my.cnf文件
      • 重启MYSQL容器
      • 配置主从同步
  • 验证主从同步
  • 彩蛋

MySQL 主从同步(Master-Slave Replication)是一种常用的解决方案,它允许一个主服务器(Master)将其数据复制到一个或多个从服务器(Slave)。这种架构不仅提高了数据的冗余性,还能通过读取分离来提升应用的性能
关于MYSQL主从同步的原理以及八股文这篇文章中就暂时不讲述啦,直接上干货,面对许多同学没有大量服务器,又想参与MYSQL集群实战过程中,提升技能,这篇实操技能你值得拥有~

环境配置

正如文章主题,简单明了,docker,会使用基本的docker命令即可,即使不会也没有关系,溪源会带着大家一步一步完成搭建。

  • 获取MYSQL镜像:docker命令
docker pull mysql:8.0.36
  • 本地服务器创建数据卷
/Users/docker/data/mysql/

对于docker实战而言,少不了,主机目录与容器数据卷映射之类的操作,所以可以将相关数据卷统一目录管理;

  • 授权
chmod 777 /Users/docker/data/

授权所有用户读写操作

容器创建

主服务器

创建MYSQL容器

docker run -d -p 3317:3306 --privileged=true \
-v /Users/docker/data/mysql/master/log:/var/log/mysql \
-v /Users/docker/data/mysql/master/data:/var/lib/mysql \
-v /Users/docker/data/mysql/master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql_master mysql:8.0.36
  • 命令说明:
**docker run**: Docker 命令,用于运行一个新的容器。**-d:** 以分离模式(detached mode)运行容器。容器将会在后台运行,你不会看到容器的输出。**-p 3317:3306:** 将主机的端口 3317 映射到容器的端口 3306。MySQL 默认监听 3306 端口,通过这种映射,你可以通过主机的 3317 端口访问 MySQL。**--privileged=true**:给予容器额外的权限。这通常用于需要访问主机的硬件设备或执行某些受限操作的容器。在大多数情况下,这不是必要的,并且使用时应谨慎。**-v /Users/docker/data/mysql/master/log:/var/log/mysql**:
将主机目录 /Users/docker/data/mysql/master/log 映射到容器的 /var/log/mysql 目录。这样,MySQL 的日志文件将会保存在主机上,即使容器删除,日志文件也会保留。**-v /Users/docker/data/mysql/master/data:/var/lib/mysql**:
将主机目录 /Users/docker/data/mysql/master/data 映射到容器的 /var/lib/mysql 目录。MySQL 的数据文件将会保存在主机上,确保数据持久化。**-v /Users/docker/data/mysql/master/conf:/etc/mysql/conf.d**:
将主机目录 /Users/docker/data/mysql/master/conf 映射到容器的 /etc/mysql/conf.d 目录。可以在该目录中放置 MySQL 配置文件(如 my.cnf),以便自定义 MySQL 配置。**-e MYSQL_ROOT_PASSWORD=123456**:
设置环境变量 MYSQL_ROOT_PASSWORD,用于初始化 MySQL 的 root 用户密码为 123456。这是在容器首次启动时设置 MySQL root 用户密码的简便方法。
**--name mysql_master** :
指定容器的名称为 mysql_master。这样你可以通过名称而不是容器 ID 来引用这个容器。**mysql:8.0.36:**
使用 mysql 镜像,并指定版本为 8.0.36。这将从 Docker Hub 拉取指定版本的 MySQL 镜像,并在容器中运行。

新增my.cnf文件

路径:上面新建文件的路径:**/Users/docker/data/mysql/master/conf **
vim my.cnf

[mysqld]
pid-file= /var/run/mysqld/mysqld.pid
socket= /var/run/mysqld/mysqld.sock
datadir= /var/lib/mysql
secure-file-priv= NULL
## 设置server_id,同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=binlog
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# 设置默认时区
default-time_zone='+8:00'

创建用户并授权

  • 进入容器:
    docker exec -it mysql_master /bin/bash

  • 执行语句创建slave用户以及设置密码
    mysql> CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

  • 执行语句授权slave
    mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

  • 退出容器,输入 exit;
    mysql> exit; bash-4.4# exit

  • 执行重启主数据库:
    docker restart mysql_master;

在这里插入图片描述

  • 重启完成后,再次进入容器
    docker exec -it mysql_master /bin/bash
    进入MYSQL命令行

  • 查看主库状态
    show master status;
    在这里插入图片描述

特别说明,此处的position特别重要,后面配置从服务器需要用到

从服务器

创建MYSQL容器

docker run -d -p 3318:3306 --privileged=true \
-v /Users/docker/data/mysql/slave01/log:/var/log/mysql \
-v /Users/docker/data/mysql/slave01/data:/var/lib/mysql \
-v /Users/docker/data/mysql/slave01/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql_slave01 mysql:8.0.36

新增my.cnf文件

[mysqld]
pid-file= /var/run/mysqld/mysqld.pid
socket= /var/run/mysqld/mysqld.sock
datadir= /var/lib/mysql
secure-file-priv= NULL
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,设置二进制日志名,默认binlog
log-bin=binlog  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读(具有super权限的用户除外)
read_only=1
# 设置默认时区
default-time_zone='+8:00'
binlog-ignore-db=infomation_schema,配置同步,则主服务器用户会直接同步到从服务器

重启MYSQL容器

命令:docker restart mysql_slave;

配置主从同步

  • 进入从服务器
    进入容器:docker exec -it mysql_slave01 /bin/bash
    登录MYSQL

  • 执行以下语句,在从数据库配置主从复制

change master to master_host='主库主机ip地址', master_user='2.1在主库创建的账号', master_password='2.1在主库创建的密码', master_port=3307, master_log_file='binlog.000004', master_log_pos=157, master_connect_retry=30;


执行语句:
change master to master_host='XXXXXX', master_user='slave', master_password='123456', master_port=3307, master_log_file='binlog.000004', master_log_pos=157, master_connect_retry=30;参数说明:
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。
  • 查看主从同步状态
    show slave status \G;
    在这里插入图片描述
    说明:此时Slave_IO_Running与Slave_SQL_Running为 NO状态。

  • 开启主从同步
    start slave;
    在这里插入图片描述
    说明:Slave_IO_Running与Slave_SQL_Running为 Yes状态

验证主从同步

  • 主服务器创建数据库和表
mysql> create database tenant;
Query OK, 1 row affected (0.01 sec)mysql> use tenant;
Database changed
mysql> CREATE TABLE users (->     user_id INT AUTO_INCREMENT PRIMARY KEY, --  ID->     username VARCHAR(50) NOT NULL UNIQUE,    -- 50->     email VARCHAR(100) NOT NULL UNIQUE,      -- 100->     password VARCHAR(255) NOT NULL,          -- 255->     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- ->     updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- -> );
Query OK, 0 rows affected (0.04 sec)mysql> show tables;
+------------------+
| Tables_in_tenant |
+------------------+
| users            |
+------------------+
1 row in set (0.00 sec)
  • 查看从库是否完成同步
    在这里插入图片描述

彩蛋

哈哈哈,,,此篇彩蛋主要扩展解决问题方案,开启主从同步时,如何取消主从配置说明。溪源在配置主从配置过程IP地址错误,导致从库无法连接,如图:
在这里插入图片描述
Error connecting to source 'slave@localhost:3317'. This was attempt 2/86400, with a delay of 30 seconds between attempts. Message: Can't connect to MySQL server on 'localhost:3317' (99)
执行以下命令:

  • 停止复制进程:
    STOP SLAVE;
  • 清除所有复制配置:
    RESET SLAVE ALL;

然后按照从库,再重新配置主从同步,但是一定要注意查看一下主库的状态,判断position位置是否变化。

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

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

相关文章

Golang实现根据文件后缀删除文件和递归删除文件

概述 这个功能会非常强大,因为在日常工作中,我通常会遇到需要批量删除文件的场景,通过这个方法,再结合我的另一个 命令行开发框架,能够很轻松的开发出这个功能。 代码 package zdpgo_fileimport ("errors"…

LabVIEW与串口通讯在运行一段时间后出现数据接收中断的问题

这些问题可能与硬件、软件或通信协议有关。以下是详细的原因分析和可能的解决方案: 一、硬件原因 串口线缆或接口问题: 由于长时间使用,串口线缆可能出现接触不良或损坏。接口松动也可能导致通讯中断。 解决方案:检查并更换串口…

C语言基础-内存申请和释放

在C语言中,malloc 和 free 是用于动态内存分配和释放的函数。而在C中,new 和 delete 提供了类似的功能,但它们之间有一些重要的区别。 1. malloc 和 free malloc malloc 函数用于在堆上动态地分配指定字节数的内存。它的原型在 stdlib.h 头…

【Text2SQL 经典模型】X-SQL

论文:X-SQL: reinforce schema representation with context ⭐⭐⭐⭐ Microsoft, arXiv:1908.08113 X-SQL 与 SQLova 类似,使用 BERT style 的 PLM 来获得 representation,只是融合 NL question 和 table schema 的信息的方式不太一样&#…

一种获取java代码结构的实现思路

一种获取java代码结构的实现思路 有时,我们需要获取java文件里的代码结构,即,只需要里面的class定义、方法声明、属性定义。不需要额外的方法实现 这里提供一下实现思路: 采用语法解析器Tree-sitter对java代码进行解析,获取里面的方法实现遍历第一步获取到的方法列表,在源…

Linux c开发线程锁和条件变量使用

#include <pthread.h> #include <stdio.h> #include <unistd.h>pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond PTHREAD_COND_INITIALIZER;void* thread_function(void* arg) {printf("线程等待唤醒,锁定互斥量...\n");…

代码随想录算法训练营第十七天 | 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和

[LeetCode] 110. 平衡二叉树 [LeetCode] 110. 平衡二叉树 文章解释 [LeetCode] 110. 平衡二叉树 视频解释 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输…

HTTP 响应分割漏洞

HTTP 响应分割漏洞 1.漏洞概述2.漏洞案例 1.漏洞概述 HTTP 响应拆分发生在以下情况&#xff1a; 数据通过不受信任的来源&#xff08;最常见的是 HTTP 请求&#xff09;进入 Web 应用程序。该数据包含在发送给 Web 用户的 HTTP 响应标头中&#xff0c;且未经过恶意字符验证。…

CSS常用的两种定位方式

在CSS中&#xff0c;absolute 和 relative 是两种常用的定位方式&#xff0c;分别通过 position 属性进行设置。它们用于控制元素在页面中的位置。理解这两种定位方式对于布局和设计响应式页面非常重要。 position: relative 定义 relative 定位是相对自身原始位置进行偏移。…

Python 魂斗罗的音效和动漫效果

一、实现游戏音效 音效是游戏中不可或缺的一部分&#xff0c;它可以为游戏增添氛围和趣味性。在 Pygame 中&#xff0c;我们可以使用 pygame.mixer 模块来播放音效。下面是一个简单的示例代码&#xff0c;演示如何在游戏中播放音效&#xff1a; import pygamepygame.mixer.init…

windows平台vcpkg安装

1. 克隆vcpkg仓库 git clone https://github.com/microsoft/vcpkg 2.运行bootstrap-vcpkg.bat下载vcpkg.exe 3.运行验证 4.使用VCPKG安装OPENSSL 5.安装成功

VC++学习(1)——环境准备,参考文档等,初步入门VC++

目录 引出环境准备&#xff0c;参考文档第一讲 初步入门键盘按下的消息鼠标左键按下报错源码新建一个工程 总结 引出 VC学习&#xff08;1&#xff09;——环境准备&#xff0c;参考文档等&#xff0c;初步入门VC C是一门编程语言,他的语法标准和语言特性是全球统一的 VC是微…

计算机系统概述习题

选择题 电子计算机问世至今&#xff0c;新型计算机不断推陈出新&#xff0c;不管怎么更新&#xff0c;依然具有“存储程序”的特点&#xff0c;最早提出这种概念的是(B) A. 巴贝奇 B. 冯*诺伊曼 C. 帕斯卡 D. 贝尔 B下列描述中___是正确的。 A. 控制器能理解&#xff0c;解释…

中国主要城市房价指数数据集(2011-2024)

数据来源&#xff1a;东方财富网 时间跨度&#xff1a;2011年1月 - 2024年4月 数据范围&#xff1a;中国主要城市 包含指标&#xff1a; 日期、城市 新建商品住宅价格指数-同比 新建商品住宅价格指数-环比 新建商品住宅价格指数-定基 二手住宅价格指数-环比 二手住宅价格指…

Visual Studio 调试及快捷键

文章目录 原文连接环境一、调试器的基本使用1、更改执行流2、快速执行某一条代码断点设置条件断点查看内存信息查看调用堆栈查看寄存器信息设置监视断点调试二、快捷键一、窗口快捷键二、查找相关快捷键三、代码快捷键原文连接 【教程】visual studio debug 技巧总结 环境 一…

OpenCASCADE Draw模块TKDraw项目问题修改

1.问题 在调试Draw模块代码时&#xff0c;出现一个小问题&#xff0c;导致无法正常运行 如下&#xff1a; 2.代码跟踪 通过代码跟踪发现时一个数组越界问题&#xff0c;在此处添加了判断处理&#xff0c;程序可以正常调试

Golang使用HTTP框架zdpgo_resty实现文件下载

核心代码 代码解析&#xff1a; client.SetOutputDirectory("Downloads") 设置下载目录client.R().SetOutput("test.go").Get("http://127.0.0.1:3333/download 指定下载文件名并进行下载 // 设置输出目录路径&#xff0c;如果目录不存在&#xff…

数据结构顺序表实现通讯录

目录 1. 前言&#xff1a; 2.通讯录项目的创建 3. 通讯录的实现 3.1 通讯录的初始化 3.2 通讯录的销毁 3.3 通讯录添加数据 3.4 通讯录查找数据 3.5 通讯录展示数据 3.6 通讯录删除数据 3.7 通讯录修改数据 4. 通讯录完整代码 4.1 test.c 4.2 SeqList.h 4.3 SeqLis…

PostgreSQL学习笔记

PostgreSQL 基本概念和架构 PostgreSQL 是一个功能强大的开源对象关系数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;其设计目标是遵循 SQL 标准&#xff0c;并提供丰富的功能&#xff0c;如复杂查询、外键、触发器、视图和事务处理。以下是 PostgreSQL 的基本概念…

数据结构(Java实现):ArrayList

目录 1.ArrayList简介2.ArrayList构造方法分析3.ArrayList的add方法以及扩容机制4.ArrayList常用方法5.ArrayList遍历6.ArrayList的缺陷 1.ArrayList简介 在集合框架中&#xff0c;ArrayList是一个普通的类&#xff0c;实现了List接口&#xff0c;具体框架图如下&#xff1a; …