程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • MySQL基础

  • MySQL高级

    • 第01章_Linux下安装MySQL
    • 第02章_MySQL的数据目录
    • 第03章_用户与权限管理
    • 第04章_逻辑架构
    • 第05章_存储引擎
    • 第06章_索引的数据结构
    • 第07章_InnoDB数据结构
    • 第08章_索引的创建与设计
    • 第09章_性能分析工具
    • 第10章_索引优化与优化
    • 第11章_数据库的设计规范
    • 第12章_数据库调优策略
    • 第13章_事务基础知识
    • 第14章_MySQL事务日志
    • 第15章_锁
    • 第16章_多版本并发控制
    • 第17章_其他数据库日志
    • 第18章_主从复制
    • 第19章_数据库备份与恢复
    • 第20章_Docker实现主从复制
    • MySQL
    • MySQL高级
    scholar
    2024-03-12
    目录

    第20章_Docker实现主从复制

    友情提示

    转载须知: 以下所有文章整理于B站宋红康老师的《MySQL数据库入门到大牛》。MySQL (opens new window)

    # 1. 前言

    mysql主从复制用途

    • 实时灾备,用于故障切换
    • 读写分离,提供查询服务
    • 备份,避免影响业务

    主从部署必要条件:

    • 主库开启binlog日志(设置log-bin参数)
    • 主从server-id不同
    • 从库服务器能连通主库

    利用docker实现mysql的主从复制,首先需要在服务器上安装好docker 及拉取相关mysql镜像:

    关于docker的环境配置可以参考这里https://note.wym123.cn/docker/install/ (opens new window)

    # 2. 拉取镜像到本地

    docker pull mysql:tag   # tag 默认不加是最新版
    
    docker pull mysql:8.0.27   # 目前最新版本为 8.0.27
    
    1
    2
    3

    然后利用镜像分别启动两个容器,一个主机master ,一个从机slave , master端口为3307,slave为3308对应的root密码为123456,映射配置文件和数据存储目录到 mysql。

    MySQL在容器启动时创建的文件和目录都会直接出现在宿主机的挂载目录中,实现了宿主机目录和容器内目录之间的实时同步。注意宿主机路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它

    启动 Master

    docker run -d \
        --name master \
        --restart always \
        -p 3307:3306 \
        -e MYSQL_ROOT_PASSWORD=123456 \
        -v /docker/master/data:/var/lib/mysql \
        -v /docker/master/conf:/etc/mysql/conf.d \
        -v /docker/master/log:/var/log \
        mysql:8.0.27
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    启动Slave

    docker run -d \
        --name slave \
        --restart always \
        -p 3308:3306 \
        -e MYSQL_ROOT_PASSWORD=123456 \
        -v /docker/slave/data:/var/lib/mysql \
        -v /docker/slave/conf:/etc/mysql/conf.d \
        -v /docker/slave/log:/var/log \
        mysql:8.0.27
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    # 3. 配置主机(master)配置文件

    提示

    这里说明一下:容器内主配置文件名叫 my.cnf,位置在 /etc/mysql,但是官方不建议直接操作 my.cnf 主配置文件所以官方提供了 conf.d 目录,只要在 conf.d 目录下创建 xx.cnf 配置文件,那么该配置文件自动被引入 my.cnf 主配置文件,避免直接操作 my.cnf 引起安全问题。

    conf目录映射了容器内的con.d目录,所以在master/conf/ 路径下创建 my.cnf :vim /docker/master/conf/my.cnf

    [mysqld]
    ## 同一局域网内注意要唯一
    server-id=1
    #[必须]启用二进制日志,对应是二进制日志名称前缀。可以指定路径本地的路径/log/my-binlog,默认在/var/lib/mysql路径下
    log-bin=my-binlog
    #[可选] 0(默认)表示读写(主机),1表示只读(从机)
    read-only=0
    #设置日志文件保留的时长,单位是秒
    binlog_expire_logs_seconds=6000
    #控制单个二进制日志大小。此参数的最大和默认值是1GB
    max_binlog_size=200M
    #[可选]设置不要复制的数据库
    binlog-ignore-db=test
    #[可选]设置需要复制的数据库,默认全部记录。比如:binlog-do-db=atguigu_master_slave
    # binlog-do-db=需要复制的主数据库名字
    #[可选]设置binlog格式
    binlog_format=STATEMENT
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    # 4. 配置从机(slave)配置文件

    在slave /conf/路径下 创建 my.cnf 内容如下,执行命令 :vim /docker/slave/conf/my.cnf

    [mysqld]
    ## 设置server_id,注意要唯一
    server-id=2
    ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
    log-bin=mysql-slave-bin   
    ## relay_log配置中继日志
    relay_log=edu-mysql-relay-bin
    secure_file_priv=/var/lib/mysql
    default_authentication_plugin=mysql_native_password  #设置密码规则
    max_connections=1000 #最大连接数设置 根据实际需要 自行调整
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    image-20240312215353561

    启动完成后,分别测试下连接,发现都可以正常连接,接下来开始具体的主从配置 image-20240312215459359 image-20240312215524450

    # 5. 主从数据同步配置

    使用navicat连接 master数据库,进行slave账户创建及相关授权

    image-20240312215949723

    -- 创建一个名为 'slave1' 的用户,允许从任何主机连接,密码设置为 '123456'
    CREATE USER 'slave1'@'%' IDENTIFIED BY '123456';
    
    -- 授予 'slave1' 用户复制从服务器的权限
    GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';
    
    -- 为了兼容性,改变 'slave1' 用户的密码加密方式为 'mysql_native_password',
    -- MySQL 8.0 默认使用 'caching_sha2_password' 加密方式,这可能会导致旧客户端连接失败
    ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    
    -- 刷新权限,使之前的更改立即生效
    FLUSH PRIVILEGES;
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    在Master进入mysql,执行show master status;

    -- 显示当前MySQL服务器的二进制日志状态,此状态信息对设置复制非常重要,
    -- 包括当前正在使用的二进制日志文件名和位置
    SHOW MASTER STATUS;
    
    1
    2
    3

    image-20240312220625705 回到linux服务器,执行命令查看master容器的ip地址

    [root@wuyimin]# docker inspect --format={{.NetworkSettings.IPAddress}} master
    172.17.0.2
    
    1
    2

    然后在slave数据库服务器中根据上面得到的信息执行命令,主要是 master_log_file 和 master_log_pos 这两个参数需要根据上面语句查出来的结果进行配置,IP分配的内部地址基本就是172.17.0.2,如果不是这个地址改为 上述 查询出来的地址即可。

    CHANGE MASTER TO \
        MASTER_HOST='172.17.0.2', \
        MASTER_USER='slave1', \
        MASTER_PASSWORD='123456', \
        MASTER_PORT=3306, \  
        MASTER_LOG_FILE='my-binlog.000001', \
        MASTER_LOG_POS=156, \
        MASTER_CONNECT_RETRY=30;
    
    1
    2
    3
    4
    5
    6
    7
    8
    • master_port:Master的端口号,指的是容器的端口号,不要填映射的端口号.
    • master_user:用于数据同步的用户
    • master_password:用于同步的用户的密码
    • master_log_file:指定Slave从哪个日志文件开始复制数据,即上文中提到的File字段的值
    • master_log_pos:从哪个Position开始读,即上文中提到的Position字段的值
    • master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

    查询下当前从服务器的状态

    show slave status \G;
    
    1

    由于navicat 不支持 \G格式化展示,所以我们进入slave从服务器内查看

    docker exec -it slave mysql -uroot -p123456
     
    show slave status \G
    
    1
    2
    3

    image-20240312221257241

    可以看到这两个属性都为No 设置从数据库开启主从服务

    # 启动slave同步
    start slave;
    
    1
    2

    如果中途报错,之类的,可以使用reset slave进行从服务器重置

    # 先关闭同步
    stop SLAVE;
    # 然后重置从服务器的复制配置,包括删除现有的中继日志文件并重新初始化中继日志
    reset slave; 
    
    1
    2
    3
    4

    如果之前的配置没配置好,第一个yes将不会正常显示 再次强调!!!即:下面这段配置一定要对应好!!

    change master to master_host='172.17.0.2', master_user='slave1', master_password='123456',
    master_port=3306, master_log_file='my-binlog.000001', master_log_pos=156, master_connect_retry=30;
    
    1
    2

    image-20240312221053195 执行语句后,可以看到主从服务已经开启了。

    # 6. 主从同步测试

    利用navicat 在主数据库新建一个TestDB数据库,然后刷新从数据库连接

    image-20240312221737536 刷新: image-20240312221827617 发现在主数据库添加的新库TestDB也被同步到从数据库上了,至此主从同步配置完成。 后续对主数据库做的操作都会基于binlog发送给从数据库的relaylog上进行同步。

    编辑此页 (opens new window)
    上次更新: 2024/12/28, 18:32:08
    第19章_数据库备份与恢复

    ← 第19章_数据库备份与恢复

    Theme by Vdoing | Copyright © 2019-2025 程序员scholar
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式