MySQL主从复制
主从复制概念
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
主从复制主要用途及形式
用途
- 读写分离
在开发工作中,有时候会遇见某个sql 语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作
- 数据实时备份
当系统中某个节点发生故障时,可以方便的故障切换
- 高可用HA
- 架构扩展
随着系统中业务访问量的增大,如果是单机部署数据库,就会导致I/O访问频率过高。有了主从复制,增加多个数据存储节点,将负载分布在多个从节点上,降低单机磁盘I/O访问的频率,提高单个机器的I/O性能
形式
- 一主一从
- 一主多从,提高系统的读性能
- 多主一从(5.7开始支持)
- 双主复制
- 级联复制
主从复制原理
基于二进制日志(binlog)
主库:dump线程
从库:IO线程、SQL线程、real-log
主节点 binary log dump 线程
当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。
从节点I/O线程
当从节点上执行`start slave`命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地relay-log中。
从节点SQL线程
SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。
对于每一个主从连接,都需要三个进程来完成。当主节点有多个从节点时,主节点会为每一个当前连接的从节点建一个binary log dump 进程,而每个从节点都有自己的I/O进程,SQL进程。从节点用两个线程将从主库拉取更新和执行分成独立的任务,这样在执行同步数据任务的时候,不会降低读操作的性能。比如,如果从节点没有运行,此时I/O进程可以很快从主节点获取更新,尽管SQL进程还没有执行。如果在SQL进程执行之前从节点服务停止,至少I/O进程已经从主节点拉取到了最新的变更并且保存在本地relay日志中,当服务再次起来之后,就可以完成数据的同步。
要实施复制,首先必须打开Master 端的binary log(bin-log)功能,否则无法实现。因为整个复制过程实际上就是Slave 从Master 端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。如下图所示:
- 大致流程
从库的io线程读取master.info里的内容拿到主库的地址等信息后链接到主库的dump线程,并携带最后一次的日指标记号,如果主库有新的记号时就会通过dump线程发送给从库的io线程,io线程将其储存到tcp/ip缓存,然后给主库返回一个ack信息,并将信息更新到master.info;从库会将日志落地到real-log,SQL线程会去读取real-log.info的信息,然后从real-log将日志记录到real-log.info,完成一次主从复制
主从开启
master 3307
slave 3308
1 、 3307 中创建复制用户 主库开启二进制日志: vim / data / 3307 / my.cnf 添加一行:log_bin = / data / 3307 / mysql - bin 重启: systemctl restart mysqld3307 mysql - S / data / 3307 / mysql.sock grant replication slave on * . * to repl@ '10.0.0.%' identified by '123' 2 、查看主库的日志位置 mysql> show master status; 3 、从库 3308 开启主从复制 [root@standby 3307 ] # mysql -S /data/3308/mysql.sock mysql> CHANGE MASTER TO MASTER_HOST = '10.0.0.200' , MASTER_USER = 'repl' , MASTER_PASSWORD = '123' , MASTER_PORT = 3307 , MASTER_LOG_FILE = 'mysql-bin.000001' , MASTER_LOG_POS = 154 ; 开启从库 mysql> start slave; mysql> show slave status\G 两个重要参数: Slave_IO_Running: Yes Slave_SQL_Running: Yes |
本文来自博客园,仅供参考学习,如有不当之处还望不吝赐教,不胜感激!转载请注明原文链接:https://www.cnblogs.com/rong-z/p/10658659.html
作者:cnblogs用户
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人