mongodb搭建集群副本集及分片处理

时间:2022-12-31 08:44:49
关于片键的选择和相关策略可参考mongodb片键及策略
1.集群部署方案

mongodb搭建集群副本集及分片处理

mongodb搭建集群副本集及分片处理

mongodb搭建集群副本集及分片处理

2.集群部署详细

主要是把数据和元数据进行分离
config server存储元数据
sharding存储数据.
mongos代理
读操作:
客户端请求进入mongos之后需要去configserver上去获取数据具体在哪个分片上,然后在和相应的节点进行通信然后再把数据在本地整合起来返回给客户端
写操作:
对于分片集群分片集合,mongos将应用程序的写操作直接特定到指定的分片。mongos从config  server使用集群元数据将写操作路由到适当的分片上。基于片键将数据分区,然后,MongoDB将这些块分片到分片上,片键决定块分片的分布情况。这可能会影响集群写操作的性能。
2.1部署文件建立
2.1.1IP设置
准备机器,IP分别设置为:v01/10.10.10.36、v02/10.10.10.37、v03/10.10.10.38
2.1.2公共文件夹
分别在v01 、v02、 v03机器上建立 /data/server/mongodb-3.4.4分片对应测试文件夹。
2.1.3目录建立
分别在机器v01 、v02、 v03建立data 、conf、 config 、 logs、pid

mongodb搭建集群副本集及分片处理

在 data 目录中 建立 每个分片存储路径的 
v01 机器data 目录中建立 shard11 、shard21、shard31 目录

mongodb搭建集群副本集及分片处理

v02 机器data 目录中建立 shard12 、shard22、shard32 目录

mongodb搭建集群副本集及分片处理

v03 机器data 目录中建立 shard13 、shard23、shard33 目录

mongodb搭建集群副本集及分片处理

mkdir -p /data/server/mongodb-3.4.4/conf
mkdir -p /data/server/mongodb-3.4.4/data
mkdir -p /data/server/mongodb-3.4.4/logs
mkdir -p /data/server/mongodb-3.4.4/pid
mkdir -p /data/server/mongodb-3.4.4/config
机器v1
mkdir -p /data/server/mongodb-3.4.4/shard11
mkdir -p /data/server/mongodb-3.4.4/shard21
mkdir -p /data/server/mongodb-3.4.4/shard31 
mkdir -p /data/server/mongodb-3.4.4/data/shard11
mkdir -p /data/server/mongodb-3.4.4/data/shard21
mkdir -p /data/server/mongodb-3.4.4/data/shard31
机器v2
mkdir -p /data/server/mongodb-3.4.4/shard12
mkdir -p /data/server/mongodb-3.4.4/shard22
mkdir -p /data/server/mongodb-3.4.4/shard32
mkdir -p /data/server/mongodb-3.4.4/data/shard12
mkdir -p /data/server/mongodb-3.4.4/data/shard22
mkdir -p /data/server/mongodb-3.4.4/data/shard32
机器v3
mkdir -p /data/server/mongodb-3.4.4/shard13
mkdir -p /data/server/mongodb-3.4.4/shard23
mkdir -p /data/server/mongodb-3.4.4/shard33
mkdir -p /data/server/mongodb-3.4.4/data/shard13
mkdir -p /data/server/mongodb-3.4.4/data/shard23
mkdir -p /data/server/mongodb-3.4.4/data/shard33

端口规划
规划5个组件对应的端口号,由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。
这个端口可以*定义,在本文 

mongos为 20000 
config server 为 21000 
shard1为 22001 , shard2为22002, shard3为22003.

2.2mongdb-shard 分片 conf 配置
sharding存储数据.

