我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Docker-Compose实现Mysql主从的示例代码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Docker-Compose实现Mysql主从的示例代码

1. 简介

通过使用docker-compose 搭建一个主从数据库,本示例为了解耦 将两个server拆分到了两个compose文件中,当然也可以放到一个compose文件中

演示mysql版本:5.7.16

2. 部署流程

master节点:

  • 安装mysql-server
  • 修改配置
  • 创建用于同步的账号并授权
  • 检查相关配置

slave节点:

  • 安装mysql-server
  • 修改配置
  • 选择主节点
  • 检查相关配置并验证同步功能

3. master节点

3.1 安装mysql

创建mysql文件夹并进入文件夹(文件夹名称mysql)

创建docker-compose文件内容如下

# docker-compose.yml
version: '3'
services:
  mysql:
    restart: "no"
    image: mysql:5.7.16
    container_name: mysql-master
    volumes:
      - ./datadir:/var/lib/mysql
      - ./conf/mysql:/etc/mysql
    environment:
      - "MYSQL_ROOT_PASSWORD=123456"
      - "TZ=Asia/Shanghai"
    ports:
      - 3306:3306
    networks:
      - mysql-net
networks:
  mysql-net:
    driver: bridge

注意:因为要把配置文件挂在到服务中去,所以要先把容器中的配置文件copy到宿主机上

1.先启动一个用于copy文件的容器

$ docker run --name mysql-temp -e MYSQL_ROOT_PASSWORD=root --rm -d  mysql:5.7.16

2.将mysql-temp容器中的配置文件copy出来,现在conf文件夹中就是mysql自带的所有配置文件

$ docker cp mysql-temp:/etc/mysql conf

因为当前conf目录中的my.cnf还是个link,所以直接使用当前目录中的备份文件作为主要的配置文件

$ mv my.cnf.fallback my.cnf

3.修改配置文件my.cnf

在文件的最下方加入配置信息

[mysqld]
log-bin=mysql-bin # 开启 binlog
server-id=1 # 当前server在cluster中的id,必须保证在cluster中唯一
#只保留7天的二进制日志,以防磁盘被日志占满(可选)
expire-logs-days = 7
#不备份的数据库 (可选)
binlog-ignore-db=information_schema  
binlog-ignore-db=performation_schema
binlog-ignore-db=sys

4.启动mysql服务,通过输出内容得知真实的网络名称为mysql_mysql-net,也就是当前所在文件夹的名称拼接了文件中指定的网络名称

5.服务启动完毕后,创建用于同步的用户并授权

创建的用户名称为slave密码为123456

CREATE USER 'slave' @'%' IDENTIFIED BY '123456';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave' @'%';
#刷新权限
FLUSH PRIVILEGES;

6.查看master状态信息

SHOW MASTER STATUS;
#查看Mater数据有哪些slave
select * from information_schema.processlist as p where p.command = 'Binlog Dump'; 

4. slave节点

安装步骤同master相同,只把需要修改的展示一下,当前的目录结构如下

docker-compose.yaml 主要修改了网络相关的信息和container_name(网络名称上面有解释)

version: '3'
services:
  mysql:
    restart: "no"
    image: mysql:5.7.16
    container_name: mysql-slave
    volumes:
      - ./datadir:/var/lib/mysql
      - ./conf:/etc/mysql
    environment:
      - "MYSQL_ROOT_PASSWORD=123456"
      - "TZ=Asia/Shanghai"
    ports:
      - 3307:3306
    networks:
      - mysql_mysql-net
networks:
  mysql_mysql-net:
    external: true # 来自外部

my.cnf添加的内容如下:

[mysqld]
server-id=2
relay_log=relay-log
#开启只读 意味着当前的数据库用作读,当然这也只会影响到非root的用户,如果使用root用户操作本库是不会有影响的
read_only=ON

设置完成后启动salve server,连接slave并关联master节点

  • MASTER_HOST:直接使用container_name
  • MASTER_LOG_FILE/MASTER_LOG_POS:直接使用安装master步骤中的最后一步的值,其实就是指定同步的bin-log文件名称和Offset
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;

管理完成后 启动salve

START SLAVE;

最后查看slave status

SHOW SLAVE STATUS;

5. 验证

在master上创建test数据库并创建user表,刷新查看salve库,出现了对应的库表

经验证数据同步也没有问题。

6. 可能遇到的问题

SHOW SLAVE STATUS时发现 slave_io_running=No salve_sql_running=No,可能的原因有很多,可以查看如下的字段中输出的内容

