重点:
使用场景 集群搭建(路由节点,配置节点,分片集群) 安全认证 索引类型(ttl-过期索引 分片时也要用到索引)
1 前言
NoSQL数据库四大家族
- 列存储 Hbase,
- 键值(Key-Value)存储 Redis,
- 图像存储 Neo4j,
- 文档存储 MongoDB
mongoDB相关命令:
启动:./bin/mongod -f mongo.conf(-f xxx表示指定配置文件启动)
连接到服务端:./bin/mongo --port 57017(不带端口默认连接到27017)
关闭服务器:连接到客服端后,use admin; db.shutdownServer();
2 MongoDB集合数据操作(CURD)
2.1 数据添加
- 插入单条数据 db.集合名.insert(文档)
文档的数据结构和JSON基本一样。 - 例如:
db.lg_resume_preview.insert({name:"张晓峰",birthday:new ISODate("2000-07-01"),expectSalary:15000,gender:0,city:"bj"})
没有指定 _id 这个字段 系统会自动生成 当然我们也可以指定 _id - 插入多条数据
db.集合名.insert([文档,文档])
2.2 数据查询
2.2.1. 比较条件查询
db.集合名.find(条件)
2.2.2 逻辑条件查询
and 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件
db.集合名.find({key1:value1, key2:value2}).pretty()
or 条件
db.集合名.find({ not:{$操作符:value}}).pretty()
2.2.3. 分页查询
db.集合名.find({条件}).sort({排序字段:排序方式})).skip(跳过的行数).limit(一页显示多少数据)
2.3. 数据更新 调用update
db.集合名.update(
,
,
{
upsert: ,
multi: ,
writeConcern:
}
)
ps:
:json格式的查询条件 三种更新类型:unset - 删除指定字段,set:{字段名:值}},{multi:true})
2.4 数据删除
db.collection.remove(
,
{
justOne: ,
writeConcern:
}
)
参数说明:
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值false,则删除所有匹配条件的文档。
writeConcern :(可选)用来指定mongod对写操作的回执行为。
例如:
db.lg_resume_previem.remove({expectSalary:18000})
3 实战
3.1 MongoDB的适用场景
3.1.1
● 网站数据:Mongo 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
● 缓存:由于性能很高,Mongo 也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
ps:(????mongo真的可以拿来做缓存吗)
● 大尺寸、低价值的数据:使用传统的关系型数据库存储一些大尺寸低价值数据时会比较浪费,在此之前,很多时候程序员往往会选择传统的文件进行存储。
● 高伸缩性的场景:Mongo 非常适合由数十或数百台服务器组成的数据库,Mongo 的路线图中已经包含对MapReduce 引擎的内置支持以及集群高可用的解决方案。
● 用于对象及JSON 数据的存储:Mongo 的BSON 数据格式非常适合文档化格式的存储及查询。
3.1.2 行业具体应用场景
● 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新。
● 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
● 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
● 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
● 直播,使用 MongoDB 存储用户信息、礼物信息等。
3.1.3 是否使用MongoDB
3.2 Spring Boot 访问 MongoDB
有MongoTemplate 方式和MongoRepository 方式,个人更倾向于MongoRepository 方式。
1、 jar包
org.springframework.boot
spring-boot-starter-data-mongodb
2.2.2.RELEASE
2、配置文件 application.properties
spring.data.mongodb.host=192.168.211.133
spring.data.mongodb.port=37017
spring.data.mongodb.database=lg_resume
3、编写实体类 并在实体类上打@Document(“集合名”)
4、编写 Repository 接口 继承 MongoRepository
方法具体参考
如果内置方法不够用 就自己定义 如:定义find|read|get 等开头的方法进行查询
5、从Spring容器中获取Repository对象 进行测试
3.3 复制集
主从结构没有自动故障转移功能,需要指定master和slave端,不推荐在生产中使用。mongodb4.0后不再支持主从复制,从而使用复制集。
复制集是由一组拥有相同数据集的mongod实例做组成的集群。
复制集是一个集群,它是2台及2台以上的服务器组成,以及复制集成员包括Primary主节点,secondary从节点和投票节点。
复制集提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,保证数据的安全性。
(仲裁节点也要写dbpath!!!)
3.4 分片
分片集群由分片、mongos路由器和配置服务器组成。
分片集群由以下3个服务组成:
- Shards Server: 每个shard由一个或多个mongod进程组成,用于存储数据。
- Router Server: 数据库集群的请求入口,所有请求都通过Router(mongos)进行协调,不需要在应用程序添加一个路由选择器,Router(mongos)就是一个请求分发中心它负责把应用程序的请求转发到对应的Shard服务器上。
- Config Server: 配置服务器。存储所有数据库元信息(路由、分片)的配置。
片键(shard key)
区块(chunk)
分片策略:
- 范围分片(Range based sharding)
范围分片是基于分片主键的值切分数据,每一个区块将会分配到一个范围。
范围分片适合满足在一定范围内的查找,例如查找X的值在[20,30)之间的数据,mongo 路由根据Config server中存储的元数据,可以直接定位到指定的shard的Chunk中。
缺点: 如果shard key有明显递增(或者递减)趋势,则新插入的文档多会分布到同一个chunk,无法扩展写的能力。 - hash分片(Hash based sharding)
Hash分片是计算一个分片主键的hash值,每一个区块将分配一个范围的hash值。
Hash分片与范围分片互补,能将文档随机的分散到各个chunk,充分的扩展写能力,弥补了范围分片的不足,缺点是不能高效的服务范围查询,所有的范围查询要分发到后端所有的Shard才能找出满足条件的文档。 - 组合片键 A + B(散列思想 不能是直接hash)
数据库中没有比较合适的片键供选择,或者是打算使用的片键基数太小(即变化少如星期只有7天可变化),可以选另一个字段使用组合片键,甚至可以添加冗余字段来组合。一般是粗粒度+细粒度进行组合。
链接们:
1、mongodb添加用户
2、mongodb复制集中的节点
3、MongoDB的路由器
4、MongoDB实战-分片概念和原理
5、centos固定ip sudo vim ifcfg-ens33
6、mongo的日志解析
4 实战
现在的公司里有用到mongo,就是上文提到的物流场景。对比了一下MongoTemplate和MongoRepository,感觉自己更习惯MongoTemplate的语法形式。
MongoTemplate
https://www.jianshu.com/p/a576499769ae