2.2.1 机器 v01 分片配置   shard11.conf
dbpath=/data/server/mongodb-3.4.4/data/shard11
logpath=/data/server/mongodb-3.4.4/logs/shard11.log
pidfilepath=/data/server/mongodb-3.4.4/pid/shard11.pid
directoryperdb=true
logappend=true
replSet=shard1
port=22001
fork=true
shardsvr=true
journal=true
oplogSize=64
#keyFile=/data/server/mongodb-3.4.4/key/keyfile
机器 v02 分片配置   shard21.conf
dbpath=/data/server/mongodb-3.4.4/data/shard21
logpath=/data/server/mongodb-3.4.4/logs/shard21.log
pidfilepath=/data/server/mongodb-3.4.4/pid/shard21.pid
directoryperdb=true
logappend=true
replSet=shard2
port=22002
fork=true
shardsvr=true
journal=true
oplogSize=64
#keyFile=/data/server/mongodb-3.4.4/key/keyfile
机器 v02 分片配置   shard31.conf
dbpath=/data/server/mongodb-3.4.4/data/shard31
logpath=/data/server/mongodb-3.4.4/logs/shard31.log
pidfilepath=/data/server/mongodb-3.4.4/pid/shard31.pid
directoryperdb=true
logappend=true
replSet=shard3
port=22003
fork=true
shardsvr=true
journal=true
oplogSize=64
#keyFile=/data/server/mongodb-3.4.4/key/keyfile

2.2.2 机器 v02 分片配置   shard12.conf

dbpath=/data/server/mongodb-3.4.4/data/shard12
logpath=/data/server/mongodb-3.4.4/logs/shard12.log
pidfilepath=/data/server/mongodb-3.4.4/pid/shard12.pid
directoryperdb=true
logappend=true
replSet=shard1
port=22001
fork=true
shardsvr=true
journal=true
oplogSize=64
#keyFile=/data/server/mongodb-3.4.4/key/keyfile
机器 v02 分片配置   shard22.conf
dbpath=/data/server/mongodb-3.4.4/data/shard22
logpath=/data/server/mongodb-3.4.4/logs/shard22.log
pidfilepath=/data/server/mongodb-3.4.4/pid/shard22.pid
directoryperdb=true
logappend=true
replSet=shard2
port=22002
fork=true
shardsvr=true
journal=true
oplogSize=64
#keyFile=/data/server/mongodb-3.4.4/key/keyfile
机器 v02 分片配置   shard32.conf
dbpath=/data/server/mongodb-3.4.4/data/shard32
logpath=/data/server/mongodb-3.4.4/logs/shard32.log
pidfilepath=/data/server/mongodb-3.4.4/pid/shard32.pid
directoryperdb=true
logappend=true
replSet=shard3
port=22003
fork=true
shardsvr=true
journal=true
oplogSize=64
#keyFile=/data/server/mongodb-3.4.4/key/keyfile

2.2.3 机器 v03 分片配置   shard13.conf
dbpath=/data/server/mongodb-3.4.4/data/shard13
logpath=/data/server/mongodb-3.4.4/logs/shard13.log
pidfilepath=/data/server/mongodb-3.4.4/pid/shard13.pid
directoryperdb=true
logappend=true
replSet=shard1
port=22001
fork=true
shardsvr=true
journal=true
oplogSize=64
#keyFile=/data/server/mongodb-3.4.4/key/keyfile
机器 v03 分片配置   shard23.conf
dbpath=/data/server/mongodb-3.4.4/data/shard23
logpath=/data/server/mongodb-3.4.4/logs/shard23.log
pidfilepath=/data/server/mongodb-3.4.4/pid/shard23.pid
directoryperdb=true
logappend=true
replSet=shard2
port=22002
fork=true
shardsvr=true
journal=true
oplogSize=64
#keyFile=/data/server/mongodb-3.4.4/key/keyfile
机器 v02 分片配置   shard33.conf
dbpath=/data/server/mongodb-3.4.4/data/shard33
logpath=/data/server/mongodb-3.4.4/logs/shard33.log
pidfilepath=/data/server/mongodb-3.4.4/pid/shard33.pid
directoryperdb=true
logappend=true
replSet=shard3
port=22003
fork=true
shardsvr=true
journal=true
oplogSize=64
#keyFile=/data/server/mongodb-3.4.4/key/keyfile

2.3mongdb-config 配置部署
config server存储元数据
2.3.1 v01 机器config配置  config.conf

