深入解析MySQL(9)——主从复制架构详解

深入解析MySQL(9)——主从复制架构详解
在这里插入图片描述

🔥我的主页:九转苍翎⭐️个人专栏:《Java SE 》《Java集合框架系统精讲》《MySQL高手之路:从基础到高阶 》《计算机网络 》《Java工程师核心能力体系构建》天行健,君子以自强不息。


MySQL版本:8.0.44
Linux操作系统版本:Ubuntu 24.04 LTS

1.MySQL集群

1.1 单机模式

在单一服务器上安装和运行MySQL数据库,多个应用程序都访问同一台数据库服务器

优点:

  • 简单易用:部署和维护成本低,无需配置复杂的集群管理工具或分布式协议
  • 低成本:无需额外购买多台服务器或负载均衡设备,硬件和运维成本较低

缺点:

  • 单点故障风险:所有数据和服务依赖单一节点,一旦服务器硬件故障或网络问题,整个系统将不可用
  • 读写压力集中:所有读写请求集中在单台服务器,可能成为性能瓶颈,尤其在数据量或并发量大的场景下

1.2 集群模式

通过多台服务器协同工作来提高数据库性能、可用性和可扩展性

优点:

  • 负载均衡:读操作可分散到多个从节点,降低主节点压力
  • 数据冗余:数据在多个节点同步存储,避免单点故障导致数据丢失
  • 扩展性:水平扩展能力强,可通过增加节点提升处理能力

缺点:

  • 数据同步延迟:异步复制可能导致从节点数据滞后,尤其在网络波动或高负载时
  • 资源消耗:多节点需额外硬件资源
  • 配置复杂度高:集群部署需调整多项参数,维护成本较高

1.3 主从结构

1.3.1 角色

主服务器(Master):主要负责写操作和简单查询操作
从服务器(Slave):主要负责复杂查询操作和备份

1.3.2 原理

  • 主库的Binlog Dump Thread:当从库连接主库时,主库创建一个Binlog Dump Thread,负责将二进制日志内容发送给从库
  • 从库的I/O Thread:接收主库的二进制日志事件并写入从库的中继日志(Relay Log)

从库的SQL Thread:读取中继日志(Relay Log)中的事件并执行,实现数据同步

在这里插入图片描述
  1. Slave连接master,读取master的版本和时钟信息,并在master中注册自己
  2. Master根据Slave的连接数为每个连接创建Binlog Dump Thread
  3. Master节点在进行insert、update、delete操作时,把相应操作按执行顺序写入Binary Log
  4. 当Master节点的Binary Log发生变化时,Binlog Dump Thread通知所有Slave节点,并把Binary Log的增量内容以event的方式推送给Slave的I/O Thread
  5. Slave的I/O Thread把接收到的内容写入Relay Log
  6. Slave的SQL Thread读取Relay Log的内容
  7. Slave的SQL Thread解析日志并转为SQL进行回放操作,把数据写入Databases

1.4 高性能架构

  • 读写分离:将读操作和写操作分发到不同的数据库节点,提升系统整体性能。写操作集中在主库(Master),读操作分散到从库(Slave)
  • 数据库分片:将数据水平拆分到多个独立数据库实例(database),解决单库数据量过大导致的性能瓶颈

2.Ubuntu系统安装Docker

2.1 添加Docker官方密钥

添加Docker官方GPG密钥是为了验证从Docker仓库下载的软件包的真实性和完整性

  • 验证软件源的真实性
    • 确保你下载的Docker软件包确实来自官方
    • 防止中间人攻击或恶意镜像站提供被篡改的软件包
  • 确保软件包完整性
    • 用GPG密钥验证软件包的数字签名
    • 确认软件在传输过程中没有被修改
aptinstall apt-transport-https ca-certificates curl software-propertiescommon -ycurl-fsSL https://download.docker.com/linux/ubuntu/gpg |sudo apt-key add - # 1. 下载Docker官方的公钥# 2. 存储在系统的密钥环中# 3. APT在安装时会用这个密钥验证软件包签名

