MongoDB是最易用的NoSQL,比较适合取代MySQL做一些存储,不过不是强一致性的。本文介绍一下MongoDB各种部署方式,并分享一些感受。前两部分“单机部署”和“主从部署”是“分片部署”的基础。

MongoDB单机部署
启动下载来的MongoDB包的bin目录下的mongod.exe即可打开MongoDB服务,可以添加的基本配置是:

./mongod.exe --dbpath ~/db/data --port 127.0.0.1:10000 --logpath ~/db/log
默认的端口是27017。启动的时候必须有一个data目录,让mongod读写数据。写入数据后,data目录里的文件如图:

.lock文件如果在下次启动时候还存在,需要删除才能成功启动。"article"和"config"是数据库名字,可以特别注意一下每个文件块的大小(16M, 32M, 64M, 128M)。

MongoDB主从部署
主从配置是MongoDB特色之一,使之具备了容错,故障恢复等性能。主节点要声明"master",从节点们要声明"slave"和"--source"。最简单的主从配置如下:

./mongod.exe --dbpath ~/db/master --port 10000 --master
./mongod.exe --dbpath ~/db/slave --port 10001 --slave --source localhost:10001
从节点直接从主节点同步数据,从节点之间不互相同步。容错性更强的部署是一个主从集群,互相都能成为“主节点”,叫做Replica Set。在Replica Set里会有一个活跃节点和若干个备份节点。配置的时候,整个Replica Set要取个名字,然后每台都要指明一个或几个伙伴:
./mongod.exe --dbpath ~/db/node1 --port 10001 --replSet setname/localhost:10002
./mongod.exe --dbpath ~/db/node2 --port 10002 --replSet setname/localhost:10001
./mongod.exe --dbpath ~/db/node3 --port 10003 --replSet setname/localhost:10001
谁成为活跃节点取决于优先级,优先级默认是1,也可以启动mongod进行设置(不具体介绍了),总之是内部的选举机制。

MongoDB分片部署
介绍完以上,组合起来就可以搭建一个比较强壮的分布式MongoDB集群。分片类似分布式,MongoDB以新增分片的方式,扩展自己的容量,并且能给读写负载均衡。

1. 每一个启动的mongod都是实际存放数据的地方,都能作为别人的sharding

2. 分片部署需要一个mongos,起路由分发的作用;需要一个配置服务器和若干个分片服务器(都是mongod)

3. 单机的时候,应用连接的是mongod;分布式的时候,应用连接的是mongos。

最简单的分片部署是单个的配置服务器,一个config(即mongod),一个mongos,几个sharding(即mongod):

./mongod.exe --dbpath ~/db/config --port 20000
./mongos.exe --configdb 127.0.0.1:20000 --port 30000
./mongod.exe --dbpath ~/db/shard1 --port 10001
./mongod.exe --dbpath ~/db/shard2 --port 10002
如果有时候启动不了某个mongod,可能和端口有关。在windows下,这样一个集群会打开很多shell窗口。这种情况下,还是三个独立的mongd,要打开上面的mongos,输入命令加入sharding片:
> use admin
> db.runCommand({addshard : "localhost:10001", allowLocal : true})
> db.runCommand({addshard : "localhost:10002", allowLocal : true})
> db.runCommand({"enablesharding" : "dbname"})
还要设置片建,以提供负载均衡的依据:
> db.runCommand({"shardcollection" : "dbname.collection", "key" : {"_id":1}})
dbname.collection是自己的数据库的数据集。设置的"key"需要已经建立索引。
mongos下还有一些查看分片情况的命令,方便集群的管理和监控,可以自己体验下:

> db.shards.find()
> db.chunks.find()
> db.printShardingStatus()
也可以通过runCommand的其他命令添加新的片,删除已有的片,而且添加的片可以是旧的mongod。
测试开发的时候像上面这样的一组可能够了,真正健壮的集群可能要具备下面三个条件:

1. 多个配置服务器config1, config2, config3(可以都经过一个mongos来路由)

2. 每个sharding都是Replica Set

3. 每一台物理物理服务器承担若干个不同的进程(mongos, shards, config)

就像下面这种图呈现的一样:

我们可以这样理解mongos, shards, config三样东西:

1. shards是一些实际存数据的可以单独使用的db,他们能分配给任何config server,而且添加删除都很方便。

2. 每个shard里有若干个地位平等的mongods,所以每个是一个Replica Set(副本集)

3. 一个config手下带领好几个shards,目的是负载和扩容,他们之间需要mongos来路由

4. mongos是一个路由,可以路由一个或多个config servers,不需要很大的分配空间

