Mysql主从集群搭建——基于docker-compose一键部署

news2024/12/23 16:05:54

搭建初衷

  • 本身自己就是开发这类应用的工作者,一个私有库还是很有必要的。无论是公司项目还是私人项目都可以用到,不用担心忘记同步导致的数据丢失
  • 统一管理所有docker应用的数据(如果容器可以连接mysql的话)也方便随时修改数据
  • 结构可视化,方便拓展一些容器的功能,比如Halo的代码

注意事项

  • 所有基础应用都会在统一一个docker公用网络中,要先创建这个网络。我们这边就是创建了一个名为basenetwork的网络。后续所有Mysql、Redis、MongoDB、nacos、ES都会连到这个网络中。具体如何创建docker公用网络,百度一下或者GPT一下,很简单的
  • 为了方便容器的排序,我将所有基础服务的名称都加上了zz-前缀,可以自行修改

增加相关配置

目录结构

├── init_db
├── master
│   └── my.conf
├── slave1
│   └── my.conf
├── slave2
│   └── my.conf
└── docker-compose.yml

docker-compose.yml

version: "3"
services:
  mysql-master:
    container_name: zz-base-mysql-master
    hostname: mysql-master
    image: "mysql:5.7"
    ports:
      - 3306:3306
    volumes:
      - ./master/etc:/etc/mysql
      - ./master/var/lib:/var/lib/mysql
      - ./master/my.cnf:/etc/my.cnf
      - ./init_db/:/docker-entrypoint-initdb.d/
    environment:
      MYSQL_ROOT_PASSWORD: 填入超级管理员密码
      MYSQL_DATABASE: rule_platform
      MYSQL_USER: 填入普通用户
      MYSQL_PASSWORD: 填入普通用户密码
      TZ: Asia/Shanghai
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    networks:
      basenetwork:
        ipv4_address: 172.16.0.101

  mysql-slave-1:
    container_name: zz-base-mysql-slave-1
    hostname: mysql-slave-1
    image: "mysql:5.7"
    ports:
      - 3307:3306
    volumes:
      - ./slave1/etc:/etc/mysql
      - ./slave1/var/lib:/var/lib/mysql
      - ./slave1/my.cnf:/etc/my.cnf
      - ./slave1/init_db/:/docker-entrypoint-initdb.d/
    environment:
      MYSQL_ROOT_PASSWORD: 填入超级管理员密码
      MYSQL_DATABASE: rule_platform
      MYSQL_USER: 填入普通用户
      MYSQL_PASSWORD: 填入普通用户密码
      TZ: Asia/Shanghai
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    networks:
      basenetwork:
        ipv4_address: 172.16.0.102

  mysql-slave-2:
    container_name: zz-base-mysql-slave-2
    hostname: mysql-slave-2
    image: "mysql:5.7"
    ports:
      - 3308:3306
    volumes:
      - ./slave2/etc:/etc/mysql
      - ./slave2/var/lib:/var/lib/mysql
      - ./slave2/my.cnf:/etc/my.cnf
      - ./slave2/init_db/:/docker-entrypoint-initdb.d/
    environment:
      MYSQL_ROOT_PASSWORD: 填入超级管理员密码
      MYSQL_DATABASE: rule_platform
      MYSQL_USER: 填入普通用户
      MYSQL_PASSWORD: 填入普通用户密码
      TZ: Asia/Shanghai
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    networks:
      basenetwork:
        ipv4_address: 172.16.0.103

networks:
  basenetwork:
    external: true

master的my.cnf

[mysqld]
# 主数据库端ID号
server_id = 101
# 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 开启二进制日志
log-bin = mysql-bin
# 不需要复制的数据库名(mysql库一般不同步)
binlog-ignore-db = mysql
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
# 将函数复制到slave
log_bin_trust_function_creators = 1
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON

# MySQL 8.x,需要如下配置
default_authentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

slave-1的my.cnf

[mysqld]
# 从数据库端ID号
server_id = 102
# 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 开启二进制日志
log-bin = mysql-slave1-bin
# 不需要复制的数据库名(mysql库一般不同步)
binlog-ignore-db = mysql
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON
relay_log = mysql-relay-bin
read_only=1

slave2的my.cnf

[mysqld]
# 从数据库端ID号
server_id = 103
# 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 开启二进制日志
log-bin = mysql-slave2-bin
# 不需要复制的数据库名(mysql库一般不同步)
binlog-ignore-db = mysql
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON
relay_log = mysql-relay-bin
read_only=1

