后台系统可扩展性学习笔记(十)Database Partitioning

为了提升数据库的处理能力,我们把单库扩展成多库,并通过更新同步机制(即Replication)来保证多份数据的一致性。然而,在 各种复制方案下,每个数据库都持有一份完整数据,基于全量数据提供增删改查服务,单库的性能瓶颈仍然存在,并将成为限制系统扩展性的关键因素。

单库性能瓶颈

单机的硬件资源是有限的,因此单库的处理能力也是有限的:

  • 容量有限:数据量可能大到单库无法容纳
  • 性能有限:单库的读写性能同样受数据量影响,查询/更新越来越慢

单靠加机器/加库显然无法直接解决单机/单库的性能问题,除非进一步打破库的边界,把单库拆分成多库(而不只是复制多份)
理论上,Web 应用层也面临同样的问题,却不曾听说过一个 Web 服务庞大到单机无法部署,这是因为Web 服务在设计之初就会考虑职责划分与解耦,以便各部分能够独立部署、独立扩展,从 20 年前的 SOA(即面向服务架构,包括微服务架构(Microservices)等变体)起便是如此。

分区 Partitioning

把逻辑数据库(或其组成元素,例如数据表)拆分成各个独立部分,这种做法称为分区(Partitioning)。
就像微服务架构中把单体应用(Monolithic application)拆分成一组小型服务一样,我们通过分区把单库拆分成一组(数据规模)更小的库,各自处理一部分数据,共同分担流量,主要优势体现在:

  • 可扩展性:把单库数据拆分到多库后,系统的可扩展性不再受限于单库性能,数据库层“无限”扩展成为了可能
  • 性能:单库数据量减少,数据操作更快,甚至允许多库并行操作
  • 安全性:可以针对(拆出去的)敏感数据,采取更强的安全控制
  • 灵活性:可以对不同的库(比如按数据重要性)采用不同的监控、备份策略,以缩减成本,提升管理效率。或者对不同类型的数据选用不同的存储服务,比如大型二进制内容放到 blob 存储中,更复杂的数据可以存放在文档数据库中
  • 可用性:把数据分散放到多个篮子里,能够避免单点故障,并且单库故障仅影响一部分数据

具体的,有 3 种拆分策略:

  • 水平分区(Horizontal partitioning,也叫 Sharding):按行拆分,把不同的行放入不同的表中
  • 垂直分区(Vertical partitioning):按列拆分,把一些列放到其它表中
  • 按功能分区(Functional partitioning,有时也叫 Federation):按业务功能拆分,把业务领域中属于相同界限上下文(Bounded Context)的数据放在一起

当然,这 3 种策略并不冲突,可以结合使用

水平分区 Horizontal partitioning

在这里插入图片描述
水平分区,即分片(Sharding)。每片(shard)都是原数据的一个子集,共同构成完整的数据集。
与垂直分区相比,水平分区最大的特点是schema 保持不变:每个分区都是一个单独的数据存储,但所有分区都有相同的模式。
就像把一张表横向切几刀,分成几段小表,它们的表结构(字段等)完全一致。
这种横向切分减少了单库所需存储的数据量,以及所需承载的流量/操作,另一方面,还减少了资源争用(contention),有助于提升性能
它的关键在于shard key 的选取:
按哪个字段的什么特征来分片,尽可能保证负载被均匀地分散到每一片上。注意,均匀并不意味着要求每一片的数据量均等,重点是均分流量(有些片可能数据量很大,但访问量却很低)。同时还要避免产生“热点”,比如按姓氏首字母对用户信息进行分片实际上是不均匀的,因为有些字母更常见,此时按用户 ID 哈希值来分片可能更均匀些。

垂直分区 Vertical partitioning

在这里插入图片描述
多用于减少 I/O、降低性能成本,比如,按使用频率把常用字段和不常用的字段分开
比起水平分区,垂直分区的关键优势在于把信息拆的更细,进而允许一些针对性的优化,比如把不经常变化的数据拆分出来,丢到缓存中,把照片等大型二进制内容拆出去单独存放,或者对部分敏感数据进行针对性的安全控制,另一方面,细粒度的数据划分也能够消除一些并发访问,降低并发访问量。

