在 data 目录中 建立 每个分片存储路径的
v01 机器data 目录中建立 shard11 、shard21、shard31 目录
v02 机器data 目录中建立 shard12 、shard22、shard32 目录
v03 机器data 目录中建立 shard13 、shard23、shard33 目录
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
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
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
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
#!/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
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
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
在 v01 v02 v03每一台服务器分别启动配置服务器。chmod 777 shard-start.sh && ./shard-start.sh 执行文件
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"}
);
>../logs/config01.log && ./mongod -f /data/server/mongodb-3.4.4/conf/config.conf && tailf ../logs/config01.log
在v01 v02 v03 机器上执行 ./ config-start.sh
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节点查看状态
如果各台机器把config启动完后,而不进行初始化,出现启动时时报错,
>../logs/route.log && ./mongos -f /data/server/mongodb-3.4.4/conf/mongos-route.conf && tailf ../logs/route.log
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 } );
因为10.10.10.38是每个分片副本集的仲裁节点,所以在上面结果没有列出来。
针对于数据库 testdb 建用户
./mongo 127.0.0.1:20000/admin
use testdb
db.createUser( { user: "auth01", pwd: "123456",roles: [ "readWrite" ] } )
如果不以用户登录至数据库,操作相关数据(报没有权限异常),如以下:
登录操作后:
./mongo 127.0.0.1:20000/testdb -u auth01 -p 123456
便可执行数据库test相关操作
权限管理详见4.4 安全管理
# |
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 |
在admin数据库中,查询admin 该库中的用户 及 角色
useadmin
db.auth(“kenny”,”123456”)
show users./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
创建一个数据库 authdb在测试mongdodb用户权限功能
在admin数据库中权限为 root 才能创建数据库,非root 权限不能创建数库
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"]})
在admin库用,尝试用非root权限进行建库authdb及为authdb库建立表table1,报权限错误
use admin
#权限为 userAdminAnyDatabase
db.auth(“kenny”,”123456”);
db.runCommand( { shardcollection : "authdb.table1",key : {id: 1} } )
在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});
#写入成功
4.4.2角色 2 操作 - 读权限
用读权限操作登录,进行写操作,报以下异常!
#角色只有读权限登录
use authdb
db.auth(“zjya”,” zjya”)
db.table1.insert({"id":1,"c1":2})
以上账号都是 当前数据库 创建账号,并授权认证登录的,要是不在当前数据库下会怎么样?
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" }
]
}
)
到对应的库登录认证(在admin下创建的帐号,不能直接在其他库验证),
报分别在testdb , authdb 库中 认证,权限错误
use testdb
db.auth(“dxy”,”dxy”);
use authdb
db.auth(“dxy”,”dxy”);
只能在帐号创建库下认证,再去其他库进行操作。
4.4.4 删除角色
db.dropUser("user1");
#返回结果
True
4.4.5 更改密码
use authdb
#更改密码
db.changeUserPassword('auth02','11111');
#对更改后的密码auth02 进行登录
db.auth("auth02","123456");
Error: Authentication failed.
0
db.auth("auth02","11111");
1
V03 机器
>../logs/shard43.log && ./mongod -f /data/server/mongodb-3.4.4/conf/shard43.conf
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 } );
查看分片状态
Rs.status()
以上配置由于机器v03 设置优先级 priority:8 要高于 机器v01 priority:1, shard4初始化后(v02 为仲裁节点)
V03机器 主节点
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 } );
Shard4 分片 V02机器设置的为仲裁节点,则没有将对应的IP列出来
表示 己增加新的分片
向testdb下 表table4发送10W消息,消息会自己分发到shard4上
而且之前在shard1 shard2 shard3 三个分片上的数据会转移一部分至 shard4上
如下截图:
db.table4.stats()
由于shard4 分片,v02 机器 配置为仲裁节点,该机器不存储数据,
db.table4.stats() 查看,测没有shard4分片存储信息
分片被删除之后,数据被移到其他分片中,不会丢失。分片移除后再次添加会出现的问题可以参考http://blog.csdn.net/liqi_q/article/details/79047361
查看分片列表 db.runCommand( { listshards : 1 } );
移除分片shard4 : db.runCommand( { removeShard: "shard4" } )
下面是操作成功的图片分片列表中已经移除了分片shard4
主分片进行转移观察shard4存储的数据变化 以table1为例子
shard4分片被删除后分片shard4上面的数据已经自动转移到了其他分片上