文档章节

炸!亿级数据DB秒级平滑扩容

编程SHA
 编程SHA
发布于 05/26 14:05
字数 1917
阅读 5
收藏 0

一步一步,娓娓道来。

一般来说,并发量大,吞吐量大的互联网分层架构是怎么样的?

数据库上层都有一个微服务,服务层记录“业务库”与“数据库实例配置”的映射关系,通过数据库连接池向数据库路由sql语句。

炸!亿级数据DB秒级平滑扩容

 

 

如上图所示,服务层配置用户库user对应的数据库实例ip。

画外音:其实是一个内网域名。

该分层架构,如何应对数据库的高可用?

数据库高可用,很常见的一种方式,使用双主同步+keepalived+虚ip的方式进行。

炸!亿级数据DB秒级平滑扩容

 

 

如上图所示,两个相互同步的主库使用相同的虚ip。

炸!亿级数据DB秒级平滑扩容

 

 

当主库挂掉的时候,虚ip自动漂移到另一个主库,整个过程对调用方透明,通过这种方式保证数据库的高可用。

画外音:关于高可用,《互联网分层架构如何保证“高可用“?》专题介绍过,本文不再展开。

该分层架构,如何应对数据量的暴增?

随着数据量的增大,数据库要进行水平切分,分库后将数据分布到不同的数据库实例(甚至物理机器)上,以达到降低数据量,增强性能的扩容目的。

炸!亿级数据DB秒级平滑扩容

 

 

如上图所示,用户库user分布在两个实例上,ip0和ip1,服务层通过用户标识uid取模的方式进行寻库路由,模2余0的访问ip0上的user库,模2余1的访问ip1上的user库。

画外音:此时,水平切分集群的读写实例加倍,单个实例的数据量减半,性能增长可不止一倍。

 

综上三点所述,大数据量,高可用的互联网微服务分层的架构如下:

炸!亿级数据DB秒级平滑扩容

 

 

既有水平切分,又保证高可用。

如果数据量持续增大,2个库性能扛不住了,该怎么办呢?

此时,需要继续水平拆分,拆成更多的库,降低单库数据量,增加库主库实例(机器)数量,提高性能。

新的问题来了,分成n个库后,随着数据量的增加,要增加到2*n个库,数据库如何扩容,数据能否平滑迁移,能够持续对外提供服务,保证服务的可用性?

画外音:你遇到过类似的问题么?

 

停服扩容,是最容易想到的方案?

在讨论秒级平滑扩容方案之前,先简要说明下停服务扩容的方案的步骤:

(1)站点挂一个公告“为了为广大用户提供更好的服务,本站点/游戏将在今晚00:00-2:00之间升级,届时将不能登录,用户周知”;

画外音:见过这样的公告么,实际上在迁移数据。

(2)微服务停止服务,数据库不再有流量写入;

(3)新建2*n个新库,并做好高可用;

(4)写一个小脚本进行数据迁移,把数据从n个库里select出来,insert到2*n个库里;

(5)修改微服务的数据库路由配置,模n变为模2*n;

(6)微服务重启,连接新库重新对外提供服务;

整个过程中,最耗时的是第四步数据迁移。

 

如果出现问题,如何进行回滚?

如果数据迁移失败,或者迁移后测试失败,则将配置改回旧库,恢复服务即可。

 

停服方案有什么优劣?

优点:简单。

 

缺点:

(1)需要停止服务,方案不高可用;

(2)技术同学压力大,所有工作要在规定时间内完成,根据经验,压力越大约容易出错;

画外音:这一点很致命。

(3)如果有问题第一时间没检查出来,启动了服务,运行一段时间后再发现有问题,则难以回滚,如果回档会丢失一部分数据;

有没有秒级实施、更平滑、更帅气的方案呢?

炸!亿级数据DB秒级平滑扩容

 

 

再次看一眼扩容前的架构,分两个库,假设每个库1亿数据量,如何平滑扩容,增加实例数,降低单库数据量呢?三个简单步骤搞定。

 

步骤一:修改配置。

炸!亿级数据DB秒级平滑扩容

 

 

主要修改两处:

  • 数据库实例所在的机器做双虚ip

(1)原%2=0的库是虚ip0,现增加一个虚ip00;

(2)原%2=1的库是虚ip1,现增加一个虚ip11;

  • 修改服务的配置,将2个库的数据库配置,改为4个库的数据库配置,修改的时候要注意旧库与新库的映射关系:

(1)%2=0的库,会变为%4=0与%4=2;

(2)%2=1的部分,会变为%4=1与%4=3;

画外音:这样能够保证,依然路由到正确的数据。

 

步骤二:reload配置,实例扩容。

炸!亿级数据DB秒级平滑扩容

 

 

服务层reload配置,reload可能是这么几种方式:

(a)比较原始的,重启服务,读新的配置文件;

(b)高级一点的,配置中心给服务发信号,重读配置文件,重新初始化数据库连接池;

不管哪种方式,reload之后,数据库的实例扩容就完成了,原来是2个数据库实例提供服务,现在变为4个数据库实例提供服务,这个过程一般可以在秒级完成。

