第44章:MongoDB-集群--Sharding(分片)--分片的片键选择
所谓片键,就是用来拆分数据的字段,通常为1-2个字段,由于片键一旦确定,并已经分片过后,基本上就不可能再修改片键了,因此初期设计和选择就非常重要了
1:不可以是数组
2:一旦插入了文档,片键不可修改,要修改就必须先删除文档,然后才能修改片键
3:大多数特殊类型的索引都不能作为片键
4:片键的数据取值应该是多样的,这样才利于分片
1:小基数片键
就是片键可取的值非常少,所以叫小基数。通常这不是个好方式,因为:片键有N个值,也就最多只能有N个块,也就是最多只能N个分片。这也意味着当某个块越来越大的时候,MongoDB无法拆分块,因此你什么也干不了,除了购买更大的硬盘。
2:升序片键
就是片键值是不断增加的,类似于自增字段。通常这不是个好方式,因为:
(1)新加入的数据始终会加入最后一个块,即所有数据都被添加到一个块上,从而导致了热点必然存在,且是单一,不可分割的热点。
(2)由于数据始终会先加入到最大块,会导致最大块需要不断的拆分出新的小块
(3)会导致数据均衡处理很困难,因为所有的新快都是由同一个分片创建的
3:随机分发的片键
就是片键值是随机散列的数据,这种方式对数据的均衡是有好处的,数据加载速度也很快,缺点是:如果需要按照片键值进行范围查找的话,就必须到所有分片上执行了。
创建一个散列片键,需要先创建散列索引,示例如下:
db.users.ensureIndex({“userId”:”hashed”});
然后对集合分片,示例如下:
sh.shardCollection(“mydb.users”,{“userId”:”hashed”});
4:基于某个业务的片键
这个就要具体问题具体分析和选择了,比如:选择用户IP,电话号码段,或者是自定义的编码段等。如果要指定特定范围的块出现在特定的分片中,可以为分片添加tag,然后为块指定tag,例如:
sh.addShardTag(“myrep2”,“gtu”) 然后:
sh.addTagRange("mydb.users",{"userId":"v0"},{"userId":"v9"},"gtu");
就可以设定v0-v9的数据存放到myrep2这个分片里面去
(1)在设置范围的时候,可以使用:ObjectId()、MinKey、MaxKey 等来作为值
(2)不用某个tag了可以删除:sh.removeShardTag(“myrep2”,“gtu”);
实际项目中,建议尽量采用准升序键加查询键构成组合片键。
其中升序键的每个值最好能对应几十到几百个数据块,而查询键则是应用程序通常都回依据其进行查询的字段。
例如:某应用,用户会定期访问过去一个月的数据,就可以在{month:1,user:1}上进行分片,month是一个粗粒度的升序字段,每个月都会增大;而user是经常会查询某特定
用户数据的查询字段。
1:注意一点:查询键不可以是升序字段,否则该片键会退化成为一个升序片键,照样会面临
热点问题
2:通常通过准升序键来控制数据局部化,而查询键则是应用上常用的查询字段
第44章:MongoDB-集群--Sharding(分片)--分片的片键选择的更多相关文章
- mongodb集群搭建(分片+副本)开启安全认证
关于安全认证得总结: 这个讲述的步骤也是先创建超管用户,关闭服务,然后生成密钥文件,开启安全认证,启动服务 相关概念 先来看一张图: 从图中可以看到有四个组件:mongos.config server ...
- mongodb集群搭建(分片+副本)
原文地址:https://www.cnblogs.com/ityouknow/p/7344005.html 相关概念 先来看一张图: 从图中可以看到有四个组件:mongos.config server ...
- linux下Mongodb集群搭建:分片+副本集
三台服务器 192.168.1.40/41/42 安装包 mongodb-linux-x86_64-amazon2-4.0.1.tgz 服务规划 服务器40 服务器41 服务器42 mongo ...
- MongoDB集群设置集合分片生效及查看集合分片情况
#连接mongos /opt/mongodb/mongodb-linux-x86_64-2.4.8/bin/mongo 127.0.0.1:27017 #使用admin数据库 use admin ...
- MongoDB 集群设置集合分片生效及查看集合分片情况
一.设计DB分片与Collection分片 #连接mongos /opt/mongodb/mongodb-linux-x86_64-2.4.8/bin/mongo 127.0.0.1:27017 ...
- 搭建高可用mongodb集群—— 分片
从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出 ...
- Mongodb集群搭建之 Sharding+ Replica Sets集群架构(2)
参考http://blog.51cto.com/kaliarch/2047358 一.概述 1.1 背景 为解决mongodb在replica set每个从节点上面的数据库均是对数据库的全量拷贝,从节 ...
- Mongodb集群配置(sharding with replica set)
转自:http://blog.csdn.net/zhangzhaokun/article/details/6269514 前言 最近在研习MongoDB集群,找到一个不错的例子,加了几句,按照自己的理 ...
- mongodb 3.4 集群搭建:分片+副本集
mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...
随机推荐
- python待学习内容
1.Python中不尽如人意的断言Assertion https://www.cnblogs.com/cicaday/p/python-assert.html 2.Python中的反转字符串问题 ht ...
- 吴裕雄 python 数据可视化
import pandas as pd df = pd.read_csv("F:\\python3_pachongAndDatareduce\\data\\pandas data\\taob ...
- 软件工程小组讨论设计NABCD
项目名称:失物招领平台 项目工作小组:冰淇淋队 项目简介:目前同学们丢了东西都qq空间转发或者某个特定的qq群发消息,qq空间转发浪费了别人的时间,qq群发消息也浪费了别人的时间.怎么样才能浪费最少的 ...
- Django 日志输出及打印--logging
Django使用python自带的logging作为日志打印工具. logging是线程安全的,主要分为4部分: Logger 用户使用的直接接口,将日志传递给Handler Handler 控制日志 ...
- SpringCloud-day03-服务注册与发现组件Eureka
5.服务注册与发现组件Eureka 5.1Eureka简介: Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中 ...
- pandas列操作集锦
列操作 pandas的列操作 数据准备: 增 将两张表合并到一起 pd.concat([page_001,page_002]).reset_index(drop=True) 默认从上到下合,如果想从左 ...
- Linux - Ubuntu 图形界面入门
Ubuntu 图形界面入门 目标 熟悉 Ubuntu 图形界面的基本使用 01. Ubuntu 的任务栏 02. 窗口操作按钮 03. 窗口菜单条 ——本文源自<黑马程序员>
- html页面的CSS、DIV命名规则(仅供参考学习)
CSS命名规则: 头:header 内容:content/containe 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中: ...
- sql yog出现2013错误
首先用telnet检查一下你的防火墙端口,如果连接失败,配置防火墙. 配置防火墙,开启3306端口 find -name iptables vim /etc/sysconfig/iptables -A ...
- 矢量水听器 近场 远场 --------------------常规波束形成,MVDR的比较
摘自<水平线阵的反卷积常规波束形成>,IRONMAN--------------------------------------------------- 在常规的波束形成中,是将阵列上的 ...