使用docker-compose搭建mysql主从复制

news2024/11/24 20:09:15

使用docker-compose搭建mysql主从复制:

Mysql的主从【快速】搭建

  • 编写脚本
    • 编写 master.sh 脚本
    • 编写 slave.sh 脚本
  • 编写docker-compose.yml文本
  • 测试阶段
    • 主从同步效果
    • 主从环境重启
    • 容器被删除,重新启动
    • 从节点关闭,主节点继续写入数据
    • 从节点删除,主节点继续写入数据,从节点重新创建

编写脚本

在Linux中编写Shell脚本,目的:

此脚本主要是根据环境变量,创建出用于主从同步的用户。关于为什么要创建出master,slave脚本,是为了区分master和slave环境,
因为只要把sql和sh文件放到master目录下面,master在第一次初始化的时候,会自动执行里面的文件内容

编写 master.sh 脚本

在创建docker.compose.yml目录位置下创建init目录,接着分别编写shell脚本

mkdir -p  ./init/master

cat >  ./init/master/master.sh <<EOF

master.sh

#!/bin/bash
#定义用于同步的用户名
MASTER_SYNC_USER=\${MASTER_SYNC_USER:-sync_admin}
#定义用于同步的用户密码
MASTER_SYNC_PASSWORD=\${MASTER_SYNC_PASSWORD:-123456}
#定义用于登录mysql的用户名
ADMIN_USER=\${ADMIN_USER:-root}
#定义用于登录mysql的用户密码
ADMIN_PASSWORD=\${ADMIN_PASSWORD:-123456}
#定义运行登录的host地址
ALLOW_HOST=\${ALLOW_HOST:-%}
#定义创建账号的sql语句
CREATE_USER_SQL="CREATE USER '\$MASTER_SYNC_USER'@'\$ALLOW_HOST' IDENTIFIED BY '\$MASTER_SYNC_PASSWORD';"
#定义赋予同步账号权限的sql,这里设置两个权限,REPLICATION SLAVE,属于从节点副本的权限,REPLICATION CLIENT是副本客户端的权限,可以执行show master status语句
GRANT_PRIVILEGES_SQL="GRANT SELECT,REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO '\$MASTER_SYNC_USER'@'\$ALLOW_HOST';"
#定义刷新权限的sql
FLUSH_PRIVILEGES_SQL="FLUSH PRIVILEGES;"
#执行sql
mysql -u"\$ADMIN_USER" -p"\$ADMIN_PASSWORD" -e "\$CREATE_USER_SQL \$GRANT_PRIVILEGES_SQL \$FLUSH_PRIVILEGES_SQL"
EOF

编写 slave.sh 脚本

mkdir -p  ./init/slave

cat >  ./init/slave/slave.sh <<EOF

slave主要是去master查询最新的pos位置和binlog文件名称,然后创建同步需要的相关信息,然后执行start slave;

slave.sh

