关于MongoDB分布式高可用集群实现
一、环境准备
1.本例使用3台Linux主机,IP地址如下:
点击(此处)折叠或打开
- Server B
- Server C
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
创建数据目录:
点击(此处)折叠或打开
- ,config} #在serverA上
- mkdir ,config} #在serverB上
- mkdir ,config} #在serverC上
2.1配置shard1的Replica Sets:
#在serverA上启动shard1-1
点击(此处)折叠或打开
- .log --logappend --replSet shard1 --directoryperdb
#在serverB上启动shard1-2
点击(此处)折叠或打开
- .log --logappend --replSet shard1 --directoryperdb
#在serverC上启动shard1-3
点击(此处)折叠或打开
- .log --logappend --replSet shard1 --directoryperdb
用mongo连接其中一台主机的27018端口的mongod,初始化复制集shard1:
./mongo --port 27018
点击(此处)折叠或打开
- >config={_id:'shard1',members:[
- {_id,host:'192.168.1.231:27018',priority:2},
- {_id,host:'192.168.1.232:27018',priority:1},
- {_id,host:'192.168.1.233:27018',arbiterOnly:true}]
- }
- >rs.initiate(config)
2.2 配置shard2的Replica Sets
#在serverA上启动shard2-1
点击(此处)折叠或打开
- .log --logappend --replSet shard2 --directoryperdb
#在serverB上启动shard2-2
点击(此处)折叠或打开
- .log --logappend --replSet shard2 --directoryperdb
#在serverC上启动shard2-3
点击(此处)折叠或打开
- .log --logappend --replSet shard2 --directoryperdb
用mongo连接其中一台主机(建议在ServerB上)的27019端口的mongod,初始化复制集shard2:
./mongo --port 27019
点击(此处)折叠或打开
- >config={_id:'shard2',members:[
- {_id,host:'192.168.1.231:27019',arbiterOnly:true},
- {_id,host:'192.168.1.232:27019',priority:1},
- {_id,host:'192.168.1.233:27019',priority:2}]
- }
- >rs.initiate(config)
3.配置config
server
#在3台主机中分别启动配置服务
点击(此处)折叠或打开
- ./mongod --configsvr --port 20000 --dbpath /data/config/ --logpath /data/config/config.log –replSet configdb --logappend --fork
用mongo连接其中一台主机的20000端口的mongod,初始化复制集configdb:
./mongo –port 20000
点击(此处)折叠或打开
- >configdb1={_id:'configdb',members:[
- {_id,host:'192.168.1.231:20000',priority:3},
- {_id,host:'192.168.1.232:20000',priority:1},
- {_id,host:'192.168.1.233:20000',priority:2}]
- }
- >rs.initiate(configdb1)
4.配置router
server
#在3台主机中分别运行mongos服务
点击(此处)折叠或打开
- :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.1.231:27018,192.168.1.232:27018,192.168.1.233:27018"})
- >db.runCommand({addshard:"shard2/192.168.1.231:27019,192.168.1.232:27019,192.168.1.233:27019"})
#激活数据库(work)和集合(status)的分片功能:
点击(此处)折叠或打开
- > db.runCommand({enablesharding:"work"})
- >db.runCommand({shardcollection:"work.status",key:{_id:1}})
6.验证
#查看shard1的集合work.status和shard2的文档数几乎均分,且之和等于路由节点下查看的文档数:
./mongo --port 27018 work
点击(此处)折叠或打开
- >db.status.count()
./mongo --port 27019 work
点击(此处)折叠或打开
- >db.status.count()
./mongo work
点击(此处)折叠或打开
- >db.status.count()
#查看分片的状态:
点击(此处)折叠或打开
- > printShardingStatus()
三、常见问题
1.【问题描述】执行初始化副本集时报错:
点击(此处)折叠或打开
- > rs.initiate(config)
- {
- ,
- "errmsg" : "replSetInitiate quorum check failed because not all proposed set members responded affirmatively: 192.168.1.232:27018 failed with No route to host, 192.168.1.233:27018 failed with No route to host",
- ,
- "codeName" : "NodeNotFound"
- }
【解决方法】
开启防火墙的相关端口
点击(此处)折叠或打开
- -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)
- {
- ,
- "errmsg" : "This node, 192.168.1.231:27019, with _id 0 is not electable under the new configuration version 1 for replica set shard2",
- ,
- "codeName" : "InvalidReplicaSetConfig"
- }
【解决方法】
如果设置主机A为仲裁节点,那么不要在A主机上执行初始化操作,否则会报上述错误。
3.【问题描述】启动路由器mongos报错:
点击(此处)折叠或打开
- :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时需使用副本集名称,否则会报上述错误。例如:
点击(此处)折叠或打开
- :20000 --port 27017 --logpath /data/mongos.log --logappend --fork
关于MongoDB分布式高可用集群实现的更多相关文章
- Hbase 完全分布式 高可用 集群搭建
1.准备 Hadoop 版本:2.7.7 ZooKeeper 版本:3.4.14 Hbase 版本:2.0.5 四台主机: s0, s1, s2, s3 搭建目标如下: HMaster:s0,s1(备 ...
- ClickHouse 分布式高可用集群搭建(转载)
一.ClickHouse安装方式: 源码编译安装 Docker安装 RPM包安装 为了方便使用,一般采用RPM包方式安装,其他两种方式这里不做说明. 二.下载安装包 官方没有提供rpm包,但是Alti ...
- Memcache 分布式高可用集群介绍
分布式缓存需考虑如下三点: 1.缓存本身的水平线性扩展的问题. 2.缓存大病罚下的本身性能问题. 3.避免缓存的单点鼓掌问题. 分布式缓存存在的问题: 1.内存本身的管理问题.内存的分配,管理和回收机 ...
- MongoDB高可用集群配置的方案
>>高可用集群的解决方案 高可用性即HA(High Availability)指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性. ...
- MongoDB高可用集群配置方案
原文链接:https://www.jianshu.com/p/e7e70ca7c7e5 高可用性即HA(High Availability)指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非 ...
- Centos7.5基于MySQL5.7的 InnoDB Cluster 多节点高可用集群环境部署记录
一. MySQL InnoDB Cluster 介绍MySQL的高可用架构无论是社区还是官方,一直在技术上进行探索,这么多年提出了多种解决方案,比如MMM, MHA, NDB Cluster, G ...
- MongoDB 高可用集群副本集+分片搭建
MongoDB 高可用集群搭建 一.架构概况 192.168.150.129192.168.150.130192.168.150.131 参考文档:https://www.cnblogs.com/va ...
- MongoDB高可用集群搭建(主从、分片、路由、安全验证)
目录 一.环境准备 1.部署图 2.模块介绍 3.服务器准备 二.环境变量 1.准备三台集群 2.安装解压 3.配置环境变量 三.集群搭建 1.新建配置目录 2.修改配置文件 3.分发其他节点 4.批 ...
- MongoDB 高可用集群架构简介
在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. 转载自严澜的博文——<如何搭建高效的 ...
随机推荐
- 关于IO模拟时序(SPI)的注意事项
原则:有硬件I2C.SPI时尽量用硬件操作,省去IO模拟繁琐的时序调试.但在内部资源不够时就要用IO模拟总线了. 关于短延时:模拟时序时是否需要延时要看MCU与device的相对速度.比如I2C如果4 ...
- [已读]移动web手册
冲着作者是PPK才买的,双色,180页,略贵.但是这本书的内容,我并不是很满意.4.5.6三章算是干货,尤其是第四章,值得一读.其他的内容,忽略就好了.
- jdk1.8源码包下载并导入到开发环境下助推高质量代码(Eclipse、MyEclipse和Scala IDEA for Eclipse皆适用)(图文详解)
不多说,直接上干货! jdk1.8 源码, Linux的同学可以用的上. 由于源码JDK是前版本的超集, 所以1.4, 1.5, 1.6, 1.7都可以用的上. 其实大家安装的jdk路径下,这 ...
- java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
在往数据库添加数据需要判断数据库中是否已有记录,判断的返回结果通常是List.在List为空的情况下,调用其方法需要格外注意,例如:调用get()则会报下标越界的异常. 当然还可以联想到其他情况,当判 ...
- mybatis(错误) 项目启动时报“Result Maps collection already contains value forxxx”的解决方案
使用逆向工程生成代码时,一定要将原来的代码删除干净,如果覆盖的话,不是真正的覆盖,在原来的代码上增加重复的代码,导致出错
- JVM垃圾回收机制三
垃圾回收器 分代垃圾回收常见的垃圾回收器 判断一个垃圾回收器好坏的标准 1.吞吐量越高越好 2.工作线程暂停时间越短越好. Serial垃圾回收器 串行回收器时最古老的最基本的垃圾回收器,工作线程会产 ...
- react注意点
event 对象 和普通浏览器一样,事件监听函数会被自动传入一个 event 对象,这个对象和普通的浏览器 event 对象所包含的方法和属性都基本一致.不同的是 React.js 中的 event ...
- imageview加载本地和网络图片
ImageView是Android程序中经常用到的组件,它将一个图片显示到屏幕上. 在UI xml定义一个ImageView如下: public void onCreate(Bundle savedI ...
- cp参数详解
-a 相当于pdr的意思 -d 若原文件为连接文件,则复制链接文件属性,而非文件本身 -f 强制复制,有重复时,不询问用户,而直接强制复制 -i 目标文件存在的话,先询问 -p 与文件的属性一起复制 ...
- HDU 5418 Victor and World (可重复走的TSP问题,状压dp)
题意: 每个点都可以走多次的TSP问题:有n个点(n<=16),从点1出发,经过其他所有点至少1次,并回到原点1,使得路程最短. 思路: 给了很多重边,选最小的留下即可.任意点可能无法直接到达, ...