浅谈数据库扩容方案

起因

每一个项目都是由小项目发展而来,从最初的一台数据库,到后面的几千上万台数据库,这发展的过程,我们都要涉及到一个技术问题:当数据量太大的时候,如何进行扩容?

案例

小明现在负责一个站点,用户数据库有2个,网站用户数据通过ID取模,分别存在两台用户数据库中,现在数据增大,两台数据库已经不够用了,现在需要增加数据库进行扩容,小明应该如何进行扩容?

方案

  1. 停机扩容
  2. 平滑扩容

停机扩容

我们先来了解下停机扩容方案,这是一种很多人初期都会使用的方案(几台数据库的时候),具体步骤:

  1. 小明先挂公告,告诉大家明天的凌晨02:00 - 06:00,站点将停机升级;
  2. 时间到了,小明停止了所有对外服务;
  3. 小明新增了2个数据库,然后写了一个程序,将原先的2个库的数据迁移到现有的4个库(2+2)上;
  4. 数据迁移完成,修改数据库服务配置;
  5. 重启服务,并重新开启对外服务。

回滚方案:

数据迁移失败,或者迁移后测试失败,则将服务配置修改回原先的两个库,改天再升级。

优点:

  • 简单

缺点:

  1. 不高可用
  2. 开启升级到升级完成,时间短,项目组压力大,易出错
  3. 升级时间基本是半夜人流量最少的时候,项目组疲累,容易出错
  4. 运行一段时间后,发现问题,难以回滚,只能回到扩容前,会丢失部分数据

适用:

  1. 小型网站;
  2. 大部分游戏;
  3. 对高可用要求不高的服务。

平滑扩容

现在我们来聊一下本文的重点:平滑扩容中最好的方案就是扩容的数据库是原先数据库的倍数,如:2个数据库扩容到4个数据库,是原先的2倍。步骤:

(1)新增2个数据库

(2)配置双主进行数据同步(先测试,后线上,重启服务时间是秒级)

(3)数据同步完成之后,配置主主双写因为同步有延迟,如果每时每刻都有数据写入/更新的话,就不能准确的保证数据已经同步完成

(4)数据同步完成后(时间比较长),删除双主同步,修改数据库配置,并重启(秒级);

(5)此时已经扩容完成,但此时的数据并没有减少,新增的数据库跟旧的数据库一样多的数据,此时还需要写一个程序,清空数据库中多余的数据,如:

  1. User1去除 uid % 4 = 2的数据;
  2. User3去除 uid % 4 = 0的数据;
  3. User2去除 uid % 4 = 3的数据;
  4. User4去除 uid % 4 = 1的数据。

现在,我们就已经完成了数据库的平滑扩容了。

优点

  1. 扩容期间,服务照常进行,保证高可用
  2. 时间长,项目组压力没有这么大,出错率低
  3. 扩容期间,遇到什么问题,都可以随时调试,不怕影响线上服务
  4. 每个数据库少了一半的数据量。

缺点

  1. 程序复杂,需要配置双主、主主双写、检测数据同步等额外技术;
  2. 但后期数据库成千上万台的时候,扩容复杂(情况非常少,除非将很多业务数据放在同一个数据库)。

适用:

  1. 大型网站;
  2. 对高可用要求高的服务。

总结

本文主要简单讲解了数据库扩容的两种方案,并对这两种方案的优缺点、适用场景进行了说明:

  • 停机扩容:简单,不高可用,易出错,扩容后不能回滚,只能回档,会丢失一部分数据。
  • 平滑扩容:复杂,高可用,出错调试容易,易回滚,不会造成数据丢失,

结语

  1. 每一种方案都有适合它的场景,适合自己的,才是最好的;
  2. 小编经验有限,希望此文章对大家有帮助;
  3. 每天进步一点点。

参考文献

58沈剑老师架构师之路的:数据库秒级平滑扩容架构方案

原文地址:https://www.cnblogs.com/kafeixiaoluo/p/9156855.html

时间: 2024-10-12 18:46:32

浅谈数据库扩容方案的相关文章

浅谈数据库设计技巧(转)

说到数据库,我认为不能不先谈数据结构.1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法.尽管现在的程序开发已由面向过程为主逐步过渡到面向对象为主,但我还是深深赞同8年前老师的告诉我们的公式:计算机程序=数据结构+算法.面向对象的程序开发,要做的第一件事就是,先分析整个程序中需处理的数据,从中提取出抽象模板,以这个抽象模板设计类,再在其中逐步添加处理其数据的函数(即算法),最后,再给类中的数据成员和函数划分访问权限,从而实现封装. 数据库的最初雏形据说源

浅谈数据库之存储过程

