mongodb企业级应用管理

概要:

  1. mongoDB的聚合操作
  2. mongodb 集群:复制
  3. mongodb 集群:分片

 

一、 mongoDB的聚合操作


知识点:

  1. pipeline 聚合
  2. mapRedurce 聚合
  3. 在聚合中使用索引

 

1.pipeline 聚合

pipeline相关运算符:

  • $match :匹配过滤聚合的数据
  • $project:返回需要聚合的字段
  • $group:统计聚合数据

示例:

 

# $match 与 $project使用
db.emp.aggregate(
{$match:{"dep":{$eq:"客服部"}}},
{$project:{name:1,dep:1,salary:1}}
);

# $group 与 $sum 使用
db.emp.aggregate(
 {$project:{dep:1,salary:1}},
 {$group:{"_id":"$dep",total:{$sum:"$salary"}}}
 );

#  低于4000 忽略
db.emp.aggregate(
 {$match:{salary:{$gt:4000}}},
 {$project:{dep:1,salary:1}},
 {$group:{"_id":"$dep",total:{$sum:"$salary"}}} 
 );

# 基于多个字段 进行组合group  部门+职位进行统计
db.emp.aggregate(
 {$project:{dep:1,job:1,salary:1}},
 {$group:{"_id":{"dep":"$dep","job":"$job"},total:{$sum:"$salary"}}} 
 );


二次过滤

 

db.emp.aggregate(
 {$project:{dep:1,job:1,salary:1}},
 {$group:{"_id":{"dep":"$dep","job":"$job"},total:{$sum:"$salary"}}},
 {$match:{"$total":{$gt:10000}}} 
 );

 

2.mapRedurce 聚合

mapRedurce 说明:
    为什么需要 MapReduce?
     (1) 海量数据在单机上处理因为硬件资源限制,无法胜任
     (2) 而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度
     (3) 引入 MapReduce 框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将 分布式计算中的复杂性交由框架来处理

mongodb中mapRedurce的使用流程

  1. 创建Map函数,
  2. 创建Redurce函数
  3. 将map、Redurce 函数添加至集合中,并返回新的结果集
  4. 查询新的结果集

示例操作

 

// 创建map 对象 
var map1=function (){
	emit(this.job,1);
 }
// 创建reduce 对象 
 var reduce1=function(job,count){
 return Array.sum(count);
 }
 // 执行mapReduce 任务 并将结果放到新的集合 result 当中
db.emp.mapReduce(map1,reduce1,{out:"result"})
// 查询新的集合
db.result.find()

 

# 使用复合对象作为key
 var map2=function (){
	emit({"job":this.job,"dep":this.dep},1);
 }
 
 var reduce2=function(key,values){
	return values.length;
 }
 
db.emp.mapReduce(map2,reduce2,{out:"result2"}).find()

mapRedurce的原理
在map函数中使用emit函数添加指定的 key 与Value ,相同的key 将会发给Redurce进行聚合操作,所以Redurce函数中第二个参数 就是 所有集的数组。return 的显示就是聚合要显示的值。

 

3.在聚合中使用索引

通过Math内 可以包合对Math内可以包合对text 的运算
示例:

 

db.project.aggregate(
			{$match:{$text:{$search:"apache"}}},
			{$project:{"name":1,"price":1}},
			{$group:{_id:"$name",price:{$sum:"$price"}}}
)

关于索引
除了全文索引之外,还有单键索引。即整个字段的值作为索引。单键索引用值1和-1表示,分别代表正序和降序索引。

示例:
de 创建单键索引

 

db.emp.createIndex({"dep":1})

查看基于索引的执行计划

 

db.emp.find({"dep":"客服部"}).explain()

除了单键索引外还可以创建联合索引如下:

 

db.emp.createIndex({"dep":1,"job":-1})

查看 复合索引的执行计划

 

db.emp.find({"dep":"ddd"}).explain()

查看索引在排序当中的使用

 

db.emp.find().sort({"job":-1,"dep":1}).explain()

 

二、mongodb 的主从复制机制


