5、用户管理 *****
注意:
验证库,建立用户时use到的库,在使用用户时,要加上验证库才能登陆。
对于管理员用户,必须在admin下创建.
1. 建用户时,use到的库,就是此用户的验证库
2. 登录时,必须明确指定验证库才能登录
3. 通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库
4. 如果直接登录到数据库,不进行use,默认的验证库是test,不是我们生产建议的.
用户管理例子:
基本语法说明:
user:用户名
pwd:密码
roles:
role:角色名
db:作用对象
role:root, readWrite,read 权限
-- 1. 创建超级管理员:管理所有数据库(必须use admin再去创建) *****
mongo use admin db.createUser( { user: "root", pwd: "root123", roles: [ { role: "root", db: "admin" } ] } ) 验证用户 db.auth(‘root‘,‘root123‘) 库和用户验证 配置文件中,加入以下配置 security: authorization: enabled 重启mongodb 登录验证 mongo -uroot -proot123 admin mongo -uroot -proot123 10.0.0.51/admin
-- 3、创建对app数据库,读、写权限的用户app01 *****
(1)超级管理员用户登陆 mongo -uroot -proot123 admin (2)选择一个验证库 use app (3)创建用户 db.createUser( { user: "app01", pwd: "app01", roles: [ { role: "readWrite" , db: "app" } ] } ) mongo -uapp01 -papp01 10.0.0.53/app -- 4、创建app数据库读写权限的用户并对test数据库具有读权限: mongo -uroot -proot123 10.0.0.51/admin use app db.createUser( { user: "app03", pwd: "app03", roles: [ { role: "readWrite", db: "app" }, { role: "read", db: "test" }]}) -- 5、查询mongodb中的用户信息 mongo -uroot -proot123 10.0.0.53/admin db.system.users.find().pretty() -- 6、删除用户(root身份登录,use到验证库) 删除用户 mongo -uroot -proot123 10.0.0.51/admin use app db.dropUser("app01")
6. MongoDB复制集RS(ReplicationSet)******
6.1 基本原理
基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB) Paxos(mysql MGR 用的是变种))
如果发生主库宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知
客户端程序,主库已经发生切换了。应用就会连接到新的主库。
6.2 Replication Set配置过程详解
6.2.1 规划
三个以上的mongodb节点(或多实例)
6.2.2 环境准备
多个端口:
28017、28018、28019、28020
多套目录: su - mongod mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log 多套配置文件 /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/mongod.conf /mongodb/28019/conf/mongod.conf /mongodb/28020/conf/mongod.conf 配置文件内容: cat > /mongodb/28017/conf/mongod.conf <<EOF systemLog: destination: file path: /mongodb/28017/log/mongodb.log logAppend: true storage: journal: enabled: true dbPath: /mongodb/28017/data directoryPerDB: true #engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true processManagement: fork: true net: bindIp: 10.0.0.53,127.0.0.1 port: 28017 replication: oplogSizeMB: 2048 replSetName: my_repl EOF \cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/ \cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/ \cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/ sed ‘s#28017#28018#g‘ /mongodb/28018/conf/mongod.conf -i sed ‘s#28017#28019#g‘ /mongodb/28019/conf/mongod.conf -i sed ‘s#28017#28020#g‘ /mongodb/28020/conf/mongod.conf -i 启动多个实例备用: mongod -f /mongodb/28017/conf/mongod.conf mongod -f /mongodb/28018/conf/mongod.conf mongod -f /mongodb/28019/conf/mongod.conf mongod -f /mongodb/28020/conf/mongod.conf 查看启动状态 netstat -lnp|grep 280
6.3 配置普通复制集:
1主2从,从库普通从库
mongo --port 28017 admin config = {_id: ‘my_repl‘, members: [ {_id: 0, host: ‘10.0.0.53:28017‘}, {_id: 1, host: ‘10.0.0.53:28018‘}, {_id: 2, host: ‘10.0.0.53:28019‘}] } rs.initiate(config)
查看整体复制集状态
6.4 1主1从1个arbiter(专门投票的,不参与主从复制)
mongo -port 28017 admin config = {_id: ‘my_repl‘, members: [ {_id: 0, host: ‘10.0.0.53:28017‘}, {_id: 1, host: ‘10.0.0.53:28018‘}, {_id: 2, host: ‘10.0.0.53:28019‘,"arbiterOnly":true}] } rs.initiate(config)
查看复制集配置信息
6.5 复制集管理操作
6.5.1 查看复制集状态
rs.status(); //查看整体复制集状态
rs.isMaster(); // 查看当前是否是主节点
rs.conf(); //查看复制集配置信息
6.5.2 添加删除节点
rs.remove("ip:port"); // 删除一个节点
rs.add("ip:port"); // 新增从节点
rs.addArb("ip:port"); // 新增仲裁节点
添加普通节点
添加arbiter节点
6.5.3 特殊从节点
介绍:
添加arbiter节点需要把原来的节点删除,在重新添加
arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
hidden节点:隐藏节点,不参与选主,也不对外提供服务。
delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)
一般情况下会将delay+hidden一起配置使用
配置延时节点(一般延时节点也配置成hidden)
cfg=rs.conf()
cfg.members[2].priority=0 节点下标索引
cfg.members[2].hidden=true
cfg.members[2].slaveDelay=120
rs.reconfig(cfg)
取消以上配置
cfg=rs.conf()
cfg.members[2].priority=1
cfg.members[2].hidden=false
cfg.members[2].slaveDelay=0
rs.reconfig(cfg)
--副本集角色切换(不要人为随便操作)
admin> rs.stepDown()
注:
admin> rs.freeze(300) //锁定从,使其不会转变成主库
freeze()和stepDown单位都是秒。
查看副本节点(监控主从延时)
admin> rs.printSlaveReplicationInfo()
MongoDB Sharding Cluster 分片集群 *****
原理图
至少四台物理机
路由router 用户连接 把请求给config server ,不做数据存储,无数据
**配置管理节点config server 复制集 不支持arbiter
**存储节点shard 复制集
规划:
10个实例:38017-38026
(1)configserver:
3台构成的复制集(1主两从,不支持arbiter)38018-38020(复制集名字configsvr)
(2)shard节点:
sh1:38021-23 (1主两从,其中一个节点为arbiter,复制集名字sh1)
sh2:38024-26 (1主两从,其中一个节点为arbiter,复制集名字sh2)
配置过程
shard复制集配置:
2.1目录创建: mkdir -p /mongodb/38021/conf /mongodb/38021/log /mongodb/38021/data mkdir -p /mongodb/38022/conf /mongodb/38022/log /mongodb/38022/data mkdir -p /mongodb/38023/conf /mongodb/38023/log /mongodb/38023/data mkdir -p /mongodb/38024/conf /mongodb/38024/log /mongodb/38024/data mkdir -p /mongodb/38025/conf /mongodb/38025/log /mongodb/38025/data mkdir -p /mongodb/38026/conf /mongodb/38026/log /mongodb/38026/data 2.2修改配置文件: sh1: cat > /mongodb/38021/conf/mongodb.conf<<EOF systemLog: destination: file path: /mongodb/38021/log/mongodb.log logAppend: true storage: journal: enabled: true dbPath: /mongodb/38021/data directoryPerDB: true #engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true net: bindIp: 10.0.0.53,127.0.0.1 port: 38021 replication: oplogSizeMB: 2048 replSetName: sh1 sharding: clusterRole: shardsvr processManagement: fork: true EOF cp /mongodb/38021/conf/mongodb.conf /mongodb/38022/conf/ cp /mongodb/38021/conf/mongodb.conf /mongodb/38023/conf/ sed ‘s#38021#38022#g‘ /mongodb/38022/conf/mongodb.conf -i sed ‘s#38021#38023#g‘ /mongodb/38023/conf/mongodb.conf -i sh2: cat > /mongodb/38024/conf/mongodb.conf<<EOF systemLog: destination: file path: /mongodb/38024/log/mongodb.log logAppend: true storage: journal: enabled: true dbPath: /mongodb/38024/data directoryPerDB: true wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true net: bindIp: 10.0.0.53,127.0.0.1 port: 38024 replication: oplogSizeMB: 2048 replSetName: sh2 sharding: clusterRole: shardsvr processManagement: fork: true EOF cp /mongodb/38024/conf/mongodb.conf /mongodb/38025/conf/ cp /mongodb/38024/conf/mongodb.conf /mongodb/38026/conf/ sed ‘s#38024#38025#g‘ /mongodb/38025/conf/mongodb.conf -i sed ‘s#38024#38026#g‘ /mongodb/38026/conf/mongodb.conf -i 2.3启动所有节点,并搭建复制集: mongod -f /mongodb/38021/conf/mongodb.conf mongod -f /mongodb/38022/conf/mongodb.conf mongod -f /mongodb/38023/conf/mongodb.conf mongod -f /mongodb/38024/conf/mongodb.conf mongod -f /mongodb/38025/conf/mongodb.conf mongod -f /mongodb/38026/conf/mongodb.conf mongo --port 38021 admin config = {_id: ‘sh1‘, members: [ {_id: 0, host: ‘10.0.0.53:38021‘}, {_id: 1, host: ‘10.0.0.53:38022‘}, {_id: 2, host: ‘10.0.0.53:38023‘,"arbiterOnly":true}] } rs.initiate(config) mongo --port 38024 admin config = {_id: ‘sh2‘, members: [ {_id: 0, host: ‘10.0.0.53:38024‘}, {_id: 1, host: ‘10.0.0.53:38025‘}, {_id: 2, host: ‘10.0.0.53:38026‘,"arbiterOnly":true}] } rs.initiate(config)
=-=----=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
3、config节点配置:
3.1目录创建: mkdir -p /mongodb/38018/conf /mongodb/38018/log /mongodb/38018/data mkdir -p /mongodb/38019/conf /mongodb/38019/log /mongodb/38019/data mkdir -p /mongodb/38020/conf /mongodb/38020/log /mongodb/38020/data 3.2修改配置文件: cat > /mongodb/38018/conf/mongodb.conf <<EOF systemLog: destination: file path: /mongodb/38018/log/mongodb.conf logAppend: true storage: journal: enabled: true dbPath: /mongodb/38018/data directoryPerDB: true #engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true net: bindIp: 10.0.0.53,127.0.0.1 port: 38018 replication: oplogSizeMB: 2048 replSetName: configReplSet sharding: clusterRole: configsvr processManagement: fork: true EOF cp /mongodb/38018/conf/mongodb.conf /mongodb/38019/conf/ cp /mongodb/38018/conf/mongodb.conf /mongodb/38020/conf/ sed ‘s#38018#38019#g‘ /mongodb/38019/conf/mongodb.conf -i sed ‘s#38018#38020#g‘ /mongodb/38020/conf/mongodb.conf -i 3.3启动节点,并配置复制集 mongod -f /mongodb/38018/conf/mongodb.conf mongod -f /mongodb/38019/conf/mongodb.conf mongod -f /mongodb/38020/conf/mongodb.conf mongo --port 38018 admin config = {_id: ‘configReplSet‘, members: [ {_id: 0, host: ‘10.0.0.53:38018‘}, {_id: 1, host: ‘10.0.0.53:38019‘}, {_id: 2, host: ‘10.0.0.53:38020‘}] } rs.initiate(config)
注:configserver 可以是一个节点,官方建议复制集。configserver不能有arbiter。
新版本中,要求必须是复制集。
注:mongodb 3.4之后,虽然要求config server为replica set,但是不支持arbiter
=============================================================================
4、mongos节点配置:
4.1创建目录: mkdir -p /mongodb/38017/conf /mongodb/38017/log 4.2配置文件: cat >/mongodb/38017/conf/mongos.conf<<EOF systemLog: destination: file path: /mongodb/38017/log/mongos.log logAppend: true net: bindIp: 10.0.0.53,127.0.0.1 port: 38017 sharding: configDB: configReplSet/10.0.0.53:38018,10.0.0.53:38019,10.0.0.53:38020 processManagement: fork: true EOF 4.3启动mongos mongos -f /mongodb/38017/conf/mongos.conf
5、分片集群操作:
连接到其中一个mongos(10.0.0.53),做以下配置
(1)连接到mongs的admin数据库 # su - mongod $ mongo 10.0.0.53:38017/admin (2)添加分片 db.runCommand( { addshard : "sh1/10.0.0.53:38021,10.0.0.53:38022,10.0.0.53:38023",name:"shard1"} ) db.runCommand( { addshard : "sh2/10.0.0.53:38024,10.0.0.53:38025,10.0.0.53:38026",name:"shard2"} ) (3)列出分片 mongos> db.runCommand( { listshards : 1 } ) (4)整体状态查看 mongos> sh.status();
## RANGE分片配置及测试
test库下的vast大表进行手工分片(Chunk默认大小64M)
1、激活数据库分片功能 mongo --port 38017 admin admin> ( { enablesharding : "数据库名称" } ) eg: admin> db.runCommand( { enablesharding : "test" } ) 2、指定分片建对集合分片 eg:范围片键 --创建索引 use test > db.vast.ensureIndex( { id: 1 } ) --开启分片 use admin > db.runCommand( { shardcollection : "test.vast",key : {id: 1} } ) 3、集合分片验证 admin> use test test> for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); } test> db.vast.stats() 4、分片结果测试 shard1: mongo --port 38021 db.vast.count(); shard2: mongo --port 38024 db.vast.count();
----------------------------------------------------
4、Hash分片例子:
对oldboy库下的vast大表进行hash
创建哈希索引
(1)对于oldboy开启分片功能 mongo --port 38017 admin use admin admin> db.runCommand( { enablesharding : "oldboy" } ) (2)对于oldboy库下的vast表建立hash索引 use oldboy oldboy> db.vast.ensureIndex( { id: "hashed" } ) (3)开启分片 use admin admin > sh.shardCollection( "oldboy.vast", { id: "hashed" } ) (4)录入10w行数据测试 use oldboy for(i=1;i<100000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); } (5)hash分片结果测试 mongo --port 38021 use oldboy db.vast.count(); mongo --port 38024 use oldboy db.vast.count();
查看分片的详细信息,shard集群信息
admin> sh.status() *****
5、删除分片节点(谨慎)
(1)确认blance是否在工作
sh.getBalancerState()
(2)删除shard2节点(谨慎)
mongos> db.runCommand( { removeShard: "shard2" } )
注意:删除操作一定会立即触发blancer。
6、balancer操作 *****
介绍:
mongos的一个重要功能,自动巡查所有shard节点上的chunk的情况,自动做chunk迁移。
均衡策略,该策略会实现查找并收集要迁移的chunk。
什么时候工作?
1、自动运行,会检测系统不繁忙的时候做迁移
2、在做节点删除的时候,立即开始迁移工作
3、balancer只能在预设定的时间窗口内运行 *****
有需要时可以关闭和开启blancer(备份的时候)
mongos> sh.stopBalancer() 或 sh.setBalancerState( falsee )
mongos> sh.startBalancer() 或 sh.setBalancerState( true )
7、自定义 自动平衡进行的时间段
https://docs.mongodb.com/manual/tutorial/manage-sharded-cluster-balancer/#schedule-the-balancing-window
// connect to mongos
mongo --port 38017 admin use config sh.setBalancerState( true )
# 时间凌晨三点到五点进行迁移 db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "3:00", stop : "5:00" } } }, true ) sh.getBalancerWindow() sh.status()