• 基于Docker从零到一实操MySql的主从复制


    一、在Docker上安装,启动MySQL

    查看docker是否安装成功

    docker -v 查看是否已经安装了docker,如下面提示版本信息则是安装了。

    ➜  ~ docker -v
    Docker version 20.10.16, build aa7e414```
    
    • 1
    • 2

    查询docker hub 上是否有mysql镜像,
    如下 ofiicial 为ok的为官方发布的,一般我们选择就是官方提供的。

    docker search mysql
    NAME     DESCRIPTION    STARS     OFFICIAL   AUTOMATED
    mysql    MySQL is a widely used,   [OK]
    
    • 1
    • 2
    • 3

    使用docker pull mysql 拉去mysql 这里的mysql为上面search 出来的name字段;

    安装mysql

    ➜  ~ docker pull mysql
    Using default tag: latest
    latest: Pulling from library/mysql
    bd2ec1b01835: Downloading [=========>                                         ]  7.979MB/43.63MB
    ec2e560d878c: Download complete
    e8397fbbbc3b: Download complete
    eff4258297ab: Download complete
    137be606bff3: Download complete
    0ef6a538fcba: Download complete
    a5431fa8c17d: Downloading [========>                                          ]  10.14MB/57.7MB
    23af94ba6338: Download complete
    87a8250fff28: Downloading [=====>                                             ]  6.919MB/63.78MB
    6b7e1aea563b: Waiting
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    查看mysql镜像

    等待⌛️安装完成✅后,docker images -a 查看本地镜像

    ➜  ~ docker images -a
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    mysql        latest    bdfb0ec4d54a   4 weeks ago   599MB
    
    • 1
    • 2
    • 3

    docker run -it mysql /bin/bash

    ( 参数 -i -t 等价于 -it 表示insert , 进入 ; /bin/bash 表示 shell 脚本交互界面 )

    ➜  ~ docker run -it mysql /bin/bash
    bash-4.4# ls
    bin   dev			  etc	lib    media  opt   root  sbin	sys  usr
    boot  docker-entrypoint-initdb.d  home	lib64  mnt    proc  run   srv	tmp  var
    
    • 1
    • 2
    • 3
    • 4

    基于上一步后,查看mysql 的版本

    bash-4.4# mysql -V
    mysql  Ver 8.1.0 for Linux on aarch64 (MySQL Community Server - GPL)
    
    • 1
    • 2

    退出当前窗口🪟,docker 容器也同时推出,docker ps 查看后没有记录

    bash-4.4# exit
    exit
    
    • 1
    • 2

    进入mysql后台操作

    启动mysql 后一直运行:

      docker run -p 3306:3306 --name JY_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
    
    • 1

    像上述的命令运行的mysql,如果只是平时玩玩是没问题。因为没有做到备份数据记录📝,如果某个(100+150)运行 docker rm -f mysql 后,你的mysql数据也被删除了。

    docker Volume(卷)入门

    这里就要说说 docker Volume 卷

    Docker 卷(Volume)是用于持久化存储数据的一种机制,可以将宿主机上的文件系统目录或者其他容器挂载到容器中,以方便地对数据进行管理和共享。

    下面是 Docker 卷的一些特点和使用方法:

    1. 数据持久化:容器运行时的数据保存在卷中,即使容器停止或删除,数据仍然存在。

    2. 数据共享:多个容器可以挂载同一个卷,实现数据共享。

    3. 管理文件系统:Docker 卷可以为容器指定一个特定的文件系统,从而使容器和宿主机之间的文件系统隔离。

    4. 备份和恢复:通过卷,可以将容器的数据备份到宿主机,方便容器的数据管理和恢复。

    使用 Docker 卷的步骤如下:

    1. 创建卷:可以使用 docker volume create 命令创建卷,也可以在容器启动时自动创建。

    2. 挂载到容器:使用 -v 或 --mount 参数将卷挂载到容器中,可以指定挂载点和读写权限等参数。

    3. 访问数据:在容器中使用挂载点访问卷中的数据。

    例如,下面的命令将创建一个名为 myvolume 的卷,并将其挂载到名为 mycontainer 的容器的 /data 目录中:

    docker volume create myvolume
    docker run -v myvolume:/data --name mycontainer myimage
    
    • 1
    • 2

    这样,在容器中访问 /data 目录时,就可以访问到卷中的数据了。(也就是数据共享的味道了)如果需要备份或恢复数据,可以使用 docker cp 命令将容器中的数据备份到宿主机上,或者将宿主机上的数据恢复到容器中

    看了上述的基本认识,我们回到关于 250 删了我们的mysql的数据备份问题。我们照着上面画葫芦,加上 -v 以及备份的路径,

    ➜  ~ docker run -p 3306:3306 --name mysql -v $PWD/conf/my.cnf:/etc/mysql/my.cnf -v $PWD/logs:/logs -v $PWD/data:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql
    
    • 1

    这里我提前安装了 docker desktop 工具,下面就是带了 -v 也就是有卷和没卷的创建的mysql,明显带 -v 的数据大小大了很多。也可以使用 docker inspect my_container 查看;
    请添加图片描述

    然后我们 docker ps 查看,exec 进入操作一下

     docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                               NAMES
    0fbfa37c3274   mysql     "docker-entrypoint.s…"   42 minutes ago   Up 42 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
    
    docker exec -it 0fbfa37c3274 /bin/bash
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我们进入mysql后台 ,然后就是创建表,插入数据,这些操作就和在mysql操作一样

    bash-4.4# mysql -u root -p
    Enter password:
    mysql> create DATABASE TESTDB;
    mysql> CREATE TABLE IF NOT EXISTS `test_tbl`(
       `testdb_id` INT UNSIGNED AUTO_INCREMENT,
       `testdb_title` VARCHAR(100) NOT NULL,
       `testdb_author` VARCHAR(40) NOT NULL,
       `testdb_date` DATE,
       PRIMARY KEY ( `testdb_id` )
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    mysql> use TESTDB;
    Database changed
    mysql> INSERT INTO test_tbl 
        -> (testdb_title, testdb_author, testdb_date)
        -> VALUES
        -> ("learn docker use mysql", "chayedan", NOW());
    mysql>  SHOW DATABASES;
    mysql>  SHOW DATABASES LIKE '%DB';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    上面依次是创建数据库 TESTDB,创建表 test_tbl,插入数据,显示数据库;

    MySql的主从复制

    在docker环境中设置MySQL主从复制,需要以下步骤:

    1. 创建MySQL主从复制的网络

    docker network create mysql-replication
    
    • 1

    2. 创建MySQL主服务器

    docker run -d --name mysql-master \
      --network mysql-replication \
      -e MYSQL_ROOT_PASSWORD=master-pass \
      -e MYSQL_REPLICATION_USER=repl \
      -e MYSQL_REPLICATION_PASSWORD=repl-pass \
      mysql:latest \
      --server-id=1 \
      --log-bin=mysql-bin \
      --binlog-do-db=testdb \
      --binlog-ignore-db=mysql \
      --gtid-mode=ON \
      --enforce-gtid-consistency=ON \
      --log-slave-updates=ON \
      --auto-increment-offset=1 \
      --auto-increment-increment=2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3. 创建MySQL从服务器

    docker run -d --name mysql-slave \
      --network mysql-replication \
      -e MYSQL_ROOT_PASSWORD=slave-pass \
      -e MYSQL_REPLICATION_USER=repl \
      -e MYSQL_REPLICATION_PASSWORD=repl-pass \
      mysql:latest \
      --server-id=2 \
      --log-bin=mysql-bin \
      --binlog-do-db=testdb \
      --binlog-ignore-db=mysql \
      --gtid-mode=ON \
      --enforce-gtid-consistency=ON \
      --relay-log=mysql-relay-bin \
      --log-slave-updates=ON \
      --read-only=ON \
      --auto-increment-offset=2 \
      --auto-increment-increment=2 \
      --master-info-repository=TABLE \
      --relay-log-info-repository=TABLE \
      --replicate-do-db=testdb
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    4. 配置主从同步

    在主服务器上创建一个用户和密码,用于从服务器连接到主服务器。在主服务器上执行以下命令:

    CREATE USER 'repl'@'%' IDENTIFIED BY 'repl-pass';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
    FLUSH PRIVILEGES;
    
    • 1
    • 2
    • 3

    然后,在从服务器上执行以下命令:

    CHANGE MASTER TO
      MASTER_HOST='mysql-master',
      MASTER_USER='repl',
      MASTER_PASSWORD='repl-pass',
      MASTER_AUTO_POSITION=1;
    START SLAVE;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    5.测试主从同步

    在主服务器上创建一个测试数据库和表:

    CREATE DATABASE testdb;
    USE testdb;
    CREATE TABLE users (
      id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
      name VARCHAR(255) NOT NULL
    );
    INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Charlie');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    然后,在从服务器上查询该表:

    USE testdb;
    SELECT * FROM users;
    
    • 1
    • 2

    如果返回结果与主服务器上的结果一致,则说明主从同步已经成功。


    总结

    我们一开始介绍了如何在docker上安装与启动mysql,以及进入mysql的后台创建数据库与表等;接着我们过了一遍如何基于docker操作mysql 主从库复制。

  • 相关阅读:
    Element Plus 组件库相关技术:7. 组件实现的基本流程及 Icon 组件的实现
    typescript辅助技术
    web大作业 静态网页(地下城与勇士 10页 带视频)
    spring 使用多线程,保证事务一致性
    【UCIe】UCIe 协议层介绍
    动态组件<component></component>、<keep-alive></keep-alive>
    java毕业设计艾灸减肥管理网站Mybatis+系统+数据库+调试部署
    无涯教程-JavaScript - INDIRECT函数
    【管理运筹学】第 8 章 | 动态规划(2,动态规划的基本思想)
    计算机网络之传输层
  • 原文地址:https://blog.csdn.net/Bruce__taotao/article/details/132767634