关系型数据库的分片原则

来自Citus的Ozgun Erdogan分享了进行数据库分片的三个原则,并强调应用类型是决定数据库分片最主要的因素。其中B2B类型的应用最容易进行数据库分片。

在数据库很小的时候,可以很容易地通过添加硬件来扩展数据库。但随着数据表数量的不断增长,我们需要寻找其他的方式来伸缩数据库。

分片是伸缩数据库最好的方式之一。通过分片将数据库拆分成更小的单元,可以线性地扩展数据库的CPU、内存和磁盘资源。不过在分片这个问题上也存在一些争议,网络上充斥着各种有关分片的不同观点,如“essential to scaling your database infrastructure”和“why you never want to shard”。那么问题来了,我们应该采纳哪一种观点?而一般来说,答案通常会是“它取决于”。

分片的原理很简单,就是通过一个键(或者说列)来均匀地分布数据。不过理论虽简单,在真正遇到要对数据库进行分片时,很可能会陷入一团手忙脚乱之中。

在Citus,我们曾经帮助数百个团队进行数据库分片,也从中总结了一些关键的分片模式。

在这篇文章里,我们会先探讨一些决定分片成败的关键属性,然后从底层细节分析这些属性之间的不同点。在进行大型数据库分片时,应用程序的类型将成为最主要的影响因素。

成功分片取决于三个关键属性

我们发现有三个关键属性会影响到成功的分片。下图通过三个方向轴展示了这三个属性,并在每个轴上面放置了一些知名的公司作为例子。

X-轴表示负载类型,从左侧的事务开始延伸到右侧的数据仓库。在进行数据库伸缩时,这一维度最具有识别度。

Z-轴表示另一个非常重要的属性,也就是应用程序当前所处的生命周期。此时你的数据库里有多少数据表?你的应用程序已经运行了多长时间?一个运行了几个月的数据库要比运行了数年的数据库更容易进行分片。

在Citus,我们发现大部分用户都有自己的应用程序。应用程序越是成熟,Y-轴就显得越为重要。不过这个维度不如其他两个维度那么具有识别度。事实上,很多讨论分片的文章之所以会得出互相矛盾的结论,是因为它们只是基于单一的应用类型。

分片中最重要的属性:应用类型(B2B或B2C)

Y-轴展示了在对成熟数据库进行分片时最为重要的属性:应用程序的类型。在这条轴上,B2B应用处于最上端,它们的数据模型更容易进行分片。B2C应用处于轴的底部,比如Amazon和Facebook,它们的分片需要做更多的工作。接下来,我们挑选了三家知名的公司来比对它们之间的不同点。

B2B类型:Salesforce

CRM系统是B2B应用最为典型的例子。构建CRM系统的目的是为了要给其他客户提供服务的,我们假设GE Aviation是你的一个客户,他们正在使用Salesforce。

GE Aviation有如下的一些实体。

  • 客户(customer):公司的顾客。

  • 用户(user):用户可以登录GE公司的仪表盘。

  • 负责人(lead):GE与这些负责人商谈业务。

  • 联系人(contact):GE与这些联系人有了业务往来,并知道他们的联系方式。

  • 账号(account):业务代表和拥有联系人的人。

  • 机会(opportunity):与账号和联系人相关的销售事件。

如果把这些实体之间的复杂关系映射到数据库里,看起来是这样的:

整个图咋一看确实很复杂,不过如果你多花一点时间看仔细一点,你会发现大多数表都是源自customer表。通过往每个表里添加customer_id列可以把表间关系转换成如下形式:

通过这种简单的转换,就可以通过customer_id这个键进行数据库分片。这个键可以让数据均匀地分布,而大部分查询都需要带上这个键。另外,你还可以根据customer_id把相关表聚集在同一个位置,这样就可以继续使用关系型数据库的一些关键特性,比如事务、表连接和外键。

换句话说,如果你的应用类型是B2B的,那么你的数据就具备了分片的天然特性。

B2C类型:Amazon

Amazon是B2C应用最为典型的例子。在构建像Amazon这样的网站时,有许多东西需要考虑。首先,用户来到你的网站,浏览你的商品,比如书或电子产品。假设用户在浏览《Harry Potter 7》,他们也可以看到这个产品的分类信息,比如书本的作者、价格、封面和其他图片。

用户在登录网站之后,开始访问用户相关的数据。用户需要得到认证,然后获得给产品添加评论的权限或者把产品添加到购物车里。在某个时候,用户决定要购买购物车里的产品,于是就下单。订单经过处理之后,开始进入物流运送流程。