#定义连接master进行同步的账号
SLAVE_SYNC_USER="\${SLAVE_SYNC_USER:-sync_admin}"
#定义连接master进行同步的账号密码
SLAVE_SYNC_PASSWORD="\${SLAVE_SYNC_PASSWORD:-123456}"
#定义slave数据库账号
ADMIN_USER="\${ADMIN_USER:-root}"
#定义slave数据库密码
ADMIN_PASSWORD="\${ADMIN_PASSWORD:-123456}"
#定义连接master数据库host地址
MASTER_HOST="\${MASTER_HOST:-%}"
#连接master数据库,查询二进制数据,并解析出logfile和pos,这里同步用户要开启 REPLICATION CLIENT权限,才能使用SHOW MASTER STATUS;
RESULT=\`mysql -u"\$SLAVE_SYNC_USER" -h\$MASTER_HOST -p"\$SLAVE_SYNC_PASSWORD" -e "SHOW MASTER STATUS;" | grep -v grep |tail -n +2| awk '{print \$1,\$2}'\`
#解析出logfile
LOG_FILE_NAME=\`echo \$RESULT | grep -v grep | awk '{print \$1}'\`
#解析出pos
LOG_FILE_POS=\`echo \$RESULT | grep -v grep | awk '{print \$2}'\`
#设置连接master的同步相关信息
SYNC_SQL="change master to master_host='\$MASTER_HOST',master_user='\$SLAVE_SYNC_USER',master_password='\$SLAVE_SYNC_PASSWORD',master_log_file='\$LOG_FILE_NAME',master_log_pos=\$LOG_FILE_POS,get_master_public_key=1;"
#开启同步
START_SYNC_SQL="start slave;"
#查看同步状态
STATUS_SQL="show slave status\G;"
mysql -u"\$ADMIN_USER" -p"\$ADMIN_PASSWORD" -e "\$SYNC_SQL \$START_SYNC_SQL \$STATUS_SQL"
EOF

编写docker-compose.yml文本

version: '3'
services:
  master:
    image: mysql:8.0.28
    container_name: mysql-master
    ports:
    - '3306:3306'
    restart: always
    hostname: mysql-master
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      MASTER_SYNC_USER: "sync"
      MASTER_SYNC_PASSWORD: "123456"
      ADMIN_USER: "root"
      ADMIN_PASSWORD: "123456"
      TZ: "Asia/Shanghai"
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: 50m
    healthcheck:
      test: ["CMD","mysqladmin","-uroot","-p$${MYSQL_ROOT_PASSWORD}","ping","-h","localhost"]
      timeout: 2s
      interval: 10s
      retries: 5
      start_period: 5s
    logging:
      options:
        max-file: '1'
        max-size: '128k'
    command:
    -  "--server-id=1"
    -  "--character-set-server=utf8mb4"
    -  "--collation-server=utf8mb4_unicode_ci"
    -  "--log-bin=mysql-bin"
    -  "--sync_binlog=1"
    -  "--binlog-ignore-db=mysql"
    -  "--binlog-ignore-db=sys"
    -  "--binlog-ignore-db=performance_schema"
    -  "--binlog-ignore-db=information_schema"
    -  "--sql_mode=NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES"
    volumes:
    - ./init/master:/docker-entrypoint-initdb.d
    - ./data/master:/var/lib/mysql
  slave:
    image: mysql:8.0.28
    container_name: mysql-slave
    ports:
    - '3307:3306'
    restart: always
    hostname: mysql-slave
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      SLAVE_SYNC_USER: "sync"
      SLAVE_SYNC_PASSWORD: "123456"
      ADMIN_USER: "root"
      ADMIN_PASSWORD: "123456"
      MASTER_HOST: "mysql-master"
      TZ: "Asia/Shanghai"
    healthcheck: 
      test: ["CMD","mysqladmin","-uroot","-p$${MYSQL_ROOT_PASSWORD}","ping","-h","localhost"]
      timeout: 2s
      interval: 10s
      retries: 5
      start_period: 5s
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: 50m
    logging:
      options:
        max-file: '1'
        max-size: '128k'
    depends_on:
      master:
        condition: service_healthy
    command:
    -  "--server-id=2"
    -  "--character-set-server=utf8mb4"
    -  "--collation-server=utf8mb4_unicode_ci"
    -  "--sql_mode=NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES"
    volumes:
    - ./init/slave:/docker-entrypoint-initdb.d
    - ./data/slave:/var/lib/mysql

启动准备,最终结构如下图所示:
在这里插入图片描述

执行脚本

docker-compose up -d

通过docker logs -f mysql-slave 查看从mysql日志如下图所示:看到以下两个yes,就代表成功了
在这里插入图片描述

测试阶段

注意:这里由于用到了Mysql8.0+版本的数据库,采用老版Navicate是连接不上的,主要是还不支持Mysql8新增加的加密方式caching_sha2_password,所以这里最直接的方式就是去官网下载最新的navicate16,亲测有效,另外一种方式就是修改mysql的加密方式为老版navicate支持的加密方式。
这里我直接下载最新,目的是快速测试mysql的主从效果

连接master
在这里插入图片描述
.

连接slave
在这里插入图片描述
.

主从同步效果

在master中创建test数据库,slave中同步出现test数据库
在这里插入图片描述

创建表及添加数据测试
在这里插入图片描述
在这里插入图片描述

主从环境重启

docker-compose restart

重新连接数据库,查看从节点同步状态

SHOW SLAVE STATUS;

可以看到,重启之后,同步也是正常的
在这里插入图片描述
当修改数据和新增数据,也是可以正常同步
.

容器被删除,重新启动

容器已经被删除了,数据库也无法正常连接
重启容器,查看同步状态,
在从节点执行。可以看到,同步也是正常的
在这里插入图片描述

从节点关闭,主节点继续写入数据

这里测试,当从节点被关闭,然后主节点继续写入数据,然后从节点启动
测试结果显示:同步也是正常开启的

从节点删除,主节点继续写入数据,从节点重新创建

节点容器已经被删除,也无法正常连接
主节点操作数据
创建从节点,启动容器
注意:在从节点中删除或修改数据的方式试图保持和主节点数据一致,这样子是没用的,后续操作还是没有同步
这种无法进行同步的情况下,需要将slave数据库删除,再执行一下命令即可恢复同步
这里同步点正常开启,但是同步失败,

在这里插入图片描述

此时需要执行sql语句:


STOP SLAVE;

RESET SLAVE;

CHANGE MASTER TO master_log_pos=0;

START SLAVE;

SHOW SLAVE STATUS;

后续在刷新slave数据库,可以看到,数据已经同步过来了

基于docker-compose搭建mysql主从已经结束,这里主要演示了如何一键搭建mysql主从,同时测试在各种环境下,还能保证主从同步。但是单主从同步肯定也无法满足企业的需求,有兴趣的同学可以研究一些主主双写同步,然后通过nginx搭建主备模式,达到高可用

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

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

相关文章

[附源码]计算机毕业设计的云网盘设计Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

阻塞队列BlockingQueue与同步队列SynchronousQueue

阻塞队列&#xff08;BlockingQueue&#xff09; 什么情况下我们会使用阻塞队列&#xff1f; 多线程并发处理&#xff0c;线程池&#xff01; 使用队列 添加 移除 BlockingQueue四组API 方式有返回值&#xff0c;抛出异常 有返回值&#xff0c;不抛出异常 阻塞等待 超时等待 …

Kubelet v1.25.x源码——StatusManager

1. 环境说明 Kubernetes源码版本&#xff1a;remotes/origin/release-1.25 Kubernetes编译出来的Kubelet版本&#xff1a;Kubernetes v1.24.0-beta.0.2463ee7799bab469d7 Kubernetes集群实验环境&#xff1a;使用Kubernetes v1.25.4二进制的方式搭建了一个单节点集群 K8S 单节…

Linux redhat8.0 NFS共享目录

简介&#xff1a; NFS允许一个系统在网络上与它人共享目录和文件。通过使用NFS&#xff0c;用户和程序可以像访问本地文件一样访问远端系统上的文件。 作用&#xff1a; 多个机器共享一台CDROM或者其他设备。这对于在多台机器中安装软件来说更加便宜跟方便。 员工都可以操作…

流辰信息技术企业凭匠心,助力企业打造专属低代码解决方案!

从建立之初开始&#xff0c;流辰信息技术企业就凭借一股热劲和对低代码开发平台的执着热爱精神&#xff0c;在业界打磨升级&#xff0c;成为众多新老客户朋友青睐和信任的服务商。 在稳定发展的近些年中&#xff0c;流辰信息一直信奉品质和服务是紧跟市场发展步伐的法宝&#x…

maven工程,mybatis,spring

maven 简介&#xff1a;Maven主要用于解决导入依赖于Java类的jar和编译Java项目的主要问题&#xff0c;其使用pom文件将自动管理下载的jar包 创建maven工程 1. groupid:包名 artifactid:工程名 location:存放位置 2.结构 工程目录结构&#xff1a;srcmain主程序区java后端代…

ARM的八种工作模式

ARM有八种工作模式&#xff0c;有些处理器可能是七种&#xff0c;这个要看处理器的版本&#xff0c;早期的处理器如ARM9有七种工作模式&#xff0c;到了后来的Cortex系列新增了一种Secure Monitor模式。对工作模式的理解需要记住以下三点&#xff1a; 不同模式拥有不同的权限不…

基于冲突搜索算法的多机器人路径规划(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Java Request学习笔记

1.获取请求部分的信息方法&#xff1a; Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置响应的内容为html&#xff0c;指定编码为utf-8response.setContentType("text/html;…

如何利用ArcGIS探究环境与生态因子对水体、土壤、大气污染物等影响

如何利用ArcGIS实现电子地图可视化表达&#xff1f;如何利用ArcGIS分析空间数据&#xff1f;如何利用ArcGIS提升SCI论文的层次&#xff1f;制图是地理数据展现的直观形式&#xff0c;也是地理数据应用的必要基础。本次课程从ArcGIS的基本操作、ArcGIS 的空间数据分析及ArcGIS 的…

Biotin-PEG-Fluorescein,FITC-PEG-Biotin,荧光素peg生物素用于纳米粒子

英文名称&#xff1a;FITC-PEG-Biotin&#xff0c;Biotin-PEG-Fluorescein 中文名称&#xff1a;荧光素-聚乙二醇-生物素 FITC-PEG生物素是一种含有荧光素染料和生物素基团的线性异生物功能PEG试剂。荧光素通常被称为FITC&#xff0c;是生物学中常用的荧光示踪剂&#xff0c;…

[附源码]Node.js计算机毕业设计电影网站系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Flask从入门到放弃三(g对象、Flask-Session的使用、Flask集成Mysql、Wtforms、信号)

文章标题一、g对象二、Flask-Session使用三、数据库连接池1&#xff09;Flask中集成mysql2&#xff09;上面代码存在的问题3&#xff09;使用数据库连接池4&#xff09;压力测试四、WTForms1&#xff09;Python代码2&#xff09;Hmtl代码五、信号一、g对象 介绍 g对象全称glo…

java instanceof关键字详解

instanceof描述 将从操作数堆栈中弹出objectref&#xff0c;它必须是引用类型。无符号indexbyte1和indexbyte2用于将索引构造到当前类的运行时常量池中&#xff08;2.6&#xff09;&#xff0c;其中索引的值为&#xff08;indexbyte1<<8&#xff09;|indexbyte2.索引处的…

node文件上传和下载

node文件上传和下载 一、准备项目 npm install -g express-generator express upload-download然后用vscode打开&#xff0c;安装依赖包&#xff0c;在装一个nodemon #安装依赖npm i# 安装nodemonpm i nodemon -g修改启动命令 启动项目&#xff0c;访问localhost&#xff1a;…

WebDAV之葫芦儿·派盘 + CloudBeats

CloudBeats 支持WebDAV方式连接葫芦儿派盘。 推荐一款手机云端音乐播放器,可以直接播放云盘中的音乐,不占用手机内存,同时也可以播放本地的音频文件,自动扫描,支持离线播放,可以自由创建音乐播放列表。 CloudBeats无需网络即可运行。将专辑,播放列表,文件夹或文件下…

艾美捷游离维多珠单抗ADA水平检测试剂盒,高灵敏度检测

艾美捷游离维多珠单抗ADA水平检测试剂盒用于测定维多利单抗&#xff08;如ENTYVIO&#xff09;的游离人抗体) 适用于EDTA血浆和血清。只用于体外诊断。 引言&#xff1a; 中度至重度活动型溃疡性结肠炎患者克罗恩病&#xff0c;常规治疗或肿瘤坏死因子α&#xff08;TNFα&…

pmp考试多长时间出成绩?

考完大概 6-8 周之后就会出陆续出成绩了&#xff0c;一开始没查到成绩的别着急&#xff0c;出成绩的时间会持续一周左右。 这次 2022年 6 月考的已经在陆续出成绩了&#xff0c;快来查查你过了没 一、查看是否通过 1、登录PMI 官网&#xff0c;点击“Log In” 如果忘记 PMI 的…

rancher 给k8s api 审计日志增加webhook

例子可以参考gosoon / k8s-audit-webhook或者omri86 / k8s-audit-webhook 编译运行。 然后将对应的audit-webhook.yaml&#xff0c;拷贝到/etc/kubernetes/目录下。 然后登录rancher 管控界面&#xff0c;进入Cluster Management 页面 找到对应的集群。 然后点击最后的三个点…

Servlet:狂神源码分析2

目录Demo结构源码分析总结Demo结构 源码分析 1.首先进入web.xml配置一下serlvet路由&#xff0c;也就是serlvet的name&#xff0c;class&#xff0c;以及对应的url-pattern <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http:/…