集群搭建

只有3台服务器,开始搭建mongodb集群里主要参照的是http://www.lanceyan.com/tech/arch/mongodb_shard1.html,端口的设置也是mongos为 20000, config server 为 21000, shard1为 22001 , shard2为22002, shard3为22003。其大体思路为:

在每台服务器上启动config服务

在每台服务器上启动mongos服务,并指定每个mongos服务包含的config服务地址(前一步启动的3个config服务)https://docs.mongodb.com/manual/reference/program/mongos/#cmdoption--configdb

每台服务器上,为每个分片或其复本启动mongod实例https://docs.mongodb.com/manual/tutorial/deploy-replica-set/#start-each-member-of-the-replica-set-with-the-appropriate-options

登录任意一台服务器,配置每个分片的复本集包含的实例https://docs.mongodb.com/manual/reference/method/rs.initiate/#example

登录mongos,在mongos服务中添加启动好的分片https://docs.mongodb.com/manual/reference/command/addShard/#definition

最后在数据库层面和数据集层面开启分片功能。

经过上述几个步骤,就搭出了下图的集群。(图片来自http://www.lanceyan.com/tech/arch/mongodb_shard1.html)

原理、基本命令及参数说明

基本命令

mongod --configsvr  把该mongod实例启动为某个分片集的config Server。这样一来,只能通过admin或config来向数据库写数据

mongod --fork  把mongod实例启动为后台进程

mongod --dbpath  指定实例的目录

mongod --logpath  指定实例的日志路径

mongod --shardsrv  把该实例启动为【分片集】的一个【分片】

mongod --replSet  该实例为【复本集】的一个实例

mongod --oplogSize  配置local数据库中oplog.rs集合的大小(单位M)。实例同步时,在多个实例之间进行同步时,oplog.rs集合用来存储数据库的改变。一旦建立该表大小就固定了,填满后如果又来了新的更改,后来的修改就覆盖前面的。由于在装集群时开始设置太小,后面插入操作又特别多,导致多实例同步跟不上oplog.rs表覆写的速度,造成too stale to 更新的错误。后面有更改oplig.rs大小的过程。

mongod --port  指定该实例启动的端口号

mongos  mongos是为分片的mogodb集群作为路由服务的,说白了就是来了一个操作,我给你指定你到哪个分片上去执行。

mongos --configdb  指定分片集的config servers

mongos --dbpath  同上

mongos --logpath  同上

mongos --port  同上

mongos --fork  同上

为分片集开启一个配置服务(每台机器一个,如果有损坏,路由服务器可以读取其它配置服务)

mongod --configsvr --dbpath /data/dbmongo/config/data --port  --logpath /data/dbmongo/config/log/config.log --fork

为分片集开启路由服务(每台机器一个,如果有损坏,程序可以调其它的路由继续工作)

mongos  --configdb ip1:,ip2:,ip3: --port    --logpath  /data/dbmongo/mongos/log/mongos.log --fork

开启每个分片对应的每个mongod数据库实例(每台机器上都有3个数据库实例)

mongod --shardsvr --replSet shard1 --port  --dbpath /data/dbmongo/shard1/data  --logpath /data/dbmongo/shard1/log/shard1.log --fork --oplogSize
mongod --shardsvr --replSet shard2 --port --dbpath /data/dbmongo/shard2/data --logpath /data/dbmongo/shard2/log/shard2.log --fork --oplogSize
mongod --shardsvr --replSet shard3 --port --dbpath /data/dbmongo/shard3/data --logpath /data/dbmongo/shard3/log/shard3.log --fork --oplogSize

登录一个mongod数据实例,并初始化副本集

mongo  127.0.0.1:
  use admin
  config = {
    _id:"复本名字",
    members:[
      {_id:,host:"ip1:22001",arbiterOnly:true},
      {_id:,host:"ip2:22001"},
      {_id:,host:"ip3:22001"}
    ]
  }
  rs.initiate(config);

在分片中加入相应的复本集

mongo  127.0.0.1:
use admin
db.runCommand( { addshard : "shard1/ip1:22001,ip2:22001,ip3:22001"});
db.runCommand( { addshard : "shard2/ip1:22002,ip2:22002,ip3:22002"});
db.runCommand( { addshard : "shard3/ip1:22003,ip2:22003,ip3:22003"});

开启数据库分片并对集合进行分片

    db.runCommand( { enablesharding :"数据库名"});
db.runCommand( { shardcollection : "数据库名.集合名",key : {_id: } } )

更改oplogSize值

oplogSize是设置的local数据库里的oplog.rs集合的大小,如果启动时oplogSize设置太小,一旦建立就不能再增大了。复本数据库一旦down掉一段时间,主数据库有可能把oplog.rs表填满之后又来了新的修改把表覆盖了,那么复本数据库再启起来就会一直处于Recovering状态,日志里提示too stale to catch up。这个时候可以:

1。把复本数据库全清掉,重新启动复本数据库实例,这样复本数据库会初始把主数据库里的数据全拷贝一遍。

2。把复本数据库全清掉,从主数据库里复制好data放过来并重启。(没试过)

3。在线的修改oplogSize的值,原理就是把数据库关掉后,启动成单实例的模式,然后删掉oplog.rs并重新建一个更大的oplog.rs。这个官方文档里有说明:Change the Size of the Oplog

更改步骤

  • (可选)对于Primary节点,要降成非Primary节点

        rs.stepDown()
  • 关闭数据库
        use admin
    db.shutdownServer()
  • 启动为独立的数据库实例
    mongod --port  --dbpath /data/dbmongo/shard2/data --logpath /data/dbmongo/shard2/log/shard2.log --fork
  • (可选)备份oplog.rs文件Back Up with mongodump
    mongodump --db local --collection 'oplog.rs' --port 
  • 把oplog.rs里最后更新的一条备份出来,新建oplog.rs,并导入备份的这一条。(以后复本集里的不同复本之间相互同步时,要找到本地的最后一次修改(备份的这一条),在其它oplog.rs里找到这一条,更新其之后的修改)
        use local
    db = db.getSiblingDB('local')
    db.temp.drop()
    db.temp.save( db.oplog.rs.find( { }, { ts: , h: } ).sort( {$natural : -} ).limit().next() )
    db.oplog.rs.drop()
    db.runCommand( { create: "oplog.rs", capped: true, siz10 * * * ) } )
    db.oplog.rs.save( db.temp.findOne() )
  • 关闭数据库并启动为集群的一个分片的复本集的一个复本。
        use admin
    db.shutdownServer() mongod --shardsvr --replSet shard2 --port --dbpath /data/dbmongo/shard2/data --logpath /data/dbmongo/shard2/log/shard2.log --fork 

