docker搭建mysql集群实现主从复制

前言

随着业务的增长,一台数据服务器已经满足不了需求了,负载过重。这个时候就需要减压了,实现负载均衡和读写分离,一主一丛或一主多从。
主服务器只负责写,而从服务器只负责读,从而提高了效率减轻压力。

主从复制方式可以分为:
主从同步:当用户写数据主服务器必须和从服务器同步了才告诉用户写入成功,等待时间比较长。
主从异步:只要用户访问写数据主服务器,立即返回给用户。
主从半同步:当用户访问写数据主服务器写入并同步其中一个从服务器就返回给用户成功。

主从复制的常见架构:一主一从、一主多从、多主多从、双主复制、级联复制(一主+一级从+二级从,一级从复制主库,二级从复制一级从库)

本文以一主三从架构为例,在docker中配置mysql集群,在实际多台服务器中原理基本差不多。


原理和过程

  1. 主库开启 bin-log,主库会生成一个 Log Dump 线程,用来给从库 I/O 线程传 bin-log;
  2. 从库生成两个线程,一个 I/O 线程(Slave_IO),一个 SQL 线程(Slave_SQL);
  3. 从库I/O 线程去请求主库的 bin-log,并将得到的 binlog 日志写到 relay-log (中继日志) 文件中;
  4. 从库SQL 线程会读取 relay-log 文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致。


拉取镜像

docker pull mysql:5.7

创建容器

执行下面的命令分别创建一台主数据库和3台从数据库,端口分别映射到3306-3309,其中mysql5.7为master库,其余为slave库,如果需要修改目录映射请自行修改参数

docker run -d --restart=always --name mysql5.7 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:5.7
docker run -d --restart=always --name mysql-slave1 -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 mysql:5.7
docker run -d --restart=always --name mysql-slave2 -e MYSQL_ROOT_PASSWORD=123456 -p 3308:3306 mysql:5.7
docker run -d --restart=always --name mysql-slave3 -e MYSQL_ROOT_PASSWORD=123456 -p 3309:3306 mysql:5.7

执行docker ps查看容器情况


主库配置

  1. 开启 bin-log

    进入主库,编辑my.cnf文件,在[mysqld]节点下增加下面几行配置开启 bin-log

    # 服务器唯一id
    server-id=1
    # 设置日志格式,默认值ROW。Statement:只记录 SQL,数据量小,但不能使用mysql函数;ROW:记录被修改的数据,数据量大;MIXED有函数时使用ROW,否则使用Statement
    binlog_format=MIXED
    # 二进制日志名,默认binlog
    log-bin=mysql-bin
    # 二进制日志保存时间(天)
    expire_logs_days=7
    # 设置不需要复制的数据库
    binlog-ignore-db=mysql
    binlog-ignore-db=infomation_schema
    binlog-ignore-db=performance_schema
    binlog-ignore-db=sys
    

    注意注意!!! :上面的配置一定要在[mysqld]节点下啊,不然会报错mysql: [ERROR] unknown variable 'server-id=1'

    保存后重启主库容器,记得要重启容器啊

  2. 创建同步用户

    同步数据不能使用root用户,我们登陆mysql新建一个

    mysql -u root -p
    

    输入密码后创建用户slave,密码是123456

    CREATE USER 'slave'@'%';
    ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
    FLUSH PRIVILEGES;
    
  3. 查看bin-log状态

    mysql> show master status;
    +------------------+----------+--------------+------------------------------------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                               | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------------------------------------+-------------------+
    | mysql-bin.000001 |      939 |              | mysql,infomation_schema,performance_schema,sys |                   |
    +------------------+----------+--------------+------------------------------------------------+-------------------+
    1 row in set (0.00 sec)
    

从库配置

