环境准备

1.本例使用3台Linux主机,IP地址如下:

一、 点击(此处)折叠或打开

Server A: 192.168.106.101
Server B: 192.168.106.102
Server C: 192.168.106.103

2.根据需要,开启相应主机防火墙的相关端口。本次需要用到3台主机,所以开启这3台主机的以下端口:
点击(此处)折叠或打开
-A INPUT -m state –state NEW -m tcp -p tcp –dport 27017 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 27018 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 27019 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 20000 -j ACCEPT

二、搭建分布式集群

运用MongoDB的复制集(Replica Sets)+分片(Sharding)就能实现MongoDB分布式高可用的集群。
分片(sharding)能够增加更多的机器来应对不断增加的负载和数据,也不影响应用。
复制集(Replica Sets)能确保每个分片节点都具有自动备份、自动故障恢复能力。

1.集群的环境

架构图:

主机设计:

2.配置Replica Sets

创建数据目录:

#在serverA上
mkdir -p /data/{shard1-1,shard2-1,config}
#在serverB上
mkdir -p /data/{shard1-2,shard2-2,config}
#在serverC上
mkdir -p /data/{shard1-3,shard2-3,config}

2.1配置shard1的Replica Sets:

#在serverA上启动shard1-1
mongod --fork --shardsvr --port 27018 --dbpath /data/shard1-1/ --logpath /data/shard1-1/shard1-1.log --logappend --replSet shard1 --directoryperdb
#在serverB上启动shard1-2
mongod --fork --shardsvr --port 27018 --dbpath /data/shard1-2/ --logpath /data/shard1-2/shard1-2.log --logappend --replSet shard1 --directoryperdb
#在serverC上启动shard1-3
mongod --fork --shardsvr --port 27018 --dbpath /data/shard1-3/ --logpath /data/shard1-3/shard1-3.log --logappend --replSet shard1 --directoryperdb

用mongo连接其中一台主机的27018端口的mongod,初始化复制集shard1:
mongo –port 27018

点击(此处)折叠或打开

>config={_id:'shard1',members:[
{_id:0,host:'192.168.106.101:27018',priority:2},
{_id:1,host:'192.168.106.102:27018',priority:1},
{_id:2,host:'192.168.106.103:27018',arbiterOnly:true}]
}>rs.initiate(config)

2.2 配置shard2的Replica Sets

 #在serverA上启动shard2-1
mongod --fork --shardsvr --port 27019 --dbpath /data/shard2-1/ --logpath /data/shard2-1/shard2-1.log --logappend --replSet shard2 --directoryperdb
#在serverB上启动shard2-2
mongod --fork --shardsvr --port 27019 --dbpath /data/shard2-2/ --logpath /data/shard2-2/shard2-2.log --logappend --replSet shard2 --directoryperdb
#在serverC上启动shard2-3
mongod --fork --shardsvr --port 27019 --dbpath /data/shard2-3/ --logpath /data/shard2-3/shard2-3.log --logappend --replSet shard2 --directoryperdb

用mongo连接其中一台主机(建议在ServerB上)的27019端口的mongod,初始化复制集shard2:

mongo --port 27019>config={_id:'shard2',members:[
{_id:0,host:'192.168.106.101:27019',arbiterOnly:true},
{_id:1,host:'192.168.106.102:27019',priority:1},
{_id:2,host:'192.168.106.103:27019',priority:2}]
}>rs.initiate(config)

3.配置config server

#在3台主机中分别启动配置服务
mongod --configsvr --port 20000 --dbpath /data/config/ --logpath /data/config/config.log --replSet docdetection --logappend --fork

用mongo连接其中一台主机的20000端口的mongod,初始化复制集docdetection:

mongo --port 20000configdb1={_id:'docdetection',members:[
{_id:0,host:'192.168.106.101:20000',priority:3},
{_id:1,host:'192.168.106.102:20000',priority:1},
{_id:2,host:'192.168.106.103:20000',priority:2}]
}>rs.initiate(configdb1)