2.2 添加阿里云Docker APT源

Docker官方服务器位于国外,国内访问速度慢。阿里云在国内,下载速度通常能大幅提升

add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/dockerce/linux/ubuntu $(lsb_release -cs) stable"

可能出现的错误信息:

W: GPG error: https://mirrors.aliyun.com/docker-ce/linux/ubuntu noble InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8 

简单来说,这个错误的意思是:“阿里云给了我Docker的软件列表,并且说这是用7EA0A9C3F273FCD8这个钥匙签名的,但是我的钥匙串里没有这把钥匙,所以我无法确认这是不是真的Docker官方列表。”
解决方法: 把Docker官方的公钥添加到你的系统中

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7EA0A9C3F273FCD8 

2.3 安装Docker

#更新APT包索引apt update #安装Dockeraptinstall docker-ce docker-ce-cli containerd.io -y

2.4 查看结果

# 查看状态 systemctl status docker
在这里插入图片描述
# 查看版本docker version 
在这里插入图片描述

2.5 设置配置

# 设置开机自启动 root@VM-0-7-ubuntu:~# systemctl enable docker# 查看是否开机启动 root@VM-0-7-ubuntu:~# systemctl list-unit-files|grep docker.service docker.service enabled enabled 
# 停止防火墙 root@VM-0-7-ubuntu:~# systemctl stop ufw# 查看防火墙 root@VM-0-7-ubuntu:~# systemctl status ufw
在这里插入图片描述
# 禁用防火墙开机自启动 systemctl disable ufw 

2.6 修改镜像源

vim /etc/docker/daemon.json 
{"registry-mirrors":["https://docker.m.daocloud.io","https://dockerhub.timeweb.cloud","https://huecker.io"]}

3.主从复制

3.1 一主一从

⼀台主服务器主要负责读写操作,⼀台从服务器主要负责读操作或备份(本文演示该模式,但在实际开发中不常用)

在这里插入图片描述

3.2 一主多从

  • ⼀台主服务器负责写操作,多台从服务器负责读操作和备份。从节点从主节点同步数据
在这里插入图片描述
  • ⼀台主服务器负责写操作,多台从服务器负责读操作和备份。其中⼀个从节点从主节点同步数据,并为其他从节点提供数据同步服务,这样可以降低主节点数据同步的压力
在这里插入图片描述

3.3 多主多从

在这里插入图片描述

3.4 主库配置

docker run \-d\-p53306:3306 \-v /org/mysql/master/conf:/etc/mysql/conf.d \-v /org/mysql/master/mysql:/var/lib/mysql \-eMYSQL_ROOT_PASSWORD=123456\--name org-mysql-master \ mysql:8.0.44 
  • docker run
    • 作用:创建并启动一个新的容器
    • docker create:只创建不启动
    • docker start:启动已存在的容器
    • docker run = create + start
  • -d
    • 作用:在后台运行容器(守护进程模式)
  • -p 53306:3306
    • 格式:-p 宿主机端口:容器端口
    • 作用:端口映射
  • -v /org/mysql/master/conf:/etc/mysql/conf.d
  • -e MYSQL_ROOT_PASSWORD=123456
    • 格式:-e 环境变量名=值
    • 作用: 设置容器内的环境变量
  • –name org-mysql-master
    • 作用:给容器命名
  • mysql:8.0.44(指定版本)

作用:数据卷挂载 - 数据库数据,容器删除后数据不会丢失