分别进入3个从库,完成下面3个步骤

  1. 开启relay-log

    编辑my.cnf文件,增加下面几行配置开启 relay-log

    # 服务器唯一id,注意每台mysql服务器不要相同
    server-id=2
    # 中继日志名
    relay-log=relay-bin
    

    注意注意!!! :上面的配置一定要在[mysqld]节点下啊!

  2. 配置完成保存重启docker从库,然后再重新进入容器进行这一步,一定要重启容器啊

    分别执行下面的命令,注意把注释->去掉

    mysql> stop slave;
    mysql> CHANGE MASTER TO MASTER_HOST='192.168.204.128',	# 这里的ip填主库的ip,docker环境填宿主机ip地址即可
        -> MASTER_PORT=3306, # 这里的ip填主库的端口
        -> MASTER_USER='slave', # 用于同步数据的用户,不要用root
        -> MASTER_PASSWORD='123456',
        -> MASTER_LOG_FILE='mysql-bin.000001', # 填上一步查看到的主库bin-log文件名
        -> MASTER_LOG_POS=154;  # 填上一步查看到的主库Position
    mysql> start slave;
    
  3. 查看从库状态

    mysql> show slave status\G;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.204.128
                      Master_User: slave
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 939
                   Relay_Log_File: relay-bin.000002
                    Relay_Log_Pos: 320
            Relay_Master_Log_File: mysql-bin.000001
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB:
                  .........(后面的信息省略)
    

    注意:上面的Slave_IO_RunningSlave_SQL_Running这两个就是从库的IOSQL进程,状态必须为Yes才表示连接主库成功,如果是Connecting,说明链接失败,检查主库ip和mysql账号是不是错了

到这里,主从复制的配置就已经完成了。你在主库的所有操作现在从库应该都能保持同步了,需要注意的是如果你的主库有旧表和数据,那么在主从复制之前,你要把这些表和数据一起复制到从库再开启主从同步,不然SQL进程就会报错挂掉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/620100.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务核心01-Maven【项目管理工具】基础

一、Maven 简介 1.1 传统项目管理: 1.2 Maven 的作用 项目构建:提供标准的、跨平台的自动化项目构建方式。依赖管理:管理项目依赖的资源(jar 包),避免资源间的版本冲突问题统一开发结构:提供标…

夜莺监控(Nightingale)上线内置指标功能

Prometheus 生态里如果要查询数据,需要编写 promql,对于普通用户来说,门槛有点高。通常有两种解法,一个是通过 AI 的手段做翻译,你用大白话跟 AI 提出你的诉求,让 AI 帮你写 promql,另一种是平台…

智慧油田三维电子沙盘系统

深圳易图讯科技(www.3dgis.top)智慧油田三维电子沙盘系统采用三维GIS、大数据、云计算、虚拟现实、物联网、AI等前沿技术,支持无人机航拍、高清卫星影像、DEM高程数据、矢量数据、无人机倾斜摄像、BIM模型、点云、城市白模、等高线、标高点等数据融合和切换&#xf…

如何查看MySQL binlog日志

1、查看MySQL是否开启binlog日志 SQL:show variables like ‘%log_bin%’; log_bin:on 是开启状态 若是OFF,则需要开启binlog日志。 开启方式:打开mysql配置文件my.cnf,在[mysqlId]下面增加 log-binmysql-bin 查看binlog日志 …

每日OJ题_贪心算法四⑥_力扣1262. 可被三整除的最大和

目录 力扣1262. 可被三整除的最大和 解析代码 力扣1262. 可被三整除的最大和 1262. 可被三整除的最大和 难度 中等 给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。 示例 1: 输入:nums [3,6,5,1,8] 输出:1…

Section I:Introduction

想学习的私信,免费学习路线 原文 Section I:Introduction 1.1 Your First Java Program The classic first program when introducing any new language is Hello World, or a program that prints to the console. In Java, Hello World can be writ…

AI地名故事:笔岗村

笔岗村,实际上是由笔村和宏岗村两个古老的村落合并而成的。南宋度宗元年,也就是公元1265年,笔村开始建立。随着时间的推移,到了宋代后期,宏岗村也相继建立。这两个村落各自承载着丰富的历史和文化,最终在历…

浅析安全用电监控系统在工厂的研究与应用论述

摘 要:随着社会时代的发展,人们的安全意识越来越强烈,在人们生活和工作中离不开各种用电设备,用电设备的安全使用是保障人们生命安全的重要内容。工厂因自身厂内工作环境的特殊性,用电设备的种类多且复杂,如…