启动容器

填入好docker-compose.yml文件中那些需要手动填入的内容,创建好所有文件文件夹之后,就可以启动容器了。
在docker-compose.yml目录下,运行sudo docker-compose up -d即可

配置主从同步

在服务器(宿主机)上运行以下sh命令即可

# master
docker exec -it zz-base-mysql-master bash
mysql -uroot -p填入root用户密码
create user 'repl'@'%' identified by 'repl';
grant replication client,replication slave on *.* to 'repl'@'%';

# slave
docker exec -it zz-base-mysql-slave bash
mysql -uroot -p填入root用户密码
reset master;
CHANGE MASTER TO MASTER_HOST='mysql-master',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_PORT=3306,MASTER_AUTO_POSITION=1;
start slave;

至此,完事!~

如果你某个容器要使用mysql库了,将这个容器设置在basenetwork网络下,然后就可以直接使用172.16.0.101这个地址连接到了。
内网也可以直接使用Navicat或者dataGrip连接。
当然,如果想让外网也访问到可以配置个frp,之后会再出一篇frp的教程,感谢支持!

image

END。

欢迎访问我的blog > https://blog.taotaojs.top/archives/mysql%E4%B8%BB%E4%BB%8E%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA%E5%9F%BA%E4%BA%8Edocker-compose%E4%B8%80%E9%94%AE%E9%83%A8%E7%BD%B2

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

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

相关文章

FTP协议(PORT和PASV模式)

目录 FTP协议基本概念 PORT主动模式工作流程 PORT工作过程 PORT工作报文 PASV被动模式工作流程 PASV工作过程 PASV工作报文 FTP协议基本概念 FTP文件传输协议,用于在互联网上进行文件传输,基于C/S架构 FTP的连接模式 FTP采用双TCP连接方式 控制连…

vue3项目中前端导出word文档和导出excel文档

一、导出word文档 参考文章https://blog.csdn.net/qq_53722480/article/details/130017092 1、使用到的包如下: "docxtemplater": "^3.42.4", "file-saver": "^2.0.5", "jszip-utils": "^0.1.0", &q…

分布式锁常见实现方案

