Docker-Compose实现Mysql主从-编程思维

1. 简介

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

演示mysql版本:5.7.16

2. 部署流程

master节点:

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

slave节点:

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

3. master节点

3.1 安装mysql

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

  2. 创建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
      

    3. 因为当前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,可能的原因有很多,可以查看如下的字段中输出的内容

可能的原因:

  1. 主从网络不通
  2. 两台节点的server-id重复,直接修改对应的id即可
  3. 数据库的uuid相同(可能是因为数据库文件是直接copy过来的导致的),在对应的库下生成不同于master的uuid到auto.cnf中即可
  4. sql执行失败,可能是slave刚添加进来,也没有master库的数据库instance,导致操作对应的库时slave这边根本没有对应的instance或者table又或是记录,引发的报错。这个只能具体问题具体解决了
  5. 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

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/ludangxin/p/16358928.html

在 Minecraft 中管理 Kubernetes 集群-编程思维

原文链接:在 Minecraft 中管理 Kubernetes 集群 微软 2015 年收购 Minecraft 之后不久开源了一个项目叫 Dockercraft,这个项目当时看起来非常有趣,通过 Dockercraft,玩家可以在 Minecraft 中启动或停止一个 Docker 容器,而 Docker 容器会以

超详细干货!Docker+PXC+Haproxy搭建高可用强一致性的MySQL集群-编程思维

前言 干货又来了,全程无废话,可先看目录了解。 MySQL搭建集群最常见的是binlog方式,但还有一种方式是强一致性的,能保证集群节点的数据一定能够同步成功,这种方式就是pxc,本篇就使用图文方式一步步展示具体的搭建步骤及最终效果。 搭建 本次搭建集群环境以5节点MySQL为例 1、安装pxc镜像 拉取px

【视频】k8s套娃开发调试dapr应用 - 在6月11日【开源云原生开发者日】上的演示-编程思维

这篇博客是在2022年6月11日的【开源云原生】大会上的演讲中的演示部分。k8s集群套娃(嵌套)是指在一个k8s的pod中运行另外一个k8s集群,这想法看上去很疯狂,实际上非常实用。 k8s集群套娃(嵌套)是指在一个k8s的pod中运行另外一个k8s集群,这想法看上去很疯狂,其实这想法也非常实用。 试想,当你开发一个

关于事务的四个特性、事务的隔离级别、事务的并发问题-编程思维

关于事务的四个特性、事务的隔离级别、事务的并发问题 事务的四个特性 MySQL事务,首先要提他的四大特性(ACID),正是这些特性,才保证了数据库事务的安全性。 原子性(Atomicity) 一致性(Consistent) 隔离性(Isolation) 持久性(Durable) 原子性 原子性是指一个事务是一个不可分割

数据库监测sql执行-编程思维

SQL Server Profiler可以检测在数据上执行的语句,特别是有的项目不直接使用sql语句,直接使用ORM框架的系统处理数据库的项目,在调试sql语句时,给了很大的帮助。 之前写了使用SQL Server Profiler追踪死锁的文章《SQL Server Profiler追踪数据库死锁》,这里再简单写SQ

jdbc、orm、jpa、spring data jpa,傻傻分不清楚?一文带你厘清个中曲直,给你个选择springdatajpa的理由!_架构悟道-编程思维

序言Spring Data JPA作为Spring Data中对于关系型数据库支持的一种框架技术,属于ORM的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度。 本文档隶属于《Spring Data JPA用法与技能探究》系列的第一篇。本系列文档规划对Spring Data JPA进行全方位的使用介绍,

学会4种备份mysql数据库(基本备份方面没问题了)_星朝-编程思维

前言 我们试着想一想, 在生产环境中什么最重要?如果我们服务器的硬件坏了可以维修或者换新, 软件问题可以修复或重新安装, 但是如果数据没了呢?这可能是最恐怖的事情了吧, 我感觉在生产环境中应该没有什么比数据跟更为重要. 那么我们该如何保证数据不丢失、或者丢失后可以快速恢复呢?只要看完这篇, 大家应该就能对MySQL中