主从原理,一主多从架构

article/2025/9/27 8:52:31

主从架构总结

主从原理这里写图片描述

用binlog做主从,redolog只支持innodb

过程

这里写图片描述

start slave后从库启动io线程连接主库,请求读日志②dump线程根据请求信息读取指定位置后的日志③完成后就响应成功,没有确认机制④IO线程收到信息,将受到的日志依次写入relay log⑤sql线程检测到relay log更新,就解析增加部分的relaylog内容
即执行这部分sql,应用到自己的库

要分离看io thread 和sql thread
备份从库的时候,可以关闭sql thread,io thread 正常运行

主从之间的延迟

传输延迟
主库产生大量日志(并行产生)

1、Dump是单线程,,没有能力读取速度如此之快的binlog
2、网络延迟sar -n DEV 1

io 线程

[root@localhost][(none)]> show processlist;

dump 线程

mysql> pager grep -i "dump";

3、从库的io 线程没有能力及时写入relaylog
提高从库的写入性能,最好的办法就是使用raid 卡,带有写缓存
4、要判断binlog 的生成速度
5、可以采用mixed 这种方式,因为row 可能会导致binlog 暴增。
如何看线程状态:

Linux 层面:ps -To pcpu,tid -C mysqld | sort -r -k1 | more
mysql> select * from performance_schema.threads where THREAD_OS_ID=2483;
top:H

如何解决传输延迟:
1、增加物理读的能力
1、使用raid 卡(最好是RAID 10)或者磁盘阵列
2、使用PCIe 闪卡
2、增加网络带宽
3、增加写能力,使用raid 卡+写缓存(raid+写flash)
4、可以采用mixed 这种方式,因为row 可能会导致binlog 暴增

应用延迟

应用延迟的原因:

1、从库只有一个sql 线程,因此速度自然会慢
2、sql 有问题
通过慢查询日志来确认问题(开启查询时间全表扫描两个选项)
3、从库性能问题
show global status like ‘%rows%’;
不要只是查看时间差距、还要查看日志的量差距
通过线程状态去确认线程是否繁忙,是否达到100 的繁忙top H

如何解决应用延迟:

在5.7 里面可以采取并行复制:
slave-parallel-type = LOGICAL_CLOCK(一定要打开这个基于逻辑时间并行,
如果是别的下面这个参数就不管用了)

slave-parallel-workers = 16(从库启16 个并行线程,去恢复主库发过来的事
务,起了半同步,传输延迟就非常小,开启多线程,整个应用速度大幅提升,基
本实现了主从的完全同步,可以增大)

slave_preserve_commit_order=1(这个一定要是1、表示主库上事务提交的顺
序在从库上也按照这个顺序提交,因为并行之后十几个线程去应用,但是要保证
事务提交的顺序要不然事务就不一致了)

slave_transaction_retries=128(并行就意味着会有锁,当锁超时的时候,在这
个事务回滚之前,我试着再执行128 次,保证因为并行产生的锁,不至于已被锁
就马上回滚事务,而是再尝试执行128 次)

如何看传输延迟:

1,在主库上show master status\G,查看当前的binlog 点:

mysql> show master status \G
*************************** 1. row ***************************
File: mysqlserver.000007
Position: 222393531
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
mysql>

2,在从库上show slave status\G,看从库IO 线程读到主库binlog 的位置:

mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.35.23
Master_User: backup
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqlserver.000007
Read_Master_Log_Pos: 217636200
mysql>

3,1-2 的值表示主从库之间的传输延迟。

2、时间延迟
时间延迟计算方式:
传输过来的binlog 的时间-正在应用的binlog 的时间。
假设在某一个时间点出现了海量的ml,可能会出现主从应用延迟也就是
Seconds_Behind_Master 越来越大。
这个时候还是要同时去比较一下日志量的差距。
确认从库的性能问题的时候,要配合tps 和rows 去看:

mysql> show global status like '%rows%';
+--------------------------+---------+
| Variable_name | Value |
+--------------------------+---------+
| Innodb_rows_deleted | 3024 |
| Innodb_rows_inserted | 5134444 |
| Innodb_rows_read | 85069 |
| Innodb_rows_updated | 82021 |
| Not_flushed_delayed_rows | 0 |
| Sort_rows | 0 |
主从之间的延迟主要在应用延迟上:

1、主库的海量dml
2、row 模式,没有主键
3、row 模式,没有主键、没有高效索引
4、row 模式,没有主键、没有索引
5、从库单线程执行应用

如何处理:

