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()

创建用户

  1. 启动routeServer。分别在C1、C2、C3上运行以下命令:

/data01/项目名/mongodb/bin/mongos -f /data01/项目名/mongodb/config/mongos.conf

  1. 在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区间分片。

例子:

sh.shardCollection("records.people", { "zipcode": 1, "name": 1 } )

sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } )

sh.shardCollection("assets.chairs", { "type": 1, "_id": 1 } )

db.alerts.ensureIndex( { _id : "hashed" } )

sh.shardCollection("events.alerts", { "_id": "hashed" } )
这些分片操作按顺序依次表示为:

数据库records 中的People集合使用了片键{ “zipcode” : 1, “name” : 1 }

这个片键通过字段zipcode的值进行数据分配。如果这个有大量相同的值,则会根据name字段的值对块进行分裂。

数据库people的addresses集合使用了片键{ “state” : 1, “_id” : 1 }

这个片键通过字段state的值进行数据分配。如果这个有大量相同的值,则会根据_id字段的值对块进行分裂。

数据库assets的chairs集合使用了片键{ “type” : 1, “_id” : 1 }

这个片键通过字段type的值进行数据分配。如果这个有大量相同的值,则会根据_id字段的值对块进行分裂。

数据库events的alerts集合使用了片键{ “_id” : “hashed” }

在版本2.4中最新出现的。

这个片键通过字段_id的散列值进行数据分配。MongoDB计算_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高可用复制集分片集群搭建的更多相关文章

  1. MongoDB 高可用集群副本集+分片搭建

    MongoDB 高可用集群搭建 一.架构概况 192.168.150.129192.168.150.130192.168.150.131 参考文档:https://www.cnblogs.com/va ...

  2. MongoDB高可用集群搭建(主从、分片、路由、安全验证)

    目录 一.环境准备 1.部署图 2.模块介绍 3.服务器准备 二.环境变量 1.准备三台集群 2.安装解压 3.配置环境变量 三.集群搭建 1.新建配置目录 2.修改配置文件 3.分发其他节点 4.批 ...

  3. MongoDB高可用集群+MMS集群监控搭建

    备注: mongodb学习资料 http://www.runoob.com/mongodb/mongodb-tutorial.html 一. 集群的三个组件: mongos(query routers ...

  4. MongoDB 高可用集群架构简介

    在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. 转载自严澜的博文——<如何搭建高效的 ...

  5. Redis高可用复制集群实现

    redis简单介绍 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库.Redis 与其他 key - value 缓存产品有以下三个特点: 支持数据的持久化,可以将 ...

  6. Corosync+Pacemaker+DRBD+MySQL 实现高可用(HA)的MySQL集群

    大纲一.前言二.环境准备三.Corosync 安装与配置四.Pacemaker 安装与配置五.DRBD 安装与配置六.MySQL 安装与配置七.crmsh 资源管理 推荐阅读: Linux 高可用(H ...

  7. 高可用,完全分布式Hadoop集群HDFS和MapReduce安装配置指南

    原文:http://my.oschina.net/wstone/blog/365010#OSC_h3_13 (WJW)高可用,完全分布式Hadoop集群HDFS和MapReduce安装配置指南 [X] ...

  8. mongoDB副本集+分片集群

    首先搭建一个副本集(三台机器) 主,从,仲裁 然后搭建分片shard1,在每台机子上启用shard1(这里就写一个分片吧!!如果写多了怕初学者会混乱,先写一个.然后可以按照同样的方法写第二个,第三个) ...

  9. MongoDB 副本集+分片 认证方式搭建

    MongoDB 副本集+分片 认证方式搭建 参考资料: https://www.cnblogs.com/ityouknow/p/7344005.htmlhttps://jorwen-fang.itey ...

随机推荐

  1. vimrc

    我的vimrc https://github.com/juandx/vimrc 当然得装vundle git clone https://github.com/VundleVim/Vundle.vim ...

  2. .Net中使用SendGrid Web Api发送邮件(附源码)

    SendGrid是一个第三方的解决邮件发送服务的提供商,在国外使用的比较普遍.国内类似的服务是SendCloud.SendGrid提供的发送邮件方式主要是两种, 一种是SMTP API, 一种是Web ...

  3. easyui窗口组件

    注意首先要在title后面导入配置文件,前后顺序不能乱 <!-- 1.JQuery的js包 --><script type="text/javascript" s ...

  4. SQL Server 查询树结构的表,查询一个节点的所有子节点

    ;with cte as ( select * from Associator where No = 'mc1007' union all select air.* from Associator a ...

  5. Pause/Resume Instance 操作详解 - 每天5分钟玩转 OpenStack(34)

    本节通过日志详细分析 Nova Pause/Resume 操作. 有时需要短时间暂停 instance,可以通过 Pause 操作将 instance 的状态保存到宿主机的内存中.当需要恢复的时候,执 ...

  6. 【推荐】CentOS安装Tomcat-7.0.57+启动配置+安全配置+性能配置

    注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. #准备工作# 在安装Tomcat之前,请确保已经安装了JDK-1.7环境,具体见<CentOS安装JDK-1.7>. ...

  7. window 和 linux 环境下杀死tomcat进程——也可以解决其他端口被占用的问题

    1.应用场景 在Windows或者linux操作系统中,我们在启动一个tomcat服务器时,经常会发现8080端口已经被占用的错误,而我们又不知道如何停止这个tomcat服务器. 2.window环境 ...

  8. apache服务器启动时提示httpd: apr_sockaddr_info_get() failed for

    apache服务器启动时提示httpd: apr_sockaddr_info_get() failed for 在RedHat Linux 5 与 CentOS 5服务器上配置好apache后,启动或 ...

  9. iOS Run_time

    Runtime是想要做好iOS开发,或者说是真正的深刻的掌握OC这门语言所必需理解的东西.最近在学习Runtime,有自己的一些心得,整理如下,一为 查阅方便二为 或许能给他人一些启发,三为 希望得到 ...

  10. 简单了解ICMP协议

    ping命令是什么协议? 维基百科: ping是一种电脑网络工具,用来测试数据包能否通过IP协议到达特定主机.ping的运作原理是向目标主机传出一个ICMP echo@要求数据包,并等待接受echo回 ...