浅谈数据库之存储过程 什么是存储过程 如果你接触过其他的编程语言,那么就好理解了,存储过程就像是方法一样. 竟然他是方法那么他就有类似的方法名,方法要传递的变量和返回结果,所以存储过程有存储过程名有存储过程参数也有返回值. 存储过程的优点:    存储过程的能力大大增强了SQL语言的功能和灵活性. 可保证数据的安全性和完整性. 通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全. 通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性. 在运行存储过程前,

浅谈数据库并发控制 - 锁和 MVCC

在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制. 如果数据库中的所有事务都是串行执行的,那么它非常容易成为整个应用的性能瓶颈,虽然说没法水平扩展的节点在最后都会成为瓶颈,但是串行执行事务的数据库会加速这一过程:而并发(Concurrency)使一切事情的发生都有了可能,它能够解决一定的性能问题,但是它会带来更多诡异的错误. 引入了并发事务之后,如果不对事务的执行进行控制就会

浅谈数据库框架,见笑,请多指正

浅谈数据库框架,见笑,请多指正 http://weibo.com/p/1001603724746155003486 一友说"插件式存储又割裂了SQL引擎的完整逻辑...总体而言在现有框架下MySQL的优化器没有多大改进的价值". 我们且做个技术分析: 1 插件式框架,可以静态/动态加载组件,方便在同类不同属家的模块间切换,这种设计是良好的. 很多软件的设计都采用了"微内核+插件"这样的方式构筑了强大的应用.如Ecplise生态圈. 2 数据库范围内, MySQL的属

浅谈数据库去重

关于sql去重,我简单谈一下自己的简介,如果各位有建议或有不明白的欢迎多多指出.推荐网址:www.4-yecao.com 关于sql去重最常见的有两种方式:DISTINCT和ROW_NUMBER(),当然了ROW_NUMBER()除了去重还有很多其他比较重要的功能,一会我给大家简单说说我自己在实际中用到的. 假如有张UserInfo表,如下图: 现在我们要去掉完全重复的数据:SELECT DISTINCT * FROM dbo.UserInfo结果如下图: 但是现在有个新的需求,要把名字为‘张三

浅谈数据库设计

浅谈数据库设计 数据库设计的重要性:好的数据库设计有下面的一些作用: 1.首先充分体现系统的需求,数据库是为应用服务的,好的数据库设计应该首先能满足应用系统的业务需求,准确的表达数据间关系. 2.保证数据的准确性和一致性,通过主外键.非空.限制.唯一索引等保证数据的健壮. 3.提高数据的查询效率,通过合理表结构,安排物理存储分区.增加索引等方式,提高数据的读取速度,提高查询效率. 4.有好的扩展性,在必要时能根据需求扩展数据结构. 在系统设计中对数据库的设计应考虑哪些设计原则  数据库是整个软件

架构组件:基于Shard-Jdbc分库分表,数据库扩容方案

一.数据库扩容 1.业务场景 互联网项目中有很多"数据量大,业务复杂度高,需要分库分表"的业务场景. 这样分层的架构 (1)上层是业务层biz,实现业务逻辑封装: (2)中间是服务层service,封装数据访问: (3)下层是数据层db,存储业务数据: 2.扩容场景和问题 当数据量持续新增,面临着这样一些需求,两台数据库无法容纳,需要数据库扩容,这里选择2台-扩容到3台的模式,如下图: 这样扩容的问题 (1)分库分表的策略导致数据迁移量大: (2)影响数据的持续服务性: (3)指定时间

基于Shard-Jdbc分库分表模式下,数据库扩容方案

本文源码:GitHub·点这里 || GitEE·点这里 一.数据库扩容 1.业务场景 互联网项目中有很多"数据量大,业务复杂度高,需要分库分表"的业务场景. 这样分层的架构(1)上层是业务层biz,实现业务逻辑封装:(2)中间是服务层service,封装数据访问:(3)下层是数据层db,存储业务数据: 2.扩容场景和问题 当数据量持续新增,面临着这样一些需求,两台数据库无法容纳,需要数据库扩容,这里选择2台-扩容到3台的模式,如下图: 这样扩容的问题(1)分库分表的策略导致数据迁移量

浅谈数据库的锁

数据库对于程序猿来 并不陌生,但是数据库的锁你知道多少?数据库的锁直接影响数据性能,在大并发的前提下,怎么保证数据不被死锁,提高数据库性能?如何加锁,何时加锁,加什么锁,你可以通过hint手工强行指定,但大多是数据库系统自动决定的.这就是为什么我们可以不懂锁也可以写SQL. 下面我们来简单谈一谈数据库中的锁,以sqlserver 为例: 数据库锁的种类: 1.共享锁(Shared lock) 何为共享锁,顾名思义意思就是资源共享,所以共享锁之间 是没有时间等待的可以同时执行一条或多条查询语句,共