搭建 MongoDB分片(sharding) / 分区 / 集群环境
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) / 分区 / 集群环境的更多相关文章
- Mongodb 3.2.8: 集群环境搭建
简介 MongoDB是一种面向文档的数据库管理系统,由C++撰写而成,以此来解决应用程序开发社区中的大量现实问题.2007年10月,MongoDB由10gen团队所发展.2009年2月首度推出. ## ...
- 大数据架构:搭建CDH5.5.1分布式集群环境
yum install -y ntp gcc make lrzsz wget vim sysstat.x86_64 xinetd screen expect rsync bind-utils ioto ...
- Redis集群环境搭建实践
0 Redis集群简介 Redis集群(Redis Cluster)是Redis提供的分布式数据库方案,通过分片(sharding)来进行数据共享,并提供复制和故障转移功能.相比于主从复制.哨兵模式, ...
- 带你自行搭建虚拟机和Redis集群环境,值得收藏!
前言: 我们看到分析 Redis 使用或原理的文章不少,但是完整搭建一套独立的 redis 集群环境的介绍,并不是很多或者说还不够详细. 那么,本文会手把手带着大家搭建一套 Redis 集群环境,Re ...
- hadoop集群环境的搭建
hadoop集群环境的搭建 今天终于把hadoop集群环境给搭建起来了,能够运行单词统计的示例程序了. 集群信息如下: 主机名 Hadoop角色 Hadoop jps命令结果 Hadoop用户 Had ...
- ElasticSearch-5.3.1集群环境搭建,安装ElasticSearch-head插件,安装错误解决
说起来甚是惭愧,博主在写这篇文章的时候,还没有系统性的学习一下ES,只知道可以拿来做全文检索,功能很牛逼,但是接到了任务不想做也不行, leader让我搭建一下分布式的ES集群环境,用来支持企业信用数 ...
- Ningx集群环境搭建
Ningx集群环境搭建 Nginx是什么? Nginx ("engine x") 是⼀个⾼性能的 HTTP 和 反向代理 服务器,也是⼀个 IMAP/ POP3/SMTP 代理服务 ...
- 一:Storm集群环境搭建
第一:storm集群环境准备及部署[1]硬件环境准备--->机器数量>=3--->网卡>=1--->内存:尽可能大--->硬盘:无额外需求[2]软件环境准备---& ...
- rocketmq那些事儿之集群环境搭建
上一篇入门基础部分对rocketmq进行了一个基础知识的讲解说明,在正式使用前我们需要进行环境的搭建,今天就来说一说rockeketmq分布式集群环境的搭建 前言 之前已经介绍了rocketmq的入门 ...
随机推荐
- python web应用--WSGI接口(二)
WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求.我们来看一个最简单的Web版本的“Hello, web!”: 1 # server.py 2 # 从wsgiref模 ...
- 刚学不久的python,自己稍微加工了一点,影响不大,因为博主很懒,所以格式什么的,就没有太在意了!
本人初学python,之前因为有接触过其他语言,但是并没有接触的太深,出于对一个hacker的向往,学习一下Linux和python再说,当然,也是为了高工资啦,啊哈哈哈! 一开始就是一个蛮有意思的小 ...
- Java面试不得不知的程序(二)
[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 斐波那契数列:前面相邻两项之和,构 ...
- Delphi7程序调用C#写的DLL解决办法(转)
近来,因工作需要,必须解决Delphi7写的主程序调用C#写的dll的问题.在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行: 编写C#dll的方法都一样,首先在vs2005中创建一个 ...
- 爬虫学习(十八)——selenium解决javascript渲染
selenium 是一个用于Web应用程序测试的工具. Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Fir ...
- Servlet学习笔记03——什么是DAO?
1.案例 (1)添加用户 step1.建表 create table t_user( id int primary key auto_increment, username varchar(50) u ...
- 嵌入式Linux编译内核步骤 / 重点解决机器码问题 / 三星2451
嵌入式系统更新内核 1. 前言 手里有一块Friendly ARM的MINI2451的板子,这周试着编译内核,然后更新一下这个板子的Linux内核,想要更新Linux Kernel 4.1版本,但是种 ...
- python-5模块
1-使用模块 import sys def test(): args = sys.argv if len(args)==1: print("hello word") elif le ...
- 清空Fragment回退栈中某个Fragment之上的所有Fragment
根据debug信息查看Fragment回退栈的情况,具体debug代码如下: int num = getActivity().getSupportFragmentManager().getBackSt ...
- 17,saltstack高效运维
salt介绍 saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统. salt强大吗 系统管理员日常会进行大量的重复性操作,例如安 ...