mongodb数据库范围分片数据分布不均匀

news/2024/9/23 7:19:13/文章来源:https://www.cnblogs.com/zetanchen/p/18332083

【说明】

当前使用mongodb分片,三个分片

mongos> sh.status()
--- Sharding Status --- sharding version: {"_id" : 1,"minCompatibleVersion" : 5,"currentVersion" : 6,"clusterId" : ObjectId("66a30ccca62de41d6b0241a4")}shards:{  "_id" : "mongo1",  "host" : "mongo1/mongo1:2700,mongo2:2700,mongo3:2700",  "state" : 1 }{  "_id" : "mongo2",  "host" : "mongo2/mongo1:2701,mongo2:2701,mongo3:2701",  "state" : 1 }{  "_id" : "mongo3",  "host" : "mongo3/mongo1:2702,mongo2:2702,mongo3:2702",  "state" : 1 }active mongoses:"4.2.8" : 3autosplit:Currently enabled: yesbalancer:Currently enabled:  yesCurrently running:  noFailed balancer rounds in last 5 attempts:  0Migration Results for the last 24 hours: 690 : Success

 

【表范围分片测试】

sh.enableSharding("test");
sh.shardCollection("test.messages", { createTime : 1} );  注意这里只是测试时候将时间字段作为范围分片键

使用js插入数据

cat shard_test_messages.js 
testdb = db.getSiblingDB('test');var messages = ["Hello there", "Good Morning", "valar morghulis"];
var createTime = new Date();
for (var j = 0; j < 50000; j ++) {createTime.setFullYear(2024);createTime.setMonth(Math.floor(Math.random() * 12));createTime.setDate(Math.floor(Math.random() * 31) + 1);createTime.setHours(Math.floor(Math.random() * 24));createTime.setMinutes(Math.floor(Math.random() * 60));createTime.setSeconds(Math.floor(Math.random() * 60));testdb.messages.insertOne({userid: Math.floor(Math.random()*50000),message: messages[Math.floor(Math.random()*messages.length)],createTime: createTime})
}db.messages.ensureIndex({createTime: 1});

mongo "localhost:27017/admin" /tmp/shard_test_messages.js -u admin -p 123456

 

【查看表分片情况】

