NoSQL介绍
NoSQL简介
NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是SQL”。
在现代的计算系统上每天网络上都会产生庞大的数据量。
这些数据有很大一部分是由关系数据库管理系统(RDMBSs)来处理。 1970 年 E.F.Codd’s 提出的
关系模型的论文 “A relational model of data for large shared data banks”,这使得数据建模和应用程
序编程更加简单。
通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构
化数据存储在网络和商务应用的主导技术。
NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009 年趋势越发高涨。NoSQL
的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是
一种全新的思维的注入。
什么是NoSQL
NoSQL,指的是非关系型的数据库。NoSQL 有时也称作Not Only SQL 的缩写,是对不同于传统的
关系型数据库的数据库管理系统的统称。
对NoSQL 最普遍的解释是”非关联型的”,强调Key-Value Stores 和文档数据库的优点,而不是单
纯的反对RDBMS。
NoSQL 用于超大规模数据的存储。(例如谷歌或Facebook 每天为他们的用户收集万亿比特的数
据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
为什么使用NoSQL
今天我们可以通过第三方平台(如:Google,Facebook 等)可以很容易的访问和抓取数据。用户的个
人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这
些用户数据进行挖掘,那SQL 数据库已经不适合这些应用了, NoSQL 数据库的发展也却能很好的处
理这些大的数据。
MongoDB简介
Mongodb 由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。,是专为可扩展性,
高性能和高可用性而设计的数据库, 是非关系型数据库中功能最丰富,最像关系型数据库的,它支
持的数据结构非常散,是类似 json 的 bjson 格式,因此可以存储比较复杂的数据类型。
MongoDB 的(来自于英文单词“了Humongous”,中文含义为“庞大”)是可以应用于各种规模
的企业,各个行业以及各类应用程序的开源数据库。作为一个适用于敏捷开发的数据库,MongoDB
的的数据模式可以随着应用程序的发展而灵活地更新。
MongoDB 以一种叫做 BSON(二进制 JSON)的存储形式将数据作为文档存储。具有相似结构的
文档通常被整理成集合。可以把这些集合看成类似于关系数据库中的表: 文档和行相似, 字段和
列相似。
MongoDB数据格式
JSON
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON 采用完全独立于语言的文本
格式,但是也使用了类似于C 语言家族的习惯(包括C、 C++、 C#、 Java、JavaScript、 Perl、
Python 等)。这些特性使JSON 成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析
和生成(一般用于提升网络传输速率)。JSON 的官方 MIME 类型是 application/json,文件扩展名
是.json。
MongoDB 使用JSON(JavaScript ObjectNotation)文档存储记录。
JSON 简单说就是JavaScript 中的对象和数组,通过对象和数组可以表示各种复杂的结构。
对象:
对象在js 中表示为“{}”括起来的内容,数据结构为 {key: value,key: value,…}的键值对的
结构,在面向对象的语言中, key 为对象的属性, value 为对应的属性值,所以很容易理解,取值
方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
例如: {"FirstName":"ke","LastName":"me","email":"hikeme@aa"}
取值方式和所有语言中一样,使用key 获取,字段值的类型可以是 数字、字符串、数组、对象几种。
BSON
MongoDB特点
高性能: Mongodb 提供高性能的数据持久性,尤其是支持嵌入式数据模型减少数据库系统上的
I/O 操作,索引支持能快的查询,并且可以包括来嵌入式文档和数组中的键
丰富的语言查询: Mongodb 支持丰富的查询语言来支持读写操作(CRUD)以及数据汇总,文本
搜索和地理空间索引
高可用性: Mongodb 的复制工具,成为副本集,提供自动故障转移和数据冗余,
水平可扩展性: Mongodb 提供了可扩展性,作为其核心功能的一部分,分片是将数据分,在一组
计算机上。
支持多种存储引擎: WiredTiger 存储引擎(原先需要3台服务器,一压缩只要2台就够了)和MMAPv1(老版本) 存储引擎和 InMemory 存储引擎
MongoDB包含的程序
MongoDB Drivers
官方MongoDB 客户端库提供C, C ++, C#, Java, Node.JS, Perl, PHP,Python, Ruby
和Scala 驱动程序的参考指南。
MongoDB Stitch
为开发人员提供了一个API 到MongoDB 和其他后端服务。保持MongoDB 的全部功能和灵性,同
时受益于强大的系统来配置细粒度的数据访问控制。
MongoDB Atlas
MongoDB 在云中部署,操作和扩展的最佳方式。适用于AWS,Azure 和Google Cloud Platform。轻
松将数据迁移到MongoDB Atlas,零停机
MongoDB Cloud Manager
是一个用于管理MongoDB 部署的软件包。 Ops Manager 提供Ops Manager 监控和Ops Manager 备
份,可帮助用户优化群集并降低操作风险
MongoDB Charts
可以最快速最简单的创建Mongodb 可视化图表
MongoDB Connector for BI
MongoDB 商业智能连接器(BI)允许用户使用SQL 创建查询,并使用现有的关系商业智能工具
(如Tableau, MicroStrategy 和Qlik)对其MongoDB Enterprise 数据进行可视化,图形化和报告。
MongoDB Compass
通过从集合中随机抽样一个文档子集,为用户提供其MongoDB 模式的图形视图。采样文件可最大
程度地降低对数据库的影响,并能快速产生结果。有关 抽样的更多信息
MongoDB Spark Connector
使用连接器,您可以访问所有使用MongoDB 数据集的Spark 库:用SQL 进行分析的数据集(受益
于自动模式推理),流式传输,机器学习和图形API。您也可以使用连接器与Spark Shell。
应用场景
#增加字段可直接增加,随意扩展,而不需要alter(mysql)
链接:https://www.zhihu.com/question/32071167/answer/147896283
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
案例1用在应用服务器的日志记录,查找起来比文本灵活,导出也很方便。也是给应用练手,从外围系统开始使用MongoDB。
用在一些第三方信息的获取或者抓取,因为MongoDB的schema-less,所有格式灵活,不用为了各种格式不一样的信息专门设计统一的格式,极大的减少开发的工作。案例2mongodb之前有用过,主要用来存储一些监控数据,No schema 对开发人员来说,真的很方便,增加字段不用改表结构,而且学习成本极低。案例3使用MongoDB做了O2O快递应用,·将送快递骑手、快递商家的信息(包含位置信息)存储在 MongoDB,然后通过 MongoDB 的地理位置查询,这样很方便的实现了查找附近的商家、骑手等功能,使得快递骑手能就近接单,目前在使用MongoDB 上没遇到啥大的问题,官网的文档比较详细,很给力。经常跟一些同学讨论 MongoDB 业务场景时,会听到类似『你这个场景 mysql 也能解决,没必要一定用 MongoDB』的声音,的确,并没有某个业务场景必须要使用 MongoDB才能解决,但使用 MongoDB 通常能让你以更低的成本解决问题(包括学习、开发、运维等成本),下面是 MongoDB 的主要特性,大家可以对照自己的业务需求看看,匹配的越多,用 MongoDB 就越合适。MongoDB 特性优势事务支持MongoDB 目前只支持单文档事务,需要复杂事务支持的场景暂时不适合灵活的文档模型JSON 格式存储最接近真实对象模型,对开发者友好,方便快速开发迭代高可用复制集满足数据高可靠、服务高可用的需求,运维简单,故障自动切换可扩展分片集群海量数据存储,服务能力水平扩展高性能mmapv1、wiredtiger、mongorocks(rocksdb)、in-memory 等多引擎支持满足各种场景需求强大的索引支持地理位置索引可用于构建 各种 O2O 应用、文本索引解决搜索的需求、TTL索引解决历史数据自动过期的需求Gridfs解决文件存储的需求aggregation & mapreduce解决数据分析场景需求,用户可以自己写查询语句或脚本,将请求都分发到 MongoDB 上完成从目前阿里云 MongoDB 云数据库上的用户看,MongoDB 的应用已经渗透到各个领域,比如游戏、物流、电商、内容管理、社交、物联网、视频直播等,以下是几个实际的应用案例。游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析视频直播,使用 MongoDB 存储用户信息、礼物信息等......如果你还在为是否应该使用 MongoDB,不如来做几个选择题来辅助决策(注:以下内容改编自 MongoDB 公司 TJ 同学的某次公开技术分享)。应用特征Yes / No应用不需要事务及复杂 join 支持必须 Yes新应用,需求会变,数据模型无法确定,想快速迭代开发?应用需要2000-3000以上的读写QPS(更高也可以)?应用需要TB甚至 PB 级别数据存储?应用发展迅速,需要能快速水平扩展?应用要求存储的数据不丢失?应用需要99.999%高可用?应用需要大量的地理位置查询、文本查询?如果上述有1个 Yes,可以考虑 MongoDB,2个及以上的 Yes,选择MongoDB绝不会后悔。
安装部署
官方文档
https://docs.mongodb.com/manual/?_ga=2.57024426.1834178963.1557492386-
816165234.1557492386
安装方式
官方下载地址:
https://www.mongodb.com/download-center/community
tar 包的安装方式
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.13.tgz
目录规划
以软连接形式放在/opt 目录下
软件安装
[root@db01 ~]# yum install libcurl openssl -y
[root@db01 ~]# mkdir /opt/mongo_cluster/ -p
[root@db01 ~]# mkdir /data/soft -p
[root@db01 ~]# cd /data/soft/
[root@db01 /data/soft]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.13.tgz
[root@db01 /data/soft]# tar zxvf mongodb-linux-x86_64-3.6.13.tgz -C /opt/mongo_cluster/
[root@db01 /data/soft]# cd /opt/mongo_cluster/
[root@db01 /opt/mongo_cluster]# ln -s mongodb-linux-x86_64-3.6.13 mongodb
[root@db01 /opt/mongodb_cluster]# mkdir /opt/mongo_cluster/mongo_27017/{conf,logs,pid} -p
[root@db01 /opt/mongodb_cluster]# mkdir /data/mongo_cluster/mongo_27017 -p
配置文件
参考博客
https://blog.csdn.net/MatrixGod/article/details/82585778
配置文解释:
systemLog:
destination: file #Mongodb 日志输出的目的地,指定一个 file 或者 syslog,如果指定 file,必须指定
logAppend: true #当实例重启时,不创建新的日志文件,在老的日志文件末尾继续添加
path: /opt/mongo_cluster/mongo_27017/logs/mongodb.log #日志路径
storage:
journal: #回滚日志
enabled: true
dbPath: /data/mongo_cluster/mongo_27017 #数据存储目录
directoryPerDB: true #默认 false,不适用 inmemory engine
wiredTiger:
engineConfig:
cacheSizeGB: 1 #将用于所有数据缓存的最大小
directoryForIndexes: true #默认false 索引集合storage.dbPath 存储在数据单独子目录
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement: #使用处理系统守护进程的控制处理
fork: true #后台运行
pidFilePath: /opt/mongo_cluster/mongo_27017/pid/mongod.pid #创建 pid 文件
net:
port: 27017 #监听端口
bindIp: 127.0.0.1,10.0.0.51 #绑定 ip
写入配置文件(配置文件的格式很重要,如果错了,启动就会错)
[root@db01 ~]# cat > /opt/mongo_cluster/mongo_27017/conf/monogdb.conf <<EOF
systemLog:
destination: file
logAppend: true
path: /opt/mongo_cluster/mongo_27017/logs/mongodb.log
storage:
journal:
enabled: true
dbPath: /data/mongo_cluster/mongo_27017
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
pidFilePath: /opt/mongo_cluster/mongo_27017/pid/mongod.pid
net:
port: 27017
bindIp: 127.0.0.1,10.0.0.51
EOF
启动关闭
启动命令
[root@db01 ~]# /opt/mongodb/bin/mongod -f /opt/mongodb/conf/monogdb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 3024
child process started successfully, parent exiting
检查命令
[root@db01 ~]# ps -ef|grep mongo
root 3024 1 3 10:26 ? 00:00:00 /opt/mongodb/bin/mongod -f
/opt/mongodb/conf/monogdb.conf
root 3049 1827 0 10:26 pts/0 00:00:00 grep -E --color=auto --color=auto mongo
[root@db01 ~]# netstat -lntup|grep 27017
tcp 0 0 10.0.0.51:27017 0.0.0.0:* LISTEN 3024/mongod
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 3024/mongod
[root@db01 ~]# ll /data/mongodb/
总用量 72
drwx------ 4 root root 35 7 月 6 10:26 admin
drwx------ 4 root root 35 7 月 6 10:26 config
drwx------ 2 root root 69 7 月 6 10:27 diagnostic.data
drwx------ 2 root root 107 7 月 6 10:26 journal
drwx------ 4 root root 35 7 月 6 10:26 local
-rw------- 1 root root 16384 7 月 6 10:27 _mdb_catalog.wt
-rw------- 1 root root 5 7 月 6 10:26 mongod.lock
-rw------- 1 root root 4096 7 月 6 10:26 sizeStorer.wt
-rw------- 1 root root 114 7 月 6 10:26 storage.bson
-rw------- 1 root root 45 7 月 6 10:26 WiredTiger
-rw------- 1 root root 4096 7 月 6 10:26 WiredTigerLAS.wt
-rw------- 1 root root 21 7 月 6 10:26 WiredTiger.lock
-rw------- 1 root root 1095 7 月 6 10:27 WiredTiger.turtle
-rw------- 1 root root 28672 7 月 6 10:27 WiredTiger.wt
写入环境变量
[root@db01 ~]# echo 'PATH=$PATH:/opt/mongodb/bin' >> /etc/profile
[root@db01 ~]# tail -1 /etc/profile
PATH=$PATH:/opt/mongodb/bin
[root@db01 ~]# source /etc/profile
[root@db01 ~]# mongo
mongo mongoexport mongoperf mongos
mongod mongofiles mongoreplay mongostat
mongodump mongoimport mongorestore mongotop
创建hosts解析
[root@db01 ~]# cat > /etc/hosts <<EOF
10.0.0.51 db01
10.0.0.52 db02
10.0.0.53 db03
EOF
连接命令
root@db01 ~]# mongo db01:27017
MongoDB shell version v3.6.13
connecting to: mongodb://db01:27017/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("5dccc8f1-3e0e-4001-9361-4b4d9b6b2a8c") }
MongoDB server version: 3.6.13
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
2019-07-06T10:26:37.135+0800 I STORAGE [initandlisten]
2019-07-06T10:26:37.135+0800 I STORAGE [initandlisten] ** WARNING: The configured WiredTiger
cache size is more than 80% of available RAM.
2019-07-06T10:26:37.135+0800 I STORAGE [initandlisten] ** See
http://dochub.mongodb.org/core/faq-memory-diagnostics-wt
2019-07-06T10:26:37.751+0800 I CONTROL [initandlisten]
2019-07-06T10:26:37.751+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled
for the database.
2019-07-06T10:26:37.751+0800 I CONTROL [initandlisten] ** Read and write access to data
and configuration is unrestricted.
2019-07-06T10:26:37.751+0800 I CONTROL [initandlisten] ** WARNING: You are running this process
as the root user, which is not recommended.
2019-07-06T10:26:37.751+0800 I CONTROL [initandlisten]
2019-07-06T10:26:37.751+0800 I CONTROL [initandlisten]
2019-07-06T10:26:37.751+0800 I CONTROL [initandlisten] ** WARNING:
/sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2019-07-06T10:26:37.751+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2019-07-06T10:26:37.751+0800 I CONTROL [initandlisten]
2019-07-06T10:26:37.751+0800 I CONTROL [initandlisten] ** WARNING:
/sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2019-07-06T10:26:37.751+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2019-07-06T10:26:37.751+0800 I CONTROL [initandlisten]
>
关闭命令
2 种关闭方式,建议使用mongo 自带的命令
方法1:登陆mongo 使用内置shutdown 命令
使用这条命令的前提是必须使用localhost 登陆,否则会提示报错
[root@db01 ~]# mongo localhost:27017
> use admin
switched to db admin
> db.shutdownServer()
server should be down...
2019-07-06T10:42:53.538+0800 I NETWORK [thread1] trying reconnect to localhost:27017 (127.0.0.1)
failed
2019-07-06T10:42:53.538+0800 W NETWORK [thread1] Failed to connect to 127.0.0.1:27017,
in(checking socket for error after poll), reason: Connection refused
2019-07-06T10:42:53.538+0800 I NETWORK [thread1] reconnect localhost:27017 (127.0.0.1) failed
failed
>
bye
方法2:启动命令添加--config 命令
[root@db01 ~]# mongod -f /opt/mongodb/conf/monogdb.conf --shutdown
killing process with pid: 3391
警告优化
普通用户登录
高静内容:
2019-07-06T10:26:37.751+0800 I CONTROL [initandlisten] ** WARNING: You are running this process
as the root user, which is not recommended.
解决方案:
1.创建普通用户
2.更改目录权限
3.切换到普通用户后再启动mongo
[root@db01 ~]# useradd mongo
[root@db01 ~]# echo '123456'|passwd --stdin mongo
[root@db01 ~]# chown -R mongo:mongo /opt/mongo_cluster
[root@db01 ~]# chown -R mongo:mongo /data/mongo_cluster
方法2:
解决方法2:创建systemcd启动文件
cat >/lib/systemd/system/mongod.service<<EOF
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /opt/mongo_27017/conf/mongodb.conf"
ExecStart=/opt/mongodb/bin/mongod \$OPTIONS
ExecStartPre=/usr/bin/chown -R mongod:mongod /opt/mongo_27017
ExecStartPre=/usr/bin/chown -R mongod:mongod /data/mongo_27017
PermissionsStartOnly=true
PIDFile=/opt/mongo_27017/pid/mongod.pid
Type=forking
# file size
LimitFSIZE=infinity
# c