知识点:

  1. 复制集群的架构
  2. 复制集群搭建
  3. 复制集群的选举配置

 

1.复制集群的架构

 

2.复制集群搭建基础示例

主节点配置

 

dbpath=/data/mongo/master
port=27017
fork=true
logpath=master.log
replSet=tulingCluster

从节点配置

 

dbpath=/data/mongo/slave
port=27018
fork=true
logpath=slave.log
replSet=tulingCluster

 

子节点配置2

 

dbpath=/data/mongo/slave2
port=27019
fork=true
logpath=slave2.log
replSet=tulingCluster
  •  分别启动三个节点
  •  进入其中一个节点

集群复制配置管理

 

#查看复制集群的帮助方法
rs.help()

添加配置

 

// 声明配置变量
var cfg ={"_id":"tulingCluster",
			"members":[
				{"_id":0,"host":"127.0.0.1:27017"},
				{"_id":1,"host":"127.0.0.1:27018"}
			]
		 }
// 初始化配置
rs.initiate(cfg)
// 查看集群状态
rs.status()

变更节点示例:

 

// 插入新的复制节点
rs.add("127.0.0.1:27019")
// 删除slave 节点
rs.remove("127.0.0.1:27019")
  •  演示复制状态
    •  进入主节点客户端
    •  插入数据
    •  进入从节点查看数据
    •  尝试在从节点下插入数据

注:默认节点下从节点不能读取数据。调用 rs.slaveOk() 解决。

 

3.复制集群选举操作

为了保证高可用,在集群当中如果主节点挂掉后,会自动 在从节点中选举一个 重新做为主节点。

  •  演示节点的切换操作
    •  kill 主节点
    •  进入从节点查看集群状态 。rs.status()

选举的原理:
在mongodb 中通过在 集群配置中的 rs.属性值大小来决定选举谁做为主节点,通时也可以设置arbiterOnly 为true 表示 做为裁判节点用于执行选举操作,该配置下的节点 永远不会被选举为主节点和从节点。

示例:

 

重新配置节点
var cfg ={"_id":"tulingCluster",
		  "protocolVersion" : 1,
		  "members":[
				{"_id":0,"host":"127.0.0.1:27017","priority":10},
				{"_id":1,"host":"127.0.0.1:27018","priority":2},
				{"_id":2,"host":"127.0.0.1:27019","arbiterOnly":true}
			]
		 }
// 重新装载配置,并重新生成集群节点。
rs.reconfig(cfg)
//重新查看集群状态
rs.status()

节点说明:
 PRIMARY 节点: 可以查询和新增数据
 SECONDARY 节点:只能查询 不能新增  基于priority 权重可以被选为主节点
 RBITER 节点: 不能查询数据 和新增数据 ,不能变成主节点

 

三、mongodb 中的分片机制


知识点:

  1. 分片的概念
  2. mongodb 中的分片架构
  3. 分片示例

 

1.为什么需要分片?

随着数据的增长,单机实例的瓶颈是很明显的。可以通过复制的机制应对压力,但mongodb中单个集群的 节点数量限制到了12个以内,所以需要通过分片进一步横向扩展。此外分片也可节约磁盘的存储。

 

1.mongodb 中的分片架构

分片中的节点说明:

  • 路由节点(mongos):用于分发用户的请求,起到反向代理的作用。
  • 配置节点(config):用于存储分片的元数据信息,路由节基于元数据信息 决定把请求发给哪个分片。(3.4版本之后,该节点,必须使用复制集。)
  • 分片节点(shard):用于实际存储的节点,其每个数据块默认为64M,满了之后就会产生新的数据库。

 

2.分片示例流程:

  1. 配置 并启动config 节点集群
  2. 配置集群信息
  3. 配置并启动2个shard 节点
  4. 配置并启动路由节点
  5. 添加shard 节点
  6. 添加shard 数据库
  7. 添加shard 集合
  8. 插入测试数据
  9. 检查数据的分布
  10. 插入大批量数据查看shard 分布
  11. 设置shard 数据块为一M
  12. 插入10万条数据

配置 并启动config 节点集群

 

节点1 config1-37017.conf

 