1、特殊处理主库的海量dml
2、将所有的没有主键的表建立一个唯一键索引(联合唯一键索引)
3、最好给表加上主键(动作非常大,一定要谨慎)
4、将模式改成mixed
5、5.7 开始,一个很好的改进就是可以并行应用
并行度一般不超过cpu 的核数,最大不要超过2 倍

slave-parallel-type = LOGICAL_CLOCK
slave-parallel-workers = 16
#slave_preserve_commit_order=1
slave_transaction_retries=128

但是对于上面的经典SQL,并行也解决不了。
因为主库一个线程产生的sql,因为row 模式到了从库以后变成很多的
sql,这些sql 只能被从库的一个线程执行,因此速度没有提升。

5.7 的新特性

现对于异步方式,主库提交成功,dump 线程及时发现,即时传送到从库,如
果主库出现问题,会出现部分binlog 没有传输到从库。
保证传输同步,但是不保证应用同步

主库的一些海量操作,例如批量、ddl操作,最好避免直接在生产上操作,如果非要做,可以在主库临时关闭回话级别的binlig,主从同时执行批量或者ddl前提是主从没有明显的延迟
主从搭建以及从库启动io线程,sql apply线程 监控主从线程工作状态

主从相关命令

change master to//从库连接主库的时候,跳过主库的一些binlog
binlog删除策略,可以使用过期参数或者purge定期删除
relaylog会自动清除,不需要关心

主从的几种架构:

1、一主多从
优点:主从间的传输延迟会小一些
缺点:产生太多binlog dump 线程,会加重主库的IO 负载
2、多级复制(级联复制)
多级复制的优缺点:
优点:主上就一个dump 线程,从主上不承担读binlog 的内容,只负责把主
上的binlog 传送到从库上。要把从主的表和各种都设置成BLACKHOLE 引擎,
从主应用日志产生的数据都被丢到黑洞里去,只需要从主在应用主库的binlog
时产生的binlog,所以设置log_slave_updates=on,从主开启binlog,才能在从
主应用主上的日志的时候把产生的binlog 传送到(二级)从库上。
这里写图片描述
多级复制中一级从库的设置要点:
1、设置log_slave_updates=on,从主开启binlog
2、把从主的引擎设置成BLACKHOLE
缺点:二级从库的延迟会大一些,在从主那里又应用产生binlog,造成了延
迟。


http://chatgpt.dhexx.cn/article/tWB9PQaV.shtml

相关文章

主从复制:主从复制的概述、一主一从架构搭建主从复制的原理、同步数据一致性问题

文章目录 1. 主从复制的概述1.1 如何提升数据库的并发能力1.2 主从复制的作用 2. 主从复制的原理2.1 原理剖析2.2 复制的最大问题2.3 复制的基本原则 3. 一主一从架构搭建3.1 准备工作3.2 主机配置文件3.3 从机配置文件3.4 建立账户并授权3.5 配置需要复制的主机3.6 测试3.7 停…

c/c++经典面试题(高频考点)

一、数据结构及算法(快排、归并、堆排等) 十大排序算法 数据结构(c/c版)-严蔚敏 数据结构与算法(思维导图) E:\学习\4.数据结构(C语言版)].严蔚敏_吴伟民.扫描版.pdf 数据结构分为8类有:数组、栈、队列、链表、树、散列表、堆、图 1.快速排…

吐血整理 | 最常见的 C/C++ 面试题(含答案)

大家好,我是 K 哥! 最近群里有小伙伴想跳槽,问我有没有常见的 C/C 面试题。这不正好,K 哥之前整理了一份 PDF,里面包含了各种经典的 C/C 题目,当然更重要的是还附带了非常详细的答案。 K 哥不仅面试之前会反…

2018秋招C/C++面试题总结

博主从8月中旬开始大大小小面试了十几家公司,至今也许是告一段落吧,希望后面会有好结果,因此总结记录一些C/C方向常见的问题。和大家一起学习! 参考了互联网的各种资源,自己尝试归类整理,谢谢~ 一、C和C的区…

C++面试题总结,一篇就够了

C面试题汇总 1. C基础1.1 内存模型1.1.0 内存四区1.1.1 简述C、C程序编译的内存分配情况1.1.2 分配函数与释放函数1.1.2.1 malloc / free1.1.2.2 new / delete1.1.2.3 new/delete 与 malloc/free 区别1.1.2.5 calloc 、realloc1.1.2.6 在C中,使用malloc申请的内存能…

C面试题--汇总

目录 一、C语言基础面试题1. gcc编译器编译的完整流程,分别有什么作用?2.什么是回调函数?3.地址能否使用 printf函数中的 %u形式打印?4.结构体与共用体(联合体)的区别5. static、const、volatile关键字有什…

C/C++ 最常见50道面试题

