一个mongodb问题分析
mongodb问题分析
现状
表的个数:
生产上常用的表就10来个。
sharding cluster + replica set方式部署:
9个shard server, 每个shard server 1主2从, 大量数据写入时或对大表创建索引时,可能有主从复制延迟问题。实测下来,20亿表的索引创建导致主从延时4小时,因为从表在建索引的时候会停掉主从复制。
一个shard server挂掉,恢复起来很慢,一般要半个小时。而且一个shard server挂掉,目前会导致整个集群不可用,此点需要定位。
一个shard server里的master挂掉,剩下2个从是可以选出一个master出来的,只不过选举中间不能写,只能读。另外,一个shard server里的三个节点是分散在3个AZ的,所以断AZ的情况下,可靠性是有保障的。
平时做需求会有加索引的要求,但是你对一张百亿级别的表做索引,这个耗时是很长的,哪怕放到晚上做,也要5~6个小时之久。万一晚上没做完,第二天就可能影响replica set里从节点的复制操作。
还有,业务上大量使用事务,加剧了主从复制延迟情况下的集群负担,造成mongodb连接池和处理线程的耗尽,并波及到incoming request的处理,最后导致整个docker都处于不健康状态。
我们的业务特点是:读优先,写慢一点、不及时都可以容忍。
问题清单
一个shard server挂掉,可能导致整个集群不可用;
是我们使用的方法问题,还是shard server真的就完全不可用了?因为shard server内部是一主二从,且为多AZ分布,理论上完全可以通过降低C(一致性)来保证A(可用性),不会说完全不可用。在这个基础上,我个人认为双活的意义可能不是很大,双活只是为了提高可用性。
数据量继续以每月千万级的规模增长下,如何保证业务查询效率不降低?
增加分片,但增加分片时尽量不要引发大量的数据均衡。
业务逻辑大量使用事务,有没有问题?
mongo的事务本质上是一个分布式事务,效率不高,遇到异常,大概率要成为瓶颈。需要从业务层面评估是否确实需要事务,能不能通过修改表结构,减少事务的使用。
因业务需要对大表加索引,如何降低对集群的影响?
索引是提升查询效率的重要手段,属于以空间换时间,这种行为是不可避免的。那么,如何降低建索引对集群的影响。
核心要素:主从复制延时
主从复制延时应该是不可避免的,因为本身从机把oplog拉到本地redo就是异步的,在正常情况下,这个时间差不会很大,好像就1~2s。但如果有以下几点:
- 因为大量写入导致的主机cpu、io负载很高
- 网络异常,时延增加
- 从机在忙着干其它事(比如创建索引)
这个时延就可能扩的很大。
大量写入及随后的自动均衡、针对大表建索引,都会导致第一个情况发生。
主从时延大对于强调一致性的系统来说,影响很大,不仅仅是各节点数据不一致的问题(这个要看业务是否有强一致性诉求),还会影响读写操作本身。因为对这样的系统而言,写入成功的标准往往不是单点写入成功就行,而是要半数以上的节点写入成功,主从延时大可能会导致写操作挂住或失败!而大量的写失败或挂住又会影响读的可用性,一方面是连接数和线程数的消耗,另一方面是读可能依赖于写(比如readConcern里的majority,为避免脏读,要求读的是大部分节点写入的数据)。
突破口
主从复制延时的解决
要考虑几点:
- 尽量减少主从复制延时发生的概率;
- 降低主从复制延时对业务的影响;
- 主从复制延时后的恢复时间要尽可能短。
解决思路:
- mongodb备份/ 新增分片的数据均衡/ 大表建索引/ 大量数据不均衡写入/ 慢SQL 这些因素的混合影响,前三者如何把时间错开
- 修改readPreference做到读写分离,由此带来的数据非最新、不全、不同人做相同的查询结果可能不一样等等,要有心里准备。另外,如果开启了自动均衡,由于还未结束或者异常终止的chunk迁移,secondary返回的可能是有缺失或者多余的数据 。但这里有个问题:读写分离是不是就能降低主从复制延时的影响?需要测试
- 设置writeConcern的wtimeout,事务失败后的重试保证?
- 恢复手段:将从节点隐藏,使事务尽快结束;
事务的必要性
首先,假如用嵌套文档解决了表与表之间的关联性,因为mongo里记录级的修改都是原子的,是不是就可以不需要事务了?
第二,如果后面要改成从机读,这样读到的数据本身就没法保证一致性(取决于主从复制的速度) ,当前这么广泛的事务使用还有必要吗?
高可用
我理解,跟ES一样,要考虑几个点:
- 异常情况下的master选举要能启动,否则集群只读;
- replica要够,确保异常情况下数据尽量不丢失;
- shard受损的情况下的行为是怎样的;
- AZ恢复后的双master脑裂风险
参考该文。
相关文章:
一个mongodb问题分析
mongodb问题分析 现状 表的个数: 生产上常用的表就10来个。 sharding cluster replica set方式部署: 9个shard server, 每个shard server 1主2从, 大量数据写入时或对大表创建索引时,可能有主从复制延迟问题。实…...
Vue3.0极速入门- 目录和文件说明
目录结构 以下文件均为npm create helloworld自动生成的文件目录结构 目录截图 目录说明 目录/文件说明node_modulesnpm 加载的项目依赖模块src这里是我们要开发的目录,基本上要做的事情都在这个目录里assets放置一些图片,如logo等。componentsvue组件…...
RabbitMQ---订阅模型-Direct
1、 订阅模型-Direct • 有选择性的接收消息 • 在订阅模式中,生产者发布消息,所有消费者都可以获取所有消息。 • 在路由模式中,我们将添加一个功能 - 我们将只能订阅一部分消息。 例如,我们只能将重要的错误消息引导到日志文件…...
Django REST framework实现api接口
drf 是Django REST framework的简称,drf 是基于django的一个api 接口实现框架,REST是接口设计的一种风格。 一、 安装drf pip install djangorestframework pip install markdown # Markdown support for the browsable API. pip install …...
4.19 20
服务端没有 listen,客户端发起连接建立,会发生什么? 服务端如果只 bind 了 IP 地址和端口,而没有调用 listen 的话,然后客户端对服务端发起了连接建立,服务端会回 RST 报文。 没有 listen&#x…...
(动态规划) 剑指 Offer 10- II. 青蛙跳台阶问题 ——【Leetcode每日一题】
❓剑指 Offer 10- II. 青蛙跳台阶问题 难度:简单 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97(1000000007),如计算初始结果为:1…...
物联网WIFI 模块AT指令版本七大元凶
前言 目前我们讨论的这个问题,并不是说WIFI方案不具备以应的功能。而是指在同一个AT固件下可能存在的问题。由于各厂商AT指令的开发深度不同,导致各厂商之间的AT指令差异很大。我总结了一些问题,可能是导致目前AT指令不好用元凶。 底层库问题…...
Qt 正则(数据格式校验、替换指定格式数据、获取匹配数据)
头文件引用 #include <QRegExp>初始化QRegExp实列 QRegExp re("^\\d{1,3},\\d{1,3}$");数据格式验证 QRegExp re("^\\d{1,3},\\d{1,3}$"); QString msg "12,33"; if(re.exactMatch()){// 验证通过 }else{//验证不通过 }替换数…...
网络层协议——ip
文章目录 1. 网络层2. IP协议2.1 协议头格式 3. 网段划分3.1 特殊的IP地址3.2 IP地址的数量限制 4. 私有IP地址和公网IP地址 1. 网络层 在应用层解决了如何读取完整报文、序列化反序列化、协议处理问题。在传输层解决了可靠性问题。那么网络层IP的作用是在复杂的网络环境中确定…...
Qt6和Rust结合构建桌面应用
桌面应用程序是原生的、快速的、安全的,并提供Web应用程序无法比拟的体验。 Rust 是一种低级静态类型多范式编程语言,专注于安全性和性能,解决了 C/C 长期以来一直在努力解决的问题,例如内存错误和构建并发程序。 在桌面应用程序开…...
Kubernetes(K8S)简介
Kubernetes (K8S) 是什么 它是一个为 容器化 应用提供集群部署和管理的开源工具,由 Google 开发。Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项…...
面试中问:React中函数组件和class组件的区别,hooks模拟生命周期
React中函数组件和class组件的区别,hooks模拟生命周期 React中函数组件和class组件的区别hooks模拟生命周期 React中函数组件和class组件的区别 函数组件: 定义:函数组件是使用纯函数定义的组件,它接受 props 作为参数并返回 JSX。简洁性&am…...
Python高光谱遥感数据处理与高光谱遥感机器学习方法应用
本文提供一套基于Python编程工具的高光谱数据处理方法和应用案例。 本文涵盖高光谱遥感的基础、方法和实践。基础篇以学员为中心,用通俗易懂的语言解释高光谱的基本概念和理论,旨在帮助学员深入理解科学原理。方法篇结合Python编程工具,专注…...
Java实现接收xml格式数据并解析,返回xml格式数据
需求描述:后端接受xml格式数据,解析出相应数据,并返回xml格式数据。 <!--XML解析--><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId>…...
【C++】初步认识模板
🏖️作者:malloc不出对象 ⛺专栏:C的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录 前言一、泛型编程二、函数模板2.1 函…...
Ansible 临时命令搭建安装仓库
创建一个名为/ansible/yum.sh 的 shell 脚本,该脚本将使用 Ansible 临时命令在各个受管节点上安装 yum 存储库. 存储库1: 存储库的名称为 EX294_BASE 描述为 EX294 base software 基础 URL 为 http://content/rhel8.0/x86_64/dvd/BaseOS GPG 签名检查为…...
phpstorm动态调试
首先在phpstudy搭建好网站,在管理拓展开启xdebug拓展 查看php.ini配置已经更改 需要增添修改一下设置 [Xdebug] zend_extensionD:/phpstudy_pro/Extensions/php/php5.6.9nts/ext/php_xdebug.dll xdebug.collect_params1 xdebug.collect_return1 xdebug.auto_trace…...
二叉树的层序遍历及完全二叉树的判断
文章目录 1.二叉树层序遍历 2.完全二叉树的判断 文章内容 1.二叉树层序遍历 二叉树的层序遍历需要一个队列来帮助实现。 我们在队列中存储的是节点的地址,所以我们要对队列结构体的数据域重定义, 以上代码 从逻辑上来讲就是1入队,1出队&am…...
java八股文面试[JVM]——JVM内存结构
参考: JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 JVM是运行在操作系统之上的,它与硬件没有直接的交互 JVM内存结构: 方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实…...
Kafka基本使用
查看Kafka的进程是否在运行 #命令行终端中运行如下命令 ps -ef | grep kafkafind / -iname kafka-server-start.shcd /usr/local/kafka/bin/#启动kafka ./kafka-server-start.sh -daemon /usr/local/kafka/config/server.propertiesKafka默认使用9092端口提供服务…...
【目标检测】理论篇(2)YOLOv3网络构架及其代码实现
网络构架图: 代码实现: import math from collections import OrderedDictimport torch.nn as nn#---------------------------------------------------------------------# # 残差结构 # 利用一个1x1卷积下降通道数,然后利用一个3x3卷…...
k8s之工作负载、Deployment、DaemonSet、StatefulSet、Job、CronJob及GC
文章目录 1、工作负载1.1、定义1.2、分类 2、Deployment2.1、定义2.2、Deployment创建2.3、Deployment 更新机制2.3.1、比例缩放(Proportional Scaling)2.3.2、HPA(动态扩缩容)2.3.2.1、需要先安装metrics-server2.3.2.2、配置hpa…...
IDEA项目实践——Element UI概述
系列文章目录 IDEA项目实践——JavaWeb简介以及Servlet编程实战 IDEA项目实践——Spring当中的切面AOP IDEA项目实践——Spring框架简介,以及IOC注解 IDEA项目实践——动态SQL、关系映射、注解开发 IDEWA项目实践——mybatis的一些基本原理以及案例 文章目录 …...
Docker 容器学习笔记
Docker 容器学习笔记 容器的由来 早先,虚拟机通过操作系统实现相互隔离,保证应用程序在运行时相互独立,避免相互干扰。但是操作系统又笨又重,耗费资源严重: 容器技术只隔离应用程序的运行时环境但容器之间共享同一个…...
Day03-vue基础
Day03-vue基础 一 列表渲染 v-for这个指令可以实现列表渲染 1 数组 <ul><!-- v-for遍历的时候,key必须赋唯一值第一个参数是数组元素,第二个参数是元素下标--><li v-for="(item,index) in [1,3,5,7]" :key="item">{{item}}--{{index}…...
RAC sid=‘*‘ 最好加上 v$system_parameter
实验结论:在RAC环境中,最好修改参数sid* 安全可靠,因为暂时未明确知道哪些参数是默认全局修改,什么参数是默认单节点修改的,* 靠谱,不容易出问题 在RAC环境中,修改全局参数scopespfile生效时&am…...
【位运算进阶之----左移(<<)】
今天我们来谈谈左移这件事。 ❤️简单来说,对一个数左移就是在其的二进制表达末尾添0。左移一位添一个0,结果就是乘以2;左移两位添两个0,结果就乘以2 ^ 2;左移n位添n个0,结果就是乘以2 ^ n,小心…...
石油石化行业网络监控运维方案,全局态势感知,实时预警
石油石化行业是一个高科技密集型行业,投资巨大、人员众多,各产业价值链的关联度较高,大型石油石化企业实现了上中下游产业的一体化协同发展。随着工业4.0时代的来临,信息化和工业化融合,物联网、云计算等新技术的普及推…...
MyBatis 的关联关系配置 一对多,一对一,多对多 关系的映射处理
目录 一.关联关系配置的好处 二. 导入数据库表: 三. 一对多关系:-- 一个订单对应多个订单项 四.一对一关系:---一个订单项对应一个订单 五.多对多关系(两个一对多) 一.关联关系配置的好处 MyBatis是一…...
Diffusion Models for Image Restoration and Enhancement – A Comprehensive Survey
图像恢复与增强的扩散模型综述 论文链接:https://arxiv.org/abs/2308.09388 项目地址:https://github.com/lixinustc/Awesome-diffusion-model-for-image-processing/ Abstract 图像恢复(IR)一直是低水平视觉领域不可或缺的一项具有挑战性的任务&…...
温岭网站建设制作/推56论坛
首先说明是函数指针,函数指针,就是一个函数,将其函数名指针化,通过传入指针调用不同的函数 手撸代码一次 #include<stdio.h> void max(int a,int b) { printf("now call max :"); int t a > b ? a : b; …...
html怎么做网站版块/2022新闻热点事件简短30条
含义: 把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数, 并且返回接受余下的参数且返回结果的新函数的技术。作用: 惰性求值实例: add(1,2,3)>add(1)(2)(3) function curry(fn, args []){let len …...
建一个网站的流程/搜索引擎排名优化包括哪些方面
下面是来自老男孩培训初级第14期第六节课的批量分发管理服务器课程的女学生的作品(详细注释)在大多数男同学还在迷糊的时候,该女同学已经完整的读懂并注释了全部的脚本,老男孩非常感慨,大家都有此努力的学习态度何愁运…...
网站宝二级域名怎么设置/产品如何做线上推广
情景一:两个bat文件在同一个目录下 有时候我们需要在一个bat文件中调用另一个bat文件,比如我们想在a.bat中调用b.bat,如下。 a.bat echo off echo I am a.bat… echo now run the b.bat call b.bat echo over b.bat echo off echo I am b…...
政法委网站建设背景/全球搜是什么公司
selenium from selenium.webdriver import Chrome# 创建浏览器对象 b Chrome() # 打开网页 b.get(https://cd.zu.ke.com/zufang/pg2/#contentList) # 获取网页源代码 print(b.page_source)控制翻页 找到多页规律利用循环获取多页内容 from selenium.webdriver import Chrom…...
大淘客网站商品做淘口令/站长之家工具查询
今天周六,突然想看看自己这一周项目的进度,看看每天在GitHub提交了什么模块。 通过百度,找到了一个很简单的方法: 1.打开项目,点击“x commits” 2.查看历史的提交 补充:如果在我们在写代码、数次修改并提…...