dbpath=/data/server/mongodb-3.4.4/config/
logpath=/data/server/mongodb-3.4.4/logs/config01.log
pidfilepath=/data/server/mongodb-3.4.4/pid/config01.pid
directoryperdb=true
logappend=true
port=21000
fork=true
replSet=cfgReplSet
configsvr=true
journal=true
#keyFile=/data/server/mongodb-3.4.4/key/keyfile

2.3.2v02 机器config配置  config.conf

dbpath=/data/server/mongodb-3.4.4/config/
logpath=/data/server/mongodb-3.4.4/logs/config02.log
pidfilepath=/data/server/mongodb-3.4.4/pid/config02.pid
directoryperdb=true
logappend=true
port=21000
fork=true
replSet=cfgReplSet
configsvr=true
journal=true
#keyFile=/data/server/mongodb-3.4.4/key/keyfile

2.3.3v03 机器config配置  config.conf

dbpath=/data/server/mongodb-3.4.4/config/
logpath=/data/server/mongodb-3.4.4/logs/config03.log
pidfilepath=/data/server/mongodb-3.4.4/pid/config03.pid
directoryperdb=true
logappend=true
port=21000
fork=true
replSet=cfgReplSet
configsvr=true
journal=true
#keyFile=/data/server/mongodb-3.4.4/key/keyfile

2.4mongdb-mongos 配置部署 
mongos代理
2.4.1 v01 v02 v03 机器配置mongos-route.conf

configdb=cfgReplSet/v01:21000,v02:21000,v03:21000
pidfilepath=/data/server/mongodb-3.4.4/pid/route.pid
port=20000
logpath=/data/server/mongodb-3.4.4/logs/route.log
logappend=true
fork=true
#keyFile=/data/server/mongodb-3.4.4/key/keyfile

3.程序启动
启动顺序为 mogodb(shard) ->  config  - > mongos
3.1shard分片
3.1.1shard 执行程序sh
在v01, v02, v03目录 /data/server/mongodb-3.4.4/bin 建 shard-start.sh 执行文件
V01 机器  shard-start.sh

#!/bin/bash

>../logs/shard11.log && ./mongod -f /data/server/mongodb-3.4.4/conf/shard11.conf
>../logs/shard21.log && ./mongod -f /data/server/mongodb-3.4.4/conf/shard21.conf
>../logs/shard31.log && ./mongod -f /data/server/mongodb-3.4.4/conf/shard31.conf

mongodb搭建集群副本集及分片处理

V02 机器  shard-start.sh

#!/bin/bash
>../logs/shard12.log && ./mongod -f /data/server/mongodb-3.4.4/conf/shard12.conf
>../logs/shard22.log && ./mongod -f /data/server/mongodb-3.4.4/conf/shard22.conf
>../logs/shard32.log && ./mongod -f /data/server/mongodb-3.4.4/conf/shard32.conf

mongodb搭建集群副本集及分片处理

V03 机器  shard-start.sh

#!/bin/bash
>../logs/shard13.log && ./mongod -f /data/server/mongodb-3.4.4/conf/shard13.conf
>../logs/shard23.log && ./mongod -f /data/server/mongodb-3.4.4/conf/shard23.conf
>../logs/shard33.log && ./mongod -f /data/server/mongodb-3.4.4/conf/shard33.conf

mongodb搭建集群副本集及分片处理

在 v01 v02 v03每一台服务器分别启动配置服务器。chmod 777 shard-start.sh   && ./shard-start.sh 执行文件

mongodb搭建集群副本集及分片处理

3.1.2shard1 shard2 shard3初始化
3.1.2.1分片 shard1 初始化 :
./mongo 10.10.10.36:22001/admin
db.runCommand(
{
"replSetInitiate":
{
"_id":"shard1",
"members":
[
{
"_id":1,
"host":"10.10.10.36:22001",priority:10
},
{
"_id":2,
"host":"10.10.10.37:22001",priority:8
},
{
"_id":3,
"host":"10.10.10.38:22001",arbiterOnly:true
}
]
}
});
3.1.2.2分片 shard2 初始化 :
./mongo 10.10.10.36:22002/admin
db.runCommand(
{
"replSetInitiate":
{
"_id":"shard2",
"members":
[
{
"_id":1,
"host":"10.10.10.36:22002",priority:8
},
{
"_id":2,
"host":"10.10.10.37:22002",priority:10
},
{
"_id":3,
"host":"10.10.10.38:22002",arbiterOnly:true
}
]
}
});

