mongoDB之主分片

2024-06-01 16:08
文章标签 mongodb 分片 之主

本文主要是介绍mongoDB之主分片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、什么是主分片      

 我们再使用mongoBD的分片功能时,使用分片的集合数据可以很好的分布在几个shard上(一主n副),但是没有进行分片的集合保存在什么地方,这个mongoBD的主分片了。

        分片群集中的每个数据库都有一个主分片,其中包含该数据库的所有非分片集合。 每个数据库都有自己的主分片。主分片(primary shard)和副本集中主节点(primary)之间没有任何关联。

        主分片是由mongos选择出来的,选择的依据是每当创建新数据库的时候,mongos会从集群中选择包含数据最少的分片作为新数据库的主分片。具体的选择方式是:

选择listDatabase命令返回的totalSize字段作为选择的准则。如下

mongos> db.adminCommand("listDatabases")
{"databases" : [{xxxx},{xxxx},{xxxx}],"totalSize" : 2842624,"totalSizeMb" : 2,"ok" : 1,"operationTime" : Timestamp(1610982469, 1),"$clusterTime" : {"clusterTime" : Timestamp(1610982469, 1),"signature" : {"hash" : BinData(0,"knqdZrxpyGFdSi0gljxCQG4LJ9U="),"keyId" : NumberLong("6894922308364795934")}}
}

如果我们想手工的选择某个数据库的主分片,可以使用movePrimary命令,迁移主分片的过程会耗费一定的时间,在迁移完成之前,不应该对数据库或者对应的集合进行访问。迁移过程可能会影响整个集群的操作,所以这个命令一般不要主动去使用,如果必须使用,请务必考虑对网络负载的影响。

   如果你部署的一个分片集群是由一个副本集修改配置而来的,那么副本集上原来的那些数据库的主分片将会继续留在原来的副本集上,之后创建的数据库才可以将主分片设置在其他分片上。

2、如何迁移主分片

下面我们演示如何使用movePrimary命令来迁移数据库的主分片。

首先,我们来看,当前new数据库的test集合的主分片在sharding_yeyz这个分片上。它就是new.test的主分片,如下

mongos> sh.status()
--- Sharding Status --- shards:{ "_id" : "sharding_yeyz", "host" : "sharding_yeyz/127.0.0.1:27018,127.0.0.1:27019,127.0.0.1:27020", "state" : 1, "tags" : [ "1_1000" ] }{ "_id" : "sharding_yeyz1", "host" : "sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026", "state" : 1, "tags" : [ "1000_", "1000_2000" ] }databases:...{ "_id" : "new", "primary" : "sharding_yeyz", "partitioned" : true, "version" : { "uuid" : UUID("68c70c64-f732-4478-8851-06dad4b94d6b"), "lastMod" : 1 } }new.testshard key: { "number" : 1 }unique: falsebalancing: truechunks:sharding_yeyz 3sharding_yeyz1 1{ "number" : { "$minKey" : 1 } } -->> { "number" : 1 } on : sharding_yeyz Timestamp(2, 1) { "number" : 1 } -->> { "number" : 1000 } on : sharding_yeyz Timestamp(1, 2) { "number" : 1000 } -->> { "number" : 2000 } on : sharding_yeyz1 Timestamp(2, 0) { "number" : 2000 } -->> { "number" : { "$maxKey" : 1 } } on : sharding_yeyz Timestamp(1, 5) tag: 1_1000 { "number" : 1 } -->> { "number" : 1000 }tag: 1000_2000 { "number" : 1000 } -->> { "number" : 2000 }

接下来我们使用movePrimary命令,使用之前,我们需要知道它的执行过程:

1、首先在集群元数据中修改主分片信息

2、然后移动所有的没有分片的集合到指定的主分片中

**它只能在mongos上执行。

命令的用法是:

db.adminCommand( { movePrimary: <databaseName>, to: <newPrimaryShard> } )举例:
db.adminCommand( { movePrimary : "new", to : "sharding_yeyz1" } )

我们执行完:

db.adminCommand( { movePrimary : "new", to : "sharding_yeyz1" } )

之后,结果如下:

mongos> sh.status()
--- Sharding Status --- shards:{ "_id" : "sharding_yeyz", "host" : "sharding_yeyz/127.0.0.1:27018,127.0.0.1:27019,127.0.0.1:27020", "state" : 1, "tags" : [ "1_1000" ] }{ "_id" : "sharding_yeyz1", "host" : "sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026", "state" : 1, "tags" : [ "1000_", "1000_2000" ] }databases:{ "_id" : "new", "primary" : "sharding_yeyz1", "partitioned" : true, "version" : { "uuid" : UUID("68c70c64-f732-4478-8851-06dad4b94d6b"), "lastMod" : 2 } }new.testshard key: { "number" : 1 }unique: falsebalancing: truechunks:sharding_yeyz 3sharding_yeyz1 1{ "number" : { "$minKey" : 1 } } -->> { "number" : 1 } on : sharding_yeyz Timestamp(2, 1) { "number" : 1 } -->> { "number" : 1000 } on : sharding_yeyz Timestamp(1, 2) { "number" : 1000 } -->> { "number" : 2000 } on : sharding_yeyz1 Timestamp(2, 0) { "number" : 2000 } -->> { "number" : { "$maxKey" : 1 } } on : sharding_yeyz Timestamp(1, 5) tag: 1_1000 { "number" : 1 } -->> { "number" : 1000 }tag: 1000_2000 { "number" : 1000 } -->> { "number" : 2000 }

