MogonDB介绍
最新研究PowerJob日志依赖于MongoDB,所以学习一下MongoDb应用场景。
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB是文档型的NoSQL数据库,数据以文档(对应关系型数据库的记录)的形式在MongoDB中保存,文档实际上就是一个个JSON字符串,使用JSON的好处是非常直观,通过一系列的Key-Value键值对来表示数据,符合我们的阅读习惯。
在Java、Python中对JSON都有很好的支持,数据从MongoDB中读取出来后,可无需转换直接使用;支持丰富的数据结构,Value可以是普通的整型、字符串、数组、嵌套的子文档,使用嵌套的好处是在MongoDB中仅需一次简单的查询就能够获取到你所需的数据。
MongoDB安装(Docker运行)
下载镜像:由于web端不能访问github,所以现在docker search。
[root@localhost conf]# docker search mongo
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mongo MongoDB document databases provide high avai… 9717 [OK]
mongo-express Web-based MongoDB admin interface, written w… 1321 [OK]
mongodb/mongodb-atlas-kubernetes-operator The MongoDB Atlas Kubernetes Operator - Kube… 4
mongodb/mongodb-community-server The Official MongoDB Community Server 24
mongodb/mongodb-atlas-kubernetes-operator-prerelease This is an internal-use-only build of the Mo… 0
mongodb/mongodb-enterprise-server The Official MongoDB Enterprise Advanced Ser… 3
bitnami/mongodb Bitnami MongoDB Docker Image 228 [OK]
circleci/mongo CircleCI images for MongoDB 13 [OK]
bitnami/mongodb-exporter 11
percona/mongodb_exporter A Prometheus exporter for MongoDB including … 4
bitnami/mongodb-sharded 11
rapidfort/mongodb RapidFort optimized, hardened image for Mong… 23
rapidfort/mongodb-ib RapidFort optimized, hardened image for Mong… 10
rancher/mongodb-conf 2
rapidfort/mongodb-official RapidFort optimized, hardened image for Mong… 11
rapidfort/mongodb-perfomance-test 10
bitnamicharts/mongodb 0
mongodb/apix_test apix test repo 0
bitnamicharts/mongodb-sharded 0
rancher/mongodb-config 0
litmuschaos/mongo 1
noenv/mongo-exporter Prometheus MongoDB Exporter Docker Image 2
corpusops/mongo https://github.com/corpusops/docker-images/ 0
formio/mongotest 0
noenv/mongo MongoDB Docker Image 0
拉取镜像:
[root@localhost ~]# docker pull mongo
Using default tag: latest
latest: Pulling from library/mongo
9d19ee268e0d: Pull complete
84c1327991fa: Pull complete
1feec59ecd14: Pull complete
3af7480eaf55: Pull complete
d7524ee16ced: Pull complete
f4742175eefc: Pull complete
9d688a8d9c18: Pull complete
b24ebfb25f44: Pull complete
0ee52198e640: Pull complete
Digest: sha256:bf1d25bae7c2fd47cd9a89eec3db08e73ccfbef666e43f583fa6b560ca07ac5a
Status: Downloaded newer image for mongo:latest
docker.io/library/mongo:latest
创建本地目录:
mkdir /root/mongodb/backup
mkdir /root/mongodb/conf
mkdir /root/mongodb/data
touch /root/mongodb/conf/mongodb.conf
内容如下:
#数据库数据存放目录
dbpath=/root/mongodb/data
#数据库日志存放目录
logpath=/root/mongodb/backup/log.txt
#以追加的方式记录日志
logappend = true
#端口号 默认为27017
port=27017
#以后台方式运行进程
fork=true
#开启用户认证
auth=true
查看镜像
[root@localhost conf]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mongo latest 1f3d6ec739d8 38 hours ago 654MB
app_docker latest fc58c235b89f 4 days ago 123MB
启动Docker
docker run -d --name mymongo -p 27017:27017 --restart=always -v /root/mongodb/data:/data/db -v /root/mongodb/backup:/data/backup -v /root/mongodb/conf:/data/configdb -d mongo --auth
查看启动的容器:
[root@localhost conf]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6e06d8d547b mongo "docker-entrypoint.s…" 5 hours ago Up 5 hours 0.0.0.0:27017->27017/tcp, :::27017->27017/tcp mymongo
登录的容器内部命令行,并查看mongodb版本:
[root@localhost conf]# docker exec -it mymongo /bin/bash
root@c6e06d8d547b:/# mongod --version
db version v6.0.7
Build Info: {
"version": "6.0.7",
"gitVersion": "202ad4fda2618c652e35f5981ef2f903d8dd1f1a",
"openSSLVersion": "OpenSSL 3.0.2 15 Mar 2022",
"modules": [],
"allocator": "tcmalloc",
"environment": {
"distmod": "ubuntu2204",
"distarch": "x86_64",
"target_arch": "x86_64"
}
}
进入mongodb命令行
root@c6e06d8d547b:/# mongosh
Current Mongosh Log ID: 64a63cec6329656ebd7f934a
Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.10.1
Using MongoDB: 6.0.7
Using Mongosh: 1.10.1
For mongosh info see: https://docs.mongodb.com/mongodb-shell/
To help improve our products, anonymous usage data is collected and sent to MongoDB periodically (https://www.mongodb.com/legal/privacy-policy).
You can opt-out by running the disableTelemetry() command.
查看数据库版本
test> db.version()
6.0.7
# 进入amdin数据库
use admin
test> use admin
switched to db admin
创建超级管理账号
# 创建超级权限root角色的用户,或者userAdminAnyDatabase 等角色权限比较大的用户,我创建的是拥有超级权限root角色的用户root
# 用户名:rootCs,密码:123rootCs456,角色:root,数据库:admin
admin> db.createUser({user:'rootCs',pwd:'123rootCs456',roles:[{role:'root',db:'admin'}]})
{ ok: 1 }
admin> show dbs
MongoServerError: command listDatabases requires authentication
admin> db.auth('rootCs','123rootCs456')
{ ok: 1 }
admin> show dbs
admin 132.00 KiB
config 12.00 KiB
local 40.00 KiB
新增数据库并创建用户
- use,切换到指定数据库。没有这个数据库会创建一个。
admin> use myMongo
switched to db myMongo
- 创建用户:cs,密码:cs123456
myMongo> db.createUser({user:"cs", pwd:"cs123456", roles:[{role: "dbOwner", db:"myMongo" }]})
{ ok: 1 }
- 登陆/认证用户
myMongo> db.auth('cs','cs123456')
{ ok: 1 }
- 查看该数据库下面的表(数据)
myMongo> show collections
MongoDB客户端
选择对应的版本下载完之后安装即可。
登录后的界面:
MongoDB应用场景
MongoDB事务
MongoDB目前只支持单文档事务,MongoDB暂时不适合需要复杂事务的场景。灵活的文档模型JSON格式存储最接近真实对象模型,对开发者友好,方便快速开发迭代,可用复制集满足数据高可靠、高可用的需求,运维较为简单、故障自动切换可扩展分片集群海量数据存储。
多引擎支持各种强大的索引需求
- 支持地理位置索引
- 可用于构建各种O2O应用
- 文本索引解决搜索的需求
- TTL索引解决历史数据过期的需求
- Gridfs解决文件存储的需求
- aggregation & mapreduce解决数据分析场景需求,可以自己写查询语句或脚本,将请求分发到 MongoDB 上完成。
具体的应用场景
传统的关系型数据库在解决三高问题上的力不从心。
- High performance - 对数据库高并发读写的需求。
- Huge Storage - 对海量数据的高效率存储和访问的需求。
- High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求。
MongoDB可以完美解决三高问题。
以下是几个实际的应用案例
(1)游戏场景
使用MongoDB存储游戏用户信息、装备、积分等,直接以内嵌文档的形式存储,方便查询、更新。
(2)物流场景
使用MongoDB存储订单信息、订单状态、物流信息,订单状态在运送过程中飞速迭代、以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更查出来,牛逼plus。
(3)社交场景
使用MongoDB存储用户信息,朋友圈信息,通过地理位置索引实现附近的人、定位功能。
(4)物联网场景
使用MongoDB存储设备信息、设备汇报的日志信息、并对这些信息进行多维度分析。
(5)视频直播
使用MongoDB存储用户信息、点赞互动信息。
选择MongoDB的场景总结
- 数据量大
- 读写操作频繁
- 数据价值较低,对事务要求不高。
MongoDB的特点
1、高性能
MongoDB提供高性能的数据持久性。对嵌入式数据模型的支持减少了数据库系统上的IO活动。
索引支持更快的查询,并且包含嵌入式文档和数组的键。
- 文本索引解决搜索的需求;
- TTL索引解决历史数据自动过期的需求;
- 地理位置索引可用于构建各种 O2O 应用;
2、高可用性
MongoDB的复制工具称为副本集(reolica set),它包含提供自动故障转移和数据冗余。
3、高可用性
MongoDB提供了水平可扩展性作为其核心功能的一部分。
分片将数据分布在一组集群的机器上。(海量数据存储、服务能力水平扩展)
从3.4起,MongoDB支持基于片键创建数据区域,在一个平衡的集群中,MongoDB将一个区域所覆盖的读写只定向到该区域内的那些片。
4、丰富的查询支持
MongoDB支持丰富的查询语言,支持读写(CRUD)操作、比如数据聚合、文本搜索、地理空间查询等。
5、其他特点
如动态模式、灵活的文档模型。