MongoDB Sharding学习理论篇

转载 2016年08月29日 17:33:27

MongoDB Sharding学习理论篇


MongoDB Sharding技术是MongoDB为了解决随着数据量的增加和读写请求的增加,单个MongoDB实例无法应对的问题.通过使用Sharding,MongoDB将数据切分成多个部分,将数据分布存放在多个shard上.Sharding技术使单个shard处理请求减少和存储容量减小,同时,随着集群的扩大,整个集群的吞吐量和容量都会扩大.

Sharded cluster分片集群有以下几个组件:shards,query routers,config servers.

shards: 用来存储数据,为这个分片集群提供高可用和数据一致性。在一个生产环境中,每个shard都是一个replica set。

query routers: 或者是mongos实例,用于与应用程序交互,将请求转发到后端的shards,然后将请求结果返回给客户端。一个分片集群可以有多个query router即mongos实例用于分摊客户端的请求压力。如果使用多个mongos实例,可以使用HAProxy或者LVS等代理来转发客户端请求到后端的mongos,必须要配置成client affinity模式保证来自同一个客户端的请求转发到后端相同的mongos.通常会将mongos实例部署到应用服务器上。

config servers: 用于存储分片集群的元数据。这些元数据包含整个集群的数据集合data sets与后端shards的对应关系。query router使用这些元数据来将客户端请求定位到后端相应的shards。生产环境的分片集群正好有3个config servers。config servers里的数据非常重要,如果config servers全部挂掉,整个分片集群将不可用。在生产环境中,每个config server都必须放置到不同的服务器上,并且每个分片集群的config server不能共用,必须分开部署。

MongoDB Sharding是在Collection即集合层面来分布存储数据的,Sharding依据shard key来讲一个集合的数据来分布存储。

为了将一个集合的数据进行分片,首先需要选择一个shard key。一个shard key可以是存在于一个集合中每个文档的索引字段或者符合索引字段。MongoDB将这个shard key的值切分成多个数据块,然后将这些数据块均匀分布到后端的shard上。MongoDB使用range based partitioning 或者 hash based partitionning来讲一个shard key的值进行切分。shard key一旦选择好是不能变更的。

Range Based Sharding

Given a range based partitioning system, documents with “close” shard key values e likely to be in the same chunk, and therefore on the same shard.

Hash Based Sharding

对于hash based partitionning,MongoDB会先计算一个字段值得哈希值,然后使用这些哈希值来创建数据块。

With hash based partitioning, two documents with “close” shard key values are unlikely to be part of t same chunk. This ensures a more random distribution of a collection in the cluster.

Performance Distinctions between Range and Hash Based Partitioning

Range based partitioning支持更有效的范围查询。对于一个shard key给定一个范围查询,query router可以更容易地判断将请求只路由到包含相应数据库的shard上。

Range based partitioning可能会导致数据分布不均,这样会对sharding产生负面作用,比如会出现大部分请求被分发到同一个shard的情况发生。

Hash based partitioning可以确保数据平均分布,但是这样会导致经过哈希处理的值在各个数据块和shard上随机分布,进而使制定的范围查询range query不能定位到某些shard而是在每个shard上进行查询。

Customized Data Distribution with Tag Aware Sharding

MongoDB允许使用tag aware sharding来根据shard key的范围创建并关联一些tag到后端的shards。主要用于同一个分片集群数据分布到多个数据中心的情况。

Maintaining a Balanced Data Distribution

随着数据的增加或者是服务器的增加都会导致整个分片集群的数据分布不均衡,比如一个shard比其他shard上的数据库chunk明显多了很多,或者一个数据块chunk的大小明显比其他chunk大很多。

MongoDB使用两个后台进程来确保一个均衡的分片集群,它们分别是splitting和balancer.

Splitting

Splitting是一个防止chunk变得太大的后台进程,当一个chunk大小超过了指定的大小,MongoDB将会把这个chunk分成两半。插入和更新操作都会触发split。

Balancing

balancer是一个用于管理chunk迁移的后台进程。

当一个分片集群中一个分片集合的数据分布不均衡时,balancer进程会把拥有最多chunk的shard上的chunk迁移到拥有最少chunk的shard上,直到这个集合的数据分布均衡为止。例如,集合user在shard 1上拥有100个chunk,在shard2上拥有50个chunk,balancer进程会将shard1上的chunk迁移到shard2,直到两个shard上的chunk数量保持均衡位置。

向一个分片集群中添加或删除shard都会影响整个集群的均衡性。

Primary shard

每个数据库都会有一个primary shard存储这个数据库中所有未被分片的集合数据。

MongoDB Sharding技术的应用场景:

A.如果数据集data set大小将要或者已经超过了单个MongoDB实例的容量大小。

B.活动的工作集working set大小将要超过最大物理内存大小

C.单个MongoDB实例无法满足频繁的写操作。

如果以上三种情况没有满足,不需要部署sharding,只会增加复制度,同时在设计数据模型时,也要考虑到以后作分片的情况。

Data Quantity Requirements