5. 每一个客户端的应用,每一张数据库表,最好对应一个config server和一个mongos

以上内容里的"--port" 部分改为IP:port就可以分布式环境了。比较合理的节省物理服务器的配置方法可以像下图这样:

不把所有鸡蛋扔一个篮子里。

(全文完)
---------------------
作者:张包峰
来源:CSDN
原文:https://blog.csdn.net/pelick/article/details/8644116
版权声明:本文为博主原创文章,转载请附上博文链接!

MongoDB单机, 主从, 分布式部署的更多相关文章

  1. zookeeper分布式部署方案

    版本:http://apache.fayea.com/zookeeper/zookeeper-3.4.8/环境:debian 7/8说明:最低配置3台步骤:1.下载zookeeper-3.4.8并解压 ...

  2. TensorFlow分布式部署【单机多卡】

    让TensorFlow飞一会儿 面对大型的深度神经网络训练工程,训练的时间非常重要.训练的时间长短依赖于计算处理器也就是GPU,然而单个GPU的计算能力有限,利用多个GPU进行分布式部署,同时完成一个 ...

  3. MongoDB单机部署

    MongoDB单机部署 一.环境 系统:centos7.6 DB版本:mongodb-linux-x86_64-rhel62-4.2.1.tgz 官网地址:https://www.mongodb.co ...

  4. 【web】 亿级Web系统搭建——单机到分布式集群

      当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架 ...

  5. [转]亿级Web系统搭建:单机到分布式集群

    当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...

  6. 亿级Web系统搭建:单机到分布式集群【转】

    当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...

  7. Redis集群的分布式部署

    3.2.2:Redis Cluster: Redis  分布式部署方案: 1)  客户端分区:由客户端程序决定 key 写分配和写入的 redis node,但是需要客户端自己处理写入 分配.高可用管 ...

  8. 亿级Web系统搭建:单机到分布式集群

    亿级Web系统搭建:单机到分布式集群 当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压 ...

  9. ActiveMQ5.14.1+Zookeeper3.4.9高可用伪分布式部署

    本文借鉴http://www.cnblogs.com/gossip/p/5977489.html,在此基础上进行了完善,使之成为一个完整版的伪分布式部署说明,在此记录一下! 一.本文目的       ...

随机推荐

  1. Codeforces Round #380 Div.2 F - Financiers Game

    F - Financiers Game 这种两人博弈一般都可以用两个dp写, 一个dp描述第一个人的最优态, 第二个dp描述第二个人的最优态,难点在于优化空间... 我感觉这个空间开得有点玄学.. d ...

  2. MIT-6.828-JOS-lab2:Memory management

    MIT-6.828 Lab 2: Memory Management实验报告 tags:mit-6.828 os 概述 本文主要介绍lab2,讲的是操作系统内存管理,从内容上分为三部分: 第一部分讲的 ...

  3. Python中“if __name__=='__main__':”理解与总结

    1 引言 在Python当中,如果代码写得规范一些,通常会写上一句“if __name__==’__main__:”作为程序的入口,但似乎没有这么一句代码,程序也能正常运行.这句代码多余吗?原理又在哪 ...

  4. python scrapy 调试模式

    scrapy通过命令行创建工程,通过命令行启动爬虫,那么有没有方式可以在IDE中调试我们的爬虫呢? 实际上,scrapy是提供给我们工具的, 1. 首先在工程目录下新建一个脚本文件,作为我们执行爬虫的 ...

  5. usb3.0 monitor is already started

    用360 开机加速里找到这个程序,把它从开机启动中删除掉就好.

  6. Cmd2001的毒瘤水题题解

    怕不是我再不写题解这题就该成没人做也没人会的千古谜题了...... T1: 仔细分析题面,发现相同就是广义SAM上节点相同,相似就是广义SAM上为从根到某个点路径的前缀..直接SAM上跑从根开始,每个 ...

  7. COJ1013 WZJ的数据结构(十三)

    WZJ的数据结构(十三) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个节点的有根树(根节点为1),每个节点有权 ...

  8. Booting LPC-Link2, Updating LPCXpresso firmware

    Booting LPC-Link2 The recommended way to use LPC-Link2 with the LPCXpresso IDE is to boot and soft l ...

  9. [Go] Http / Net 相关资料

    [astaxie] [基础]GO搭建一个简单的Web服务器 [astaxie] Go如何使得Web工作 [astaxie] Go 的 Http 包详解 [叶剑峰] Go语言_HTTP包 [叶剑峰] 使 ...

  10. nginx源码学习 资料

    首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没有注释,完全没有配置文档的代码. 现在你最希望要的是一份注释版的nginx源码, ...