架构组件:基于Shard-Jdbc分库分表,数据库扩容方案
本文源码:GitHub·点这里 || GitEE·点这里
一、数据库扩容
1、业务场景
互联网项目中有很多“数据量大,业务复杂度高,需要分库分表”的业务场景。

这样分层的架构
(1)上层是业务层biz,实现业务逻辑封装;
(2)中间是服务层service,封装数据访问;
(3)下层是数据层db,存储业务数据;
2、扩容场景和问题
当数据量持续新增,面临着这样一些需求,两台数据库无法容纳,需要数据库扩容,这里选择2台—扩容到3台的模式,如下图:

这样扩容的问题
(1)分库分表的策略导致数据迁移量大;
(2)影响数据的持续服务性;
(3)指定时间完成,技术压力大,容易导致预想不到的错误;
如何平稳不停机迁移数据,保证系统持续服务,是本文将要讨论的问题。
二、扩容解决方案
1、扩容方案图解

(1)分库分表基于MySQL数据库,使用shard-jdbc中间件
(2)该方案的思路整体基于SpringCloud微服务架构
2、解决扩容问题
(1)扩容情况下不需要暂停服务;
(2)数据迁移的压力小,不需要指定时间;
3、数据访问层逻辑

方案描述
基于两台数据库分库分表,简称:服务二
基于三台数据库分库分表,简称:服务三
(1)提供两套服务,服务二和服务三
(2)数据库扩容后,如果访问服务三直接获取到数据,流程结束。
(3)如果访问服务三获取不到数据,则访问服务二获取数据。
(4)在迁移开始的一段时间内,访问压力还会在服务二上面。
(5)这样就做到数据访问服务不会停机。
(6)这种访问模式基于SpringCloud很容易做到。
4、数据迁移层逻辑

方案描述
(1)关闭基于两台库的数据入库流程
(2)开启基于三台库的数据入库流程,这样新入库数据就可以被服务三直接访问到。
(3)开发数据迁移中间件,扫描原先两台库的数据。
(4)扫描的数据根据分三台库策略判断是否需要迁移。
(5)如果数据需要迁移,则调用服务三的数据入库接口。
(6)数据迁移完成后,删除原来的位置的数据。
(7)这种迁移模式基于SpringCloud很容易做到。
5、该方案迁移的优点
(1)整个过程是持续对线上提供服务;
(2)数据迁移中间件的开发复杂度较低;
(3)可以限速慢慢迁移,没有时间压力;
三、源代码管理
GitHub·地址
https://github.com/cicadasmile/spring-cloud-base
GitEE·地址
https://gitee.com/cicadasmile/spring-cloud-base

