MongoDB高可用复制集分片集群搭建
1 逻辑架构
1.1 逻辑架构图

1.2 组件说明
一、mongos(query routers):查询路由,负责client的连接,并把任务分给shards,然后收集结果。一个集群可以有多个query routers(replica sets),以分担客户端请求(负载均衡)。
二、config server:配置服务器。保存了集群的元数据(比如数据放在哪个shards上),query router通过config server中的配置信息决定把任务分配到哪个shards上。从版本3.2开始,config servers可以做成replica sets。
三、shards:分片,即数据结点,存储数据和执行计算。为了保证高可用和数据一致性,生产环境中shards 应该做成replicasets(防止丢失数据)。
2 服务器规划
2.1 IP及端口规划

2.2 linux目录规划

3 集群搭建
3.1 准备工作
1、 根据服务器系统版本,来下载最新版MongoDB(3.2.x),下载地址:https://www.mongodb.com/download-center?jmp=nav#community
2、 根据2.2节的目录规划,在6台机器中的任意一台上建好相应目录,并将下载好的MongoDB解压到/data01/项目名/mongodb/下;
3、 执行以下指令创建keyfile:
a) openssl rand -base64 741 > /data01/项目名/mongodb/keyfile/keyfile
b) chmod 300 /data01/项目名/mongodb/keyfile/keyfile
4、 根据2.1节的端口规划,在6台机器上依次执行如下指令,以开放相应端口:
vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17017 -j ACCEPT
-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 37017 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 47017 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 57017 -j ACCEPT
3.2 参数配置
3.2.1 configServer配置
新建2.2节中的configsvr.conf文件,文件内容如下:
dbpath =/data01/项目名/mongodb/data/configsvr
configsvr = true
port = 27017
logpath =/data01/项目名/mongodb/logs/configsvr.log
logappend = true
fork = true
replSet=configRS
keyFile =/data01/项目名/mongodb/keyfile/keyfile
3.2.2 routeServer配置
新建2.2节中的mongos.conf文件,文件内容如下:
configdb =C1:27017,C2:27017,C3:27017
port = 17017
chunkSize = 5
logpath =/data01/项目名/mongodb/logs/mongos.log
logappend = true
fork = true
keyFile =/data01/项目名/mongodb/keyfile/keyfile
3.2.3 Shard配置
新建2.2节中的shard1.conf、shard2.conf、shard3.conf文件,文件内容如下:
shard1.conf:
dbpath = /data01/项目名/mongodb/data/shard1
shardsvr = true
replSet = shard1
port = 37017
oplogSize = 100
logpath = /data01/项目名/mongodb/logs/shard1.log
logappend = true
fork = true
keyFile =/data01/项目名/mongodb/keyfile/keyfile
shard2.conf:
dbpath = /data01/项目名/mongodb/data/shard2
shardsvr = true
replSet = shard2
port = 47017
oplogSize = 100
logpath = /data01/项目名/mongodb/logs/shard2.log
logappend = true
fork = true
keyFile =/data01/项目名/mongodb/keyfile/keyfile
shard3.conf:
dbpath = /data01/项目名/mongodb/data/shard3
shardsvr = true
replSet = shard3
port = 57017
oplogSize = 100
logpath = /data01/项目名/mongodb/logs/shard3.log
logappend = true
fork = true
keyFile =/data01/项目名/mongodb/keyfile/keyfile
到此,所有配置文件都已经建好,通过scp指令将整个/data01/项目名/mongodb目录拷贝到其余5台机器。
3.2.4 创建用户
分别在C1、C2、C3上运行以下命令:
/data01/项目名/mongodb/bin/mongod -f /data01/项目名/mongodb/config/configsvr.conf
再在C1上运行:/data01/项目名/mongodb/bin/mongo --port 27017
配置config server为replica sets:
>use admin
>rs.initiate( {_id: "configRS",configsvr: true,members: [{ _id: 0, host: "C1:27017" },{ _id: 1, host: "C2:27017" },{ _id: 2, host: "C3:27017" }]})
>rs.status()
创建用户
- 启动routeServer。分别在C1、C2、C3上运行以下命令:
/data01/项目名/mongodb/bin/mongos -f /data01/项目名/mongodb/config/mongos.conf
- 在C1上执行:
/data01/项目名/mongodb/bin/mongo --port 17017
mongos> use admin
mongos>db.createUser( {user: "xxx", pwd: "xxx", roles: [ { role: "root", db: "admin" } ] })
mongos>db.auth(“xxx”,”xxx”)
mongos>exit
3.2.5 配置Shard
采用以下命令启动S1、S2和S3上的shard1、shard2、shard3:
备注:先依次启动S1的shard1、S2的shard2、S3的shard3,再启动其余的。
/data01/项目名/mongodb/bin/mongod -f /data01/项目名/mongodb/config/shard1.conf
/data01/项目名/mongodb/bin/mongod -f /data01/项目名/mongodb/config/shard2.conf
/data01/项目名/mongodb/bin/mongod -f /data01/项目名/mongodb/config/shard3.conf
查看是否正常启动:netstat -lnpt
启动后连接到shard1、shard2、shard3的任意一台机器,来配置每个shard为replica sets,以下是具体配置过程:
Shard1:
/data01/项目名/mongodb/bin/mongo --port 37017
>use admin
>config = {“_id”:"shard1", members: [ {“_id”: 0,”host”:"S1:37017"}, {“_id”: 1, “host”:"S2:37017"}, {“_id”: 2, “host”:"S3:37017"}] }
>rs.initiate(config)
>exit
Shard2:
/data01/项目名/mongodb/bin/mongo --port 47017
>use admin
>config = {“_id”:"shard2", members: [ {“_id”: 0,”host”:"S1:47017"}, {“_id”: 1, “host”:"S2:47017"}, {“_id”: 2, “host”:"S3:47017"}] }
>rs.initiate(config)
>exit
Shard3:
/data01/项目名/mongodb/bin/mongo --port 57017
>use admin
>config = {“_id”:"shard3", members: [ {“_id”: 0,”host”:"S1:57017"}, {“_id”: 1, “host”:"S2:57017"}, {“_id”: 2, “host”:"S3:57017"}] }
>rs.initiate(config)
>exit
3.2.6 配置分片
配置分片只需在一台机器上操作即可,这里选择在C1上执行:
/data01/项目名/mongodb/bin/mongo --port 17017
mongos> use admin
mongos>db.auth("xxx","xxx")(3.2.4中创建的用户)
mongos>db.runCommand({addshard:"shard1/S1:37017,S2:37017,S3:37017",name:"shard1", maxsize:20480} )
mongos>db.runCommand({addshard:"shard2/S1:47017,S2:47017,S3:47017",name:"shard2", maxsize:20480} )
mongos>db.runCommand({addshard:"shard3/S1:57017,S2:57017,S3:57017",name:"shard3", maxsize:20480} )
验证分片。继续在C1执行:
db.runCommand({listShards:1})
激活分片配置。使用
sh.enableSharding("库名");
新增库并进行分片。
使用
sh.shardCollection("库名.集合名",{"_id":"hashed"});
创建对应的表(collection)并进行hash分片。
使用
sh.shardCollection("库名.集合名",{"_id":1});
创建对应的表(collection)并进行并按_id区间分片。
例子:
使用 use 库名 切换到新建的库
使用
db.createUser({user:"xxx",pwd:"xxx",roles:[{role:"dbOwner", db:"库名"}]});
创建对应用户。
验证路由
1、 use 库名(上面新建的库);
2、 插入一批测试数据:for(var i=0;i<10;i++){db.集合名.insert({name:"jeff"+i});}
3、 验证:db.集合名.stats()
MongoDB高可用复制集分片集群搭建的更多相关文章
- 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高可用集群+MMS集群监控搭建
备注: mongodb学习资料 http://www.runoob.com/mongodb/mongodb-tutorial.html 一. 集群的三个组件: mongos(query routers ...
- MongoDB 高可用集群架构简介
在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. 转载自严澜的博文——<如何搭建高效的 ...
- Redis高可用复制集群实现
redis简单介绍 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库.Redis 与其他 key - value 缓存产品有以下三个特点: 支持数据的持久化,可以将 ...
- Corosync+Pacemaker+DRBD+MySQL 实现高可用(HA)的MySQL集群
大纲一.前言二.环境准备三.Corosync 安装与配置四.Pacemaker 安装与配置五.DRBD 安装与配置六.MySQL 安装与配置七.crmsh 资源管理 推荐阅读: Linux 高可用(H ...
- 高可用,完全分布式Hadoop集群HDFS和MapReduce安装配置指南
原文:http://my.oschina.net/wstone/blog/365010#OSC_h3_13 (WJW)高可用,完全分布式Hadoop集群HDFS和MapReduce安装配置指南 [X] ...
- mongoDB副本集+分片集群
首先搭建一个副本集(三台机器) 主,从,仲裁 然后搭建分片shard1,在每台机子上启用shard1(这里就写一个分片吧!!如果写多了怕初学者会混乱,先写一个.然后可以按照同样的方法写第二个,第三个) ...
- MongoDB 副本集+分片 认证方式搭建
MongoDB 副本集+分片 认证方式搭建 参考资料: https://www.cnblogs.com/ityouknow/p/7344005.htmlhttps://jorwen-fang.itey ...
随机推荐
- ASP.NET MVC3 Razor 调试与预加载
目录(?)[-] 获取服务器信息 FormsAuthenticationSlidingExpiration 属性 MVC3预加载 在ASP.NET MVC3开发中,调试中怎么也是不可缺少的,那对于 ...
- css sprite简便方法切 《评分五角星》
摘抄自我趣同伴的心得: 大家可以会遇到过要做满意度用星级来评分的情况,类似这种 实现的方法有很多,大家最初想到的可能是根据满意度有多少种情况就切多少种图,然后拼在一张图里面,通过控制图片的位置来实现. ...
- 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分的解决办法方案
最近操作系统不断地报异常或错误,可能是用得太久了,而刚好工作比较多又不想重新安装系统,但用一段时间后(一天大概有两次)系统就出现各种问题导致无法继续使用真是痛苦万分啊,今天又来了这样的错误: 此实现不 ...
- String.SubString
1理论 String.SubString(int index,int length) index:开始位置,从0开始 length:你要取的子字符串的长度 2实验 string my = &quo ...
- Linux命令学习总结:rmdir
命令简介: 该命令用用来删除空目录,如果目录非空,则会出现错误.可以使用rm删除目录中的文件后,使用rmdir删除目录.也可以使用rm -rf替代rmdir命令.这是一个非常简单的命令. 命令语法 ...
- Linux忘记root密码怎么办?
开篇前言:Linux系统的root账号是非常重要的一个账号,也是权限最大的一个账号,但是有时候忘了root密码怎么办?总不能重装系统吧,这个是下下策,其实Linux系统中,如果忘记了root账号密码, ...
- 使用 Eclipse 玩转 C、C++
因为做Java开发,所以习惯了使用Eclipse.现在需要写C++程序,真心不想用VS那样的重量级的IDE,VC++6.0又是那么的不友好.使用一款自己熟悉的IDE,工作起来就顺手.为了可以在Ecli ...
- SQLite学习笔记(八)&&sqlite实现架构
该系列的前面一些文章我重点讲了sqlite的核心功能,比如封锁机制,共享缓存,以及事务管理等.但对于sqlite的整体没有作一个全面的介绍,本文将从实现的层面,整体介绍sqlite的框架.各个核心模块 ...
- 把Tomcat注册为windows服务
配置环境变量 JAVA_HOME=D:\java CLASSPATH=.;%JAVA_HOME%\lib; PATH=%JAVA_HOME%\bin; 提示:一般jre默认在jdk目录下%JAVA_H ...
- 弹窗样式 idialog,purebox,artdialog4.1.2,jquery.alert.v1.2
<script src="<?php echo $imgurl;?>/tools/media/js/jquery.iDialog.js"></scri ...