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

news2024/9/20 7:50:34

目录

  • 环境配置
  • 容器创建
    • 主服务器
      • 创建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.coloradmin.cn/o/1694072.html

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

相关文章

2024年蓝桥杯Web开发【大赛大纲】15届

一、 组别 Web应用开发分为:大学组和职业院校组。 每位选手只能申请参加其中一个组别的竞赛。各个组别单独评奖。 研究生和本科生只能报大学组。 其它高职高专院校可自行选择报任意组别。 二. 竞赛赛程 省赛时长:4小时。 决赛时长:4小…

【STM32CubeIDE】软件硬件SPI+六针OLED使用

前言 本文将介绍STM32 6针OLED的使用,分别使用软件和硬件两种SPI驱动方式,最终实现OLED显示TEST-ok字符和数字累加刷新显示 软件平台:STM32CubeIDEHAL库 硬件:STM32F103ZET6(正点原子战舰V3)六针OLED 题外话: 最…

【Apache Doris】BE宕机问题排查指南

【Apache Doris】BE宕机问题排查指南 背景BE宕机分类如何判断是BE进程是Crash还是OOMBE Crash 后如何排查BE OOM 后如何分析Cache 没及时释放导致BE OOM(2.0.3-rc04) 关于社区 作者|李渊渊 背景 在实际线上生产环境中,大家可能遇…

深入探索:移动云服务器的强大之处

文章目录 一 什么是移动云二 移动云服务器的使用三 移动云服务器的优点四 在移动云上部署node.js项目五 移动云服务器的应用场景六 移动云服务器的使用体验总结 一 什么是移动云 移动云是指用户可以通过移动设备访问云端的数据和应用,无需在本地设备上进行存储和处…

Notes for video: EDC-Con 2022/01 - EDC Conceptual Overview and Architecture

Eclipse Dataspace Connector 中文概念 Eclipse Dataspace Connector (EDC) 是一个开源项目,旨在提供一种标准化的方法来连接和共享数据空间中的数据。它是 Eclipse Foundation 下的一个项目,目标是促进数据共享和数据交换的互操作性。以下是 EDC 的一些…

【lambdastreammaven】

lambda 匿名函数 为了简化java中的匿名内部类 事件监听 写一个类 实现 ActionListener 接口 (外部类) | | 内部类 类在其他地方用不到, 索性就把这个类定义在类的内部使用 好处: 1.内部可以使用外部类的成员 …

弹性盒子布局,flex布局

弹性盒子布局(Flexbox)是CSS3引入的一种新的布局模式,它提供了一种更加有效的方式来设计、布局和对齐容器中的项目,即使容器的大小动态改变或者项目的数量未知。 弹性盒子布局的主要特点是能够轻松地在不同的屏幕大小和设备上实现…

【小程序 按钮 表单 】

按钮 代码演示 xxx.wxml <view class"boss" hover-class"box"hover-start-time"2000"hover-stay-time"5000">测试文本<view hover-stop-propagation"true">子集</view><view>子集2</view>…

Vulhub——adminer

文章目录 一、CVE-2021-21311&#xff08;SSRF&#xff09;二、CVE-2021-43008&#xff08;远程文件读取&#xff09; 一、CVE-2021-21311&#xff08;SSRF&#xff09; Adminer是一个PHP编写的开源数据库管理工具&#xff0c;支持MySQL、MariaDB、PostgreSQL、SQLite、MS SQL…

lenovo联想小新Pro 16 APH8 2023款(83AR)笔记本电脑原装出厂Windows11系统镜像安装包下载

恢复出厂开箱状态OEM预装win11系统&#xff0c;自带恢复重置初始化还原功能 下载链接&#xff1a;https://pan.baidu.com/s/1n_mPM4ZrLPrmXpCTukuyCQ?pwdmnwj 提取码&#xff1a;mnwj 联想原装系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、Office办公软件、联想…

