问题发现

  在使用过程中,通过spark访问集群的效率不是很令人满意,80核心同时运行的速度比单核心也就快了20倍左右,预测瓶颈在mongodb读写上。当然,此时没遇到其他问题暂时没进行问题梳理。

  在数据规模增大之后,通过spark访问mongodb集群会造成mongos节点远程连接时输入命令卡顿,怀疑出现了某些性能瓶颈。

  具体问题出现如下:

  1、某一天发现主节点mongod崩溃。

  2、当天重新执行spark任务,第二天发现主节点服务器无法连接,去机柜查看发现主节点服务器宕机,于是决定认真查找瓶颈。

  3、重新运行任务,执行top命令:发现计算机核心使用率为100%左右,由于本服务器拥有32核心,并且spark使用其中16核心,所以在ubuntu系统下CPU使用率小于1600%都是正常的,CPU不是系统瓶颈。

    使用free -m发现内存仍有剩余,内存不是系统瓶颈。

    使用sudo iftop命令,发现TX和RX都在800Mb以上,初步确认是网络带宽瓶颈。

    查询系统IO和硬盘容量,排除磁盘问题。

  4、确认为网络带宽问题。

问题解决 

  本地网络环境采用的是万兆网卡和千兆交换机,对于大部分应用足够使用,但是执行spark任务时,由于mongos只有主节点存在,所以所有数据读取任务均占用主节点带宽,如果想要正常使用则需要降低并发度或者提供负载均衡。

  Mongodb自身支持负载均衡,对一个sharding集群而言,所有的元数据信息分别存放在mongod里面,但是所有router信息都是放在configsvr中的(包含权限管理的用户信息等),所以想要拓展mongos异常简单,把Mongos的config文件分发到想要启动mongos的机器上,修改一下bindIP直接启动即可,启动后的使用方式和之前的mongos一致,用户信息也都存在不需要重新创建用户。

  由于本集群使用了5台服务器部署Mongod,于是解决办法就是将Mongos也启动5个,相当于启动了5个单独的服务端。

  启动后重新执行spark任务,在每台服务器上执行iftop查看网络使用,发现TX和RX均有300Mb左右。网络带宽不再是集群的使用瓶颈。

  Mongodb的标准uri格式如下:  

   mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

  所以使用时也异常简单,把代码中创建MongoURI或者ReadConfig或者spark.mongodb.imput.uri中的uri按上面格式加入多个host和port即可。

问题反思

  1、问题出现早有预兆,应当及早解决这些问题,提前引起重视。

  2、mongodb的文档中对URI的介绍在Reference > Connection String URI Format中,当时没有看到,所以没找到怎么连接多个Mongos的方法。只启动一个mongos,但是当时其实也有考虑过可能遇到并发瓶颈的问题,但是没有深究。之后的平台搭建要进行更详尽的设计再进行部署会更加合适。

  3、直接在物理机上部署虽好,但是在容器上更容易进行拓展。并且当前的系统以后可能会在多地部署,如果直接部署在k8s上会省下大量部署时间和节约大量人力成本。

  4、曾经以为千兆网够用了,以后采购还是万兆网设备更好。

MongoDB集群单mongos的问题总结的更多相关文章

  1. mongodb集群安装及到现在遇到的一些问题

    集群搭建 只有3台服务器,开始搭建mongodb集群里主要参照的是http://www.lanceyan.com/tech/arch/mongodb_shard1.html,端口的设置也是mongos ...

  2. 搭建高可用mongodb集群(四)—— 分片(经典)

    转自:http://www.lanceyan.com/tech/arch/mongodb_shard1.html 按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还 ...

  3. [转]搭建高可用mongodb集群(四)—— 分片

    按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...

  4. 搭建高可用mongodb集群(四)—— 分片

    按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...

  5. 搭建高可用mongodb集群(一)——配置mongodb

    在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. NOSQL有这些优势: 大数据量,可以通过 ...

  6. 搭建高可用mongodb集群(四)—— 分片

    按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...

  7. 搭建高可用mongodb集群—— 分片

    从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出 ...

  8. Mongodb集群搭建之 Sharding+ Replica Sets集群架构(2)

    参考http://blog.51cto.com/kaliarch/2047358 一.概述 1.1 背景 为解决mongodb在replica set每个从节点上面的数据库均是对数据库的全量拷贝,从节 ...

  9. 搭建高可用mongodb集群(一)——配置mongodb

    在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. NOSQL有这些优势: 大数据量,可以通过 ...

随机推荐

  1. 通俗讲解:PoW共识机制与以太坊的关系、Ghost协议 及 PoS共识机制的变种---Casper

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  2. passwd命令

    passwd命令用于设置用户的认证信息,包括用户密码.密码过期时间等.系统管理者则能用它管理系统用户的密码.只有管理者可以指定用户名称,一般用户只能变更自己的密码. 语法 passwd(选项)(参数) ...

  3. 【CF429E】Points and Segments 欧拉回路

    [CF429E]Points and Segments 题意:给你数轴上的n条线段$[l_i,r_i]$,你要给每条线段确定一个权值+1/-1,使得:对于数轴上的任一个点,所有包含它的线段的权值和只能 ...

  4. git使用——推送本地文件到远程仓库

    捣鼓了一下午之后总结如下:   1.首先可以照着这个链接里面博主给出的详细方法进行操作和配置: http://www.open-open.com/lib/view/open1454507333214. ...

  5. Vue2.0 脚手架代码详解

    参考作者:https://www.jianshu.com/p/2b661d01eaf8 只是为了方便个人学习. 来看一下脚手架创建后的项目目录  说明:在*.vue文件,template标签里写htm ...

  6. common lisp 里的几个操作符(2)

    集合 (Set) member 函数 默认使用 eql比较对象,可传入关键字参数 :test,作为比较的函数.关键字参数 :key,指定在每个元素上应用这个函数. > (member 2 '(( ...

  7. 网络爬虫基础知识(Python实现)

    浏览器的请求 url=请求协议(http/https)+网站域名+资源路径+参数 http:超文本传输协议(以明文的形式进行传输),传输效率高,但不安全. https:由http+ssl(安全套接子层 ...

  8. Exception occurred during processing request: id to load is required for loading

    ERROR Dispatcher:38 - Exception occurred during processing request: id to load is required for loadi ...

  9. 根据Excel模板,填写报表,并下载到web浏览器端

    package com.neusoft.nda.basic.recordmanager.viewelec.servlet; import java.io.File; import java.io.Fi ...

  10. python全栈开发 * 23 面向对象 知识点汇总 * 180704

    23 面向对象 -----特殊方法 1. isinstance(obj,类名) 判断对象是否是此类实例化或者此类的子类实例化出来的class A:passclass B(A):passb1=B()pr ...