1. 安装 MongoDB

三台机器

关闭防火墙

systemctl stop firewalld.service 
192.168.252.121 192.168.252.122 192.168.252.123
mongos mongos mongos
config server config server config server
shard server1 主节点 shard server1 副节点 shard server1 仲裁
shard server2 仲裁 shard server2 主节点 shard server2 副节点
shard server3 副节点 shard server3 仲裁 shard server3 主节点

端口分配:

mongos:20000
config:21000
shard1:27001
shard2:27002
shard3:27003

下载并且安装

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.6.2.tgz
tar -xzvf mongodb-linux-x86_64-amazon-3.6.2.tgz -C /usr/local/

所有版本二进制文件,自行下载

https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl?_ga=2.87139544.1567998244.1517190032-1153843332.1517190032&_gac=1.204211492.1517212002.EAIaIQobChMI44v9_9b82AIV1AcqCh0lcABIEAAYASAAEgKI1_D_BwE

改名

cd /usr/local/
mv mongodb-linux-x86_64-amazon-3.6.2 mongodb

分别在每台机器建立conf、mongos、config、shard1、shard2、shard3六个目录,因为mongos不存储数据,只需要建立日志文件目录即可。

mkdir -p /usr/local/mongodb/conf \
mkdir -p /usr/local/mongodb/mongos/log \
mkdir -p /usr/local/mongodb/config/data \
mkdir -p /usr/local/mongodb/config/log \
mkdir -p /usr/local/mongodb/shard1/data \
mkdir -p /usr/local/mongodb/shard1/log \
mkdir -p /usr/local/mongodb/shard2/data \
mkdir -p /usr/local/mongodb/shard2/log \
mkdir -p /usr/local/mongodb/shard3/data \
mkdir -p /usr/local/mongodb/shard3/log

配置环境变量

vi /etc/profile
# MongoDB 环境变量内容
export MONGODB_HOME=/usr/local/mongodb
export PATH=$MONGODB_HOME/bin:$PATH

使立即生效

source /etc/profile

2. config server配置服务器

mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功。

(三台机器)添加配置文件

vi /usr/local/mongodb/conf/config.conf

## 配置文件内容
pidfilepath = /usr/local/mongodb/config/log/configsrv.pid
dbpath = /usr/local/mongodb/config/data
logpath = /usr/local/mongodb/config/log/congigsrv.log
logappend = true bind_ip = 0.0.0.0
port = 21000
fork = true #declare this is a config db of a cluster;
configsvr = true #副本集名称
replSet = configs #设置最大连接数
maxConns = 20000

启动三台服务器的config server

mongod -f /usr/local/mongodb/conf/config.conf

登录任意一台配置服务器,初始化配置副本集

连接 MongoDB

mongo --port 21000

config 变量

config = {
_id : "configs",
members : [
{_id : 0, host : "192.168.252.121:21000" },
{_id : 1, host : "192.168.252.122:21000" },
{_id : 2, host : "192.168.252.123:21000" }
]
}

初始化副本集

rs.initiate(config)

其中,"_id" : "configs"应与配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 为三个节点的 ip 和 port

响应内容如下