4.配置router server

#在3台主机中分别运行mongos服务
mongos --configdb docdetection/192.168.106.101:20000,192.168.106.102:20000,192.168.106.103:20000 --port 27017 --logpath /data/mongos.log --logappend --fork

5.配置分片(shard cluster)

#连接到其中一台机器的端口27017的mongos进程,并切换到admin数据库添加分片shard1和shard2:
mongo --port 27017>use admin
>db.runCommand({addshard:"shard1/192.168.106.101:27018,192.168.106.102:27018,192.168.106.103:27018"})
>db.runCommand({addshard:"shard2/192.168.106.101:27019,192.168.106.102:27019,192.168.106.103:27019"})
#激活数据库(work)和集合(status)的分片功能:
>db.runCommand({enablesharding:"work"})
>db.runCommand({shardcollection:"work.status",key:{_id:1}})将准备好的mongodb的数据导入到mongodb中
cd /usr/local/mongodb/bin
mongorestore -h localhost:27017 -d docdetection --dir /usr/local/mongodb/docdetection/

6.验证

#查看shard1的集合work.status和shard2的文档数几乎均分,且之和等于路由节点下查看的文档数:
mongo --port 27018 work
>db.status.count()
./mongo --port 27019 work>db.status.count()./mongo work
>db.status.count()#查看分片的状态:需要在mongs进程下访问:
mongo --port 27017
> printShardingStatus()

三、常见问题
1.【问题描述】执行初始化副本集时报错:

点击(此处)折叠或打开

> rs.initiate(config)
{"ok" : 0,"errmsg" : "replSetInitiate quorum check failed because not all proposed set members responded affirmatively: 192.168.106.102:27018 failed with No route to host, 192.168.106.103:27018 failed with No route to host","code" : 74,"codeName" : "NodeNotFound"
}

【解决方法】
开启防火墙的相关端口

点击(此处)折叠或打开

-A INPUT -m state --state NEW -m tcp -p tcp --dport 27017 -j ACCEPT-A INPUT -m state --state NEW -m tcp -p tcp --dport 27018 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 27019 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 20000 -j ACCEPT

2.【问题描述】初始化副本集报错:

点击(此处)折叠或打开

> rs.initiate(config)
{"ok" : 0,"errmsg" : "This node, 192.168.106.101:27019, with _id 0 is not electable under the new configuration version 1 for replica set shard2","code" : 93,"codeName" : "InvalidReplicaSetConfig"
}

【解决方法】
如果设置主机A为仲裁节点,那么不要在A主机上执行初始化操作,否则会报上述错误。

3.【问题描述】启动路由器mongos报错:

点击(此处)折叠或打开

./mongos --configdb 192.168.106.101:20000,192.168.106.102:20000,192.168.106.103:20000 --port 27017 --logpath /data/mongos.log --logappend --forkFailedToParse: mirrored config server connections are not supported; for config server replica sets be sure to use the replica set connection stringtry './mongos --help' for more information

【解决方法】
从Mongodb3.2之后,启动mongos时需使用副本集名称,否则会报上述错误。例如:

点击(此处)折叠或打开

./mongos –configdb 副本集名称/192.168.106.101:20000,192.168.106.102:20000,192.168.106.103:20000 --port 27017 --logpath /data/mongos.log --logappend --fork

