如何实现丝滑般的数据库扩容
初版
如果我们的线上服务不重要,一般来个单体的数据库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的数据提供服务,其余三个类似操作。
至此实现成倍扩容,还避免来数据迁移。
如何实现丝滑般的数据库扩容相关推荐
- 面试题:如何实现丝滑般的数据库扩容
初版 如果我们的线上服务不重要,一般来个单体的数据库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作为跳转插件(主要原因其实是懒),如果不是今天它彻底触怒了我,恐怕我还会对它继续钟情下去. 事情的原委是这样的,今天下 ...
最新文章
- 关于学习Python的一点学习总结(57->正则表达式及re模块中的一些函数)
- js ZeroClipboard 拷贝文本到剪贴板
- php基于laravel框架的批量插入操作
- go语言中没有隐藏的this指针
- 【若依(ruoyi)】datetimepicker日期和时间插件
- 程序和计划任务管理( 查看进程ps,控制进程,终止命令进程,top命令,at一次性任务,crontab周期任务)
- 使用Timer执行定时任务
- Netty-3-服务端接受并打印telnet传递过来的字符串
- 认认真真推荐几个ATM大神的公众号
- AC日记——贪婪大陆 洛谷 P2184
- N阶行列式计算(JAVA)
- 【科学数据库】数据的合并与分组聚合||||||||
- MyBatis框架(二):多对一查询、一对多查询、ResultMap、动态SQL
- 四、项目成本管理(输入/工具与技术/输出)
- 选择哪种护眼灯对眼睛好?盘点五款护眼台灯
- 可串行化 冲突可串行化 判断方法
- STM32的GPIO口能够承受多大电压? 哪些IO口能容忍5V?
- C++标准程序库(学习笔记)二
- 小米刷机android正在启动,刷机不怕变砖 小米手机MIUI双系统详解
- linux 图标主题,Xenlism WildFire: Linux 桌面的极简风格图标主题
热门文章
- 单片机编程软件很简单(22),keil单片机编程软件优化等级+概念解析
- 快钱支付平台 退款功能
- 使用Python和OpenCV标记超级像素的炫彩度
- 部署报错$notify
- libevent入门教程:Echo Server based on libevent - Blog of Felix021 - 日,泯然众人矣。
- “郭德纲”挤兑人不带脏字
- rabbitmq报错:inequivalent arg ‘durable‘ for queue ‘ack_queue‘ in vhost ‘/‘: received ‘true‘ but curren
- 树莓派开发系列教程1——树莓派介绍
- 【Android】自定义progressBar样式
- 面试官:兄弟,你培训出来才2年,你要30K,你把我当傻子么?