分布式锁常见实现方案 基于 Redis 实现分布式锁 如何基于 Redis 实现一个最简易的分布式锁? 不论是本地锁还是分布式锁,核心都在于“互斥”。 在 Redis 中, SETNX 命令是可以帮助我们实现互斥。SETNX 即 SET if Not eXists (对应 Java 中…

前端Object的基础使用

Object.assign() 通过复制一个或多个对象来创建一个新的对象。旧对象旧对象…新对象 console.log(学习让人进步, Object.assign({name:zhangsan},{age:18})) Object.create() 使用指定的原型对象和属性创建一个新对象。旧对象新属性新对象 这个是把属性挂到原型上,…

软件产品研发过程 - 二、概要设计

软件产品研发过程 - 概要设计 相关系列文章 软件产品研发管理经验总结-管理细分 软件研发管理经验总结 - 事务管理 软件研发管理经验总结 - 技术管理 软件产品研发过程 - 二、概要设计 目录 软件产品研发过程 - 概要设计一、概要设计概述二、概要设计过程1、模块概述2、应用场景…

设计字体必备工具推荐:5款好用的字体设计软件

字体设计作为设计中的一个重要模块,如果字体软件选择正确,将给字体设计工作带来极大的便利,易于使用的字体设计软件,可以创造出优秀的排版设计。在日常工作中,设计师可能会在字体网站上下载字体,然后安装字…

记录 | linux静态库和动态库的理解

hello.cpp&#xff1a; #include <cstdio>void hello() {printf("Hello, world!\n"); }main.cpp&#xff1a; #include <cstdio>void hello();int main() {hello();return 0; }静态库编译配置&#xff1a; cmake_minimum_required(VERSION 3.12) proj…

【AI数字人-论文】DINet论文解读

DINet 方法形变修补损失函数perception lossGAN lossLip-sync loss 实现细节参考 如下图所示&#xff0c;人脸视觉配音&#xff08;Face visually dubbing&#xff09;旨在根据输入的驱动音频同步源视频中的嘴型&#xff0c;同时保持身份和头部姿势与源视频帧一致。然而在少样本…

DTCC2023大会-基于eBPF观测数据库-附所有PPT下载链接

DTCC2023大会-基于eBPF观测数据库-附所有PPT下载链接 8月16日—18日,第14届中国数据库技术大会(DTCC-2023)在北京国际会议中心举行。聚好看在大会上首次发布基于eBPF观测数据库性能的产品DBdoctor&#xff0c;受到了业界广泛的关注。近期几位业内同仁过来要大会的PPT&#xff…

Shopify二次开发之五:元字段(Metafields)

解释 Shopify Metafields 是一种用于存储和管理自定义数据的功能。它们允许商户在商城中的产品、订单、客户、Page等对象上添加自定义字段&#xff0c;以满足特定业务需求。 操作 1、添加Custom data 可以为Products、Pages添加自定义数据&#xff0c;比如选择了Pages&#…

使用pandas制作图表

数据可视化对于数据分析的重要性不言而喻&#xff0c;一个优秀的图表有足以一眼就看出关键所在。pandas利用matplotlib实现绘图。能够提供各种各样的图表功能&#xff0c;包括: 单折线图多折线图柱状图叠加柱状图水平叠加柱状图直方图拆分直方图箱型图区域块图形散点图饼图多子…

网络和Linux网络_11(数据链路层)以太网(MAC帧)协议+局域网转发+ARP协议

目录 1. 以太网协议 1.1 MAC地址 1.2 以太网帧格式 2. 局域网转发原理 2.1 数据碰撞和交换机 2.2 最大传输单元MTU 3. ARP协议 3.1 ARP协议格式 3.2 模拟APR协议工作过程 3.3 ARP缓存表 4. 重看TCP/IP四层模型 本篇完。 1. 以太网(MAC帧)协议 网络层的IP协议并不是…

怎么下载抖音视频无水印?教你三个无水印下载抖音视频方法

怎么下载抖音视频无水印&#xff1f;抖音已经成为了我们日常生活与工作的无法割舍的一部分&#xff0c;每天数以亿计的用户在进行创作分享。在这个平台上&#xff0c;用户可以通过自己的所见所想进行创作和分享记录美好瞬间。然而&#xff0c;有些用户希望能够将自己喜欢的抖音…

PHP:解决一个字符串中的斜杠 / 进行 JSON 编码时,斜杠被转义为 \/

一、修改前 问题代码 直接通过JSON编码&#xff0c;就会出现问题 代码 $url SO/.$fileName; echo json_encode($url); 效果 二、解决后 代码 使用 json_encode 函数的第二个参数 JSON_UNESCAPED_SLASHES 来禁止对斜杠进行转义 $url SO/.$fileName; echo json_encode…

电力仪表在工厂车间设备电能管理系统的设计-安科瑞黄安南

摘 要&#xff1a;基于车间用电设备的电能管理系统架构思路及实施方法&#xff0c;从硬件和软件方面对此方法进行了阐述。对车间旧设备改造以及新的电能管理系统提供一种思路和便捷的方法。 关键词&#xff1a;电能管理系统&#xff1b;多功能电力仪表&#xff1b;PLC&#x…

【后端】JVM 远程调试

前言 再好的代码,也还是有瑕疵的,不是代码不给力,是线上问题太牛逼太玄幻。这不刚部署就出现了问题,幸好还是测试的时候,早点发现早点解决,不给任何人带来不必要的损失,是我做人的原则,只要钱到位,任何问题都不是问题。 JVM 远程调试 不得不说 IDEA 和 宝塔配合是真…

【FastApi】—— uvicorn启动程序出现端口冲突

文章目录 &#x1f356; 前言&#x1f3b6;一、问题描述✨二、更改方案&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 【FastApi】—— uvicorn启动程序出现端口冲突 &#x1f3b6;一、问题描述 描述&#xff1a; INFO: Will watch for changes …

Spring Cloud版本导致的java.lang.NoSuchFieldError: sharedInstance异常

目录 一、问题现象二、解决办法1、本次异常配置2、修改后的配置 三、原因分析 一、问题现象 2023-12-05 16:21:53.680]|[ INFO]|[80173]|[main]|[]|[]|[trationDelegate$BeanPostProcessorChecker:335]|[Bean org.springframework.cloud.client.loadbalancer.reactive.LoadBal…

css 3D背景反转实现

body{/* 透视 */perspective: 800px; } div{transform-style:preserve-3d;width:259px;height:396px;margin: 100px auto;position: relative; } div img{position: absolute;width:259px;height:396px;left:0;top:0;transition: all linear 2s;z-index: 0; } div img:nth-chil…