mongos> db.messages.getShardDistribution()Shard mongo1 at mongo1/mongo1:2700,mongo2:2700,mongo3:2700data : 2.01MiB docs : 25000 chunks : 1estimated data per chunk : 2.01MiBestimated docs per chunk : 25000Totalsdata : 2.01MiB docs : 25000 chunks : 1Shard mongo1 contains 100% data, 100% docs in cluster, avg obj size on shard : 84Bmongos> sh.status()
--- Sharding Status --- sharding version: {"_id" : 1,"minCompatibleVersion" : 5,"currentVersion" : 6,"clusterId" : ObjectId("66a30ccca62de41d6b0241a4")}shards:{  "_id" : "mongo1",  "host" : "mongo1/mongo1:2700,mongo2:2700,mongo3:2700",  "state" : 1 }{  "_id" : "mongo2",  "host" : "mongo2/mongo1:2701,mongo2:2701,mongo3:2701",  "state" : 1 }{  "_id" : "mongo3",  "host" : "mongo3/mongo1:2702,mongo2:2702,mongo3:2702",  "state" : 1 }active mongoses:"4.2.8" : 3autosplit:Currently enabled: yesbalancer:Currently enabled:  yesCurrently running:  noFailed balancer rounds in last 5 attempts:  0Migration Results for the last 24 hours: No recent migrationsdatabases:{  "_id" : "config",  "primary" : "config",  "partitioned" : true }config.system.sessionsshard key: { "_id" : 1 }unique: falsebalancing: truechunks:mongo1  1{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : mongo1 Timestamp(1, 0) {  "_id" : "test",  "primary" : "mongo1",  "partitioned" : true,  "version" : {  "uuid" : UUID("35a9a3e5-3ba5-4315-977c-9c7176d891ae"),  "lastMod" : 1 } }test.messagesshard key: { "createTime" : 1 }unique: falsebalancing: truechunks:mongo1  1{ "createTime" : { "$minKey" : 1 } } -->> { "createTime" : { "$maxKey" : 1 } } on : mongo1 Timestamp(1, 0) 

mongodb的sharding.autosplit是默认开启的,并且跟checkSize参数关联,默认为64M,当前安装的时候执行了修改这个参数为1M便于方便测试,之前版本的是在mongos的配置文件参数中设置,

当前版本跟新版本参数在config库下面的setting表,使用命令修改,各版本的修改命令有差异,需要注意:https://www.mongodb.com/zh-cn/docs/manual/tutorial/modify-chunk-size-in-sharded-cluster/#std-label-tutorial-modifying-range-size;

根据淘宝月报的mongodb分片知识,查看链接:https://www.bookstack.cn/read/aliyun-rds-core/5717773a4eef2615.md

查看当前范围分片的数据只在分片shard1的primary shard中,根据chunk触发迁移条件,手工测试balance,查看到报错参数报错信息:

mongos> sh.startBalancer()
2024-07-30T10:39:49.588+0800 E  QUERY    [js] uncaught exception: Error: command failed: {"ok" : 0,"errmsg" : "Failed to refresh the chunk sizes settings :: caused by :: Expected field \"value\" to have numeric type, but found string","code" : 14,"codeName" : "TypeMismatch","operationTime" : Timestamp(1722307189, 1),"$clusterTime" : {"clusterTime" : Timestamp(1722307189, 1),"signature" : {"hash" : BinData(0,"XinbmSBnIvaxzrWfcNLn8IsFI78="),"keyId" : NumberLong("7395769083385348113")}}
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
doassert@src/mongo/shell/assert.js:18:14
_assertCommandWorked@src/mongo/shell/assert.js:583:17
assert.commandWorked@src/mongo/shell/assert.js:673:16
sh.startBalancer@src/mongo/shell/utils_sh.js:184:12
@(shell):1:1

根据报错查看是参数值类型不对,查看配置信息,确实是字符串类型:

mongos> configdb.settings.find()
{ "_id" : "chunksize", "value" : "1" }

当前安装的分片集群是使用ansible脚本安装,使用变量方式传入导致参数异常:

查看参数是数字类型

# The chunksize for shards in MB
mongos_chunk_size: 1

 

查看参数输入时候加了''号为string类型:

configdb = db.getSiblingDB('config');
configdb.settings.save( { _id:"chunksize", value: '{{ mongos_chunk_size }}' } )

查看参数跟报错一致,修改参数,测试范围分片数据正常

mongos> configdb.settings.save( { _id:"chunksize", value: 1 } )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
mongos> configdb.settings.find()
{ "_id" : "chunksize", "value" : 1 }
mongos>


mongos> sh.startBalancer() {"ok" : 1,"operationTime" : Timestamp(1722307355, 23),"$clusterTime" : {"clusterTime" : Timestamp(1722307355, 23),"signature" : {"hash" : BinData(0,"SfLbKefZpUbx4FCKVT1JeRvsrOY="),"keyId" : NumberLong("7395769083385348113")}} } mongos> mongos> sh.getBalancerState() truemongos> db.messages.getShardDistribution()Shard mongo1 at mongo1/mongo1:2700,mongo2:2700,mongo3:2700 data : 3.37MiB docs : 41863 chunks : 5 estimated data per chunk : 692KiB estimated docs per chunk : 8372Shard mongo2 at mongo2/mongo1:2701,mongo2:2701,mongo3:2701 data : 3.34MiB docs : 41482 chunks : 5 estimated data per chunk : 685KiB estimated docs per chunk : 8296Shard mongo3 at mongo3/mongo1:2702,mongo2:2702,mongo3:2702 data : 3.36MiB docs : 41655 chunks : 5 estimated data per chunk : 688KiB estimated docs per chunk : 8331Totals data : 10.09MiB docs : 125000 chunks : 15 Shard mongo1 contains 33.49% data, 33.49% docs in cluster, avg obj size on shard : 84B Shard mongo2 contains 33.18% data, 33.18% docs in cluster, avg obj size on shard : 84B Shard mongo3 contains 33.32% data, 33.32% docs in cluster, avg obj size on shard : 84B

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/774002.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Markdown排版规范

Markdown 语法虽然多,但随便乱用的话反而会显得不美观,本文就推荐一些常见的排版规则。Markdown 语法虽然多,但随便乱用的话反而会显得不美观,本文就推荐一些常见的排版规则。 ‍ ‍ Markdown 标记的使用规范 ‍ 标题一级标题,通常是用来写文章的标题。而大部分情况下,文…

便宜的和贵的 SSL 证书有什么区别?

在网络世界中,SSL 证书如同守护网站安全的忠诚卫士,确保数据在传输过程中的保密性和完整性。然而,当我们在选择 SSL 证书时会发现,其价格参差不齐,从免费到昂贵,跨度较大。那么,便宜的 SSL 证书和贵的 SSL 证书到底有哪些显著的区别呢? 验证级别和审核流程 首先,验证方…

在 Visual Studio 2022 中,开发 ASP.NET 网站并在 Windows Server 2003 中进行部署

一、ASP.NET 网站程序开发 新建项目类型:ASP.NET Web 应用程序(.NET Framework) 引用包:Microsoft.AspNet.WebApi、Microsoft.AspNet.Mvc,版本:4.0.X 创建文件:Global.asax 启动代码: public class WebApiApplication : HttpApplication {protected void Application_S…

stable diffusion 入门教程

sd基础 工作原理&入门输入提示词后 有文本编码器将提示词编译成特征向量,vae编码器将特征向量传入潜空间内,特征向量在潜空间内不断降噪,最后通过vae解码器将降噪之后的特征向量 解码成一个个像素组成的图片 一般选中默认vae模型解码编码的模型CLIP值越大,提前停止的越…

雷达气象学(5)——多普勒天气雷达的原理

目录5.1 多普勒效应和多普勒频移5.2 最大不模糊速度和速度模糊5.2.1 脉冲对处理技术5.2.2 最大不模糊速度5.2.3 速度模糊5.2.4 速度退模糊算法5.3 最大不模糊距离和距离折叠5.3.1 最大不模糊距离5.3.2 距离折叠5.3.3 距离去折叠的方法5.4 多普勒两难5.5 WSR-88D 的取样技术 5.1…

在macOS开发stm32:CubeIDE+CubePro方案

STM32CubeIDE和STM32CubeProgrammer都有Mac版。 STM32CubeIDE用于创建项目和编写代码,编译出HEX文件。 STM32CubeProgrammer用于连接ST-Link v2和烧录程序,把HEX文件下载到STM32单片机。 在安装STM32CubeIDE和STM32CubeProgrammer时,会把相关驱动下载安装。所以,等我安装完…

[HTTP] HTTP 协议 Response Header 之 Content-Length、Transfer-Encoding与Content-Encoding

0 引言在近期项目一场景中,一 Web API (响应内容:7MB - 40MB、数据项:5W-20W条)的网络传输耗时较大,短则 5s,长则高达25s,前端渲染又需要耗时 9s-60s。 在这个场景中,前端的问题暂且不表。那么针对后端的问题,个人认为还是有较大的优化空间:1)启用HTTP 内容压缩策略…

Zabbix 5.0 LTS 配置企业微信(Webhook)自动发送告警信息

依据前面文章《Zabbix 5.0 LTS URL 健康监测》环境,实现企业微信(Webhook)自动发送告警信息。 一、创建企业微信机器人先在自己的企业微信群里创建一个机器人,并获取其 WebHook 地址。右击群聊天卡片,添加群机器人。 获得一个类似下图的 WebHook 地址。注意,这个 WebHook 地…

【逆运动学2】damped least squares method阻尼最小二乘法

逆运动学逆运动学,就是从操作空间的end effector position and orientation,求关节空间的joint position的问题。在之前的文章,我们简单提到求逆运动学解的解析解法和优化解法,详细讲解了用逆瞬时(或说微分)运动学即雅可比矩阵法迭代求解逆运动学的方法。这篇文章我们继续…

CTFshow web入门vip 文件上传

CTFshow web入门vip 文件上传web151 题目提示前端校验不可靠,看源码可以看到是传到upload.php这个文件去接受文件上传,文件类型为图片,后缀限制为png 然后把前端验证修改一下,把文件后缀限制改成php 写个一句话木马传进去 1.php <?php eval($_POST[x]);?>url中需要…

我出一道面试题,看看你能拿 3k 还是 30k!

我会出一道经典的后端面试题,你只需要进行 4 个简单的选择,就能判断出来你的水平是新手(3k)、初级(10k)、中级(15k)还是高级(30k)!大家好,我是程序员鱼皮。欢迎屏幕前的各位来到今天的模拟面试现场,接下来我会出一道经典的后端面试题,你只需要进行 4 个简单的选择…