你会发现,现在的关系图与Salesforce的关系图有一个很大的不同点。现在的关系图中不止一个中心点,而是三个:分类(catalog)、用户(user)和订单(order)。

要对这种B2C类型的数据进行分片,可以考虑将它们重构成微服务。例如,与产品目录相关的服务提供目录服务,用户相关的服务提供认证和购物车服务。服务之间的API定义了底层数据访问的边界。

数据经过拆分之后,就可以进行分片。事实上,Amazon在迁移到面向服务架构时就使用了类似的方式进行数据分片。

这种分片方式与B2B应用的分片在好处和成本比率上有很大的差别。从好处方面来看,你可以依赖数据库从不同的数据库连接数据,或者为数据集提供事务和约束。从成本方面来看,现在要进行分片的不止是一个数据集,而是多个。

B2C2C类型:Instacart

在B2B和B2C之间还有另外一种类型的网站,比如Postmates、Instacart或Lyft。[Instacart][12]的主营业务是将本地商店的货物运送给用户。从某方面来看,Instacart与Amazon有点类似。Instacart的数据模型具有三个维度:提供货物的本地商店、订购商品的用户和运送货物的司机。所以,很难在这当中挑出一个键进行分片。

如果你的应用属于B2C2C类型,可能需要采取不同的策略。你会发现大部分数据表会共享一个维度:地理位置信息。在这种情况下,你可能会选择城市或地理位置作为分片的键。

一般来说,B2B2C应用或B2C2C应用的分片处于图谱的中间。B2B2C分片的好处和成本之间的比率要高于B2C应用,但低于B2B应用。

结论

网络上存在很多有关分片的观点。我们发现它们大部分都是基于单一的应用类型。事实上,应用类型比其他因素更能影响到分片。B2B类型的应用最容易进行分片。

原文地址:http://www.infoq.com/cn/news/2017/08/fragmentation-principle-relation


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

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

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

相关文章

分布式架构--基本思想汇总

转载自 分布式架构--基本思想汇总 在互联网大行其道的今天,各种分布式系统已经司空见惯。搜索引擎、电商网站、微博、微信、O2O平台。。凡是涉及到大规模用户、高并发访问的,无一不是分布式。 关于分布式系统,并没有…

花了100多去KTV不是唱歌,竟然是……

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。老师,歌词可以实现,不过比较麻烦~也还行你这样 准备几首歌的歌词就行到时候只演示这几首歌如果是其他的哥的话,就显示暂无歌词行,有时间就试…

jzoj4272-序章-弗兰德的秘密【树形dp】

正题 大意 两棵树,它们的相似值是它们留下最多的节点使它们的结构相同。求相似值。 这两颗树就是结构相同的,相似值是8。 解题思路 就是树形dp。可以用f[i][j]f[i][j]表示树1的第ii号节点和它的子树与树2的j" role="presentation" s…

从NIO到Netty开发

转载自 从NIO到Netty开发 1. 从传统BIO到NIO的升级 Client/Server模型是网络编程的基本模型,服务端提供位置信息,客户端通过连接操作向服务端发起连接请求,通过三次握手建立连接,如果连接建立成功,双方就可以通过网…

Orleans入门例子

Orleans是微软开源的分布式actor模型框架.actor模型的原理网络上有很多文章.有许多理论性的文章,深刻地我都不知道怎么应用.在这里我就不赘述了.既然是博客,就说说自己的理解。 对于编程来说,不管是前台还是后台,在现在的计算机环境下,多线程…

JavaScript常用单词整理总结

第一章object对象undefined未定义变量boolean布尔类型sort()对数组排序charAt返回在指定位置的字符toLowerCase()把字符串转换为小写button按钮break结束循环toUpperCase()把字符串转换为大写split(str)将字符串分割为字符串数组length获取数组的长度continue结束当前循环&…

JWT 应用

文章目录JWT工具模块Token认证微服务JWT授权监测网关认证过滤消费端获取JWTJWT工具模块 如果要想在项目之中去使用JWT技术,那么就必须结合到已有的模块之中,最佳的做法就是将JWT的相关的处理 操作做为一个自动的starter组件进行接入 1、【microcloud项目】既然要开…

淘宝秒杀系统设计的几个注意点

转载自 淘宝秒杀系统设计的几个注意点 还记得2013年的小米秒杀吗?三款小米手机各11万台开卖,走的都是大秒系统,3分钟后成为双十一第一家也是最快破亿的旗舰店。经过日志统计,前端系统双11峰值有效请求约60w以上的QPS &#xff0…