3.1.2.3分片 shard3 初始化 :
./mongo 10.10.10.36:22003/admin
db.runCommand(
{
"replSetInitiate":
{
"_id":"shard3",
"members":
[
{
"_id":1,
"host":"10.10.10.36:22003"
},
{
"_id":2,
"host":"10.10.10.37:22003"
},
{
"_id":3,
"host":"10.10.10.38:22003",arbiterOnly:true
}
]
}
});

移除分片使用

db.runCommand(
{"removeshard" : "shard2/10.10.10.36:22002,10.10.10.37:22002,10.10.10.38:22002"}
);

mongodb搭建集群副本集及分片处理

mongodb搭建集群副本集及分片处理

3.2config启动
在v01, v02, v03目录 /data/server/mongodb-3.4.4/bin 建 config-start.sh 执行文件
3.2.1 config 执行程序sh  config-start.sh

>../logs/config01.log && ./mongod -f /data/server/mongodb-3.4.4/conf/config.conf && tailf ../logs/config01.log

在v01 v02 v03 机器上执行  ./ config-start.sh

mongodb搭建集群副本集及分片处理

3.2.2 conifg初始化
将config启动后,进行初始化, 连接 configSvr商品进行配置初始化
./mongo 10.10.10.36:21000/admin

db.runCommand(
{
"replSetInitiate":
{
"_id":"cfgReplSet",
"members":
[
{
"_id":1,
"host":"10.10.10.36:21000"
},
{
"_id":2,
"host":"10.10.10.37:21000"
},
{
"_id":3,
"host":"10.10.10.38:21000"
}
]
}
});

Config节点查看状态

mongodb搭建集群副本集及分片处理

mongodb搭建集群副本集及分片处理

如果各台机器把config启动完后,而不进行初始化,出现启动时时报错,

3.3mongos启动
3.3.1 mongos启动
在v01, v02, v03目录 /data/server/mongodb-3.4.4/bin 建 route-start.sh 执行文件

>../logs/route.log && ./mongos -f /data/server/mongodb-3.4.4/conf/mongos-route.conf  && tailf ../logs/route.log

mongodb搭建集群副本集及分片处理

3.3.2 分片生效
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到 mongos 路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
./mongo 127.0.0.1:20000/admin

串联路由服务器与分配副本集1
db.runCommand({
addshard : "shard1/10.10.10.36:22001,10.10.10.37:22001,10.10.10.38:22001"
});
串联路由服务器与分配副本集2
db.runCommand({
addshard : "shard2/10.10.10.36:22002,10.10.10.37:22002,10.10.10.38:22002"
});
串联路由服务器与分配副本集3
db.runCommand({
addshard : "shard3/10.10.10.36:22003,10.10.10.37:22003,10.10.10.38:22003"
});
#查看分片服务器的配置
    db.runCommand( { listshards : 1 } );

mongodb搭建集群副本集及分片处理

因为10.10.10.38是每个分片副本集的仲裁节点,所以在上面结果没有列出来。

4.集群安全认证
4.1Key生成
在v01 v02 v03 机器 分别建立 key 文件夹
mkdir –p /data/server/mongodb-3.4.4/key 
在文件夹key运行以下命令
>openssl rand -base64 753 >keyfile
>chmod 600 keyfile #重点 必须

mongodb搭建集群副本集及分片处理

4.2配置文件修改
分别修改 机器 v01  v02  v03 所对应配置,conf目录 shard (分片) 、config(配置)、route(路由)下对对应的文件夹下 添加 keyFile 所对应路径 
keyFile=/data/server/mongodb-3.4.4/key/keyfile
#针对于集群:
      添加此行 就 增加了权限如auth=true
