2019-03-02-什么是shard(分片)

https://blog.csdn.net/zhuyijian135757/article/details/40870973

"Sharding" 姑且称之为"分片"。

Sharding 不是一门新技术,而是一个相对简朴的软件理念。

MySQL 5 之后才有了数据表分区(Partition)功能,那么在此之前,很多 MySQL 的潜在用户都对 MySQL 的扩展性有所顾虑,而是否具备分区功能就成了衡量一个数据库可扩展性与否的一个关键指标(当然不是唯一指标)。

如在单一数据库上处理应用数据捉襟见肘而需要进行分区化之类的处理,是如何办到的呢? 答案是:Sharding。

 Sharding 不是一个某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是水平扩展(Scale Out,亦或横向扩展、向外扩展)的解决方案,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。

通过一系列的切分规则将数据水平分布到不同的DB或table中,在通过相应的DB路由或者 table路由规则找到需要查询的具体的DB或者table,以进行Query操作。这里所说的“sharding”通常是指“水平切分”, 这也是本文讨论的重点。具体将有什么样的切分方式呢和路由方式呢?行文至此,读者难免有所疑问,接下来举个简单的例子:我们针对一个Blog应用中的日志来说明,比如日志文章(article)表有如下字段:

article_id(int),title(varchar(128)),content(varchar(1024)),user_id(int)

blog的应用中,用户分为两种:浏览者和blog的主人。浏览者浏览某个blog,实际上是在一个特定的用户的blog下进行浏览的,而blog的主人管理自己的blog,也同样是在特定的用户blog下进行操作的(在自己的空间下)。所谓的特定的用户,用数据库的字段表示就是“user_id”。就是这个“user_id”,它就是我们需要的分库的依据和规则的基础。

们可以这样做,将user_id为 1~10000的所有的文章信息放入DB1中的article表中,将user_id为10001~20000的所有文章信息放入DB2中的 article表中,以此类推,一直到DBn【水平切分】


这样一来,文章数据就很自然的被分到了各个数据库中,达到了数据切分的目的。

接下来要解决的问题就是怎样找到具体的数据库呢?其实问题也是简单明显的,既然分库的时候我们用到了区分字段user_id,那么很自然,数据库路由的过程当然还是少不了 user_id的。

考虑一下我们刚才呈现的blog应用,不管是访问别人的blog还是管理自己的blog,总之我都要知道这个blog的用户是谁吧,也就是我们知道了这个blog的user_id,就利用这个user_id利用分库时候的规则反过来定位具体的数据库

比如user_id是234,利用该才的规则,就应该定位到DB1
假如user_id是12343,利用该才的规则,就应该定位到DB2

利用分库的规则,反向的路由到具体的DB,这个过程我们称之为“DB路由”。

当然考虑到数据切分的DB设计必然是非常规,不正统的DB设计[nosql数据库]。那么什么样的DB设计是正统的DB设计呢?

当然冗余字段的出现并不只是在分库的场景下才出现的,在很多大型应用中,冗余也是必须的,

你可能感兴趣的:(2019-03-02-什么是shard(分片))