面试题:如何实现丝滑般的数据库扩容
初版
如果我们的线上服务不重要,一般来个单体的数据库DB来存储数据即可来。
单体应用
优点:简单,省事,方便。
缺点:数据并发性,稳定性都有问题。
进阶
随着数据量的不断增大,一般我们要对数据进行水平切分,水平切分的规则你可以简单根据用户id或者用户IP对数据进行取模,实现路由功能。当然也可以增加Slave跟KeepAlived来实现高可用。
主从+路由
但问题是,如果随着业务发展,目前我们2个库的性能扛不住了,还要继续水平拆分,造出更多库咋办?你一般是如何实现丝滑扩容的呢?
扩容
第一版:停机扩容
停机扩容
简单直接暴力的方法。
APP通知用户在某个时间段停机维护升级。
新建若干个具有高可用的库。
停止当前服务,然后写个数据迁移程序,实现把老库数据全部迁移到新库中。
修改代码路由规则后重新对外提供服务。
优点:简单
缺点:中间停服务了,无法保证高可用。数据切换前跟切换过程中需确保无任何出错。
第二版:在线双写
在线双写
建立好新到数据库,然后接下来用户在写原有数据库到同时也写一份数据到我们的新库中。
写个数据迁移程序,实现旧库中的历史数据迁移到新库中。
迁移过程中,每次插入数据时,需检测数据的更新情况。比如,如果新的表中没有当前的数据,则直接新增;如果新表有数据并没有我们要迁移的数据新的话,我们就更新为当前数据,只能允许新的数据覆盖旧的数据,推荐使用Canal这样到中间件。
经过一段时间后需要校验新库跟旧库两边数据是否一样。如果检查到一样了,则直接切换即可。
优点:高可用了。
缺点:不够丝滑,来回挪动数据较大。
第三版:丝滑般扩容
目标:打算将原来到两个数据库扩容到4个。
第一步:修改配置
修改配置
修改配置信息,注意旧库跟新库之间到映射关系。确保扩容后数据可以正确路由到服务器。
Id % 2 = 0 的库变为了 id % 4 = 0 或 id % 4 = 2
Id % 2 = 1 的库变为了 id % 4 = 1 或 id % 4 = 3
第二步:reload配置
服务层reload配置,可以重启服务,也可以CLoud那样配置中心发送信号来实现重读配置文件。
至此,数据库的2 --> 4 扩容完成,原来是2个数据库实例提供服务,现在变为4个数据库实例提供服务。
第三步:收缩数据
丝滑扩容
此时 id % 4 = 0 跟 id % 4 = 2 的两个DB 还在同步数据。id % 4 = 1 跟 id % 4 = 3的两个DB还在同步数据。需做一些收尾操作。
接触上面的两个同步操作。
对新库新建高可用。
删除冗余数据,比如id % 4 = 0的机器中删除id % 4 = 2的冗余数据,只为id % 4 = 0的数据提供服务,其余三个类似操作。
至此实现成倍扩容,还避免来数据迁移。
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️
面试题:如何实现丝滑般的数据库扩容相关推荐
- 如何实现丝滑般的数据库扩容
初版 如果我们的线上服务不重要,一般来个单体的数据库DB来存储数据即可来. 单体应用 优点:简单,省事,方便. 缺点:数据并发性,稳定性都有问题. 进阶 随着数据量的不断增大,一般我们要对数据进行水平 ...
- vs code保存自动格式化代码及eslint/tslint修复-太爽(丝滑般的感觉)
现在没有前后端分离的开发模式都不好意思跟同行交流.前后端分离的好处这里就不再赘述了. 本司开发的系统是基于Angular(ng zorro),TypeScript,后台采用Spring Boot.写前 ...
- vue如何使用原生js写动画效果_手摸手,带你用 vue 动画实现原生 app 切换效果,丝滑般的体验...
先来看效果图 完整源码在 github 中 欢迎 star: 准备 开始之前您需要有 vue 基础,以及安装好 vue-cli 开始 新建 vue 项目:vue init webpack vuexle ...
- 手摸手,带你用 vue 动画实现原生 app 切换效果,丝滑般的体验
先来看效果图 完整源码在 github 中 欢迎 star: https://github.com/imfing/vuexlearn 准备 开始之前您需要有 vue 基础,以及安装好 vue-cli ...
- Spring Boot使用Spring DeferredResult实现长轮询,纵享新丝滑让你体验丝滑般的感觉 - 第414篇
相关历史文章(阅读本文前,您可能需要先看下之前的系列
- 阿里云数据库专家白宸:Redis带你尽享丝滑!(图灵访谈)
访谈嘉宾: 本名郑明杭,现阿里云NoSQL数据库技术专家.先后从事Tair分布式系统.Memcached云服务及阿里云Redis数据库云服务开发,关注分布式系统及NoSQL存储技术前沿. 作为嘉宾,曾 ...
- 阿里云数据库专家白宸:Redis带你尽享丝滑!
本文仅用于学习和交流目的,不得用于商业目的.非商业转载请注明作译者.出处,并保留本文的原始链接:http://www.ituring.com.cn/art... 访谈嘉宾: 本名郑明杭,现阿里云NoS ...
- 深入浅出讲解丝滑般动画特效实现原理
作者丨哈哈将 个推安卓高级开发工程师 来源丨个推技术学院 (getuitech) 前言 APP开发市场已经告别"野蛮生长"时代,人们不再满足于APP外形创新,而将目光转向全方面的用 ...
- 让代码丝滑般跳转,rust-analyzer,你值得拥有
1 RLS触怒了我 我是一个专一的人,从学习Rust起就在vscode中使用rls作为跳转插件(主要原因其实是懒),如果不是今天它彻底触怒了我,恐怕我还会对它继续钟情下去. 事情的原委是这样的,今天下 ...
最新文章
- ASP.NET MVC+HighCharts开发统计图表
- 『数据中心』降低PUE值4种方法
- 面试官问你MySQL的优化,看这篇文章就够了
- lamda获取参数集合去空_(转)Java8使用lambda表达式进行集合的遍历
- 关于visual studio 2015 智能提示英文,而非中文的解决方案
- windows平台vs2010编译64位libiconv与libxml2
- ESXi主机性能问题
- Linux 下DNS服务配置
- 装IDT声卡时总是说检测到的硬件不受此IDT软件程序包支持安装将终止
- php微信公众号发送多条消息模板,整合ThinkPHP功能系列之微信公众号模板消息发送...
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323
- 自由-进化/开源中国众包平台
- Qt 语言家实现中英文切换(解决纯代码添加部件的中英文转换问题)
- 华为业绩发布会:5G产品和供货没有受到“实体清单”影响
- PAT 1072 开学寄语
- MATLAB 绘图合集:等高线图contour
- tkinter + wxpy 实现微信发送信息 接收消息 并保存聊天记录的功能(GUI)
- ES6-11数值扩展:二进制和八进制、数值分隔符、Number.isFinite()、Number.isNaN()等
- git log 命令详解
- 记Linux服务器中的 kdevtmpfsi 挖矿病毒
热门文章
- spring boot 加载静态文件
- input radio 样式
- mysql 5.7.17 64位_Windows(x86,64bit)升级MySQL 5.7.17免安装版的详细教程
- php搬迁安装,【资料搬迁】安装phpunit
- 周期均方根和有效值的区别_如何判断化学锚栓和膨胀锚栓的区别
- 怎么控制ajax执行先后顺序,[转]多个ajax请求时控制执行顺序或全部执行后的操作...
- 突破5G壁垒,睿至科技集团以技术实力赋能产业发展
- android使用perfetto工具步骤
- android R编译Super镜像时报错问题分析和定位
- Linux动态库的导出控制