宿主机:/org/mysql/master/mysql ↓ 挂载(双向同步) 容器内:/var/lib/mysql 
# 在配置文件中添加如下配置 root@VM-0-7-ubuntu:~# vim /org/mysql/master/conf/my.cnf
# MySQL服务器节点 [mysqld] # server-id随便设置,保证不重复即可 server-id=11253306 log-bin=binlog binlog_format=ROW binlog_expire_logs_seconds=864000 sync-binlog=1 #指定需要复制的数据库,默认全部 # binlog-do-db=db_name #设置不需要复制的数据库 # binlog-ignore-db=db_name1 # binlog-ignore-db=db_name2 
# 重启容器,使配置⽣效 root@VM-0-7-ubuntu:~# docker restart org-mysql-master# 进入容器 root@VM-0-7-ubuntu:~# docker exec -it org-mysql-master env LANG=C.UTF-8 /bin/bash bash-5.1# mysql -uroot -p
mysql>set password ='123456';# 查看配置是否⽣效 mysql>select @@server_id;+-------------+| @@server_id|+-------------+|13803306|+-------------+-- 为从服务器创建访问账号并设置密码,⽤于从服务器登录主服务器 mysql>createuser'org_slave'@'%' identified with mysql_native_password by'123456';-- 为用户赋予复制权限 mysql>grantreplication slave on*.*to'org_slave'@'%';-- 刷新权限 mysql> flush privileges;-- 查看master状态,记录File和Position的值,-- 之后要在从服务器中配置中⽤到这两个值,表⽰从哪个⽇志⽂件中的哪个位置开始同步数据 mysql>show master status;+---------------+----------+--------------+------------------+-------------------+|File| Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+---------------+----------+--------------+------------------+-------------------+| binlog.000004|157||||+---------------+----------+--------------+------------------+-------------------+

3.5 从库配置

docker run \-d\-p53307:3306 \-v /org/mysql/slave1/conf:/etc/mysql/conf.d \-v /org/mysql/slave1/mysql:/var/lib/mysql \-eMYSQL_ROOT_PASSWORD=123456\--name org-mysql-slave1 \ mysql:8.0.44 
# 在配置文件中添加如下配置 root@VM-0-7-ubuntu:~# vim /org/mysql/slave1/conf/my.cnf
[mysqld] # server-id随便设置,保证不重复即可 server-id=11253307 log-bin=binlog binlog_format=ROW binlog_expire_logs_seconds=864000 sync-binlog=1 ########################### 从服务器配置 ################################## #中继日志基本名 relay-log=relay-bin #服务器启动时不启动复制,通过手动启动 skip-replica-start=ON # 链式日志同步,如上图“一主多从”模式的第二种模式 # log-replica-updates=ON # 禁用二进制日志 # skip-log-bin ########################################################################### #指定需要复制的数据库,默认全部 # binlog-do-db=db_name #设置不需要复制的数据库 # binlog-ignore-db=db_name1 # binlog-ignore-db=db_name2 
# 重启容器,使配置⽣效 root@VM-0-7-ubuntu:~# docker restart org-mysql-slave1# 进入容器 root@VM-0-7-ubuntu:~# docker exec -it org-mysql-slave1 env LANG=C.UTF-8 /bin/bash bash-5.1# mysql -uroot -p
mysql>set password ='123456';# 查看配置是否⽣效 mysql>select @@server_id;+-------------+| @@server_id|+-------------+|13803307|+-------------+ mysql> change master to master_host ='81.69.218.112', master_port =53306, master_user ='org_slave', master_password ='123456', master_log_file ='binlog.000004', master_log_pos =157;

3.6 启动主从复制

# 在从服务器中启动复制 mysql>start replica;# 查看从服务器状态 mysql>show replica status\G;
在这里插入图片描述

4.下节预告

深入解析MySQL(10)——基于ShardingSphere的高性能架构详解

5.我的博客即将同步至腾讯云开发者社区声明

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=gxfbp0gkvtq

Read more

云边端一体化?AIoT全流程闭环的“真”开源的智能算法应用平台正式发布!

云边端一体化?AIoT全流程闭环的“真”开源的智能算法应用平台正式发布!

