面试官:如何设计数据库秒级平滑扩容架构?

我是小探花 2019-03-04 17:23:02 ⋅ 178 阅读

停服务方案

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

(2)停服务

(3)新建y个库,做好高可用

(4)数据迁移,重新分布,写一个数据迁移程序,从x个库里导入到y个库里,路由规则由%x升级为%y

(5)修改服务配置,原来x行配置升级为y行

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

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

回滚方案:

如果数据迁移失败,或者迁移后测试失败,则将配置改回x库,恢复服务,改天再挂公告。

方案优点:简单

方案缺点:

(1)停服务,不高可用

(2)技术同学压力大,所有工作要在规定时间内做完,根据经验,压力越大约容易出错(这一点很致命)

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

秒级、平滑方案


(1)修改配置


主要修改两处:

a)数据库实例所在的机器做双虚ip,原来%2=0的库是虚ip0,现在增加一个虚ip00,%2=1的另一个库同理

b)修改服务的配置(不管是在配置文件里,还是在配置中心),将2个库的数据库配置,改为4个库的数据库配置,修改的时候要注意旧库与新库的映射关系:

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

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

这样修改是为了保证,拆分后依然能够路由到正确的数据。

(2)reload配置,实例扩容


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

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

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

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

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

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

b)服务reload之前是不对外提供服务的,冗余的服务能够保证高可用

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

(3)收尾工作,数据收缩


有这些一些收尾工作:

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

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

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

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

这样下来,每个库的数据量就降为原来的一半,数据收缩完成。


该方案能够实现n库扩2n库的秒级、平滑扩容,增加数据库服务能力,降低单库一半的数据量,其核心原理是:成倍扩容,避免数据迁移。

迁移步骤:

(1)修改配置

(2)reload配置,实例扩容完成

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

---------------END----------------

后续的内容同样精彩

长按关注“IT实战联盟”哦




全部评论: 0

    我有话说:

    创业团队如何设计支撑百万并发的数据库架构

    我们来聊一下对于一个支撑日活百万用户的高并系统,他的数据库架构应该如何设计?

    反向面试

      你可以反问面试的问题 内容来源:https://github.com/yifeikong/reverse-interview-zh 大部分翻译自:https://github

    面试如何在海量数据中判断某个数据是否存在?

    https://www.toutiao.com/a6756788128960217604这是一道面试题:如何

    您应该避免的五个简单的数据库设计错误

    Anith 在他非常成功的文章 Facts and Fallacies about First Normal Form 之后,对五个常见的数据库设计错误进行了引人入胜的讨论,尽管使用它们的不幸后果

    「轻阅读」聊一聊6种常用的架构设计模式(上)

      许多现代应用都需要在企业规模上进行构建,有时甚至需要在互联网规模上进行构建。这些应用都需要满足可扩展性、可用性、安全性、可靠性和弹性需求。 在本文中,我将谈论一些设计模式,这些模式

    京东技术:京东系统架构如何让笨重的架构变得灵巧

    京东系统架构师,从事架构设计与开发工作,熟悉各种开源软件架构。在Web开发、架构优化上有较丰富实战经历。

    架构设计原则 - 高并发

    高并发设计可以从以下几方面考虑:无状态拆分服务化消息队列数据异构缓存并发化1. 无状态无状态的应用容易进行水......

    微服务架构下的若干常用设计模式

    在我们选择了用微服务架构设计、交付数字化应用后,因微服务架构本身所带来的一些共性问题。

    缓存的架构设计要点

    缓存的典型应用场景和设计要点

    打造千万流量杀系统

    背景介绍服务器成本高?经常遇见宕机?网站流量一大就出 bug ?...... 面对大流量的业务需求,任何一家大厂和高速扩张的企业,都非常需要可以掌握高可用、高性能、高并发 “三高”系统架构设计能力的

    「轻阅读」从MySQL高可用架构看高可用架构设计

    高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一

    「转载」使用DDD指导业务设计的一点思考

    领域驱动设计(DDD) 是 Eric Evans 提出的一种软件设计方法和思想,主要解决业务系统的设计和建模。DDD 有大量难以理解的概念,尤其是翻译的原因,某些词汇非常生涩,例如:模型、限界上下文

    Java Web实战篇-轻松提高千万数据库查询效率

    通过优化数据库设计、java后台和数据库优化达到提高千万数据查询的效率。

    高性能缓存架构设计(超实用)

    缓存虽然能够大大减轻存储系统的压力,但同时也给架构引入了更多复杂性。

    架构实战篇:一个可供中小团队参考的微服务架构技术栈

    作者近年一直在一线互联网公司(携程,拍拍贷等)开展微服务架构实践,根据我个人的一线实践经验和我平时对Spring Cloud的调研,我认为Spring Cloud技术栈中的有些组件离生产开发尚有

    「免费」千万电商高并发与杀实战

    IT老齐 16年Java研发与架构设计经验、前京东金融架构师、中国财政部数据平台架构师、专注送给小白的实战课、只为高薪而生、重实战,说人话,讲干货,不扯淡!

    架构实战篇:使用MyBatis延迟加载模式为数据库减压,附演示实例

    MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟规则推迟对关联对象的select查询。延迟加载可以有效的减少数据库压力......

    搞对数据库连接池,这次从100优化到3ms!阿里架构师都说好

    我在研究HikariCP(一个数据库连接池)时无意间在HikariCP的Github wiki上看到了一篇文章(即前面给出的链接),这篇文章有力地消除了我一直以来的疑虑,看完之后感觉神清气爽。故在此

    微服务架构:搭建网站扫码登录的功能设计

    微信扫码登录大家都是应用比较多的登录方式了,现在大的购物网站像京东、淘宝等都支持使用APP扫码登录网站了。今天就用APP扫码登录网站的实例来举例说明微服务架构的搭建过程。