云仓酒庄携手中视中州国际传媒 开启央视广告战略合作新征程

近日,云仓酒庄与中视中州(央视代理机构)隆重举行2024-2025年度央视广告战略签约仪式,云仓酒庄副总裁周玄代表云仓酒庄签约。此次合作标志着云仓酒庄在品牌传播和市场营销方面迈出了坚实的一步,将借助央视及多家卫视的强…

星戈瑞SH-PEG3-OH一种多功能生物相容性PEG小分子

SH-PEG3-OH是一种含有硫基(-SH)、三个乙二醇单元和羟基(-OH)的小分子化合物。其分子结构中的硫基赋予了其独特的化学反应性,能够与其他含有不饱和键的化合物发生点击化学反应,如迈克尔加成反应等。同时&…

iOS 面试题总结(可能是最全的!!!)

如有错误 请及时在评论中指出 文章将不定期更新 1. objc_msgForward是干什么的,如果直接调用会发生什么? 作用:这个函数是IMP类型(方法实现的内存地址也就是函数指针),用于消息转发,当向一个对…

iframe的替代方案有吗?做页面嵌套界面套娃

UIOTOS可以了解下,uiotos.net,通过连线来代替脚本逻辑开发,复杂的交互界面,通过页面嵌套轻松解决,是个很新颖的思路,前端零代码! 蓝图连线尤其是独创的页面嵌套和属性继承技术,好家…

【Pychart】jupyter中pyecharts无法显示问题无法使用/No module named pyecharts

无法显示或No module,一般就是更换python版本后,没有在新的python里安装jupyter;另外原因就是引用方式问题,就是import方式不对;都解决后,有报错没有add,或者str问题。 最后的解决方案竟然是bin…

LVDS 源同步接口

传统数据传输通常采用系统同步传输方式,多个器件基于同一时钟源进行系统同步,器件之间的数据传输时序关系以系统时钟为参考,如图1所示。系统同步传输方式使各器件处于同步工作模式,但器件之间传输数据的传输时延难以确定&#xff…

【代码实践】starRocks 窗口函数(udf)实践

背景说明 实现天粒度的同比计算重点说明 要求数据是连续的因为天粒度的同比,需要365天,但为了方便测试,当前的判断逻辑是计算5天的前,而不是365天前的 参考文档 https://docs.starrocks.io/zh/docs/sql-reference/sql-functio…

流量卡避坑指南

流量卡避坑指南 在选择流量卡时,有几点需要注意以避免踩坑: 合同期和优惠期。 务必看清楚流量卡的合同期和优惠期。 有些卡可能首月免费,但月底办理可能不划算。 真正的长期套餐应该是优惠期20年以上的。 宣传与实际。 对于所谓的“永久9元…

C#图像处理实例1:opencvsharp获取轮廓凸包

在OpenCvSharp中,你可以使用Cv2.ApproxPolyDP函数来获取轮廓的凸包。这个函数使用Douglas-Peucker算法来近似轮廓。 以下是一个简单的例子,展示如何使用OpenCvSharp获取轮廓的凸包: Mat src Cv2.ImRead("保存图像\2.jpg", ImreadM…

实验名称:TCP 连接管理

目录 实验目的: 实验原理: 实验步骤: 1) 启动WireShark,设置抓包状态 2) 访问指定服务器 ,通过Wireshark抓取通信数据报文 3) 分析TCP连接建立的三次握手和连接释放的四次握手过程 原始数据记录: 实…

https介绍,加密解密(举例+必要性,对称/非对称加密介绍),数字摘要/指纹(介绍,应用(session id,网盘的秒传功能))

目录 https 引入 介绍 加密解密层 介绍 没有绝对的安全 使用ssl的弊端 加密解密 概念 加密 解密 秘钥 举例 现实中 网络中 加密的必要性 常见加密方式 对称加密 特点 非对称加密 特点 数字摘要/指纹 介绍 应用 session id 百度网盘的秒传功能 https …

【数据结构课程学习】:队列学习

🎁个人主页:我们的五年 🔍系列专栏:数据结构课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 🚗 1.队列的基本概念&#xff1a…