too many open files错误

这个很有可能是由于unix系统对程序的资源使用限制造成的,具体可以参见文档:UNIX ulimit Settings

修改方法为修改/etc/security/limits.d/99-mongodb-nproc.conf

# Default limit for number of user’s processes to prevent
# accidental fork bombs.
# See rhbz # for reasoning.
#
# * soft nproc
# root soft nproc unlimited
* soft nofile
* hard nofile
* soft fsize unlimited
* hard fsize unlimited
* soft cpu unlimited
* hard cpu unlimited
* soft nproc
* hard nproc

另外还有尽量不以root用户开启mongod实例等等,具体修改忘记了,大体是这样

http://www.lanceyan.com/tech/arch/mongodb_shard1.html

http://www.cnblogs.com/wilber2013/p/4154406.html

mongodb集群安装及到现在遇到的一些问题的更多相关文章

  1. MongoDB集群安装与配置2.4.3版本

    mongoDB安装http://www.mongodb.org/downloads拷文件到# cp mongodb-linux-i686-2.4.1.tgz /usr/local/进入目录:# cd ...

  2. 在Docker中安装和部署MongoDB集群

    此文已由作者袁欢授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在Docker中安装mongodb 采用的mongodb镜像:https://registry.hub.doc ...

  3. mongodb分片集群安装教程

    mongodb 集群包含副本集群,主从集群以及分片集群,分片集群比较复杂,这里测试我采用了三台机器,交差部署 blog地址:http://www.cnblogs.com/caoguo 一 .环境:#m ...

  4. centos7下安装部署mongodb集群(副本集模式)

    环境需求:Mongodb集群有三种模式:  Replica Set, Sharding,Master-Slaver.  这里部署的是Replica Set模式. 测试环境: 这里副本集(Replica ...

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

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

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

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

  7. [转]搭建高可用mongodb集群(二)—— 副本集

    在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点 ...

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

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

  9. 搭建高可用mongodb集群(二)—— 副本集

    在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点 ...

随机推荐

  1. Java Map hashCode深究

    [Java心得总结七]Java容器下——Map 在自己总结的这篇文章中有提到hashCode,但是没有细究,今天细究整理一下hashCode相关问题 1.hashCode与equals 首先我们都知道 ...

  2. 一步一步开发Game服务器(五)地图寻路

    目前大多数使用的寻路算法有哪些? 目前市面上大部分游戏的寻路算法是A*,或者B*. A*通常所说的是最优算法也就是寻找最短路径.B*碰撞式算法也就是,也就是不断的去碰撞能走就走,不管是不是绕路.当然以 ...

  3. java中异常抛出后代码还会继续执行吗

    今天遇到一个问题,在下面的代码中,当抛出运行时异常后,后面的代码还会执行吗,是否需要在异常后面加上return语句呢? public void add(int index, E element){ i ...

  4. 《高性能javascript》 领悟随笔之-------DOM编程篇(二)

    <高性能javascript> 领悟随笔之-------DOM编程篇二 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...

  5. 用JWT来保护我们的ASP.NET Core Web API

    在上一篇博客中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕竟现在也 有不少开源的东西可以用,今天用的是JWT. 什么是JWT呢?JW ...

  6. ASP.NET MVC 利用IRouteHandler, IHttpHandler实现图片防盗链

    你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽.下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义Ro ...

  7. java中动态代理的实现

    动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...

  8. Map集合

    1:Map (1)将键映射到值的对象. 一个映射不能包含重复的键:每个键最多只能映射到一个值. 键值对的方式存在 (2)Map和Collection的区别? A:Map 存储的是键值对形式的元素,键唯 ...

  9. dpkg:处理软件包dradis (--configure)时出错

    dpkg:处理软件包dradis (--configure)时出错!解决方案:1.将info文件夹更名%mv /var/lib/dpkg/info /var/lib/dpkg/info_old2.新建 ...

  10. java多线程解读一(基础篇)

    一.线程的定义 每个应用程序内部都是由一个或多个的进程组成,而每个进程内部都是由许多具体的线程执行,所以,线程是每个程序执行的最小单位. 二.线程的实现 1.通过继承java.lang.Thread类 ...