问题发现

  在使用过程中,通过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. 【消灭代办】第4周 - Echarts在移动端的各种填坑姿势

    啊呀呀呀呀...... 2018-12-03 代办一:坐标指示器相关问题: 见另一篇 第二问:https://www.cnblogs.com/padding1015/p/9936533.html 20 ...

  2. python __get__ & __set__

    目的:  提供类似java中的getter/setter的东西. (getter/setter的目的: 将属性方法化,使得属性的引用变得简单---尤其将来属性的读取/赋值有比较复杂的逻辑) 官方简明文 ...

  3. python程序如何脱离ide而在操作系统上执行

    IDE就像一个婴儿的摇篮,当程序开发好了之后,打包成一个在OS运行的软件,这是算法落地的重要一步.如果只能在IDE上运行,那这个软件有什么意义呢?接下来我就得想办法,把我的程序迁移到win操作系统上执 ...

  4. css3奇数偶数的伪属性

    <style> /*奇数*/ ul li:nth-child(odd){ background-color: green; } /*偶数*/ ul li:nth-child(even){ ...

  5. linux下部分软件截图

    1.配置环境变量 vi /etc/profile JAVA_HOME=/usr/local/usr_software/jdk_1.8.0.121CLASSPATH=.:$JAVA_HOME/lib/t ...

  6. SparkSQL与Hive on Spark的比较

    简要介绍了SparkSQL与Hive on Spark的区别与联系 一.关于Spark 简介 在Hadoop的整个生态系统中,Spark和MapReduce在同一个层级,即主要解决分布式计算框架的问题 ...

  7. 项目实战03:Keepalived 实现高可用

    目录 实验一:实现keepalived主从方式高可用基于LVS-DR模式的应用实战: 1.环境准备: 2.在lvs-server-master 主上 3.在lvs-server-backup 从上 4 ...

  8. day21:包和异常处理

    1,复习 # 序列化模块 # json # dumps # loads # dump 和文件有关 # load load不能load多次 # pickle # 方法和json的一样 # dump和lo ...

  9. Oracle11g 配置DG broker

    在配置DG broker之前需要确保Dataguard配置正常且主库和备库均使用spfile. 1. 主库配置 配置DG_BROKER_START参数 检查主库dg_broker_start设置 SQ ...

  10. Ubuntu 使用命令行连接无线网

    一.查看可以使用的无线网: nmcli dev wifi 二.连接无线网: nmcli dev wifi connect ‘essid’(网络名称) password ‘password’(密码) 可 ...