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.rhkb.cn/news/294580.html

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

相关文章

数学矩阵(详解)

矩阵乘法 知阵乘法是《线性代数》中的基础内容,但在考察数学的算法题中也会出现。 本节我们学习基础的矩阵乘法规则。 每个矩阵会有一个行数和一个列数,只有当相乘的两个矩阵的左矩阵的列数等于右矩阵的行数 时,才能相乘,否则不允…

HCIA复习

OSI --开放式系统互联参考模型 --- 7层参考模型 TCP/IP协议栈道 --- 4层或5层 OSI: 应用层 抽象语言 -->编码 表示层 编码-->二进制 表示层以下都是二进制-----data(数据) 会话层 提供应用程序的会话地址 上三层为应用…

Go-Gin中优雅的实现参数校验,自定义错误消息提示

问题描述 在参数校验的时候我们一般会基于"github.com/go-playground/validator/v10"这个库给结构体加标签实现校验参数,当参数校验错误的时候,他的提示一般是英文的,怎么自定义参数错误提示呢?跟着我一步步来 注册校…

分析:两种不同的函数模板写法,其中一种为何不行

接上篇: 利用类型,做函数模板的“重载”-CSDN博客 比较两种模板的写法 为什么左边不可行: 注意,左边的写法的第二个模板参数,是默认参数的形式。为何这里采取了默认参数的形式呢,本意是想让编译器来走sfi…

扫地机器人(蓝桥杯)

文章目录 扫地机器人题目描述解题思路二分贪心 扫地机器人 题目描述 小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所 示。 走廊内部署了 K 台扫地机器人,其中第 i 台在第 Ai 个方格区域中。已知扫地机器人每分钟可以移动…

互联网轻量级框架整合之JavaEE基础I

不得不解释得几个概念 JavaEE SUN公司提出来的企业版Java开发中间件,主要用于企业级互联网系统的框架搭建,同时因为Java语言优质的平台无关性、可移植性、健壮性、支持多线程和安全性等优势,其迅速成为构建企业互联网平台的主流技术&#x…

Oracle EBS AR接口和OM销售订单单价为空数据修复

最近,用户使用客制化Web ADI 批量导入销售订单行功能,把销售订单行的单价更新成空值,直到发运确认以后,财务与客户对帐才发现大量销售订单的单价空,同时我们检查AR接口发现销售订单的单价和金额均为空。 前提条件 采用PAC成本方式具体问题症状 销售订单行的单价为空 Path:…

【检索增强】Retrieval-Augmented Generation for Large Language Models:A Survey

本文简介 1、对最先进水平RAG进行了全面和系统的回顾,通过包括朴素RAG、高级RAG和模块化RAG在内的范式描述了它的演变。这篇综述的背景下,更广泛的范围内的法学硕士研究RAG的景观。 2、确定并讨论了RAG过程中不可或缺的核心技术,特别关注“…

C# WPF编程-Application类(生命周期、程序集资源、本地化)

C# WPF编程-Application类 应用程序的生命周期创建Application对象应用程序的关闭方式应用程序事件 Application类的任务显示初始界面处理命令行参数访问当前Application对象在窗口之间进行交互 程序集资源添加资源检索资源pack URI内容文件 每个运行中的WPF应用程序都由System…

uniapp 开发之原生Android插件

开发须知 在您阅读此文档时,我们假定您已经具备了相应Android应用开发经验,使用Android Studio开发过Android原生。也应该对HTML,JavaScript,CSS等有一定的了解, 并且熟悉在JavaScript和JAVA环境下的JSON格式数据操作等。 为了插件开发者更方便快捷的开…

在Windows的Docker上部署Mysql服务

在我们做一些和数据库相关的测试时,往往需要快速部署一个数据库作为数据源。如果开发环境是Windows,且开发的代码不依赖于系统,即不用在linux上做开发,则可以将全套环境都部署在Windows上。 本地安装数据库会污染操作系统环境&…

【学习笔记】java项目—苍穹外卖day03

文章目录 苍穹外卖-day03课程内容1. 公共字段自动填充1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3 步骤三 1.4 功能测试1.5 代码提交 2. 新增菜品2.1 需求分析与设计2.1.1 产品原型2.1.2 接口设计2.1.3 表设计 2.2 代码开发2.2.1 文件上传实现2.2.2 新…

test02

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

Linux shell编程学习笔记45:uname命令-获取Linux系统信息

0 前言 linux 有多个发行版本,不同的版本都有自己的版本号。 如何知道自己使用的Linux的系统信息呢? 使用uname命令、hostnamectl命令,或者通过查看/proc/version文件来了解这些信息。 我们先看看uname命令。 1 uname 命令的功能和格式 …

Java

1.学生和老师都会有work方法,学生的工作是学习,老师的工作是教书,我利用了一个接口来实现; 2.同时,老师和学生都是人,并且都有姓名,姓名,年龄和身高等特征,我用了一个继承…

加密软件VMProtect教程:使用脚本-功能

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic(本机)、Virtual Pascal和XCode编译器。 同时,VMProtect有一个内置的反汇编程序,可以与Windows和Mac OS X可执行文件一起…

RabbitMQ高级笔记

视频链接:【黑马程序员RabbitMQ入门到实战教程】 文章目录 1.发送者的可靠性1.1.生产者重试机制1.2.生产者确认机制1.3.实现生产者确认1.3.1.开启生产者确认1.3.2.定义ReturnCallback1.3.3.定义ConfirmCallback 2.MQ的可靠性2.1.数据持久化2.1.1.交换机持久化2.1.2.…

Docker搭建LNMP环境实战(09):安装mariadb

1、编写mariadb部署配置文件 在文件夹:/mnt/hgfs/dockers/test_site/compose下创建文件:test_site_mariadb.yml,内容如下: version: "3.5" services:test_site_mariadb:container_name: test_site_mariadbimage: mari…

代码+视频,手动绘制logistic回归预测模型校准曲线(Calibration curve)(1)

校准曲线图表示的是预测值和实际值的差距,作为预测模型的重要部分,目前很多函数能绘制校准曲线。 一般分为两种,一种是通过Hosmer-Lemeshow检验,把P值分为10等分,求出每等分的预测值和实际值的差距. 另外一种是calibra…

vue3源码解析——ref和reactive定义响应式的区别

ref 和 reactive 是 Vue 3.0 中用于定义响应式数据的两个新 API。它们有以下区别: ref 定义单个响应式数据 数据类型可以是任意类型。它通常用于定义原始数据类型为响应式数据。返回一个响应式对象,该对象包含一个 .value 属性,可用于获取和设…