dbpath=/data/mongo/config1
port=37017
fork=true
logpath=logs/config1.log
replSet=configCluster
configsvr=true

 

节点2 config2-37018.conf

 

dbpath=/data/mongo/config2
port=37018
fork=true
logpath=logs/config2.log
replSet=configCluster
configsvr=true

进入shell 并添加 config 集群配置:

 

var cfg ={"_id":"configCluster",
		  "protocolVersion" : 1,
		  "members":[
				{"_id":0,"host":"127.0.0.1:37017"},
				{"_id":1,"host":"127.0.0.1:37018"}
			]
		 }
// 重新装载配置,并重新生成集群。
rs.initiate(cfg)

 

配置 shard 节点集群==============

 

# 节点1 shard1-47017.conf
dbpath=/data/mongo/shard1
port=47017
fork=true
logpath=logs/shard1.log
shardsvr=true

# 节点2 shard2-47018.conf
dbpath=/data/mongo/shard2
port=47018
fork=true
logpath=logs/shard2.log
shardsvr=true

配置 路由节点 mongos ==============

 

节点 route-27017.conf

 

port=27017
bind_ip=0.0.0.0
fork=true
logpath=logs/route.log
configdb=configCluster/127.0.0.1:37017,127.0.0.1:37018

// 添加分片节点

 

sh.status()
sh.addShard("127.0.0.1:47017");
sh.addShard("127.0.0.1:47018");

为数据库开启分片功能

 

sh.enableSharding("tuling")

为指定集合开启分片功能

 

 sh.shardCollection("tuling.emp",{"_id":1})

修改分片大小

 

 use config
 db.settings.find()
db.settings.save({_id:"chunksize",value:1})

尝试插入1万条数据:

 

 for(var i=1;i<=100000;i++){
			     db.emp.insert({"_id":i,"name":"copy"+i});
}

 

四、用户管理与数据集验证

// 创建管理员用户

 

use admin;
db.createUser({"user":"admin","pwd":"123456","roles":["root"]})
#验证用户信息
db.auth("admin","123456")
#查看用户信息
db.getUsers() 
# 修改密码
db.changeUserPassword("admin","123456")

以auth 方式启动mongod,需要添加auth=true 参数 ,mongdb 的权限体系才会起作用:

 

#以auth 方向启动mongod (也可以在mongo.conf 中添加auth=true 参数)
./bin/mongod -f conf/mongo.conf --auth
# 验证用户
use admin;
db.auth("admin","123456")

创建只读用户

 

db.createUser({"user":"dev","pwd":"123456","roles":["read"]})

重新登陆 验证用户权限

use luban  ;
db.auth("dev","123456")

附: mongoDb 企业集群架构应用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js企业级框架是一种用于构建可扩展和可维护的大型应用程序的框架。它提供了许多功能和工具,使开发者能够快速构建高性能的企业级应用。这些框架通常包括路由管理数据库连接、身份验证和授权、错误处理等功能。 在引用的代码中,我们可以看到使用了Egg.js框架来构建企业级应用。Egg.js是一个基于Node.js的开发框架,它提供了一种插件机制,可以轻松地扩展和定制功能。在示例中,通过创建一个Controller类,并在其中定义了一个index方法来处理获取模板的请求。通过路由配置,将API的地址与该Controller中的方法进行关联。 另外,在代码中还展示了如何连接和查询MongoDB数据库。通过导入一个名为@pick-star/cli-mongodb的模块,可以实现数据库的连接和查询操作。在示例中,通过指定数据库的连接地址和表名,使用mongodb模块进行查询并返回数据。 此外,还展示了如何使用日志记录功能。在示例中,通过ctx.logger.debug、ctx.logger.info、ctx.logger.warn和ctx.logger.error方法,可以在控制台输出不同级别的日志信息。这对于调试和问题排查非常有用。 总结起来,Node.js企业级框架是一种用于构建大型应用程序的框架,它提供了路由管理数据库连接、日志记录等功能。在示例中,我们看到了如何使用Egg.js框架、连接和查询MongoDB数据库以及使用日志记录功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值