C/C经典面试题 面试题 1:变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明, 但是只在一个地方定义。加入 extern 修饰的是变量的声明,说明此变量将在文件以外或…

C语言经典面试题学习

1. 请填写bool , float, 指针变量 与“零值”比较的if 语句。 提示:这里“零值”可以是0, 0.0 , FALSE 或者“空指针” 。例如int 变量n 与“零值”比较的if 语句为: if ( n 0 ) if ( n ! 0 ) 以此类推。 (1)请写出bool flag 与“…

C语言面试题目大全

http://blog.chinaunix.net/uid-12077574-id-145080.html 1.求下面函数的返回值(微软) int func(x) { int countx 0; while(x) { countx ; x x&(x-1); } return countx; } 假定x 9999。 答案:8 思路:将x转化为2进制&am…

C语言常见面试题汇总

文章目录 gcc的编译过程&#xff1f;static关键字变量/函数的声明和定义之间有什么区别各种指针指针常量与常量指针“引用”与指针的区别是什么&#xff1f;C语言参数传递方式&#xff1a;结构体的浅拷⻉与深拷⻉#include<> 与#include ""的区别&#xff1f;宏…

c语言打印菱形图案

1.打印空心菱形 #include<stdio.h> int main() {int n,i,m,j,k;scanf("%d", &n);m (n 1) / 2;for (i 1; i < n; i) //一行一行的循环打印{if (i < m) //分两种情况&#xff0c;上半部分和下半部分{for (j m - i; j > 0; j--)pri…

菱形的打印

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 菱形的打印 前言菱形的打印是对于初学者对for循环结构嵌套的考察&#xff0c;学会了菱形的打印基本也就掌握了for循环结构的嵌套&#xff0c;下面让我们一起看看吧~ 一、如何…

打印菱形的两种方法

1.利用字符串数组输出图案 思路&#xff1a; 用字符串数组来输出&#xff0c;第一次循环向这个字符串数组中填 ‘ * ’&#xff0c;i 从中间向左(⬅️)&#xff0c;j 从中间向右(➡️)。 第二次循环填 ‘ ’&#xff0c;i 从左向右(➡️)&#xff0c;j 从右向左(⬅️)。 char s…

JavaScript打印菱形

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script type"text/javascript">// 请打印出菱形//1 3 5 7 9 7 5 3 1 九行 //1 2 3 4 5 6 7 8 9// 首先我们实现…

打印菱形图案

题目&#xff1a; 打印菱形 题目内容&#xff1a; 用C语言在屏幕上输出以下图案&#xff1a; 思路&#xff1a; 这道题的解决办法有很多&#xff0c;大多都是拆分法&#xff0c;这里捡一种我觉得最方便的方法作以介绍&#xff1a;首先我们需要明白&#xff0c;这种图案形式打…

【C】 打印菱形图案

使用VS2019 ISO C14 标准 (/std:c14) 打印菱形图案 打印出如下图案&#xff08;菱形&#xff09;。 ********* **************** 代码&#xff1a; //打印菱形图案 #include<stdio.h> int main() {//分析&#xff0c;菱形图案由空格和*号组成//声明函数void print(in…

打印菱形图案C语言详解

这是菱形图案 这是完整代码 #include<stdio.h> int main() {while(1)//这一步目的可以打印多次菱形{int i0,j0,k0,t0,n0,x0; scanf("%d",&n); //n的含义是菱形的长对角线的长度,因此n必须是奇数,也可以说是菱形竖着放时的高度x(n1)/2; //这是菱形边长…

打印菱形(两种思路)

一、输入的行数等于上半部分的金字塔行数 思路&#xff1a; 仔细观察图形&#xff0c;可以发现&#xff0c;此图形中是由空格和*按照不同个数的输出组成的。 上三角&#xff1a;先输出空格&#xff0c;后输出*&#xff0c;每行中空格&#xff1a;从上往下&#xff0c;一行减少一…

C语言实现——打印菱形

目录 前言 如何实现 代码实现 定义一个变量line来接收输入的行数 实现上半部分 实现下半部分 代码汇总 前言 输入一个数&#xff0c;打印对应的菱形 该菱形表现为&#xff1a; 从第一行到中间行的行数为输入的数&#xff0c; 从中间行到结束行的行数为输入的数。 如…

c语言经典例题:打印菱形

题目&#xff1a;打印出如下图案&#xff08;菱形&#xff09; 思路&#xff1a; 菱形这个图案很有趣&#xff0c;图案里的*数量&#xff0c;从上到下看&#xff0c;有着独特的规律&#xff0c; 1 &#xff0c;3&#xff0c;5&#xff0c;7&#xff0c;5&#xff0c;3&#xf…