• Docker实践经验:Docker 上部署 mysql8 主从复制


    在这里插入图片描述

    文章目录

    环境准备

    需要一个 MySQL8 版本的 MySQL,因为我个人没有用过 mysql5,不知道二者是否会有一些特性上的偏差。

    默认你与我的环境是一样的。


    简易版本安装

    先仅仅安装一个 MySQL,一上来就主从的话很多细节都会杂糅在一起。

    docker run -d -p 3306:3306 --privileged=true -v /mysql/log:/var/log/mysql -v /mysql/data:/var/lib/mysql -v /mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456  --name mysql mysql
    
    • 1

    这里的参数介绍一下:

    -p:指定内外端口映射,虚拟机为外,docker 容器为内,写在前面的为外部端口,写在后面的为内部端口。因为 MySQL 本身端口为 3306,为了不使你们混淆,我外部端口不设置为 3306。
    -v:指定内外存储卷映射,Docker 实践经验(三)讲的就是这个。
    -e:往容器内部传参,最后会由 MySQL 来接收。关于这个 -e 其实我也还没研究它的一个走势。
    
    • 1
    • 2
    • 3

    这样一个简易的 MySQL 就能动了。


    设置密码

    没有设置密码的话,不确定第二次要登录的时候是否还能进得去了。
    不确定的意思就是可能进得去,可能进不去。

    所以我们自行设置一个密码比较保险。

    mysql> use mysql
    
    mysql> update user set authentication_string='123456' where user='root' and host='localhost';
    
    mysql> flush privileges;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    不用注释吧。


    现在这个 MySQL 能动了吧,可以考虑删掉了,咱开始做主从复制。

    如果想留着用的:
    修改 my.cnf,通过数据卷同步给MySQL:

    cd /mysql/conf
    vim my.cnf
    插入以下内容:
    [client]
    default_character_set=utf8
    [mysqld]
    collation_server = utf8_general_ci
    character_set_server = utf8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    重启MySQL:

    docker restart mysql
    docker exec -it mysql bash
    
    • 1
    • 2

    配置 MySQL 主从复制

    创建 bridge 网络并指定 IP 区间

    docker network create --driver bridge mysql-master-slave
    
    • 1

    mysql连接数默认不够

    set global max_connections=500;
    set global mysqlx_max_connections=500;
    
    • 1
    • 2

    创建数据和配置存放目录

    # 创建主库数据存放目录
    mkdir -p /home/docker/mysql/master/data
    # 创建主库配置存放目录
    mkdir -p /home/docker/mysql/master/conf
     
    # 创建从库1数据存放目录
    mkdir -p /home/docker/mysql/slave1/data
    # 创建从库1配置存放目录
    mkdir -p /home/docker/mysql/slave1/conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    准备配置文件

    主数据库

    [mysqld]
    pid-file        = /var/run/mysqld/mysqld.pid
    socket          = /var/run/mysqld/mysqld.sock
    datadir         = /var/lib/mysql
     
    secure-file-priv= NULL
     
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
     
    # 服务器唯一ID,默认是1
    server-id=10
     
    # 启用二进制日志
    log-bin=mysql-bin
     
    # 最大连接数 
    max_connections=10000
     
    # 设置默认时区
    default-time_zone='+8:00'
     
    # 0:区分大小写
    # 1:不区分大小写
    lower_case_table_names=1
     
    !includedir /etc/mysql/conf.d/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    从数据库

    [mysqld]
    pid-file        = /var/run/mysqld/mysqld.pid
    socket          = /var/run/mysqld/mysqld.sock
    datadir         = /var/lib/mysql
     
    secure-file-priv= NULL
     
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
     
    # 服务器唯一ID,默认是1
    server-id=11
     
    # 启用二进制日志
    log-bin=mysql-bin
     
    # 最大连接数 
    max_connections=10000
     
    # 设置默认时区
    default-time_zone='+8:00'
     
    # 0:区分大小写
    # 1:不区分大小写
    lower_case_table_names=1
     
    !includedir /etc/mysql/conf.d/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    启动数据库

    启动主数据库

    如果上面完全按照我的步骤来,这里的命令也不用改参数。

    docker run -d -p 3316:3306 --name mysql_master --restart=always --network mysql-master-slave -v /home/docker/mysql/master/data:/var/lib/mysql -v /home/docker/mysql/master/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql
    
    • 1

    启动从数据库

    docker run -d -p 3326:3306 --name mysql_slave1 --restart=always --network  mysql-master-slave -v /home/docker/mysql/slave1/data:/var/lib/mysql -v /home/docker/mysql/slave1/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql
    
    • 1

    远程访问配置(主从)

    # 在容器 mysql_master 中开启一个交互模式的终端
    docker exec -it mysql_master /bin/bash
     
    # 在容器 mysql_slave1 中开启一个交互模式的终端
    docker exec -it mysql_slave1 /bin/bash
     
    # mysql 登录
    mysql -u root -p
     
    # 给予远程用户所有表所有权限
    GRANT ALL ON *.* TO 'root'@'%';
     
    # 更改加密规则
    ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
     
    # 远程访问
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
     
    # 刷新权限
    flush privileges;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    主库创建复制用户

    CREATE USER 'woniu'@'%' IDENTIFIED WITH mysql_native_password BY 'woniu123456';
     
    GRANT REPLICATION SLAVE ON *.* TO 'woniu'@'%';
    
    flush privileges;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看 master 机器的状态

    SHOW MASTER STATUS;
    
    • 1

    在这里插入图片描述


    从库设置 master 的信息

    如果前面完全按我的步骤来,这里需要填写你们自己宿主机上的 ip、还有上图中显示的那两个数据。

    change master to master_host='192.168.190.133', master_user='woniu', master_password='woniu123456', master_port=3316, master_log_file='mysql-bin.000003', master_log_pos=2838, master_connect_retry=30;
    
    • 1

    参数释义:

    master_host:主数据库的IP地址;
    master_port:主数据库的运行端口;
    master_user:在主数据库创建的用于同步数据的用户账号;
    master_password:在主数据库创建的用于同步数据的用户密码;
    master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
    master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
    master_connect_retry:连接失败重试的时间间隔,单位为秒。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    开启主从复制

    # 开始同步
    start slave;
     
    # 同步状态
    show slave status ;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    请添加图片描述

    如果成功,圈出来的地方要都是 yes、
    如果失败,会显示日志:
    请添加图片描述

    可自行百度,不过百度出来的不一定就适用于咱,毕竟咱是在 docker 上部署的,现有资料较少。
    要靠经验。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    关于Unity Time.deltaTime的理解和使用
    2022 Apache IoTDB 物联网生态大会 | 早鸟超值获票福利第一弹!(限时 3 天)
    志宁的程序人生-从中专到博士,从分州到首都
    LC15.三数之和、LC22括号生成
    【微信小程序】button和image组件的基本使用
    P1151 子数整数
    复旦博士用130行代码解决核酸统计,2分钟完成人工一小时工作量
    【C语言】C语言文件操作详解(一)
    R语言计算dataframe所有数据列的平均值:将dataframe转化为矩阵或者向量后再计算
    RPC - gRPC简单的demo - 学习/实践
  • 原文地址:https://blog.csdn.net/m0_67392811/article/details/126082616