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 = 1

replSet = sdrs01
oplogSize = 10240
shardsvr = true

#USER
keyFile=/data/mongodb10000/cnf/keyFile
setParameter=enableLocalhostAuthBypass=1
setParameter=failIndexKeyTooLong=1

storageEngine=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 = true

configsvr = 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分片集群的搭建及配置详情,顺便梳理了其部署架构, 下文我将介绍其日志治理问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Vue3源码学习】— CH2.5 reactiveEffect.ts:Vue 3响应式系统的核心

reactiveEffect.ts:Vue 3响应式系统的核心 1. 什么是 reactiveEffect?2. 核心机制2.1 依赖收集(Track)2.2 触发更新(Trigger)2.3 效果范围(effectScope) 3. 源码解析 —— track3.1 …

绿联 部署vocechat,搭建私人聊天服务器,用于小型团队和家庭环境

1、镜像 privoce/vocechat-server:latest 2、安装 2.1、基础设置 重启策略:容器退出时总是重启容器。 2.2、网络 桥接即可。 2.3、存储空间 装载路径:/home/vocechat-server/data不可变更,权限读写。 2.4、端口设置 容器端口3000不可变…

备考ICA----Istio实验14---出向流量管控Egress Gateways实验

备考ICA----Istio实验14—出向流量管控Egress Gateways实验 1. 发布测试用 pod kubectl apply -f istio/samples/sleep/sleep.yaml kubectl get pods -l appsleep2. ServiceEntry 创建一个ServiceEntry允许流量访问edition.cnn.com egressgw/edition-ServiceEntry.yaml api…

基于springboot+vue+Mysql的家政服务管理平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

C# 多线程

文章目录 C# 多线程进程与线程无参数的子线程带参数的子线程运行结果 销毁线程 Abort()运行结果 ThreadPool和Task运行结果 C# 多线程 进程与线程 进程:进程就是一个应用程序,对电脑的各种资源的占用 线程:线程是程序执行的最小单位&#…

动力电池产业迎来周期性调整,宁德时代开启新角逐?

大爆发之后,新能源电池行业正在迈入紧张的下半场,一些数据显现出迹象。 根据业绩预告情况,目前57家锂电企业中,有45家企业的净利润负增长。另外,据中国汽车动力电池产业创新联盟数据,2月我国动力电池装车量…

【python plotly库介绍】从视觉到洞见:桑基图在业务分析中的应用【保姆级教程过于详细珍藏版】

👤作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 本文结构:工具介绍python实现库 - 案例 - 分析思路与过程 实战专栏:https://blog.csdn.net/cciehl/category_12615648.html 备注说明: 企业…

Vue实现图片浏览器

结合之前所学到的v-show,v-on,v-bind写一个图片浏览器。 整个图片浏览器有两个按钮,“上一张”按钮会切换到上一张图片,“下一张”按钮会切换到下一张。切在第一张图片时,“上一张”按钮会隐去不见;同理&a…

星闪BLE与蓝牙

蓝牙与低功耗蓝牙 蓝牙工作在2.4GHz的频段,在工作频段2402MHz-2480MHz上分为79个信道,低功耗蓝牙分为40个信道。一组设备通信的时候,短暂占用一个信道发包,由于其跳频技术,每次传输完数据包之后都会切换到另一个信道继…

云渲染实用工具:3ds max怎么改低版本?

3ds Max是建模领域广泛采用的专业软件,它通过定期更新来不断增强功能和提升性能。但这些频繁的更新有时会导致一些插件暂时无法与新版本完全兼容。为了解决这个问题,设计师们可以采用一个简单有效的方法,那就是将较新版本的3ds Max文件进行版…

js的一些底层

数据类型 按照存储方式,JavaScript的数据类型可以分为两种,原始数据类型(原始值)和引用数据类型(引用值)。 原始数据类型目前有六种,包括Number、String、Boolean、Null、Undefined、Symb…

大模型助力学术图谱挖掘!OAG-Challenge @ KDD Cup 2024正式开始

如何用大模型推动学术知识图谱挖掘任务?OAG-Challenge KDD Cup 2024 邀你来赛! 竞赛网址:https://www.biendata.xyz/kdd2024/ 竞赛背景 自 1997 年创办以来,知识发现和数据挖掘会议 ACM SIGKDD 上举办的 KDD Cup 被誉为全球最…

【2024】使用zabbix监控ESXI 6.5虚拟化系统

本次实验将采用docker部署zabbix 5.2平台监控ESXI 6.5虚拟化系统—————————————————————————— 请自行准备环境: 关于docker部署方案请参考: docker之核心概念与安装 关于docker部署zabbix方案请参考: docker容器方式部署zabbix监控平台 关于ESXI安…

009_lhs_rhs_in_Matlab中的左值和右值约定

Matlab中的左值和右值约定 1. 左值和右值 我们在把Matlab作为计算器来使用时,有些时候会直接列出一个表达式,等着Matlab打印出计算结果。就这个简单的举动,在计算机科学中,也有一个高大上的名字,叫什么REPL&#xff…

缓冲区溢出漏洞学习总结(漏洞原理及其利用方法)

文章目录 前言1、缓冲区溢出漏洞概述1.1、漏洞概述1.2、缓冲区溢出漏洞概述1.3、缓冲区溢出攻击概述1.4、引发缓冲区溢出的原因 2、栈溢出漏洞2.1、栈溢出漏洞概述2.2、栈溢出漏洞利用2.2.1、利用方法一:修改返回地址2.2.2、利用方法二:覆盖临接变量 3、…

多视图三维重建-SFM简介

背景 掌握传统的多视图三维重建基本流程 总体流程 多视图三维重建的Pipieline如下图,总共分为四个步骤: 拍摄场景多视角的图像建立这些图像之间的联系(Data Association)SFM稀疏重建MVS稠密重建 Data Association 建立图像…

第十二章 微服务核心(一)

一、Spring Boot 1.1 SpringBoot 构建方式 1.1.1 通过官网自动生成 进入官网:https://spring.io/,点击 Projects --> Spring Framework; 拖动滚动条到中间位置,点击 Spring Initializr 或者直接通过 https://start.spring…

QT_day3:信号和槽的连接方式

1、使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是…

嵌入式3-29

今日作业&#xff1a;用fwrite 和 fseek功能&#xff0c;将一张bmp格式的图片更改成 德国国旗#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> typedef unsigned char bgr[3]; int main(int argc, const char *argv[])…

用grafana+prometheus+cadvisor监控容器指标数据,并查询当前容器的网速网络用量

前言 整理技术&#xff0c;在这篇文章中&#xff0c;将会搭建grafanaprometheuscadvisor监控容器&#xff0c;并使用一个热门数据看板&#xff0c;再监控容器的性能指标 dashboard效果 这个是node-exporter采集到的数据&#xff0c;我没装node-exporter&#xff0c;而且这也…