可以看到,主分片已经迁移完成了。

这篇关于mongoDB之主分片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021472

相关文章

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

为什么要做Redis分区和分片

Redis分区(Partitioning)和分片(Sharding)是将数据分布在多个Redis实例或多个节点上的做法。这种技术用于提高性能、可扩展性和可用性。以下是执行Redis分区和分片的主要原因: 1. **提高吞吐量**:    - 通过将数据分散到多个节点,可以并行处理更多的操作,从而提高整体吞吐量。 2. **内存限制**:    - 单个Redis实例的内存是有限的。分区允许数据

瑞_MongoDB_MongoDB副本集

文章目录 1 MongoDB副本集-Replica Sets1.1 简介1.2 副本集的三个角色1.3 副本集架构目标1.4 副本集的创建1.4.1 创建主节点1.4.2 创建副本节点1.4.3 创建仲裁节点1.4.4 初始化配置副本集和主节点1.4.5 查看副本集的配置内容 rs.conf()1.4.6 查看副本集状态1.4.7 添加副本从节点1.4.8 添加仲裁从节点 1.5 副本集的数

Python中引用复制、分片复制、完整复制

Python中引用复制、分片复制、完整复制 首先直接看例子: >>> l1=[1,2,3]>>> l11 = l1>>> l2=[4,5,l1]>>> l2[4, 5, [1, 2, 3]]>>> l3 = l2[:]>>> l3[4, 5, [1, 2, 3]]>>> import copy>>> l4 = copy.deepcopy(l2)>>> l4[4, 5, [

为什么分片,尽量选择客户端分片架构

在分布式系统中,数据分片是一种常见的技术,用于将大型数据集分散存储在多个服务器上,以提高性能和可扩展性。分片可以发生在客户端或服务器端,每种方式都有其优缺点。客户端分片架构通常指的是数据分片的决策和操作由客户端应用程序来执行,而不是由中间件或服务端来处理。选择客户端分片架构可以带来以下好处: 1. **减少网络I/O**:客户端直接与数据存储节点通信,避免了中间件的介入,减少了一次网络I/O操作

MongoDB数据库的安装和删除

MongoDB数据库的删除和安装 1、删除MongoDB数据库2、下载MongoDB数据库1)、自定义安装2)、注意可视化可以取消勾选 1、删除MongoDB数据库 没有下载过的,可以直接跳到下面的安装过程↓ 我们电脑中如果有下载过MongoDB数据库,要更换版本的话,其实MongoDB数据库的删除是比较简单的,打开我们电脑的控制面板,然后找到MongoDB右击卸载删除即可。

MongoDB Map-Reduce 简介

MongoDB Map-Reduce 简介 MongoDB 是一个流行的 NoSQL 数据库,它使用文档存储数据,这些数据以 JSON 格式存储。MongoDB 提供了多种数据处理方法,其中 Map-Reduce 是一种用于批量处理和聚合数据的功能强大的工具。Map-Reduce 允许用户对大量数据进行自定义的聚合操作,适用于复杂的查询和数据转换任务。 Map-Reduce 的基本概念 Ma

持久化、主从 、分片、哨兵

目录 持久化 RDB(存数据) 使用场景 bgsave 使用方法 原理 AOF(存命令) 使用方法 原理 bgrewriteaof AOF和RDB 主从集群 搭建 数据同步原理(slave宕机) 全量同步 增量同步 集群优化 总结 哨兵机制(master宕机) 机制 监控 自动故障恢复 通知 搭建哨兵集群 RedisTemplate的哨兵模

mongoDB注册windows服务遇到的问题

1 用管理员运行   2 D:\yingyong\mongodb-win32-x86_64-2008plus-ssl-3.4.4\logs\*.log  要自己创建     3 创建命令要这样写 mongod --config d:\yingyong\mongodb-win32-x86_64-2008plus-ssl-3.4.4\mongo.conf --serviceName Mon

MongoDB安装/配置/启动/命令

转发:https://www.jianshu.com/p/b15d293930bc?utm_source=oschina-app 写在前面: 本来想直接写个node+mongodb的,但是因为还没整理好和为了纪念搞MongoDB时踩了坑,所以就先写个MongoDB安装和配置铺铺路。 在安装使用之前,我们应该要明白为什么选择MongoDB呢? 大致的理由有三 只要会js就会mongo