v01 机器 : config.conf  route.conf  shard11.conf  shard21.conf  shard31.conf  shard41.conf(新加入分片)
v02 机器 :config.conf  route.conf  shard12.conf  shard22.conf  shard32.conf  shard42.conf(新加入分片)
v03 机器 :config.conf  route.conf  shard13.conf  shard23.conf  shard33.conf  shard43.conf(新加入分片)
4.3增加权限实例
admin 库中  增加用户权限
./mongo 127.0.0.1:20000/admin
db.createUser( { user: "kenny", pwd: "123456",roles: [ "userAdminAnyDatabase" ] } )
db.auth("kenny","123456")

mongodb搭建集群副本集及分片处理

针对于数据库 testdb 建用户
./mongo 127.0.0.1:20000/admin
use testdb
db.createUser( { user: "auth01", pwd: "123456",roles: [ "readWrite" ] } )
如果不以用户登录至数据库,操作相关数据(报没有权限异常),如以下:

mongodb搭建集群副本集及分片处理

登录操作后:
./mongo 127.0.0.1:20000/testdb -u auth01 -p 123456
便可执行数据库test相关操作

权限管理详见4.4 安全管理

4.4安全管理
1.  mongodb是没有默认管理员账号,所以要先添加管理员账号,在开启权限认证。
2.  切换到admin数据库,添加的账号才是管理员账号。
3.  用户只能在用户所在数据库登录,包括管理员账号。
4.  管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。

#

mongdb 角色

数据库角色

1

Read

允许用户读取指定数据库

2

readWrite

允许用户读写指定数据库

数据库管理角色(Database Administration Roles)

3

dbAdmin

允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile

4

userAdmin

允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户

集群管理角色(Cluster Administration Roles)

5

clusterAdmin

只在admin数据库中可用 ,赋予用户所有分片和复制集相关函数的管理权限。

6

clusterManager

授予管理和监控集群的权限

7

clusterMonitor

授予监控集群的权限,对监控工具具有readonly的权限

跨库角色(All-Database Roles)

8

readAnyDatabase

只在admin数据库中可用,赋予用户所有数据库的读权限

9

readWriteAnyDatabase

只在admin数据库中可用,赋予用户所有数据库的读写权限

10

userAdminAnyDatabase

只在admin数据库中可用,赋予用户所有数据库的userAdmin权限

11

dbAdminAnyDatabase

只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。

超级管理员

12

root

只在admin数据库中可用。超级账号,超级权限


在测试中新建了4种角色 分别如下:

#

用户名

密码

角色权限

数据库

1

root

123456

root

admin

2

Kenny

123456

userAdminAnyDatabase

admin

3

auth01

123456

readWrite

testdb

4

zjyr

Zjyr

read

authdb

5

zjy

Zjy

readWrite

authdb


查询数据库所有用户
db.system.users.find()

mongodb搭建集群副本集及分片处理

在admin数据库中,查询admin 该库中的用户 及 角色 

useadmin

db.auth(“kenny”,”123456”)

show users

mongodb搭建集群副本集及分片处理

./127.0.0.1:20000/admin 
# userAdminAnyDatabase权限
db.createUser( { user: "kenny", pwd: "123456",roles: [ "userAdminAnyDatabase" ] } )
db.auth(“kenny”,” 123456”);
#  root超级管理员权限
db.createUser( { user: "root", pwd: "123456",roles: [ "root" ] } ) 
db.auth(“root”,” 123456”);
#当前库testdb中创建
use testdb
db.createUser( { user: "auth01", pwd: "123456",roles: [ "readWrite" ] } )
db.auth(“auth01”,” 123456”);
#当前库 authdb中创建
use authdb
#read权限
db.createUser({user: "zjyr",pwd: "zjyr",roles: ["read"]})
# readWrite
db.createUser({user: "zjy",pwd: "zjy",roles: ["readWrite"]})
#查看该数据库用户及角色
show users

mongodb搭建集群副本集及分片处理

创建一个数据库 authdb在测试mongdodb用户权限功能
在admin数据库中权限为 root 才能创建数据库,非root 权限不能创建数库

mongodb搭建集群副本集及分片处理

4.4.1角色权限添加
新建角色1:zjy  权限为:readWrite
新建角色2:zjyr 权限为:read
use authdb
#角色1 zjy  
db.createUser({user: "zjy",pwd: "zjy",roles: ["readWrite"]})
#角色2 zjyr
db.createUser({user: "zjyr",pwd: "zjyr",roles: ["read"]})

