Mongodb 笔记 —- Sharding-2-Shard key, Administration

Mongodb 笔记 —- Sharding-2-Shard key, Administration

6 6 月, 2019 阅读 692 字数 2243 评论 0 喜欢 0

Shard key

  • shard key不能是array field
  • shard key一旦设置,不能再修改
  • shard key默认非unique

Shard key种类:

1. Ascending shard key:

简单来说就是,不断增加且增长只在尾部maxkey的chunk(max chunk)发生 ,最终造成数据分布不均匀的shard key 。

解决且优化处理ascending shard key:
The Firehose Strategy

利用Location-Based Shard Keys,将存放$maxkey的chunks放到性能更强的机器 。再使用cron job之类的调度工具,每天将不再活跃的数据移动到弱性能不服务器上。

(致命缺点,如果整个高性能replica set 挂了,那么可能会造成没有任何集群能接手/承受住它的负载。)

Multi hotspot

利用compound key, 选择一个低cardinality的field作为compound key的第一个key, ascending key作为第二个key。

这样一个collection会因为第一个key分成N个chunk,同时又因为第二个key是不断增长的。对于某一个chunk来说,它就类在standalone-server上的single chunk一样,永远不断增长。同时它又相对分布平衡。

注意:当新增shard到配置了multi hotspot的集群的时候,将会触发balancer迁移数据到新的shard上来平衡分布。

2. Randomly Distributed Shard Keys:

比较理想的KEY,因为天然的随机特性。

比如:usernames, email addresses, UUIDs, MD5 hashes,Hashed Shard Key

缺点:当获取的数据超过内存容量时,效率将很差。

Hashed Shard Key

当对不存在的collection进行hashed shard key处理的时候,mongodb会在空的chunks分布到集群中。

  • hashed shard key 不能使用unique选项。
  • 任何shard key为数字类型的都会被先进行round处理,再转换为hash key。即可能出现大量重复。

1.需要创建Hashed index

db.users.createIndex({“username” : “hashed“})

2. 创建shard key

sh.shardCollection(“app.users”, {“username” : “hashed“})

3. Location-Based Shard Keys:

按取值范围对某个field(shard key)设置分组,将特定分组放到特定的shard上,达到分组查询、将频繁查询的数据放到性能更强的shard上的目的。

不在设置规则field取值范围,会按正常规则存放/分布到shard集群上。

将现有shard按Zone分组:

> sh.addShardToZone(“shard0000”, “USPS”)

> sh.addShardToZone(“shard0000”, “Apple”)

> sh.addShardToZone(“shard0002”, “Apple”)

设定每个Zone分组的取值范围:
  • sh.updateZoneKeyRange(“test.ips”, {“ip” : “056.000.000.000”}, {“ip” : “057.000.000.000”}, “USPS”)
  • sh.updateZoneKeyRange(“test.ips”, {“ip” : “017.000.000.000”}, {“ip” : “018.000.000.000”}, “Apple”)
移除zone分组:

sh.removeShardFromZone(“shard0005”, “whatever”)

Zone分组的技巧:

通过Zone分组,我们还可以让重要的数据只存在于特定的服务器组中。不重要的数据存放在另一组服务器中。

通过一个collection修改对应的分组,我们可以控制chunks在集群中的分布。

Administration:

Config Server各collection存放的信息

1.config.shards : shard member list

2.config.databases:所有 shard或非shard数据库的元数据(不含系统数据库)

config.databases中partitioned字段表示对于该库是否启用了shard。

3.config.collections: 所有shard的collection的元数据(不含非shard collection)

4.config.chunks:存有每个collection上所有chunk的信息

5.config.changelog: 记录split,migration

6.config.settings: chunk size 和balancer信息

网络管理:

1.connPoolStats命令,查看服务器outgoing连接。命令不会产生任何锁

db.adminCommand({“connPoolStats”: 1})

2.限制连接数:

对mongos 使用maxConn参数,限制可以连接mongos的client数量。

官方建议的计算公式:maxConns = 20,000 ? (numMongosProcesses × 3) ? (numMembersPerReplicaSet × 3) ? (other / numMongosProcesses)

发表回复

蜀ICP备15005542号