网络空间安全数学基础·整除与同余

主要内容&#xff1a; 整除的基本概念&#xff08;掌握&#xff09; 素数&#xff08;掌握&#xff09; 同余的概念&#xff08;掌握&#xff09; 1.1整除 定义&#xff1a;设a&#xff0c;b是任意两个整数&#xff0c;其中b≠0&#xff0c;如果存在一个整数q&#xff0c;使 …

线性表(从数据结构的三要素出发)

文章目录 逻辑结构存储结构顺序存储链式存储单链表双链表循环单链表循环双链表静态链表 数据的操作顺序结构链式结构单链表双链表 逻辑结构 线性表是具有相同数据类型的 n ( n ≥ 0 ) n(n≥0) n(n≥0)个数据元素的有限序列&#xff0c;其中 n n n为表长&#xff0c;当 n 0 n0…

Elasticsearch集群搭建学习

Elasticsearch集群聚合、集群搭建 RestClient查询所有高亮算分控制 数据聚合DSL实现Bucket聚合DSL实现Metrics聚合RestAPI实现聚合 拼音分词器如何使用拼音分词器&#xff1f;如何自定义分词器&#xff1f;拼音分词器注意事项&#xff1f; 自动补全数据同步集群搭建ES集群结构创…

C++—— set、map、multiset、multimap的介绍及使用

目录 关联式容器 关联式容器的特点和使用场景 树形结构与哈希结构 树形结构 哈希结构 键值对 set set的介绍 set的定义方式 set的使用 multiset map map的介绍 map的定义方式 map的使用 multimap 关联式容器 C标准模板库&#xff08;STL&#xff09;中的关联…

vue17:v-bind对css样式的控制增强

代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><styl…

软考之零碎片段记录(三十一)+复习巩固(错题整理,知识点总结,易错题)

1. 奇偶校验 只能检测一位数的错误。但无法纠正错误。若有奇数个数据位出错&#xff0c;可检测。有局限性。 2. 深度与广度优先遍历 参考题【【数据结构自用】1.图深度优先遍历2.找有向图中的强连通分量数目3.给出图的任意两个拓扑序列】https://www.bilibili.com/video/BV…

下雨!大水蚁引发的水文!看比赛咯,曼联VS曼城——早读(逆天打工人爬取热门微信文章解读)

唠唠嗑 水一水 引言Python 代码结尾 引言 今天星期六 大小周 一个等了很久的双休 昨天晚上真的是吓到我了 漫天的小飞虫 我一开始还以为是一两只 没想到那些小飞虫 从阳台不断飞进来 在山卡拉下面租房子 也是太恐怖了 来个特写 他们也就一个晚上的时间 成虫 天气合适 长翅…

Unity-Sprite Atlas+UGUI系统的运行原理

每日一句&#xff1a;别听世俗耳语&#xff0c;看自己的风景就好 目录 SA的原理&#xff1a; SA的优点&#xff1a; SA的缺点&#xff1a; DrawCall是什么&#xff1f; 批处理是什么&#xff1f; 我们先了解一下UGUI系统的运行原理吧&#xff01; 提到图集优化&#xff0…

【面试干货】数据库乐观锁,悲观锁的区别,怎么实现

【面试干货】数据库乐观锁&#xff0c;悲观锁的区别&#xff0c;怎么实现 1、乐观锁&#xff0c;悲观锁的区别2、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、乐观锁&#xff0c;悲观锁的区别 悲观锁&#xff08;Pessimistic Lo…

会声会影调速怎么用 会声会影如何调整音频速度

会声会影是一款功能强大的视频编辑软件&#xff0c;可以帮助我们轻松的实现剪辑。 会声会影的操作简单易懂&#xff0c;界面简洁明快。适合家庭使用&#xff0c; 我们使用会声会影可以在家就能将视频剪辑成好莱坞大片。但是在使用的过程中&#xff0c;仍然会遇到一些操作上的问…