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. C#中 ??、 ?、 ?: 、?.、?[ ]

    1. 可空类型修饰符(?)引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空. 例如:string str=null; 是正确的,int i=null; 编译器就会报错. 为了使值类型 ...

  2. Java借助axis2发布WebService

    Webservice: 1.Xml: 2.WSDL: Web service描述语言(WSDL)就是这样一个基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web service及其函数.参 ...

  3. JQuery.Ajax之错误调试帮助信息

    下面是Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求 ...

  4. ORA-01033因误删表空间文件导致的解决方案

    该类问题通常是由于表空间操作不当引起的.解决方法: SQL*Plus无法连接,显示以下错误:ORA-01033:ORACLE initialization or shutdown in progres ...

  5. 3-1 Linux文件管理类命令详解

    根据马哥Linux初级 03-01整理 1. 目录管理 ls cd pwd mkdir rmdir tree 2. 文件管理 touch stat file rm cp mv nano 3. 日期时间 ...

  6. android android 判断是否滑动

    (转自:http://blog.csdn.net/angle_rupert/article/details/6255522) 声明: float x_temp01 = 0.0f; float y_te ...

  7. UrlRewritingNet伪静态的使用方法与解决方案(URL重写)

    在建站初期时,我们往往需要考虑的是使用真静态还是伪静态,这对于往后的站点配置,延展性都会产生深远的影响. 我使用伪静态的唯一目的:SEO优化.毋容置疑,伪静态在对于Spider是非常有利的,因此,我更 ...

  8. RSA加密算法的简单案例

    RSA加密算法是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击. 那关于RSA加密算法有哪些应用呢?以下举一个数据库身份验证的案例. 在使用数据集进行身份认证时,密码存在数据 ...

  9. 全面剖析 <input> 标签 ------ HTML\HTML5

    <input>标签因其形式多样.功能强大,当之无愧成为了WEB前端开发人员最钟爱的元素之一.下面就来对<input>做一个全面的剖析: 标签定义: <input> ...

  10. Laravel五大功能之Eloquent关系模式

    Eloquent是Laravel的原始ActiveRecord是实现的,建立在Laravel的Fluent Query Builder之上的,所以Eloquent类和Fluent类是一样的,能实现复杂 ...