架构组件:基于Shard-Jdbc分库分表,数据库扩容方案的更多相关文章
- .net core 基于Dapper 的分库分表开源框架(core-data)
一.前言 感觉很久没写文章了,最近也比较忙,写的相对比较少,抽空分享基于Dapper 的分库分表开源框架core-data的强大功能,更好的提高开发过程中的效率: 在数据库的数据日积月累的积累下,业务 ...
- JAVA分库分表的实现方案
分库分表的实现方案无非2种:1.本地,2.远程.而在本地一般有2种实现(1.业务代码级别 2.jdbc级别), 其中jdbc级别的本地代理方案的代表有:当当开源的 shardingsphere,远 ...
- 一种可以避免数据迁移的分库分表scale-out扩容模式
转自: http://jm.taobao.org/ 一种可以避免数据迁移的分库分表scale-out扩容方式 目前绝大多数应用采取的两种分库分表规则 mod方式 dayofweek系列日期方式(所有星 ...
- 基于ShardingJDBC的分库分表详细整理
转载 https://www.cnblogs.com/jackion5/p/13658615.html 前言 传统应用项目设计通常都是采用单一数据库作为存储方案,但是随着互联网的迅猛发展以及应用数据量 ...
- 【转】mysql分库分表,数据库分库分表思路
原文:https://www.cnblogs.com/butterfly100/p/9034281.html 同类参考:[转]数据库的分库分表基本思想 数据库分库分表思路 一. 数据切分 关系型数 ...
- 一种可以避免数据迁移的分库分表scale-out扩容方式
原文地址:http://jm-blog.aliapp.com/?p=590 目前绝大多数应用采取的两种分库分表规则 mod方式 dayofweek系列日期方式(所有星期1的数据在一个库/表,或所有?月 ...
- [转]一种可以避免数据迁移的分库分表scale-out扩容方式
原文地址:http://jm-blog.aliapp.com/?p=590 目前绝大多数应用采取的两种分库分表规则 mod方式 dayofweek系列日期方式(所有星期1的数据在一个库/表,或所有?月 ...
- 分库分表数据库自增 id
分库分表之后,ID 主键如何处理? 面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 ...
- 基于ShardingJDBC的分库分表及读写分离整理
ShardingJDBC的核心流程主要分成六个步骤,分别是:SQL解析->SQL优化->SQL路由->SQL改写->SQL执行->结果归并,流程图如下: sharding ...
- 基于SpringCloud实现Shard-Jdbc的分库分表模式,数据库扩容方案
本文源码:GitHub·点这里 || GitEE·点这里 一.项目结构 1.工程结构 2.模块命名 shard-common-entity: 公共代码块 shard-open-inte: 开放接口管理 ...
随机推荐
- 解读setTimeout, promise.then, process.nextTick, setImmediate的执行顺序
最近在看<Node.js调试指南>的时候遇到有意思的几道题,是关于setTimeout, promise.then, process.nextTick, setImmediate的执行顺序 ...
- Spring IoC容器与应用上下文的设计与实现
一.前言 写这篇博文的主要目的如下: 通过相关类和接口分析IoC容器到底长什么样. 阐述笔者对Spring上下文和容器的理解. 介绍重要的类辅助理解SpringBoot的启动流程. 二.Spring ...
- vscode 同步扩展插件
第一步: 在 VSCode 中,安装用于同步配置的插件 settings sync 第二步:将 VSCode 配置上传到 GitHub 完成这一步需要 GitHub token 和 GitHu ...
- Nginx核心流程及模块介绍
Nginx核心流程及模块介绍 1. Nginx简介以及特点 Nginx简介: Nginx (engine x) 是一个高性能的web服务器和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 ...
- linux中批量添加文件前缀的操作
需要在文件夹内所有txt文件的文件名前面添加"gt_"; 就是由原来的文件“xxx.txt”变成“gt_xxx.txt”: 网上搜来的脚本如下: for i in `ls`; do ...
- 【.net core 入坑】.net core 3.0 报错:在 FETCH 语句中选项 NEXT 的用法无效
目录 1.事故现场: 2.分析及解决方案: 1.事故现场: 在项目中使用.net core 3.0,在EF链接sqlserver2008,在程序中使用了分页用的skip和take,程序报错: 在 FE ...
- C#线程学习笔记一:线程基础
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/Thread.html,记录一下学习过程以备后续查用. 一.线程的介绍 进程(Proce ...
- 学习 C#,从 Hello world 开始吧
目录 Hello world 创建.编辑.编译和运行 C# 源代码 使用 .NET Core 命令行接口 (CLI) 工具 使用 Visual Studio 创建项目 编译和执行 总结 C#(读作 & ...
- 在 ASP.NET Core 中启用跨域请求(CORS)
本文介绍如何在 ASP.NET Core 的应用程序中启用 CORS. 浏览器安全可以防止网页向其他域发送请求,而不是为网页提供服务. 此限制称为相同源策略. 同一源策略可防止恶意站点读取另一个站点中 ...
- javascript中常见的几种循环遍历
项目开发中,不管是建立在哪个框架基础上,对数据的处理都是必须的,而处理数据离不开各种遍历循环.javascript中循环遍历有很多种方式,记录下几种常见的js循环遍历. 一.for循环 for循环应该 ...