mongodb sharding分片模式的集群数据库,日志治理缺失导致写入数据库报错MongoWriteConcernException的问题总结(上)

一、背景

常见的mongodb集群模式有以下三种:

  • 主从复制(Master-Slave)模式
  • 副本集(Replica Set)模式
  • 分片(Sharding)模式

公司测试环境搭建的集群采用分片模式,有同事反馈说,程序写入数据库报错。
详细错误见下:

Caused by: com.mongodb.MongoWriteConcernException: waiting for replication timed out; Error details: { wtimeout: true } at sdrs03

提示写入数据失败,因为是分片模式,所以它的数据是需要写入到两个分片服务机器上。

也就是说,这个错误很可能是因为一个分片写入成功,另一个写入失败所导致。

连接某个节点,连接Mongodb,执行命令sh.status()查看集群状态。

最后发现是某个机器的磁盘空间已满所引起的,当时为了快速回复,就手动删除了大日志文件。

今天有空就梳理一下问题,为了便于理解,画了一个部署架构图。

二、部署架构图

在这里插入图片描述
分片模式下,三个节点是等价关系,这里只举例其中一个来说。

在这里插入图片描述

[root@mongo_test01 data]# ps -ef | grep mongo
root      6223 14104  0 11:07 pts/0    00:00:00 grep --color=auto mongo
mongo    11016     1  1 Mar27 ?        00:43:37 /usr/local/mongodb-linux-x86_64-rhel70-4.0.27/bin/mongos -f /data/mongodb50000/cnf/mongo50000.cnf
mongo    11497     1  1 Mar27 ?        00:51:45 /usr/local/mongodb-linux-x86_64-rhel70-4.0.27/bin/mongod -f /data/mongodb11000/cnf/mongo11000.cnf
mongo    16436     1  3 Mar27 ?        01:32:02 /usr/local/mongodb-linux-x86_64-rhel70-4.0.27/bin/mongod -f /data/mongodb12000/cnf/mongo12000.cnf
mongo    19133     1  1 10:35 ?        00:00:35 /usr/local/mongodb-linux-x86_64-rhel70-4.0.27/bin/mongod -f /data/mongodb40000/cnf/mongo40000.cnf
mongo    19952     1  2 09:45 ?        00:02:15 /usr/local/mongodb-linux-x86_64-rhel70-4.0.27/bin/mongod -f /data/mongodb10000/cnf/mongo10000.cnf

这里启动了五个进程,每个进程端口对应见上图。

  • 分片服务器,对应端口10000/11000/12000
  • 配置服务器,对应端口40000
  • Mongos路由服务,对应端口50000,外部访问入口

三、详细配置

日志的保存路径和进程ID,见/data/mongodb{端口}/cnf/mongo{端口}.cnf

1、分片服务

因为三个分片配置类同,只是端口号不一样,所以仅以10000端口示例:
在这里插入图片描述

#SERVER
dbpath = /data/mongodb10000/data
logpath = /data/mongodb10000/log/mongo10000.log
pidfilepath = /data/mongodb10000/run/mongo10000.pid
fork = true
port = 10000
quiet = true
logappend = true
journal = true
directoryperdb = true
maxConns = 65536
bind_ip_all = true
transportLayer=asio
serviceExecutor=adaptive#SLOW_LOG
profile = 1
slowms = 500
slowOpSampleRate = 1replSet = sdrs01
oplogSize = 10240
shardsvr = true#USER
keyFile=/data/mongodb10000/cnf/keyFile
setParameter=enableLocalhostAuthBypass=1
setParameter=failIndexKeyTooLong=1storageEngine=wiredTiger
wiredTigerCacheSizeGB=8
wiredTigerCollectionBlockCompressor=snappy
wiredTigerDirectoryForIndexes=true

2、配置服务

复制集的名称是csvrs01,端口为40000,在后面的mongos会用到。
在这里插入图片描述