可能的原因:

  • 主从网络不通
  • 两台节点的server-id重复,直接修改对应的id即可
  • 数据库的uuid相同(可能是因为数据库文件是直接copy过来的导致的),在对应的库下生成不同于master的uuid到auto.cnf中即可
  • sql执行失败,可能是slave刚添加进来,也没有master库的数据库instance,导致操作对应的库时slave这边根本没有对应的instance或者table又或是记录,引发的报错。这个只能具体问题具体解决了
  • master和slave的MASTER_LOG_FILE/MASTER_LOG_POS值设置的有问题,在slave节点上STOP SLAVE;然后重新连接下master即可

7. 同步部分数据库实例或表

在master节点上添加配置【可选】(如果只希望从库读取到部分实例)

在my.cnf文件中加入如下配置

#需要同步的数据库名 有多个库添加多行即可
binlog-do-db=test
binlog-do-db=test1
#排除的数据库
binlog-ignore-db=sys

salve端:在my.cnf文件中加入如下配置,这样的话salve只会读取配置的db或table,master对其他db的操作也不会影响slave

#如果salve库名称与master库名相同,使用本配置 
replicate-do-db=test
#如果master库名[test]与salve库名[test001]不同,使用以下配置[需要做映射] 
#replicate-rewrite-db = test -> test001
#如果不是要全部同步[默认全部同步],则指定需要同步的表 
#replicate-wild-do-table=test.user
#replicate-wild-do-table=test.role

到此这篇关于Docker-Compose实现Mysql主从的示例代码的文章就介绍到这了,更多相关Docker-Compose Mysql主从内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Docker-Compose实现Mysql主从的示例代码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用docker compose启动postgresql的示例代码

目录引言创建初始化 SQL 脚本文件:更新 docker Compose 配置:启动 PostgreSQL 容器:引言要在启动 Postgr编程网eSQL 容器时执行特定的初始化文件,可以使用 Docker 的 docker-entryp
使用docker compose启动postgresql的示例代码
2024-10-16

docker-compose启动mysql双机热备互为主从的方法实现

目录1. 环境说明2. 启动 mysql-013. 启动 mysql-024. 配置主从同步4.1 mysql-01(master) ==> mysql-02(slave)4.2 mysql-02(master) ==> mysql-01(
2022-07-14

docker compose启动mysql双机热备互为主从怎么实现

本篇内容主要讲解“docker compose启动mysql双机热备互为主从怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“docker compose启动mysql双机热备互为主从怎么实
2023-07-02

Mysql实现水平分库的示例代码

目录前言:讲解:第一种方式的水平分库:mysql水平分库数据查询合并MySQL水平分库插入数据前言:平时开发中,可能会遇见数据量越来越大的情况,一般数据量过千万级别,就必须考虑分库分表的情况了,来减少io 服务器压力, 这里目前记录一下
2023-06-08

mysql实现自增序列的示例代码

1.创建sequence表CREATE TABLE `sequence` (`name` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '序列的名字',`current_value` int(1
2022-05-28

MySQL实现查询分位值的示例代码

目录背景业务背景思考效果参考背景分位值的概念分位值:分位值(Quartile)是一种用于描述数据分布的统计概念,在统计学和数据分析中经常被用到。一般情况下,分位值分成四个等份,分别为第一分位数(Q1)、第二分位数(Q2)(也就是中位数)
2023-04-24

docker-compose启动redis多机集群的实现(6台服务器3主3从)

目录1. 环境说明2. 集群部署Redis-node-1redis-node-2redis-node-3redis-node-4redis-node-5redis-node-63. 初始化4. 测试1. 环境说明节点IPredis-nod
2022-07-13

iOS整个APP实现灰色主题的示例代码

灰色主题 背景 在一些哀悼日,清明节的时候app会实现一些灰色主题功能,部分app需求是tab首页实现灰色模式就可以,但一些需求是直接整个app都变为灰色模。 普通UI界面web页面xib界面attributeText加载的htmlStri
2022-06-03

C#/VB.NET实现从PPT中提取图片的示例代码

PPT是用于制作幻灯片(演示文稿)的应用软件,每张幻灯片中都可以包含文字、图形、图形、表格、声音和影像等多种信息。本文主要介绍了如何实现从PPT中提取图片的功能,需要的可以参考一下
2023-03-14

nodejs实现jwt的示例代码

本文主要介绍了nodejs实现jwt的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-03

编程热搜

目录