.NET Core 2.0 开源Office组件 NPOI

前言 去年 12 月,我移植了大家所熟知 NPOI 到 .NET Core 版本,这里是当时发的博客,当时得到了很多同学的支持,社区反应也很好,在这里非常感谢当时推荐的朋友们。 去年的那个版本是针对于 .NET Core 1.0 的&#xff0…

老师们一直在……

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。【随便写写】为了了解同学们在公司的情况,和佟老师上了的做了个在线问卷调查,把一些常见的问题设置在调查中,根据调查数据,然后挨个的去解决…

海量数据的分库分表技术演进,最佳实践

转载自 海量数据的分库分表技术演进,最佳实践 每个优秀的程序员和架构师都应该掌握分库分表,移动互联网时代,海量的用户每天产生海量的数量 用户表订单表交易流水表 以支付宝用户为例,8亿;微信用户更是10亿。订单表…

Orleans例子再进一步

步骤 现在我想再添加一个方法,到IGrains项目内,这个方法里面有个延迟3秒,然后返回一个Task<string>.就叫做DelayedMsg吧,如下图所示: 我调用了这个DelayedMsg,同时又调用了SayHello函数,看看效果:注意这个DelayedMsg的调用方法没有await. 虽然我的SayHello的调用时间紧随…

2018/7/12-纪中某C组题【jzoj4272,jzoj4273,jzoj4274】

前言 今天我的想法都是正解&#xff0c;也都写了&#xff0c;结果才160QwQ 今日分数 去掉了十分强大的纪中dalao 正题 T1&#xff1a;jzoj4272-序章-弗兰德的秘密【树形dp】 博客链接&#xff1a;https://blog.csdn.net/mr_wuyongcong/article/details/81021994 T2&#xf…

你,下周可否“报上有名”?

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号【雄雄的小课堂】。一周一次周测&#xff0c;一直在延续&#xff0c;一般情况下不会间断。以前我只要一说&#xff0c;同学们&#xff0c;咱们本周周五考试&#xff0c;下面的同学们就沸腾的不行了&#xff0c;有的说…

Redis的3个高级数据结构

转载自 Redis的3个高级数据结构 平常接触最多的是5个入门级数据结构&#xff1a;String&#xff0c;Hash&#xff0c;List&#xff0c;Set&#xff0c;Sorted Set&#xff0c;本文介绍3个高级数据结构&#xff1a;Bitmaps&#xff0c;Hyperloglogs&#xff0c;GEO。 Bitmap…

SpringCloudConfig整合Nacos

SpringCloudConfig 的作用是可以进行配置的更新处理&#xff0c;这个的确是很好&#xff0c;但是原始的SpringCloudNetflix 架构所提供的动态的抓取配置实在是太繁琐了&#xff0c;包括还要使用到SpringCloudBus进行Actuator处理 SpringCloudAlibaba套件之中是基于Nacos 实现的…

使用VS Code开发调试.NET Core 2.0

使用VS Code 从零开始开发调试.NET Core 2.0。无需安装VS 2017 15.3即可开发调试.NET Core 2.0应用。 VS Code 全称是 Visual Studio Code&#xff0c;Visual Studio Code是一个轻量级的跨平台Web集成开发环境&#xff0c;可以运行在 Linux&#xff0c;Mac 和Windows下&#x…

不管什么事,只要用心做,总不会太差!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号【雄雄的小课堂】。KTV项目基本已经做完&#xff0c;于是自上周五以来就开始挨个小组的进行试讲。上周五第一次试讲&#xff0c;只讲了三个小组&#xff0c;整体来说讲的都不行。组员与组长之间的协调不统一&#xff…

学生自定义的键盘,功能强大齐全!!!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号&#xff1a;雄雄的小课堂。今天给大家介绍一款键盘&#xff0c;本款键盘属于私人订制&#xff0c;“专业性”很强&#xff0c;且功能齐全&#xff0c;在使用时可以一人使用&#xff0c;在某种特定的场合下&#xff0c;两…

度量.net framework 迁移到.net core的工作量

把现有的.net framework程序迁移到.net core上&#xff0c;是一个非常复杂的工作&#xff0c;特别是一些API在两个平台上还不能同时支持。两个类库的差异性,通过人工很难识别全。好在微软的工程师们考虑到了我们顾虑&#xff0c;为我们提前设计了一个工具&#xff1a;.NET Port…