MongoDB sharding模式实现(http://blog.chinaunix.net/xmlrpc.php?r=blog/articleuid=28266791id=5758139 )相关推荐

  1. mongodb数据合并设计_「时间序列数据」和MongoDB(二)-模式设计最佳实践

    在上一篇博客文章时间序列数据与MongoDB:第一部分-简介中,我们介绍了时间序列数据的概念,然后介绍了一些可以用于帮助收集时间序列应用程序需求的发现问题.对这些问题的回答有助于指导支持大容量生产应用 ...

  2. MongoDB Sharding 机制分析

    MongoDB 是一种流行的非关系型数据库.作为一种文档型数据库,除了有无 schema 的灵活的数据结构,支持复杂.丰富的查询功能外,MongoDB 还自带了相当强大的 sharding 功能. 要 ...

  3. MongoDB sharding迁移那些事(一)

    如果不了解 MongoDB Sharded Cluster 原理,请先阅读 MongoDB Sharded cluster架构原理 关于MongoDB Sharding,你应该知道的 关于 shard ...

  4. MongoDB Sharding分片配置

    Ps:mongod是mongodb实例,mongos被默认为为mongodb sharding的路由实例. 本文使用的mongodb版本为3.2.9,因此参考网址为:https://docs.mong ...

  5. http://blog.chinaunix.net/uid-25082381-id-3242162.html

    http://blog.chinaunix.net/uid-25082381-id-3242162.html 因为项目用到了ftp传输文件的功能,设备要做ftp服务器,正好busybox有ftpd这个 ...

  6. 原百万访问量博客http://blog.chinaunix.net/uid/20656672.html不再维护(10年前数百篇oracle/teradata性能优化、故障处理案例)...

    原博客地址http://blog.chinaunix.net/uid/20656672.html不再维护(数百篇oracle/teradata性能优化.故障处理原创文章) 转载于:https://ww ...

  7. MongoDB Sharding 请勿复用已删除的 namespace

    SERVER-17397: Dropping a Database or Collection in a Sharded Cluster may not fully succeed 是 MongoDB ...

  8. http://blog.chinaunix.net/uid-20577907-id-3519578.html

    http://blog.chinaunix.net/uid-20577907-id-3519578.html 转载于:https://www.cnblogs.com/longshiyVip/p/542 ...

  9. MongoDB 进阶模式设计

    原文链接:http://www.mongoing.com/mongodb-advanced-pattern-design 12月12日上午,TJ在开源中国的年终盛典会上分享了文档模型设计的进阶技巧,就 ...

最新文章

  1. debug:g2o cmake时报错“Qt5 not found. Install it and set Qt5_DIR accordingly
  2. 一元二次方程用c语言代码,一元二次方程求解程序完整代码
  3. Pycharm远程连接Linux服务器
  4. 使用Docker构建Jekyll站点
  5. linux fedora卸载vmware16命令
  6. 程序员面试金典 - 面试题 08.07. 无重复字符串的排列组合(回溯)
  7. 双绞线传输距离_视频监控系统中布线常用传输线缆分类及制作方法
  8. 使用monkey 前准备工作
  9. 第二届蓝桥杯省赛---夺冠概率
  10. 如何根据纬度和经度获取城市名称
  11. 8.1 向量及其线性运算
  12. SMART硬盘检测参数详解
  13. ​大佬,像这种国外创意PPT逻辑图,你能做出来吗?
  14. PSnbsp;07替换颜色
  15. python123不能登录_python入门:最基本的用户登录用户登录,三次错误机会
  16. Word电子扫描仪 word文档转换为图片Pdf,Word文档扫描成Pdf,word文档加密 word转图片 word转pdf
  17. 华为各类工程师通信基础面试题库以及答案
  18. php禁止ua,服务器禁止某些User Agent抓取网站
  19. java求最大子串_Java获取两个字符串中最大相同子串的方法
  20. 如何在Viz Ticker Feed中实现对xml数据源的自动导入

热门文章

  1. 使用parted给大于2T的磁盘分区
  2. minute教会你shell
  3. opencv学习笔记14:图像礼帽,图像黑帽
  4. VTK:点定位器用法实战
  5. VTK:高亮选择动画用法实战
  6. boost::binary_search相关的测试程序
  7. 使用 Boost.MPI 的 all_reduce() 计算最小值的示例
  8. boost::hana::make_optional用法的测试程序
  9. Boost:bimap双图的structured_pair的测试程序
  10. ITK:二进制XOR两个图像