# cat /data/mongodb40000/cnf/mongo40000.cnf#SERVER
dbpath = /data/mongodb40000/data
logpath = /data/mongodb40000/log/mongo40000.log
pidfilepath = /data/mongodb40000/run/mongo40000.pid
fork = true
port = 40000
quiet = true
logappend = true
maxConns = 65536
directoryperdb = true#SLOW_LOG
profile = 1
slowms = 500
bind_ip_all = trueconfigsvr = true
replSet = csvrs01
storageEngine=wiredTiger
wiredTigerCacheSizeGB=1
oplogSize = 8192#USER
keyFile=/data/mongodb40000/cnf/keyFile
setParameter=enableLocalhostAuthBypass=1

3、Mongos

在这里插入图片描述

这里填写了配置服务列表。另外需要注意一点,它的pid进程号是保存在/data/mongodb50000/run/mongos.pid,而非/data/mongodb50000/run/mongodb50000.pid。

pidfilepath = /data/mongodb50000/run/mongos.pid
logpath = /data/mongodb50000/log/mongos.log
fork = true
port = 50000
quiet = true
logappend = true
maxConns = 20000
bind_ip_all = true
configdb = csvrs01/192.168.10.28:40000,192.168.10.71:40000,192.168.10.72:40000#USER
keyFile=/data/mongodb50000/cnf/keyFile
setParameter=enableLocalhostAuthBypass=1
setParameter=taskExecutorPoolSize=4
setParameter=ShardingTaskExecutorPoolMaxSize=5000

4、初始化副本集

在任意一台机器上使用 mongo 命令行工具连接到任意配置服务器,并初始化副本集sdrs01。

mongo --host 192.168.10.28:40000
use admin
cfg = {_id: "sdrs01",members: [{ _id: 0, host: "192.168.10.71:10000" },{ _id: 1, host: "192.168.10.72:10000" }]
}
rs.initiate(cfg)

以此类推,初始化副本集sdrs02和sdrs03。

mongo --host 192.168.10.28:40000
use admin
cfg = {_id: "sdrs02",members: [{ _id: 0, host: "192.168.10.28:11000" },{ _id: 1, host: "192.168.10.71:11000" }]
}
rs.initiate(cfg)
mongo --host 192.168.10.28:40000
use admin
cfg = {_id: "sdrs03",members: [{ _id: 0, host: "192.168.10.28:12000" },{ _id: 1, host: "192.168.10.72:12000" }]
}
rs.initiate(cfg)

5、添加分片到路由服务器mongos

使用 mongo 命令行工具连接到路由服务器,并添加分片。

mongo --host 192.168.10.28:50000
use admin
sh.addShard("sdrs01/192.168.10.71:10000")
sh.addShard("sdrs01/192.168.10.72:10000")sh.addShard("sdrs02/192.168.10.28:11000")
sh.addShard("sdrs02/192.168.10.71:11000")sh.addShard("sdrs03/192.168.10.28:12000")
sh.addShard("sdrs03/192.168.10.72:12000")

注意,这里每个分片,只选择其中的两个节点作为副本。

6、登录Mongos,查看集群状态

mongo 192.168.10.28:50000 -uroot -p{密码} --authenticationDatabase admin> sh.status()

在这里插入图片描述

shards:{  "_id" : "sdrs01",  "host" : "sdrs01/192.168.10.71:10000,192.168.10.72:10000",  "state" : 1,  "tags" : [ "test.sh1", "sdrs01" ] }{  "_id" : "sdrs02",  "host" : "sdrs02/192.168.10.28:11000,192.168.10.71:11000",  "state" : 1,  "tags" : [ "test.sh2", "sdrs02" ] }{  "_id" : "sdrs03",  "host" : "sdrs03/192.168.10.28:12000,192.168.10.72:12000",  "state" : 1,  "tags" : [ "test.sh3", "sdrs03" ] }

四、未完待续

由于整篇文章比较冗长,我先介绍Mongodb sharding分片集群的搭建及配置详情,顺便梳理了其部署架构, 下文我将介绍其日志治理问题。

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

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

相关文章

数据结构——链表(双向链表)

大家好,我是小峰,今天给大家讲解的是双向链表,我们先来看看链表的结构。 链表分类 这里带头是哨兵位的头节点 3. 循环与非循环 我们排列一些就可以看出链表的结构种类 这些链表的操作大都差不多 我们今天讲解的是双向带头循环链表 带头双向…

BGP实训