Sharding只会在数据量比较大的情况下才会发挥作用,默认的chunk大小是64MB,只有在满足特定条件下,balancer进程才会将数据迁移到其他shard上,否则数据会一直存储到单个shard上。

Broadcast Operations and Targeted Operations

通常情况下,分片集群处理客户端的请求有以下另种方式:

将操作请求广播到整个集群中所有包含集合中的文档的shard上。

基于shard key将操作请求定位到单个shard或一组shard

参考文档:http://docs.mongodb.org/manual/sharding/

CentOS 编译安装 MongoDB与mongoDB的php扩展 http://www.linuxidc.com/Linux/2012-02/53833.htm

CentOS 6 使用 yum 安装MongoDB及服务器端配置 http://www.linuxidc.com/Linux/2012-08/68196.htm

Ubuntu 13.04下安装MongoDB2.4.3 http://www.linuxidc.com/Linux/2013-05/84227.htm

MongoDB入门必读(概念与实战并重) http://www.linuxidc.com/Linux/2013-07/87105.htm

Ubunu 14.04下MongoDB的安装指南 http://www.linuxidc.com/Linux/2014-08/105364.htm

《MongoDB 权威指南》(MongoDB: The Definitive Guide)英文文字版[PDF] http://www.linuxidc.com/Linux/2012-07/66735.htm

Nagios监控MongoDB分片集群服务实战 http://www.linuxidc.com/Linux/2014-10/107826.htm

基于CentOS 6.5操作系统搭建MongoDB服务 http://www.linuxidc.com/Linux/2014-11/108900.htm

MongoDB 的详细介绍请点这里
MongoDB 的下载地址请点这里

本文永久更新链接地址http://www.linuxidc.com/Linux/2015-02/113297.htm

相关文章推荐

mongoDB的读书笔记(via3.0)(05)_【Sharding】(03)_关于Shard Keys与Hash的理论知识小絮叨

紧急出个差,但是又不能不继续写,少写点,先把Shard key和Hash的一些小概念继续写一写。Shard KeysmongoDB的Sharding最重要的就是Shard Key。用Shard Key...

【机器学习理论】第3部分 聚类分析

1、概述聚类分析可以应用到多个领域中,在生物学中,聚类可以辅助动植物分类的研究,可以通过对基因数据的聚类,找出功能相似的基因;在地理信息系统中,聚类可以找出具有相抵用途的区域,辅助石油开采;在商业上,...

机器学习理论与实战(十七)概率图模型05(极家族函数的引入)

概率图模型中极家族函数的引入                回顾概率图模型03中的内容,我们用联合树算法进行消息传递,本质是在求解某个变量的分布或者条件分布,求解一个分布不单纯局限在联合树算法上,还有...
  • cuoqu
  • cuoqu
  • 2014年01月15日 12:29
  • 5460

机器学习理论与实战(八)回归

按照《机器学习实战》的主线,结束有监督学习中关于分类的机器学习方法,进入回归部分。所谓回归就是数据进行曲线拟合,回归一般用来做预测,涵盖线性回归(经典最小二乘法)、局部加权线性回归、岭回归和逐步线性回...
  • cuoqu
  • cuoqu
  • 2013年07月20日 00:47
  • 8359

机器学习理论与实战(五)支持向量机

做机器学习的一定对支持向量机(support vector machine-SVM)颇为熟悉,因为在深度学习出现之前,SVM一直霸占着机器学习老大哥的位子。他的理论很优美,各种变种改进版本也很多,比如...
  • cuoqu
  • cuoqu
  • 2013年07月09日 23:05
  • 4795

计算学习理论介绍

现今,机器学习和神经网络已经广为人知。每年有无数篇论文发表,光顶会NIPS每年就有四百篇左右的论文发表。各种应用包括机器翻译、机器阅读等领域都在快速发展。但是,我觉得,我们做研究的人不能被这些表象所迷...

【机器学习理论】第2部分 相关性度量

不管是在机器学习算法中,还是数据挖掘算法中,相似性的度量都是一个非常重要的概念。 在聚类算法中,利用样本之间的相似度进行将样本进行划分成不同的类别; 在搜索引擎中,当输入关键词时,是利用关键词与网...

学习理论

本节主要讲述机器学习理论,它与机器学习的经典算法不同,是阐述机器学习算法为什么正确的这一类理论知识。在Ng看来,机器学习理论是一个人懂机器学习的核心或者只懂皮毛的关键所在之一。它包括的内容有偏差/方差...

机器学习理论与实战(四)逻辑回归

从这节算是开始进入“正规”的机器学习了吧,之所以“正规”因为它开始要建立代价函数(cost function),接着优化价值函数求出权重,然后测试验证。这整套的流程是机器学习必经环节。今天要学习的话题...
  • cuoqu
  • cuoqu
  • 2013年07月07日 15:36
  • 6662

PAC学习理论:机器学习那些事

机器学习是有别于专家系统(基于知识/规则)的一种模式识别方法,与专家系统的构建方法不同,但目的相同。本文分析了一众机器学习方法,并给出了一些机器学习概念的通俗解释。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MongoDB Sharding学习理论篇
举报原因:
原因补充:

(最多只允许输入30个字)