> config = {
... _id : "configs",
... members : [
... {_id : 0, host : "192.168.252.121:21000" },
... {_id : 1, host : "192.168.252.122:21000" },
... {_id : 2, host : "192.168.252.123:21000" }
... ]
... }
{
"_id" : "configs",
"members" : [
{
"_id" : 0,
"host" : "192.168.252.121:21000"
},
{
"_id" : 1,
"host" : "192.168.252.122:21000"
},
{
"_id" : 2,
"host" : "192.168.252.123:21000"
}
]
}
> rs.initiate(config);
{
"ok" : 1,
"operationTime" : Timestamp(1517369899, 1),
"$gleStats" : {
"lastOpTime" : Timestamp(1517369899, 1),
"electionId" : ObjectId("000000000000000000000000")
},
"$clusterTime" : {
"clusterTime" : Timestamp(1517369899, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
configs:SECONDARY>

此时会发现终端上的输出已经有了变化。

//从单个一个
>
//变成了
configs:SECONDARY>

查询状态

configs:SECONDARY> rs.status()

3. 配置分片副本集

3.1 设置第一个分片副本集

(三台机器)设置第一个分片副本集

配置文件

vi /usr/local/mongodb/conf/shard1.conf

#配置文件内容
#——————————————–
pidfilepath = /usr/local/mongodb/shard1/log/shard1.pid
dbpath = /usr/local/mongodb/shard1/data
logpath = /usr/local/mongodb/shard1/log/shard1.log
logappend = true bind_ip = 0.0.0.0
port = 27001
fork = true #副本集名称
replSet = shard1 #declare this is a shard db of a cluster;
shardsvr = true #设置最大连接数
maxConns = 20000

启动三台服务器的shard1 server

mongod -f /usr/local/mongodb/conf/shard1.conf

登陆任意一台服务器,初始化副本集(除了192.168.252.123)

连接 MongoDB

mongo --port 27001

使用admin数据库

use admin

定义副本集配置

config = {
_id : "shard1",
members : [
{_id : 0, host : "192.168.252.121:27001" },
{_id : 1, host : "192.168.252.122:27001" },
{_id : 2, host : "192.168.252.123:27001" , arbiterOnly: true }
]
}

初始化副本集配置

rs.initiate(config)

响应内容如下

> use admin
switched to db admin
> config = {
... _id : "shard1",
... members : [
... {_id : 0, host : "192.168.252.121:27001" },
... {_id : 1, host : "192.168.252.122:27001" },
... {_id : 2, host : "192.168.252.123:27001" , arbiterOnly: true }
... ]
... }
{
"_id" : "shard1",
"members" : [
{
"_id" : 0,
"host" : "192.168.252.121:27001"
},
{
"_id" : 1,
"host" : "192.168.252.122:27001"
},
{
"_id" : 2,
"host" : "192.168.252.123:27001",
"arbiterOnly" : true
}
]
}
> rs.initiate(config)
{ "ok" : 1 }

此时会发现终端上的输出已经有了变化。

//从单个一个
>
//变成了
shard1:SECONDARY>

查询状态

shard1:SECONDARY> rs.status()

3.2 设置第二个分片副本集

设置第二个分片副本集

配置文件

vi /usr/local/mongodb/conf/shard2.conf

#配置文件内容
#——————————————–
pidfilepath = /usr/local/mongodb/shard2/log/shard2.pid
dbpath = /usr/local/mongodb/shard2/data
logpath = /usr/local/mongodb/shard2/log/shard2.log
logappend = true bind_ip = 0.0.0.0
port = 27002
fork = true #副本集名称
replSet=shard2 #declare this is a shard db of a cluster;
shardsvr = true #设置最大连接数
maxConns=20000

启动三台服务器的shard2 server

mongod -f /usr/local/mongodb/conf/shard2.conf

连接 MongoDB

mongo --port 27002

使用admin数据库

use admin

定义副本集配置

config = {
_id : "shard2",
members : [
{_id : 0, host : "192.168.252.121:27002" , arbiterOnly: true },
{_id : 1, host : "192.168.252.122:27002" },
{_id : 2, host : "192.168.252.123:27002" }
]
}

初始化副本集配置

rs.initiate(config)

响应内容如下

> use admin
switched to db admin
> config = {
... _id : "shard2",
... members : [
... {_id : 0, host : "192.168.252.121:27002" , arbiterOnly: true },
... {_id : 1, host : "192.168.252.122:27002" },
... {_id : 2, host : "192.168.252.123:27002" }
... ]
... }
{
"_id" : "shard2",
"members" : [
{
"_id" : 0,
"host" : "192.168.252.121:27002",
"arbiterOnly" : true
},
{
"_id" : 1,
"host" : "192.168.252.122:27002"
},
{
"_id" : 2,
"host" : "192.168.252.123:27002"
}
]
}
> rs.initiate(config)
{ "ok" : 1 }
shard2:SECONDARY> rs.status()

3.3 设置第三个分片副本集

vi /usr/local/mongodb/conf/shard3.conf

#配置文件内容
#——————————————–
pidfilepath = /usr/local/mongodb/shard3/log/shard3.pid
dbpath = /usr/local/mongodb/shard3/data
logpath = /usr/local/mongodb/shard3/log/shard3.log
logappend = true bind_ip = 0.0.0.0
port = 27003
fork = true #副本集名称
replSet=shard3 #declare this is a shard db of a cluster;
shardsvr = true #设置最大连接数
maxConns=20000

启动三台服务器的shard3 server

mongod -f /usr/local/mongodb/conf/shard3.conf

登陆任意一台服务器,初始化副本集(除了192.168.252.121)

mongo --port 27003

使用admin数据库

use admin

定义副本集配置

config = {
_id : "shard3",
members : [
{_id : 0, host : "192.168.252.121:27003" },
{_id : 1, host : "192.168.252.122:27003" , arbiterOnly: true},
{_id : 2, host : "192.168.252.123:27003" }
]
}

初始化副本集配置

rs.initiate(config)

响应内容如下

> use admin
switched to db admin
> config = {
... _id : "shard3",
... members : [
... {_id : 0, host : "192.168.252.121:27003" },
... {_id : 1, host : "192.168.252.122:27003" , arbiterOnly: true},
... {_id : 2, host : "192.168.252.123:27003" }
... ]
... }
{
"_id" : "shard3",
"members" : [
{
"_id" : 0,
"host" : "192.168.252.121:27003"
},
{
"_id" : 1,
"host" : "192.168.252.122:27003",
"arbiterOnly" : true
},
{
"_id" : 2,
"host" : "192.168.252.123:27003"
}
]
}
> rs.initiate(config)
{ "ok" : 1 }
shard3:SECONDARY> rs.status()

3.4 配置路由服务器 mongos

(三台机器)先启动配置服务器和分片服务器,后启动路由实例启动路由实例:

vi /usr/local/mongodb/conf/mongos.conf

#内容
pidfilepath = /usr/local/mongodb/mongos/log/mongos.pid
logpath = /usr/local/mongodb/mongos/log/mongos.log
logappend = true bind_ip = 0.0.0.0
port = 20000
fork = true #监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字
configdb = configs/192.168.252.121:21000,192.168.252.122:21000,192.168.252.123:21000 #设置最大连接数
maxConns = 20000

启动三台服务器的mongos server

mongos -f /usr/local/mongodb/conf/mongos.conf

4. 串联路由服务器

目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,阜阳市人民政府还需要在程序里设置分片配置,让分片生效。

登陆任意一台mongos

mongo --port 20000

使用admin数据库

use  admin

串联路由服务器与分配副本集

sh.addShard("shard1/192.168.252.121:27001,192.168.252.122:27001,192.168.252.123:27001");
sh.addShard("shard2/192.168.252.121:27002,192.168.252.122:27002,192.168.252.123:27002");
sh.addShard("shard3/192.168.252.121:27003,192.168.252.122:27003,192.168.252.123:27003");

查看集群状态

sh.status()

响应内容如下

mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5a713a37d56e076f3eb47acf")
}
shards:
{ "_id" : "shard1", "host" : "shard1/192.168.252.121:27001,192.168.252.122:27001", "state" : 1 }
{ "_id" : "shard2", "host" : "shard2/192.168.252.122:27002,192.168.252.123:27002", "state" : 1 }
{ "_id" : "shard3", "host" : "shard3/192.168.252.121:27003,192.168.252.123:27003", "state" : 1 }
active mongoses:
"3.6.2" : 3
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
{ "_id" : "config", "primary" : "config", "partitioned" : true } mongos>

5. 启用集合分片生效

目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。

登陆任意一台mongos

mongo --port 20000

使用admin数据库

use  admin

指定testdb分片生效

db.runCommand( { enablesharding :"testdb"});

指定数据库里需要分片的集合和片键,哈希id 分片

db.runCommand( { shardcollection : "testdb.table1",key : {"id": "hashed"} } );

我们设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。霍山县人民政府要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!

测试分片配置结果

连接 MongoDB 路由服务

mongo  127.0.0.1:20000

切换到 testdb 数据库

use  testdb;

插入测试数据

for(i=1;i<=100000;i++){db.table1.insert({"id":i,"name":"penglei"})};

总条数

db.table1.aggregate([{$group : {_id : "$name", totle : {$sum : 1}}}])

查看分片情况如下

  • shard1: "count": 33755
  • shard2: "count": 33143,
  • shard3: "count": 33102

结论数据基本均匀

db.table1.stats();
mongos> db.table1.stats();
{
"sharded": true,
"capped": false,
"ns": "testdb.table1",
"count": 100000,
"size": 5200000,
"storageSize": 1519616,
"totalIndexSize": 3530752,
"indexSizes": {
"_id_": 892928,
"id_hashed": 2637824
},
"avgObjSize": 52,
"nindexes": 2,
"nchunks": 6,
"shards": {
"shard1": {
"ns": "testdb.table1",
"size": 1755260,
"count": 33755,
"avgObjSize": 52,
"storageSize": 532480,
"capped": false,
"wiredTiger": {
...省略很多
}
},
"shard2": {
"ns": "testdb.table1",
"size": 1723436,
"count": 33143,
"avgObjSize": 52,
"storageSize": 479232,
"capped": false,
"wiredTiger": {
...省略很多
}
},
"shard3": {
"ns": "testdb.table1",
"size": 1721304,
"count": 33102,
"avgObjSize": 52,
"storageSize": 507904,
"capped": false,
"wiredTiger": {
...省略很多
}
}
},
"ok": 1,
"$clusterTime": {
"clusterTime": Timestamp(1517488062, 350),
"signature": {
"hash": BinData(0, "AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId": NumberLong(0)
}
},
"operationTime": Timestamp(1517488062, 350)
}
mongos>

分组查看总数量是:100000

mongos> db.table1.aggregate([{$group : {_id : "$name", totle : {$sum : 1}}}])
{ "_id" : "penglei", "totle" : 100000 }
mongos>

后期运维

参考

手把手教你 MongoDB 的安装与详细使用(一)

http://www.ymq.io/2018/01/26/MongoDB-1/

手把手教你 MongoDB 的安装与详细使用(二)

http://www.ymq.io/2018/01/29/MongoDB-2/

创建索引

db.table1.createIndex({"name":1})
db.table1.getIndexes()

启动

mongodb的启动顺序是,先启动配置服务器,在启动分片,最后启动mongos.

mongod -f /usr/local/mongodb/conf/config.conf
mongod -f /usr/local/mongodb/conf/shard1.conf
mongod -f /usr/local/mongodb/conf/shard2.conf
mongod -f /usr/local/mongodb/conf/shard3.conf
mongod -f /usr/local/mongodb/conf/mongos.conf

启动报错

about to fork child process, waiting until server is ready for connections.
forked process: 1303
child process started successfully, parent exiting
[root@node1 ~]# mongod -f /usr/local/mongodb/conf/shard1.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1384

删除 mongod.lock

cd /usr/local/mongodb/shard1/data
rm -rf mongod.lock

关闭

#debian、ubuntu系统下:

apt-get install psmisc

#centos或、rhel系统下:

yum install psmisc

关闭时,直接killall杀掉所有进程

killall mongod
killall mongos

搭建 MongoDB分片(sharding) / 分区 / 集群环境的更多相关文章

  1. Mongodb 3.2.8: 集群环境搭建

    简介 MongoDB是一种面向文档的数据库管理系统,由C++撰写而成,以此来解决应用程序开发社区中的大量现实问题.2007年10月,MongoDB由10gen团队所发展.2009年2月首度推出. ## ...

  2. 大数据架构:搭建CDH5.5.1分布式集群环境

    yum install -y ntp gcc make lrzsz wget vim sysstat.x86_64 xinetd screen expect rsync bind-utils ioto ...

  3. Redis集群环境搭建实践

    0 Redis集群简介 Redis集群(Redis Cluster)是Redis提供的分布式数据库方案,通过分片(sharding)来进行数据共享,并提供复制和故障转移功能.相比于主从复制.哨兵模式, ...

  4. 带你自行搭建虚拟机和Redis集群环境,值得收藏!

    前言: 我们看到分析 Redis 使用或原理的文章不少,但是完整搭建一套独立的 redis 集群环境的介绍,并不是很多或者说还不够详细. 那么,本文会手把手带着大家搭建一套 Redis 集群环境,Re ...

  5. hadoop集群环境的搭建

    hadoop集群环境的搭建 今天终于把hadoop集群环境给搭建起来了,能够运行单词统计的示例程序了. 集群信息如下: 主机名 Hadoop角色 Hadoop jps命令结果 Hadoop用户 Had ...

  6. ElasticSearch-5.3.1集群环境搭建,安装ElasticSearch-head插件,安装错误解决

    说起来甚是惭愧,博主在写这篇文章的时候,还没有系统性的学习一下ES,只知道可以拿来做全文检索,功能很牛逼,但是接到了任务不想做也不行, leader让我搭建一下分布式的ES集群环境,用来支持企业信用数 ...

  7. Ningx集群环境搭建

    Ningx集群环境搭建 Nginx是什么? Nginx ("engine x") 是⼀个⾼性能的 HTTP 和 反向代理 服务器,也是⼀个 IMAP/ POP3/SMTP 代理服务 ...

  8. 一:Storm集群环境搭建

    第一:storm集群环境准备及部署[1]硬件环境准备--->机器数量>=3--->网卡>=1--->内存:尽可能大--->硬盘:无额外需求[2]软件环境准备---& ...

  9. rocketmq那些事儿之集群环境搭建

    上一篇入门基础部分对rocketmq进行了一个基础知识的讲解说明,在正式使用前我们需要进行环境的搭建,今天就来说一说rockeketmq分布式集群环境的搭建 前言 之前已经介绍了rocketmq的入门 ...

随机推荐

  1. Linux空间PHP开发环境小白教程(LAMP)

    租了一个云服务器, 但是只有linux系统,没有php开发环境, 只好自己摸索着一步一步安装啦. 本教程来自自学IT创E老师的Linux教程,想详细了解的可以去论坛找. 一.使用PUTTY登录服务器 ...

  2. Java中JSON字符串与java对象的互换实例详解

    这篇文章主要介绍了在java中,JSON字符串与java对象的相互转换实例详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JS ...

  3. 线程池,多线程,线程异步,同步和死锁,Lock接口

    线程池 线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源. 除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源.线程 ...

  4. deep learning书的阅读

    最近坚持读书,虽然大多数读的都是一些闲书,传记.历史或者散文之类的书籍,但是也读了点专业书.闲书是散时间读的,放车里,有时间就拿起来读读,专业书则更多的靠得是专注.因为我给自己的规定是一定时间内读完几 ...

  5. 数据库MySQL基本介绍安装使用及文件导入导出

    1.数据库(data base) 1.1 简述 把文件存储在一台电脑上(服务器),其他电脑用户可以通过账号密码登陆,通过网络去访问这台电脑上的文件,但是由于每个人的数据是不同的,所以你只能通过自己的账 ...

  6. 谷歌angle库使用心得

    通过谷歌的angle库可以在项目中,调用opengl接口渲染时,选择调用directx或者webgl来渲染,避免机器没有安装opengl驱动启动异常的问题. 这个库的使用可以不修改原有使用opengl ...

  7. DCMTK读取DICOM文件头信息的三种方法

    Howto: Load File Meta-Header Here's an example that shows how to load the File Meta Information Head ...

  8. python核心编程2 第五章 练习

    5-2 运算符(a) 写一个函数,计算并返回两个数的乘积(b) 写一段代码调用这个函数,并显示它的结果 def product(x, y): return x * y if __name__ == ' ...

  9. 微信小程序开发入门学习(2):小程序的布局

    概述 小程序的布局采用了和Css3中相同的 flex(弹性布局)方式,使用方法也类似(只是属性名不同而已). 水平排列 默认是从左向右水平依次放置组件,从上到下依次放置组件. 任何可视组件都需要使用样 ...

  10. Shell学习——列出当前路径下所有目录

    1.ls -d */[root@client02 ~]# ls -d */Desktop/ Documents/ Downloads/ jq-1.5/ Music/ Pictures/ Public/ ...