mongodb搭建集群副本集及分片处理

在admin库用,尝试用非root权限进行建库authdb及为authdb库建立表table1,报权限错误
use admin
#权限为 userAdminAnyDatabase
db.auth(“kenny”,”123456”);
db.runCommand( { shardcollection : "authdb.table1",key : {id: 1} } )

mongodb搭建集群副本集及分片处理

在admin库中,用用户root 权限root  为数据库authdb 建立 table1 表,id 为片键
use admin
db.auth(“root”,“123456”);
db.runCommand( { shardcollection : "authdb.table1",key : {id: 1} } )

4.4.2 角色 1 操作 - 读写权限
并登录 authdb库zjy/zjy ,角色为readwrite权限 
use authdb
db.auth(“zjy”,” zjy”);
#插入数据
db.table1.insert({"id":1,"c1":2});
#写入成功

mongodb搭建集群副本集及分片处理

4.4.2角色 2 操作 - 读权限
用读权限操作登录,进行写操作,报以下异常!
#角色只有读权限登录 
use authdb
db.auth(“zjya”,” zjya”)
db.table1.insert({"id":1,"c1":2})

mongodb搭建集群副本集及分片处理

以上账号都是 当前数据库 创建账号,并授权认证登录的,要是不在当前数据库下会怎么样?
4.4.3 不在当前数据库创建角色 
在库中 admin  分别创建 testdb ,authdb 库中 dxy/dxy账号 
use admin
db.createUser(
    {
       user: "dxy",
       pwd: "dxy",
       roles: [
          { role: "readWrite", db: "testdb" },
          { role: "readWrite", db: "authdb" }         
      ]
     }
  )

mongodb搭建集群副本集及分片处理

到对应的库登录认证(在admin下创建的帐号,不能直接在其他库验证),
报分别在testdb , authdb 库中 认证,权限错误
use testdb
db.auth(“dxy”,”dxy”);
use authdb
db.auth(“dxy”,”dxy”);

mongodb搭建集群副本集及分片处理

只能在帐号创建库下认证,再去其他库进行操作。

mongodb搭建集群副本集及分片处理

mongodb搭建集群副本集及分片处理

4.4.4 删除角色
db.dropUser("user1");
#返回结果
True

mongodb搭建集群副本集及分片处理

mongodb搭建集群副本集及分片处理

4.4.5 更改密码
use authdb
#更改密码
db.changeUserPassword('auth02','11111');
#对更改后的密码auth02 进行登录 
db.auth("auth02","123456");
Error: Authentication failed.
0
db.auth("auth02","11111");
1

mongodb搭建集群副本集及分片处理

5.分片管理
5.1添加文片
将 keyFile屏蔽掉,不进行验证
v01 v02 v03 机器建文件夹
v01 机器建立文件夹在
/data/server/mongodb-3.4.4/data/shard41
v02 机器建立文件夹在
/data/server/mongodb-3.4.4/data/shard42
v03 机器建立文件夹在
/data/server/mongodb-3.4.4/data/shard43
Shard4 端口规划:22004

5.1.1 shard4  配置
  机器 v01 分片配置 shard41.conf
dbpath=/data/server/mongodb-3.4.4/data/shard41
logpath=/data/server/mongodb-3.4.4/logs/shard41.log
pidfilepath=/data/server/mongodb-3.4.4/pid/shard41.pid
directoryperdb=true
logappend=true
replSet=shard4
port=22004
fork=true
shardsvr=true
journal=true
oplogSize=64

机器 v02 分片配置 shard42.conf
dbpath=/data/server/mongodb-3.4.4/data/shard42
logpath=/data/server/mongodb-3.4.4/logs/shard42.log
pidfilepath=/data/server/mongodb-3.4.4/pid/shard42.pid
directoryperdb=true
logappend=true
replSet=shard4
port=22004
fork=true
shardsvr=true
journal=true
oplogSize=64