零门槛体验,让AI算法开发从未如此简单高效 引言:重新定义AI算法平台体验 在AI技术快速发展的今天,算法开发者面临着前所未有的挑战:复杂的模型训练流程、繁琐的环境配置、高昂的学习成本、多语言技术栈的整合难题……这些问题让许多优秀的算法创意止步于概念阶段。 今天,我们隆重推出EasyAIoT——一个真正意义上的算法王炸级AI智能算法应用平台。我们创新性地采用Java、Python、C++三合一语言混编架构,规避单一语言短板,构建了一个"开发复杂度高、使用简易化"的AIoT平台,实现真正意义上的零门槛AI体验。 项目地址:https://gitee.com/soaring-xiongkulu/easyaiot 项目概述:重新构想AI算法应用 设计哲学:各取所长,完美融合 Java擅长平台构建和设备管理但不适合网络编程和AI开发,Python精通网络和AI算法执行但不擅长高性能任务,C++在高性能计算方面无可匹敌但在其他领域略显不足。EasyAIoT创新性地采用三语言混编架构,构建了一个"开发不太Easy,但使用极其Easy"的AI算法应用平台。 平台定位:零门槛AI体

By Ne0inhk
Git下载安装(保姆教程)

Git下载安装(保姆教程)

目录 1、Git下载  2、Git安装(windows版) (1)启动安装程序 (2)阅读许可协议 (3)选择安装路径 (4)选择组件 (5)选择开始菜单文件夹 (6)选择默认编辑器 (7)选择仓库的初始分支 (8)PATH环境配置 (9)选择SSH可执行文件 (10)选择HTTPS传输库 (11)配置行尾转换 (12)配置终端模拟器 (13)创建git pull的默认行为 (14)配置Git凭证  (15)配置额外选项   (16)等待安装完成 1、Git下载 (1)访问Git官方下载网站:https://git-scm.com/downloads          网盘直接下载:https://pan.

By Ne0inhk
Obsidian笔记记录与Gitee云存储

Obsidian笔记记录与Gitee云存储

Obsidian下载 首先下载ObsidianObsidian - 磨砺你的思维,下载完成后打开会弹出本地仓库创建的提示 每个仓库都是一个相对独立的空间,我们的笔记和插件都存放在里面,如核心插件的插入模板的模板文件夹和第三方插件都是各仓库独立,新建仓库都要重下第三方插件。我们可以先打开本地资源管理器自定义一个文件夹专用于这些仓库存放如D:\Obsidian\docs_notes,这样便于即将的云端 SmartGit下载 从 SmartGit 24.1 版本开始,软件安装包已经内置了完整的 Git 客户端、SSH 客户端以及文件对比/合并工具。安装完 SmartGit,就等于同时安装好了 Git,可以直接开始使用,无需任何额外配置。SmartGit | SmartGit,进入下载。 SmartGit 本身下完后会有90天的试用期,此后需要充值使用。但也可以通过此链接Apply for Non-Commercial License申请,选爱好那一栏填名字邮件申请等审批就能无限用了,申请后会收到一个确认链接,此后等待约一天可以收到下文件的返回,在smartgit选中他就可以无限使

By Ne0inhk

3分钟上手!Codex GitHub Action实现自动化代码审查全流程

3分钟上手!Codex GitHub Action实现自动化代码审查全流程 【免费下载链接】codex为开发者打造的聊天驱动开发工具,能运行代码、操作文件并迭代。 项目地址: https://gitcode.com/GitHub_Trending/codex31/codex 你是否还在手动运行代码检查工具?是否因团队代码风格不统一而频繁返工?本文将带你用Codex GitHub Action构建自动化工作流,实现从代码提交到质量报告的全流程智能化处理,让CI/CD效率提升40%。 核心价值与应用场景 Codex作为聊天驱动开发工具,其GitHub Action集成能解决三大痛点: * 开发流程割裂:将AI代码分析能力嵌入现有工作流 * 质量反馈滞后:提交后5分钟内获取详细改进建议 * 配置复杂度高:零脚本实现自定义检查规则 典型应用场景包括:自动生成单元测试、智能修复lint错误、安全漏洞扫描等。通过Model Context Protocol (MCP),还可扩展更多定制化能力。 环境准备与安装 基础环境要求 * GitHub账号及仓库权限 * 已启用

By Ne0inhk