炸!亿级数据DB秒级平滑扩容

 

 

整个过程可以逐步重启,对服务的正确性和可用性完全没有影响:

(a)即使%2寻库和%4寻库同时存在,也不影响数据的正确性,因为此时仍然是双主数据同步的;

(b)即使%4=0与%4=2的寻库落到同一个数据库实例上,也不影响数据的正确性,因为此时仍然是双主数据同步的;

 

完成了实例的扩展,会发现每个数据库的数据量依然没有下降,所以第三个步骤还要做一些收尾工作。

画外音:这一步,数据库实例个数加倍了。

 

步骤三:收尾工作,数据收缩。

炸!亿级数据DB秒级平滑扩容

 

 

有这些一些收尾工作:

(a)把双虚ip修改回单虚ip;

(b)解除旧的双主同步,让成对库的数据不再同步增加;

(c)增加新的双主同步,保证高可用;

(d)删除掉冗余数据,例如:ip0里%4=2的数据全部删除,只为%4=0的数据提供服务;

画外音:这一步,数据库单实例数据量减半了。

 

总结

炸!亿级数据DB秒级平滑扩容

 

 

互联网大数据量,高吞吐量,高可用微服务分层架构,数据库实现秒级平滑扩容的三个步骤为:

(1)修改配置(双虚ip,微服务数据库路由);

(2)reload配置,实例增倍完成;

(3)删除冗余数据等收尾工作,数据量减半完成;

 

思路比结论重要

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:787707172,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

© 著作权归作者所有

编程SHA
粉丝 19
博文 207
码字总数 503378
作品 0
长沙
私信 提问
DDM实践:数据库秒级平滑扩容方案

本文部分内容节选自华为云帮助中心的分布式数据库中间件(DDM)服务的产品介绍 背景 随着业务增长,逻辑库存储空间不足,并发压力较大。 解决方案 此时可对DDM实例逻辑库进行平滑扩容,通过增...

中间件小哥
2018/07/05
0
0
青云分布式数据库RadonDB 深度兼容MySQL

  【IT168 评论】2017年12月12日,青云宣布新一代分布式关系型数据库――RadonDB正式商用(申请加入“RadonDB 免费深度试用”计划:http://t.cn/RTGbWiq)。RadonDB将MySQL数据库与主流分布式...

it168网站
2018/05/07
0
0
数据库软件架构设计些什么

一、基本概念 概念一“单库” 概念二“分片” 分片解决的是“数据量太大”的问题,也就是通常说的“水平切分”。 一旦引入分片,势必有“数据路由”的概念,哪个数据访问哪个库。 路由规则通...

懂得-奉献
2016/12/02
18
0
2017双11技术揭秘—阿里巴巴数据库技术架构演进

作者:谌文涛(俞月) 每年电商双11大促对阿里技术人都是一次大考,对阿里数据库团队更是如此。经过9年的发展,双11单日交易额从2009年的0.5亿一路攀升到2017年的1682亿,秒级交易创建峰值达...

中间件小哥
2017/12/27
0
0
2017双11技术揭秘—X-DB支撑双11进入分布式数据库时代

作者:章颖强(江疑)、胡炜 X-DB 1.0(X-Cluster)是阿里自主研发的,100%兼容MySQL生态的,全球级分布式强一致的关系型数据库系统。今年双11是X-DB的第一次大考,本次双11X-DB服务于天猫/淘宝...

中间件小哥
2017/12/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

lombok的一个踩坑记录

lombok的类如下所示: package com.divx.service.model.task;import com.divx.service.model.BaseTypeMedia;import lombok.Data;/** * @author wuzhilang * @Title: QuestionResult ......

无知的小狼
37分钟前
2
0
如何使用markdown

我没有导入相应的包 这个用的还是有些问题 而且显示的时候格式问题还没解决 <div class="blog_editor" style="margin: 0 auto;width:60%;height:1000px;background-color: white;"> <div s......

南桥北木
40分钟前
4
0
纯手写SpringBoot框架之注解方式启动SpringMVC容器

使用Java语言创建Tomcat容器,并且通过Tomcat执行Servlet,接下来,将会使用Java语言在SpringBoot创建内置Tomcat,使用注解方式启动SpringMVC容器。 代码实现。 1.pom.xml文件,需要依赖的jar...

Java老王
41分钟前
2
0
Presto查询引擎简单分析

Hive查询流程分析 各个组件的作用 UI(user interface)(用户接口):提交数据操作的窗口 Driver(引擎):负责接收数据操作,实现了会话句柄,并提供基于JDBC / ODBC的execute和fetch API Metas...

MobService
43分钟前
1
0
《软件架构的10个常见模式》,看完真心觉得不错

作者:半吊子全栈工匠原文链接:https://blog.csdn.net/wireless_com/article/details/89008061 企业规模的软件系统该如何设计呢?在开始写代码之前,我们需要选择一个合适的架构,这个架构...

Java干货分享
54分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部