按功能分区

在这里插入图片描述
把不相干的数据剔除出去(把紧密相关的数据放到一起),有助于加强数据隔离,提升数据访问性能,比如把客户信息和商品库存信息分开。

分区的代价

把单库拆成多库,虽然能够解决数据库的扩展性难题,但也引发了一些新问题:

  • 连表查询慢:尽量避免跨分区 join、或者考虑并行查询
  • 全表查询慢:对于需要扫描全量数据的查询操作,即便有并行优化也慢,可以通过垂直分区、按功能分区来定位目标分区,避免全表查询,至于水平分区,可以在应用层维护一张映射表,加快分区定位
  • 不支持事务操作:将事务操作交由应用层来处理
  • 负载不匀导致分区效果大打折扣:考虑增加监控,并根据分析预测定期调整

参考

http://www.ayqy.net/blog/database-partitioning/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于FPGA的HDTV视频图像灰度直方图统计算法设计

随着HDTV的普及,以LCD-TV为主的高清数字电视逐渐进入蓬勃发展时期。与传统CRT电视不同的是,这些高清数字电视需要较复杂的视频处理电路来驱动,比如:模数转换(A/D Converter)、去隔行(De-interla…

后台系统可扩展性学习笔记(十一)Database Denormalization

之前的两篇笔记中谈到了从单库扩展到多库以承载更多的请求量以及单库(表)拆分成多库(表),打破单库的性能瓶颈。 这都是为了应对大数据量下的措施。 然而,除却数据量外,还有一个极其影响单库性能…

Java Swing 影楼管理系统之登录功能

开头打广告,Java1234.com。 首先,来个效果图。 关键代码 1,界面层 private void Jb_DengLuActionPerformed(java.awt.event.ActionEvent evt) {// TODO add your handling code here:String UserName this.Jb_UserNameTxt.getText();String …

Bdsyn百度手机助手是何物,它是怎样神不知鬼不觉地安装到你的电脑里的?

【电脑软件管理中Bdsyn手机助手的问题】Bdsyn手机助手 is developed by Baidu, Inc. and is used by 10 users of Software Informer. 并不是本人安装的(应该是自己自己主动安装的),卸载以后过几天又会出如今软件列表里。百度搜索却无法搜索出…

后台系统可扩展性学习笔记(十二)NoSQL

文章目录NoSQL定义NoSQL种类键值存储文档存储宽列存储图形数据库NoSQL 意味着什么ACID vs. BASESQL or NoSQLNoSQL定义 不同于关系型数据库,NoSQL 数据库(也叫非 SQL 或非关系型数据库)提供的数据存储、检索机制并不是基于表关系建模的。没有…

android2.2应用开发之IccCard(sim卡或USIM卡)

tyle"margin:20px 0px 0px; font-size:14px; line-height:26px; font-family:Arial; color:rgb(51,51,51)"> 如果要做android通讯录的联系人的机卡混排显示,由于手机卡类型的不同,导致手机卡存储容量以及可以存储信息不同,就要涉…

后台系统可扩展性学习笔记(十三)缓存

文章目录在哪儿加缓存缓存什么内容缓存原始查库结果缓存数据对象怎么查询缓存结果预留缓存模式直读模式直写模式回写式缓存绕写式缓存提前刷新模式缓存满了如何处理参考读写分离、分库分表、反范式化、采用 NoSQL……如果这些扩展手段全都上了,数据响应依旧越来越慢…

[linux]gdb调试

使用gdb可以在命令行方便地调试,并且能以命令程序的方式调试源代码。 常用命令简写print-p,step-s,next-n 进入gdb //方式一 gdb test//test 为可执行文件,使用-g编译得到 //方式二 gdb -q //不显示版权信息 file test //file命令打开文件 退出gdb quit …

后台系统可扩展性学习笔记(十四)异步机制与MQ

对于 Web 服务而言,提升可扩展性的主要途径是将耗时的同步工作改成异步处理,从而允许将这些工作“外包”给多个 Worker 去做,或者提前完成能够预知的部分。 异步机制与可扩展性之间的关系需要从(异步)并行处理的优势说…

RegisterClientScriptBlock与 RegisterStartupScript区别

Page.ClientScript.RegisterClientScriptBlock而用Page.ClientScript.RegisterStartupScript是因为:RegisterStartupScript 把script放置在ASP.NET page的底部,而RegisterClientScriptBlock把script放置在ASP.NET page的顶部,用RegisterClien…

【Web后端笔记】SQL Server与java数据类型对应

编号数据库类型JDBC类型JDBC索引描述1intjava.lang.Integer4 2varcharjava.lang.String12 3charjava.lang.String1 4ncharjava.lang.String1 5nvarcharjava.lang.String12 6textjava.lang.String-1 7ntextjava.lang.String-1 8tinyintjava.lang.Integer-6 9intjava.lang.Intege…

后台系统可扩展性学习笔记

整理了一下笔记目录,将以前学习的一些知识串联起来了,比如cdn、负载均衡、中间件,以前只是各自了解了一点,现在大概理清了后台系统设计中他们各自的作用。 后台系统可扩展性学习笔记(一)概要 后台系统可扩展…

TFS 强制删除锁定文件(数据库)

TFS:TFS2010 VS:VS2012 OS:Windows2008 DB:Sqlserver2008 R2 我们在团队开发当中,版本控制是一个不可忽略的工具。我们团队使用的是TFS2010这个版本控制器。 但在团队实际协作开发当中,团队成员难免有电脑损坏或人员离职情况&…

【转】Java:String、StringBuffer和StringBuilder的区别

1 String String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。 String类的包含如下定义: [java]view plaincopy /** The value is used for character storage. */ private final char value[]…

Linux中exit与_exit的区别

在exit,_exit的区别 - exit()与_exit()函数的区别(Linux系统中)2012-03-20 15:19:53 分类: LINUX 注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出&…

光标闪烁问题的解决办法

在调用Windows API函数SetCursor设置光标时,可能会碰到闪烁的问题:移动鼠标,光标在Class Cursor(即注册窗口类时指定的Cursor)与预设Cursor之间闪烁。 在MSDN上有关SetCursor函数的备注中强调,如果Class Cursor非空,那…

视频编解码基础

文章目录前戏编解码技术流程主流视频编码标准视频传输面临的问题视频传输差错控制视频传输Qos质量保证参数人类视觉系统HVS 以及相应编码措施正餐编码层次与码流结构PB帧编码IBBP序列编码结构图像编码结构条带编码结构宏块编码结构块编码结构预测技术码率控制实例H264前戏 编解…

XShell 屏幕锁定的恢复方法(Ctrl+Q)

操作XShell过程中很多时间大家会习惯性的按CtrlS进行保存. CtrlS在XShell的作用是屏幕锁定,很多朋友会无法操作,会直接把窗口关闭。 解决方法: 快捷键 CtrlQ 即能完成解锁!转载于:https://www.cnblogs.com/liangle/p/3173475.html

adb端口被占用

程序不能执行,kill掉任务管理器里面adb服务,重新连接设备仍然有错 查到可能是adb端口被占用 查看adb用的是哪个端口:C:\Users\wanglin>adb nodaemon server 查看谁占用了这个端口:C:\Users\wanglin>netstat -ano | findstr …

实时语音通讯丢包补偿技术

文章目录基于发送端丢包补偿技术原理与媒体无关的前向差错纠正媒体相关前向差错纠正交织技术基于接受端丢包补偿技术基于插入方法基于插值方法基于重构的方法应用建议非交互式交互式拓展阅读参考丢包补偿技术可以分为两类:基于发送端补偿、基于接受端补偿 基于发送…