BGP基础配置实训 实验拓扑 注:如无特别说明,描述中的 R1 或 SW1 对应拓扑中设备名称末尾数字为 1 的设备,R2 或 SW2 对应拓扑中设备名称末尾数字为2的设备,以此类推;另外,同一网段中,IP 地址的主…

【数据挖掘】实验5:数据预处理(2)

验5:数据预处理(2) 一:实验目的与要求 1:熟悉和掌握数据预处理,学习数据清洗、数据集成、数据变换、数据规约、R语言中主要数据预处理函数。 二:实验知识点总结 1:数据集成是将多个…

boost::asio::ip::tcp/udp::socket::release 函数为什么限制 Windows 8.1 才可以调用?

如本文题目所示,这是因为只有在 Windows 8.1(Windows Server 2012 RC)及以上 Windows 操作版本才提供了运行时,修改/删除完成端口关联的ABI接口。 boost::asio 在 release 函数底层实现之中是调用了 FileReplaceCompletionInform…

git仓库太大只下载单个文件或文件夹

有没有这样的苦恼:仓库太大,只想下载其中某些文件(夹)? 一招解决:bash down_folder_from_git.sh 运行前,先修改开头三个变量 原理: 稀疏检出 让工作树仅包含自定义的文件 #!/usr/bin/bash addrhttps://github.com/fac…

【edge浏览器无法登录某些网站,以及迅雷插件无法生效的解决办法】

edge浏览器无法登录某些网站,以及迅雷插件无法生效的解决办法 edge浏览器无法登录某些网站,但chrome浏览器可以登录浏览器插件无法使用,比如迅雷如果重装插件重装浏览器重装迅雷后仍然出现问题 edge浏览器无法登录某些网站,但chro…

niushop单商户V5多店版源码分享三端uniapp打包方法包括PC端_小程序或h5端打包_收银端打包_APP端打包_商户端

目前多店版有四端uniapp,包括PC端uniapp,商家端uniapp,收银端uniapp,门店手机端uniapp,下面我总结下这些端的打包流程希望能帮助到大家,需要交流的可以看我昵称或者点我头像关注我分享代码和教程 一.niush…

IoT网关在智能制造工厂生产线监控与管理中的应用-天拓四方

随着工业4.0时代的到来,智能制造已成为工业发展的重要方向。IoT网关在智能制造工厂中扮演着关键角色,它能够实现设备间的互联互通、数据的实时采集与处理,以及生产线的智能监控与管理。本案例将详细介绍IoT网关在智能制造工厂生产线监控与管理…

constexpr与std::is_same_v碰撞会产生什么火花?

1. 只编译会用到的if分支 示例代码一中,checkType_v1和checkType_v2两个函数的区别就是if的条件里一个加了constexpr一个没加,加与不加从结果来看都一样,那在编译时和运行时各有什么区别呢? 示例代码一,test_01.cpp&…

与鲸同行,智领未来!和鲸科技“人工智能+X”学科建设合作交流会(北京站)圆满结束!

在国家加快发展新质生产力的大背景下,3月25日下午,和鲸科技 2024 年“人工智能X”学科建设合作交流会(北京站)暨“AIX”实验室建设与供应商选型座谈会顺利召开。为提供更为集中和专业的讨论环境,本次会议特别采取闭门审…

海豚【货运系统源码】货运小程序【用户端+司机端app】源码物流系统搬家系统源码师傅接单

技术栈:前端uniapp后端vuethinkphp 主要功能: 不通车型配置不通价格参数 多城市定位服务 支持发货地 途径地 目的地智能费用计算 支持日期时间 预约下单 支持添加跟单人数选择 支持下单优惠券抵扣 支持司机收藏订单评价 支持订单状态消息通知 支…

抢先一步,搞定阿里面试难题——双亲委派机制揭秘!

希望本文对你有所帮助,欢迎继续关注我的公众号“知其然亦知其所以然”,一起探索更多有趣的技术话题! 大家好,我是小米,欢迎来到我的微信公众号!今天,我们将深入探讨一道备受关注的面试题目——“双亲委派机制”。这个话题是阿里巴巴等顶尖科技公司面试中常常涉及的一环…