MongoDB高可用复制集分片集群搭建

时间:2021-09-13 07:55:03

1     逻辑架构

1.1     逻辑架构图

MongoDB高可用复制集分片集群搭建

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及端口规划

MongoDB高可用复制集分片集群搭建

2.2     linux目录规划

MongoDB高可用复制集分片集群搭建

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 高可用集群副本集&plus;分片搭建

    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高可用集群&plus;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&plus;Pacemaker&plus;DRBD&plus;MySQL 实现高可用&lpar;HA&rpar;的MySQL集群

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

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

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

  8. mongoDB副本集&plus;分片集群

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

  9. MongoDB 副本集&plus;分片 认证方式搭建

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

随机推荐

  1. Javascript中DOM的练习

    第一个题:html计时器 方法一: <body onLoad="show()" > <div id="b"></div> & ...

  2. &lbrack;shell基础&rsqb;——read命令

    read命令:在shell中主要用于读取输入.变量.文本 1. 接受标准输入(键盘)的输入,并将输入的数据赋值给设置的变量      [按回车键——表示输入完毕]      [若输入的数据多于设置的变 ...

  3. zoj 1119 &sol;poj 1523 SPF

    题目描述:考虑图8.9中的两个网络,假定网络中的数据只在有线路直接连接的2个结点之间以点对点的方式传输.一个结点出现故障,比如图(a)所示的网络中结点3出现故障,将会阻止其他某些结点之间的通信.结点1 ...

  4. Log4net创建日志及简单扩展

    转:http://blog.csdn.net/CHENFEIYANG2009/article/details/5397342 1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log ...

  5. &lbrack;置顶&rsqb; 【SQL】查询重复人名的次数并列出

    select count(姓名) as 重复次数,姓名from 某表 group by 姓名order by 重复次数 asc 首先,group by 姓名,可以将所有相同姓名的项集合在一起.然后,c ...

  6. BZOJ 1798&colon; &lbrack;Ahoi2009&rsqb;Seq 维护序列seq&lpar; 线段树 &rpar;

    线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...

  7. NSCalendar 日历类

    NSCalendar 日历类 Cocoa中对日期和时间的处理 NSCalendar (一) (2008-11-12 21:54:10) NSCalendar用于处理时间相关问题.比如比较时间前后.计算 ...

  8. 剑指OFFER——正则表达式匹配

    请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字 ...

  9. python -- 小数据池 is和 &equals;&equals; 再谈编码

    1.小数据池 python程序是由代码块构成的,一个代码块的文本作为python程序的执行单元. 代码块:一个模块,一个函数,一个类,甚至一个command命令都是一个代码块,一个文件也是一个代码块, ...

  10. 【VBA】杨辉三角

    Private Sub Workbook_Open() Dim loopA As Integer Dim loopB As Integer Dim loopNum As Integer Dim top ...