MongoDB的分片集群搭建

  MongoDB的最为自豪的一个特色之一,分片。

  参考官方文档: https://docs.mongodb.com/manual/sharding/

  •     单机压力,高频查询CPU,IO
  •   单表压力,百万千万级

  放两张分片的描述图:

  

 

 

-------------------------------------------------------------------------------------------------------

 

 

mongoDB分片,从架构图上。
几个概念:
mongos: mongo shard表示mongo分片。需要一个或多个mongos服务,充当路由,将客户端过来的请求分发到各个分片。
config servers: mongoDB分片的配置服务器组,v3.4要求配置服务器也要是一个复制集。mongos启动时会加载配置服务器中的信息。比如mongos对某一个查询请求路由到哪一个分片上。
shard: 分片,数据真实存在的地方。每一个分片都是一个复制集。


mongod -v  查看mongod的服务端版本

mongo的shell版本可以连接后显示查看

 

搭建分片开始:

数据存储的目录放在 /home/work/mongodata/
日志存储的目录放在 /home/work/mongodata/logs

配置服务器的复制集(下面一个复制集三个mongod实例):

mkdir /home/work/mongodata/config1 -p
mkdir /home/work/mongodata/config2
mkdir /home/work/mongodata/config3
mkdir /home/work/mongodata/logs

 

# configsvr参数表示配置服务;replSet 是复制集的名称;logappend 追加日志

mongod --configsvr --replSet configset --dbpath /home/work/mongodata/config1 --port 20001 --logpath /home/work/mongodata/logs/configsvr1.log --logappend --fork

mongod --configsvr --replSet configset --dbpath /home/work/mongodata/config2 --port 20002 --logpath /home/work/mongodata/logs/configsvr2.log --logappend --fork

mongod --configsvr --replSet configset --dbpath /home/work/mongodata/config3 --port 20003 --logpath /home/work/mongodata/logs/configsvr3.log --logappend --fork

 

# configsrv 配置复制集 配置服务器不需要仲裁节点
# 每个mongod实例以及各自的权重,priority最大的充当PRIMARY,其他是SECONDARY

$ mongo localhost:20001/admin

rs.initiate({ _id:"configset",members:[
{_id:0,host:"hostname:20001",priority:3},
{_id:1,host:"hostname:20002",priority:2},
{_id:2,host:"hostname:20003",priority:1}
]});

 


配置分片服务(两个分片,每个分片是一个复制集3个实例):

分片服务 shard1

mkdir /home/work/mongodata/shard1_1
mkdir /home/work/mongodata/shard1_2
mkdir /home/work/mongodata/shard1_3

 

启动分片服务 shardsvr参数是分片服务

mongod --shardsvr --replSet shard1 --port 30001 --dbpath /home/work/mongodata/shard1_1 --logpath /home/work/mongodata/logs/shard1_1.log --logappend --fork

mongod --shardsvr --replSet shard1 --port 30002 --dbpath /home/work/mongodata/shard1_2 --logpath /home/work/mongodata/logs/shard1_2.log --logappend --fork

mongod --shardsvr --replSet shard1 --port 30003 --dbpath /home/work/mongodata/shard1_3 --logpath /home/work/mongodata/logs/shard1_3.log --logappend --fork

 

分片服务 shard2

mkdir /home/work/mongodata/shard2_1
mkdir /home/work/mongodata/shard2_2
mkdir /home/work/mongodata/shard2_3

 

启动分片服务

mongod --shardsvr --replSet shard2 --port 40001 --dbpath /home/work/mongodata/shard2_1 --logpath /home/work/mongodata/logs/shard2_1.log --logappend --fork

mongod --shardsvr --replSet shard2 --port 40002 --dbpath /home/work/mongodata/shard2_2 --logpath /home/work/mongodata/logs/shard2_2.log --logappend --fork

mongod --shardsvr --replSet shard2 --port 40003 --dbpath /home/work/mongodata/shard2_3 --logpath /home/work/mongodata/logs/shard2_3.log --logappend --fork

 

配置复制集

# 需要进到admin数据库

$ mongo localhost:30001/admin

rs.slaveOk();

 

# 配置shard1分片
# mongodb建议每个分片复制集,要有个仲裁节点(当主服务down掉,仲裁选出新的主服务)

rs.initiate({ _id:"shard1",members:[
{_id:0,host:"hostname:30001",priority:2},
{_id:1,host:"hostname:30002",priority:1},
{_id:2,host:"hostname:30003",arbiterOnly:true}
]});

 

#查看复制集的状态

rs.status()

 

# 配置shard2分片 

$ mongo localhost:40001/admin

rs.initiate({ _id:"shard2",members:[
{_id:0,host:"hostname:40001",priority:2},
{_id:1,host:"hostname:40002",priority:1},
{_id:2,host:"hostname:40003",arbiterOnly:true}
]});

 

# 启动mongos路由服务
# 注意mongos服务的命令不是mongod,参数中加载了配置服务器信息

mongos --configdb configset/hostname:20001,hostname:20002,hostname:20003 --port 50000 --logpath /home/work/mongodata/logs/mongos1.log --logappend --fork

 

# 进入mongos 添加分片
mongo localhost:50000/admin

# 添加分片 hostname表示主机名
> db.runCommand({addshard :"shard1/hostname:30001,hostname:30002,hostname:30003"});
> db.runCommand({addshard :"shard2/hostname:40001,hostname:40002,hostname:40003"});

# 查看分片配置情况
> db.runCommand({listshards : 1})

# 选择要分片的数据库
> db.runCommand({enablesharding : "db_name"})

# 选择要分片的集合和分片的片键,这里使用了hashed后的_id 片键的选择值得讲一讲 很重要
> db.runCommand({shardcollection : "db_name.collection_name",key : {"_id": "hashed"}})

 

 

# 开始插入数据,注意是从mongos 进入所选分片的数据库

use  db_name;
for (var i = 1; i <= 100000; i++){ db_name.collection_name.save({"id":i, "name":"user"+i}) }

查询分片情况:
db.collection_name.stats();

或者
sh.status()

# 这个命令可以查看下 mongo 实例的运行状态
mongostat --port 40001

 

posted @ 2017-05-14 21:53  根号五  阅读(357)  评论(0编辑  收藏  举报