MySQL之主从复制集群搭建

news2024/9/21 0:31:55

简述

这篇文章主要记录使用docker compose搭建MySQL主从复制集群搭建,方便后续进行本地测试开发。

这篇文章主要介绍一主一从的搭建过程。

主从架构,可以缓解MySQL的数据存储以及访问的压力。

一. 主从复制原理

原理图如下:
在这里插入图片描述
步骤:

  • master主服务器上的数据发生改变时,则将其改变写入二进制(binlog)事件日志文件中;
  • slave从服务器会在一定时间间隔内对master主服务器上的二进制日志进行探测,探测其是否发生过改变(通过二进制文件的大小是否不同来进行判断,日志文件改变了的大小也可以叫作偏移),如果探测到master主服务器的二进制事件日志发生了改变,则开始一个I/O Thread请求master二进制事件日志;
  • 同时master主服务器为每个I/O Thread启动一个dump thread,用于向其发送二进制事件日志;
  • slave从服务器将接收到的二进制事件日志写到自己本地的(relay日志)中继日志文件中;
  • slave从服务器将启动SQL Thread从中继日志中读取二进制日志,在本地重放,使得其数据和主服务器保持一致;
  • 最后I/O ThreadSQL Thread将进入睡眠状态,等待下一次唤醒;

主从复制的过程会有很小的延迟,基本没有影响

二. 配置文件

搭建主从集群时候,需要两个注意点(Docker不需要):

  • MySQL版本必须一致;
  • 节点之间时间需要同步;

2.1. 环境目录

.
├── conf
│   ├── master
│   │   └── my.cnf  ==> master的配置文件
│   └── slave
│       └── my.cnf  ==> slave的配置文件
├── data
│   ├── master ==> master的数据目录
│   └── slave  ==> slave的数据目录
└── docker-compose.yml

2.2. docker compose文件

version: '3'
services:
  # master节点
  mysql-cluster:
    image: mysql:latest
    container_name: mysql-cluster
    restart: always
    ports:
      - 33306:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - ./data/master:/var/lib/mysql
      - ./conf/master:/etc/mysql/conf.d
    networks:
      - one-to-one
  # slave节点    
  mysql-slave:
    image: mysql:latest
    container_name: mysql-slave
    restart: always
    ports:
      - 33307:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - ./data/slave:/var/lib/mysql
      - ./conf/slave:/etc/mysql/conf.d   
    networks:
      - one-to-one
networks:
  one-to-one:
    driver: bridge

2.3. 数据库配置文件

mastermy.cnf

[mysqld]
# 服务器唯一ID,默认是1,一般取IP最后一段
server-id=1
# 开启二进制日志
log-bin=mysql-bin
# 是否只读; 1:只读 0:可读可写
read-only=0
# 指定忽略哪个库不同步
binlog-ignore-db=mysql
# 设置binlog格式 statement|mixed|row(canal)
binlog_format=row
# 设置需要同步的数据库 binlog_do_db = 数据库名; 
# 如果是多个同步库,就以此格式另写几行即可。
# 如果不指明对某个具体库同步,表示同步所有库。除了binlog-ignore-db设置的忽略的库
# binlog_do_db=test

# 确保binlog日志写入后与硬盘同步
# sync_binlog = 1
# 跳过所有的错误,继续执行复制操作
# slave-skip-errors = all 

# 密码问题配置
default-authentication-plugin=mysql_native_password
# 字符集配置
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
explicit_defaults_for_timestamp=true
# 表名小写
lower_case_table_names=1

slavemy.cnf

[mysqld]
# 服务器唯一ID,默认是1,一般取IP最后一段
server-id=2
# 开启二进制日志
log-bin=mysql-bin
# 是否只读; 1:只读 0:可读可写
read-only=1
# 指定忽略哪个库不同步
binlog-ignore-db=mysql
# 设置binlog格式 statement|mixed|row(canal)
binlog_format=row
# 设置需要同步的数据库 binlog_do_db = 数据库名; 
# 如果是多个同步库,就以此格式另写几行即可。
# 如果不指明对某个具体库同步,表示同步所有库。除了binlog-ignore-db设置的忽略的库
# binlog_do_db=test

