ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

【博学谷学习记录】超强总结,用心分享|狂野架构师数据库扩容

2022-09-03 15:30:59  阅读:226  来源: 互联网

标签:回滚 log Service 狂野 超强 架构师 日志 数据 数据库


目录

数据库扩容

一般只在数据量较小的时候进行操作

分库分表的缺点:影响分页

数据分区概念

把一个表分区,mysql是自动支持分区的。例,根据时间分区。读取的时候就可以根据分区进行查询。容易出现尾部热点问题,大多数情况下,都是读取新写入的数据,QPS问题难解决。

QPS(TPS)= 并发数/平均响应时间

并发数 = QPS*平均响应时间

1.停机方案

停服务公告,在停止时间进行数据库迁移

1.发布公告
为了进行数据的重新拆分,在停止服务之前,我们需要提前通知用户,比如:我们的服务会在yyyy-MM-dd进行升级,给您带来的不便敬请谅解。
2.停止服务
关闭Service
3.离线数据迁移(拆分,重新分配数据)
将旧库中的数据按照Service层的算法,将数据拆分,重新分配数据
4.数据校验
开发定制一个程序对旧库和新库中的数据进行校验,比对
5.更改配置
修改Service层的配置算法,也就是将原来的uid%3变为uid%4
6.恢复服务
重启Service服务
7.回滚预案 
针对上述的每个步骤都要有数据回滚预案,一旦某个环节(如:数据迁移,恢复服务等)执行失败,立刻进行回滚,重新再来

停止服务之后, 能够保证迁移工作的正常进行, 但是服务停止,伤害用户体验, 并造成了时间压力, 必须在指定的时间内完成迁移。

2.停写方案

只支持读,不支持写。

最好的方式是在http请求到达控制层的时候。难点在于区分写请求和读请求

1.支持读写分离
数据库支持读写分离,在扩容之前,每个数据库都提供了读写功能,数据重新分配的过程中,将每个数据库设置为只读状态,关闭写的功能
2.升级公告
3.中断写操作,隔离写数据源(或拦截返回统一提示)
在Service层对所有的写请求进行拦截,统一返回提示信息,如:服务正在升级中,只对外提供读服务
4.数据同步处理
将旧库中的数据按照Service层的算法,将数据重新分配,迁移(复制数据)
5.数据校验
6.更改配置
7.恢复写操作  
设置数据库恢复读写功能,去除Service层的拦截提示
8.数据清理
使用delete语句对冗余数据进行删除
9.回滚预案
针对上述的每个步骤都要有数据回滚预案,一旦某个环节(如:数据迁移等)执行失败,立刻进行回滚,重新再来

缺点:在数据的复制过程需要消耗大量的时间,停写时间太长,数据需要先复制,再清理冗余数据

3.日志方案

老数据库继续服务,并记录写日志。

新数据库在完成迁移数据后,根据老数据库的日志对数据进行更新。

当最终一致时,切换服务。蓝绿更新、滚动更新。

日志记录
库 表 主键 操作
db t1 id1 update
db t1 id1 insert
db t1 id1 delete

4.双写方案(适合中小数据库,百万以内)

mysql有四种常用日志文件:redo log/undo log/bin log/relay log

redo log:
前进日志:所有写请求,先写入buffer,再写入硬盘。
undo log:
回滚日志:当对数据库进行update、delete、insert操作时,将反向日志记录下来。
快照读:所有select 操作都是基于快照读。基于mvcc控制
(update、delete、insert使用)
bin log:用于主从复制,主数据库完成写操作,写入日志,从库会有一个专门的线程读bin log
relay log:中继日志,用于主从复制,读取bin log ,对从数据库进行操作

1、断开主从同步。

2、使用从库中的数据,对新数据库进行同步,同步完成后进行校验。

3、同步完成之后,使用cancel-server监听主数据库bin log。

4、使用cancel-client写入增量数据,直至差距接近秒级(当最终一致时,切换服务)。

5.平滑2N方案(适合大数据量)

相当于节省了数据同步的操作

1.两个数据库,双向主从复制(两者数据高度一致)

2.扩容时,停止两者间的主从复制。

3.按照约定进行分库操作。

4.后续可以根据情况,删除脏数据

标签:回滚,log,Service,狂野,超强,架构师,日志,数据,数据库
来源: https://www.cnblogs.com/xieshier/p/16652700.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有