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 eventMaster_Host: 192.168.204.128Master_User: slaveMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000001Read_Master_Log_Pos: 939Relay_Log_File: relay-bin.000002Relay_Log_Pos: 320Relay_Master_Log_File: mysql-bin.000001Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB:.........(后面的信息省略)
    

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

融资融券概念和操纵流程,案例解析

融资融券是一种金融工具,它允许投资者在证券市场上进行杠杆交易。简单来说,融资就是借钱买股票,融券就是借股票卖出。这种交易方式可以帮助投资者在短期内获得更高的收益,但同时也伴随着较高的风险。 案例背景: 假设…

基于VOLOPV2的自动驾驶环境感知系统

基于VOLOPV2的自动驾驶环境感知系统是一个复杂的系统,它主要负责实时检测并识别周围环境中的各种物体和信息,为自动驾驶车辆提供必要的感知数据。以下是对该系统的一个简要介绍: 环境感知是自动驾驶系统中的一个关键部分,它依赖于…

静态分析-RIPS-源码解析记录-03

既然有源码可以debug,那么直接跑测试用例,来跟踪处理逻辑感觉比直接看代码理逻辑更快一些,尤其是涉及到了扫描阶段,不然不容易弄清某刻某个变量的取值。 对于所有漏洞而言,都是由sink点到source点检测是否有过滤函数&…

数据库管理-第187期 23ai:怎么用SQL创建图(20240510)

数据库管理187期 2024-05-10 数据库管理-第187期 23ai:怎么用SQL创建图(20240510)1 安装PGX1.1 数据库配置对应用户1.2 使用RPM包安装Graph Server1.3 安装Oracle Graph Client1.4 访问PGX页面 2 SQL Property Graph2.1 创建SQL属性图2.2 关于点和边图元…

副业兼职没那么难,视频号带货,1天稳定500,适合新手操作

向大家推荐一个项目:视频号书单号带货玩法。我已经实践了一段时间,并成功售出了1200多单,赚取了2万多元。这个项目表现相当出色,强烈推荐给大家! 周周近财:让网络小白少花冤枉钱,赚取第一桶金 …

[机器学习-03] Scikit-Learn机器学习工具包学习指南:主要功能与用法解析

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

芋道系统springcloud模块启动报错,枚举类不能为空

问题描述: Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2024-05-10 15:50:15.756 | ERROR 9120 | main [TID: N/A] o.s.b.d.LoggingFailureAnalysisReporter | ************************…

Vue创建todolist

电子书 第三章: https://www.dedao.cn/ebook/reader?idV5R16yPmaYOMqGRAv82jkX4KDe175w7xRQ0rbx6pNgznl9VZPLJQyEBodb89mqoO 没有使用VUE CLI创建项目。 创建步骤: 1, 用Vite 创建项目 2, npm run dev 运行程序 参照之前的文…

数据结构与算法学习笔记八-二叉树的顺序存储表示法和实现(C语言)

目录 前言 1.数组和结构体相关的一些知识 1.数组 2.结构体数组 3.递归遍历数组 2.二叉树的顺序存储表示法和实现 1.定义 2.初始化 3.先序遍历二叉树 4.中序遍历二叉树 5.后序遍历二叉树 6.完整代码 前言 二叉树的非递归的表示和实现。 1.数组和结构体相关的一些知…

搭建Harbor仓库

文章目录 Harbor仓库搭建Harbor仓库安装 docker 服务修改配置文件 Harbor仓库 搭建Harbor仓库 下载 Harbor 仓库 安装 docker 服务 # step 1: 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 yum-config-m…

QT--5

1> 将网络聊天室重新实现一遍 服务器端 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ser new QTcpServer(this); }Widget::~Widget() {delete ui; }vo…

Aapache Tomcat AJP 文件包含漏洞(CVE-2020-1938)

1 漏洞描述 CVE-2020-1938 是 Apache Tomcat 中的一个严重安全漏洞,该漏洞涉及到 Tomcat 的 AJP(Apache JServ Protocol)连接器。由于 AJP 协议在处理请求时存在缺陷,攻击者可以利用此漏洞读取服务器上的任意文件,甚至…

【Linux】Linux——Centos7安装Nginx

不需要安装包 1.安装依赖 #查看 C 环境是否安装gcc -v #查看 zlib 是否安装cat /usr/lib64/pkgconfig/zlib.pc #查看 pcre 是否安装pcre-config --version 2.安装C #安装C yum install gcc-c 3.安装pcre yum install -y pcre pcre-devel 4.安装zlib #安装 yum install -y zlib…

该问题未得到解决(仅记录)

https://releases.ubuntu.com/bionic/进入网页下载ubuntu 选择烧录软件将下载的Ubuntu烧录到U盘中 之前用这个U盘烧录过一次,成功了,后来应该是U盘受损或者是什么其他原因使得用这个U盘总是烧录失败

ChatGLM大模型简介

ChatGLM系列是国产大语言模型中性能最好、回答准确率最高的大模型。如果有毕业论文、课题研究的需要,可以关注一下这个大模型。 清华大学和智谱AI的第一代ChatGLM-6B在2023年3月份推出,开源模型推出之后不久就获得了很多的关注和使用。3个月后的2023年6…

快速上手文心一言指令

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

【NPM】Nginx Proxy Manager 一键申请 SSL 证书,自动续期,解决阿里云SSL免费证书每3个月失效问题

文章目录 1、NPM 简介2、实战Step 1:环境搭建 也可以看作者安装笔记 Step 2:创建容器 2.1 在系统任意位置创建一个文件夹,此文档以~/nginx-proxy-manager为例。2.2 创建docker-compose.yaml2.3 启动NPM服务 Step 3:配置反向代理3…

搭建知识库必备:12个开源 Wiki 软件工具盘点

在任何成功的公司中,部门间的知识共享是至关重要的。如果没有一个简单的信息交流方法,团队怎样才能有效合作呢?Wiki软件提供了一种创建、组织及在全公司范围内分享知识的直接方法。但是,哪一种Wiki软件是最佳的选择呢?…

给网络镜像模式下的 WSL2 使用 127.0.0.1代理的方法

网络镜像模式下的WSL2虽然复制了宿主机windows的ip,但是仍然无法访问127.0.0.1的代理。经过调查,发现因为WSL2从应用商店下载而来,所以可能是UWP应用,所以需要用工具解除环回代理限制。

Java入门基础学习笔记13——数据类型

数据类型的分类: 基本数据类型 引用数据类型 基本数据类型:4大类8种类型: 定义整形用int,再大的数用long。 package cn.ensource.variable;public class VariableDemo2 {public static void main(String[] args) {//目标&#x…