# 确保binlog日志写入后与硬盘同步
sync_binlog = 1
# 跳过所有的错误,继续执行复制操作
slave-skip-errors = all 

# 密码问题配置
default-authentication-plugin=mysql_native_password
# 字符集配置
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
explicit_defaults_for_timestamp=true
# 表名小写
lower_case_table_names=1

2.4. 启动

执行up命令启动docker容器:

docker compose up -d

查看执行状态:
在这里插入图片描述

2.5. 注意

上面MySQL提供了一个sync_binlog参数来控制数据的binlog写到磁盘的频率!(MySQL在每次提交事务的时候把二进制日志的内容同步到磁盘上)这个参数有下面几个配置:

  • sync_binlog=0:默认值,表示MySQL不控制binlog的刷新,由文件系统自己控制它的缓冲刷新;此时性能最好,但是风险最大,一旦系统宕机,在binlog_cache中的所有binlog信息都会被丢失;
  • sync_binlog>0:表示没sync_binlog次事务提交,MySQL调用文件系统的刷新操作将缓冲写入日志;当sync_binlog=1是最安全的,表示每次事务提交,MySQL都会把binlog写入日志,但是此时性能损耗最大(虽然可以通过group cimmit缓解,但是刷新的频率过高对IO性能影响也是非常大)。

在生产环境中sync_binlog一般设置为0或者100,这样牺牲一定的一致性,可以获得更高的并发和性能。

group commit可以参看这篇文章:http://keithlan.github.io/2018/07/24/mysql_group_commit/

三. 授权配置

上面启动之后主从复制集群并没有搭建成功,下面我们还需要配置一些数据!

3.1. master配置

接着先进去master的容器内部:

docker exec -it mysql-cluster bash

登陆MySQL,创建一个账号(这个账号主要用户主从复制),并授权:

root@45504f93e66d:/# mysql -uroot -p123456 # 登陆

mysql> create user 'long'@'%' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.04 sec)

mysql> grant replication slave on *.* to 'long'@'%';
Query OK, 0 rows affected (0.02 sec)

mysql> grant replication client on *.* to 'long'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

接着查看masterbinlog日志状态:

mysql> show master status\G;
*************************** 1. row ***************************
             File: mysql-bin.000003
         Position: 2096
     Binlog_Do_DB: 
 Binlog_Ignore_DB: mysql
Executed_Gtid_Set: 
1 row in set (0.00 sec)

这里需要记住FilePosition两个值,后面会用到

3.2. slave配置

这里我们还是和上面一样先进去slave容器内部:

docker exec -it mysql-slave bash

接着登陆MySQL的控制台,主从服务器进行连接:

mysql> change replication source to source_host='192.168.31.174', source_port=33306, source_user='long', source_password='123456', source_log_file='mysql-bin.000003', source_log_pos=1047;
Query OK, 0 rows affected, 2 warnings (0.08 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> start replica; # 开启主从复制,8.0.22之前版本执行:start slave
Query OK, 0 rows affected (0.04 sec)

这里我们稍微介绍下SQL的各个参数的含义:

  • source_host:主数据库的主机地址
  • source_port:主数据库的端口,不设置默认为3306
  • source_user:主数据库被授予同步复制权限的用户名
  • source_password:对应的用户密码
  • source_log_file:在主数据库执行命令show master statua查询的File的二进制日志文件名称
  • source_log_pos:在主数据库执行命令show master statua查询的Position的二进制日志文件记录位置

接着我们查看一些主从连接状态:show slave status\G;
在这里插入图片描述

8.0.22之前的版本执行 show slave status;

3.3. 验证

这里我们只需要在主库中创建一个database,建一张表,插入一条数据,在从库中查看如果有就说明成功了!

3.4. 常用命令

下面列举一些主从常用命令:

  • 启动主从复制:start replica | start slave
  • 停止主从复制:stop replica | stop slave
  • 重启主从复制:restart replica | restart slave

关闭主从复制配置:

  • 从库关清除该从服务器和主服务器的关系,执行:
    • stop replica;
    • reset replica all;
  • 主库也不维护主从关系,执行:
    • reset master;

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

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

相关文章

AVL平衡树(Java实现)

概念 AVL树可以定义为高度平衡二叉搜索树,其中每个节点与平衡因子相关联,该平衡因子通过从其左子树的子树中减去其右子树的高度来计算。AVL树是由GM Adelson - Velsky和EM Landis于1962年发明的。为了纪念其发明者,这树结构被命名为AVL。 定…

Android集成Unity

前言 随着前两年元宇宙的提出,虚拟现实开始在各大平台大展身手。各个平台都开始搭上了元宇宙的列车,Unity作为虚拟引擎中的热门,渲染效果和开发效率极其出色;Android作为移动开发的巨头之一也搭上了元宇宙这趟列车。今天&#xf…

图像基础概念

加解串器图像相关的概念:相关的概念:一个像素时钟可以产生两个像素可以通过调大frame freelance或vts来增大 V blinking sensor的基本配置曝光:一行一行进行曝光:每一行曝光时间 非常短 从第一行到最后一行为有效时间同步信号:同步信号的处理同步曝光的需求:曝光的…

IoU Loss综述(IOU,GIOU,CIOU,EIOU,SIOU,WIOU)

边界框回归(BBR)的损失函数对于目标检测至关重要。它的良好定义将为模型带来显著的性能改进。大多数现有的工作假设训练数据中的样本是高质量的,并侧重于增强BBR损失的拟合能力。 一、L2-norm 最初的基于回归的BBR损失定义为L2-norm&#xf…

IIS隐藏敏感数据信息

安装URL Rewrite web.config: 想要隐藏Server和X-AspNet-Version 两项 <system.webServer>节点添加子节点rewrite <system.webServer> <rewrite> <outboundRules> <rule name"REMOVE_RESPONSE_SERVER"> …

python3+requests:接口自动化测试(二)

前言&#xff1a;上篇文章python3requestsunittest&#xff1a;接口自动化测试&#xff08;一&#xff09;&#xff1a;python3requestsunittest&#xff1a;接口自动化测试&#xff08;一&#xff09; - Shapelei - 博客园 &#xff0c;已经介绍了基于unittest框架的实现接口自…

在Spring Boot中整合Katharsis,来快速开发JSON API的Web应用

1 简介 我们进行Web API开发的时候&#xff0c;经常会使用Json格式的消息体&#xff0c;而Json格式非常灵活&#xff0c;不同的人会有不同的设计风格和实现&#xff0c;而JSON API提供了一套标准。但它并不提供直接实现。 Katharsis是JSON API的Java实现&#xff0c;使用它可…

canal env create (mysql -> kafka)

&#xff08;1&#xff09;获取资源及解压 选定安装路径 cd /home下载canal.admin wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.admin-1.1.5.tar.gz解压canal-admin mkdir canal-admin tar -zxvf canal.admin-1.1.5.tar.gz -C canal-adm…

Nginx服务器上安装SSL证书

Nginx服务器上安装SSL证书1、前提条件2、nginx安装http_ssl_module模块2.1 查看是否安装过http_ssl_module2.2 进入nginx源文件目录2.3 重新编译nginx2.4 用新的nginx覆盖旧的3、https配置(SSL证书安装)3.1 下载证书文件和密钥文件3.2 服务器上创建cert文件夹3.3 配置nginx.con…

2023年中级计算机软考怎么报考呢?软考证书有用吗?

计算机软考简称软考&#xff0c;全称计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;是由人力资源和社会保障部&#xff08;原人事部&#xff09;、工业和信息化部&#xff08;原信息产业部&#xff09;领导的国家级考试&#xff0c;其目的是&#…

C++——stack和queue的介绍和使用

文章目录1. stack的介绍和使用1.1 stack的介绍1.2 stack的使用1.3 几个比较经典的oj题2. queue的介绍和使用2.1 queue的介绍2.2 queue的使用3. 容器适配器3.1 什么是适配器3.2 STL标准库中stack和queue的底层结构3.3 deque的简单介绍(简单介绍)3.3.1 deque的原理介绍3.3.2 dequ…

王道操作系统笔记(四)——— 进程同步与互斥

文章目录一、同步与互斥的概念1.1 同步与互斥的基本概念1.2 临界资源与共享资源1.3 独占设备与共享设备二、实现临界区互斥的基本方法2.1 软件实现方法2.1.1 单标志法2.1.2 双标志先检查法2.1.3 双标志后检查法2.1.4 Peterson 算法2.1.5 软件实现方法总结2.2 硬件实现方法2.2.1…

OpenMMLab 计算机视觉 # day2: 图像分类与基础视觉模型

相关资源: github 第二课 图像分类与基础视觉模型 图像分类 图像分类任务&#xff1a;给定一张图片&#xff0c;识别图像中的物体是什么 X∈RH∗W∗3→{1,2..,K}X\in R^{H*W*3} \rightarrow \{1,2..,K\}X∈RH∗W∗3→{1,2..,K}&#xff1b; 从图片中学习&#xff1a; …

Linux--Version Branch

参考链接1. Linux Version BranchLinux的发行版本大体分可为两类。一类是商业公司维护的发行版本&#xff0c;以Redhat&#xff08;RHEL&#xff09;为代表一类是社区组织维护的发行版本&#xff0c;以Debian为代表。2.Debian branchDebian系列主要包含Debian和Ubuntu等。Debia…

操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 操作系统权限提升(五)之系统错误配置-PATH环境变量提权 操作…

已解决TypeError: eval() arg 1 must be a string, bytes or code object

已解决TypeError: eval() arg 1 must be a string, bytes or code object 文章目录报错问题报错翻译报错原因解决方法联系博主免费帮忙解决报错报错问题 粉丝群里面的一个小伙伴&#xff0c;想用Python爬虫然后解析数据&#xff0c;但是发生了报错&#xff08;当时他心里瞬间…

YOLOv8 Ultralytics:最先进的 YOLO 模型——简介+实战教程

YOLOv8 Ultralytics&#xff1a;最先进的 YOLO 模型 什么是 YOLOv8&#xff1f; YOLOv8 是来自 Ultralytics 的最新的基于 YOLO 的对象检测模型系列&#xff0c;提供最先进的性能。 利用以前的 YOLO 版本&#xff0c; YOLOv8 模型更快、更准确 &#xff0c;同时为训练模型提…

unity Vuforia发布移动端,禁止相机权限,出绿屏,强制退出app,如何去掉PERMISSION ERROR

unity Vuforia发布移动端&#xff0c;禁止相机权限&#xff0c;出绿屏&#xff0c;强制退出app&#xff0c;如何去掉PERMISSION ERROR问题描述更改需求解决方案&#xff1a;总结&#x1f4a2;&#x1f4a2;版权声明问题描述 unityvuforia 发布移动端&#xff0c;运行时需要相机…

墨天轮《2022年中国数据库行业年度分析报告》正式发布,精彩抢先看

自2022年4月份起&#xff0c;墨天轮数据社区持续发布月度 《中国数据库行业分析报告》&#xff0c;目前已发布7期&#xff0c;点击超过10万次&#xff0c;下载近万次。 为总结过往&#xff0c;展望未来&#xff0c;墨天轮数据社区正式发布了《2022年中国数据库年度行业分析报告…

MAC(m1)-VsCode上传项目到GitHub仓库

安装Git集成插件&#xff1a; GitHub Pull requests 在Visual Studio Code中查看和管理GitHub拉取请求和问题 Git Graph Git图形化显示和操作 最新最全 VSCODE 插件推荐&#xff08;2023版&#xff09;_白墨石的博客-CSDN博客_vscode插件 在vscode使用git提交推送代码_水…