机器 v03 分片配置 shard43.conf
dbpath=/data/server/mongodb-3.4.4/data/shard43
logpath=/data/server/mongodb-3.4.4/logs/shard43.log
pidfilepath=/data/server/mongodb-3.4.4/pid/shard43.pid
directoryperdb=true
logappend=true
replSet=shard4
port=22004
fork=true
shardsvr=true
journal=true
oplogSize=64
  
5.1.2 程序启动
  切换到目录 
 cd  /mongod -f /data/server/mongodb-3.4.4/bin文件夹
   V01 机器 
>../logs/shard41.log && ./mongod -f /data/server/mongodb-3.4.4/conf/shard41.conf
mongodb搭建集群副本集及分片处理
V02 机器 
>../logs/shard42.log && ./mongod -f /data/server/mongodb-3.4.4/conf/shard42.conf

mongodb搭建集群副本集及分片处理

V03 机器 
>../logs/shard43.log && ./mongod -f /data/server/mongodb-3.4.4/conf/shard43.conf

mongodb搭建集群副本集及分片处理

5.1.3 shard4 初始化
./mongo 127.0.0.1:22004/admin

db.runCommand(
{
"replSetInitiate":
{
"_id":"shard4",
"members":
[
{
"_id":1,
"host":"10.10.10.36:22004",priority:1
},
{
"_id":2,
"host":"10.10.10.37:22004",arbiterOnly:true
},
{
"_id":3,
"host":"10.10.10.38:22004",priority:8
}
]
}
});
db.runCommand( 
{ addshard : "shard4/10.10.10.36:22004,10.10.10.37:22004,10.10.10.38:22004"}
);
db.runCommand( { listshards : 1 } );

mongodb搭建集群副本集及分片处理

查看分片状态
Rs.status()

mongodb搭建集群副本集及分片处理

mongodb搭建集群副本集及分片处理

以上配置由于机器v03 设置优先级 priority:8 要高于 机器v01  priority:1, shard4初始化后(v02 为仲裁节点)
V03机器 主节点

mongodb搭建集群副本集及分片处理

5.1.4 shard4 生效(添加到集群)
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到 mongos 路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
./mongo 127.0.0.1:20000/admin
串联路由服务器与分配副本集4
db.runCommand( 
{ addshard : "shard4/10.10.10.36:22004,10.10.10.37:22004,10.10.10.38:22004"}
);
#查看分片服务器的配置
db.runCommand( { listshards : 1 } );

mongodb搭建集群副本集及分片处理

Shard4 分片 V02机器设置的为仲裁节点,则没有将对应的IP列出来 
表示 己增加新的分片


向testdb下 表table4发送10W消息,消息会自己分发到shard4上
而且之前在shard1  shard2  shard3 三个分片上的数据会转移一部分至 shard4上
如下截图:
db.table4.stats()

mongodb搭建集群副本集及分片处理

由于shard4 分片,v02 机器 配置为仲裁节点,该机器不存储数据,
db.table4.stats() 查看,测没有shard4分片存储信息

5.2删除分片

分片被删除之后,数据被移到其他分片中,不会丢失。分片移除后再次添加会出现的问题可以参考http://blog.csdn.net/liqi_q/article/details/79047361

查看分片列表  db.runCommand( { listshards : 1 } );

mongodb搭建集群副本集及分片处理

移除分片shard4 :   db.runCommand( { removeShard: "shard4" } ) 

mongodb搭建集群副本集及分片处理

下面是操作成功的图片分片列表中已经移除了分片shard4

mongodb搭建集群副本集及分片处理

主分片进行转移观察shard4存储的数据变化 以table1为例子

mongodb搭建集群副本集及分片处理

shard4分片被删除后分片shard4上面的数据已经自动转移到了其他分片上

mongodb搭建集群副本集及分片处理

5.3管理明细
5.3.1分片chucks 分布
查看table4 分片 shard1 shard2 shard3 shard4 分布情况,
每个分片的chuck数量,
每个chuck 占的容量  (data per Chuck)
每个chuck 占的文档数(docs per Chuck) 
./mongo 127.0.0.1:20000/admin
use testdb
db.table4.getShardDistribution();

mongodb搭建集群副本集及分片处理