MongoDB介绍(资源)

MongoDB介绍

 • 官网www.mongodb.com, 当前最新版3.4

C++编写,基于分布式的,属于NoSQL的一种。支持使用 javascript 进行查询,读写性能优越,但不支持事务和表连接。

在NoSQL中是最像关系型数据库的

MongoDB 将数据存储为一个文档,是一个关系型数据库,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档、数组及文档数组。
• MongoDB 是一个基于分布式文件存储的数据库。

• MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

• MySQL 等关系型数据库时,主键都是设置成自增的。但在分布式环境下,尤其是在分库分表以后,单纯的自增主键会产生冲突,需要考虑如何生成唯一 ID。

mongodb 采用了一个称之为 ObjectId 的类型来做主键,ObjectId 是一个12字节的 BSON 类型字符串。

MongoDB 非常适用于高并发场景,其对事务性的牺牲换来了数据访问的低延迟而被广泛称道。

mongostat 和 mongotop 两个命令实现监控MongoDB

• MongoDB是一个跨平台,面向文档的数据库,提供高性能,高可用性和易于扩展。MongoDB是工作在集合和文档上一种概念

主从复制副本集两种主从复制模式,主从复制最大的问题就是无法自动故障转移,MongoDB副本集解决了主从模式无法自动故障转义的特点,因此是复制的首选。

• 特点:保留了SQL一些友好的特性(查询,索引)。

• 使用许可: AGPL(发起者: Apache)

• Master/slave复制(支持自动错误恢复,使用 sets 复制)

• 内建分片机制

• update-in-place支持比CouchDB更好

• update-in-place支持比CouchDB更好

• MongoDB分片的基本思想就是将集合切分成小块。这些块分散到若干片里面,每个片只负责总数据的一部分。 对于客户端来说,无需知道数据被拆分了,也无需知道服务端哪个分片对应哪些数据。

• 数据在分片之前需要运行一个路由进程进程名为mongos。这个路由器知道所有数据的存放位置,知道数据和片的对应关系。对客户端来说,它仅知道连接了一个普通的mongod,在请求数据的过程中,通过路由器上的数据和片的对应关系,路由到目标数据所在的片上,如果请求有了回应,路由器将其收集起来回送给客户端。

• 在32位操作系统上,数据库大小限制在约2.5Gb

• 空数据库大约占 192Mb

• MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

• 在大规模集群下,用户往往倾向于选择 Cassandra 作为存储,因为在这样的应用场景下。

a1edc69c301a0568c03b68596943b448940.jpg

• MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

MongoDB优点:

1)更高的写负载,MongoDB拥有更高的插入速度。

2)处理很大的规模的单表,当数据表太大的时候可以很容易的分割表。

3)高可用性,设置M-S不仅方便而且很快,MongoDB还可以快速、安全及自动化的实现节点 (数据中心)故障转移。

4)快速的查询,MongoDB支持二维空间索引,比如管道,因此可以快速及精确的从指定位置 获取数据。MongoDB在启动后会将数据库中的数据以文件映射的方式加载到内存中。如果内 存资源相当丰富的话,这将极大地提高数据库的查询速度。

5)非结构化数据的爆发增长,增加列在有些情况下可能锁定整个数据库,或者增加负载从而 导致性能下降,由于MongoDB的弱数据结构模式,添加1个新字段不会对旧表格有任何影响, 整个过程会非常快速。

 

MongoDB缺点:

1)不支持事务。

2)MongoDB占用空间过大 。

3)MongoDB没有成熟的维护工具。

 

MongoDB应用场景

1.)适用于实时的插入、更新与查询的需求,并具备应用程序实时数据存储所需的复制及高度伸缩性;

2) 非常适合文档化格式的存储及查询;

3.)高伸缩性的场景:MongoDB 非常适合由数十或者数百台服务器组成的数据库。

4.)对性能的关注超过对功能的要求。

 

mongodb用途

一般mongodb部署主从、或者mongodb分片集群;建议3台或5台服务器来部署。MongoDB分片的基本思想就是将集合切分成小块。这些块分散到若干片里面,每个片只负责总数据的一部分。  对于客户端来说,无需知道数据被拆分了,也无需知道服务端哪个分片对应哪些数据。数据在分片之前需要运行一个路由进程,进程名为mongos。这个路由器知道所有数据的存放位置,知道数据和片的对应关系。对客户端来说,它仅知道连接了一个普通的mongod,在请求数据的过程中,通过路由器上的数据和片的对应关系,路由到目标数据所在的片上,如果请求有了回应,路由器将其收集起来回送给客户端。

 

MongoDB特点

  • 面向集合存储,易于存储对象类型的数据

  • 模式自由

  • 支持动态查询

  • 支持完全索引,包含内部对象

  • 支持查询

  • 支持复制和故障恢复

  • 使用高效的二进制数据存储,包括大型对象(如视频等)

  • 自动处理碎片,以支持云计算层次的扩展性

  • 支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++语言的驱动程序

  • 文件存储格式为 BSON(一种 JSON 的扩展),文档型

  • 可通过网络访问

面向集合(Collenction-Orented)

  • 意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)

模式自由(schema-free)

  • 意味着对于存储在 MongoDB 数据库中的文件,我们不需要知道它的任何结构定义。提了这么多次"无模式"或"模式自由",它到是个什么概念呢? 例如,下面两个记录可以存在于同一个集合里面:

    {"welcome" : "Beijing"}

    {"age" : 25}

文档型数据库

 •  MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包括其他文档、数组和文档数组。

•  存储的数据是键-值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档. 我们把这个数据格式称作 “BSON” 即 “Binary Serialized dOcument Notation.”

使用文件的优点是:

  • 文档(即对象)与许多编程语言中的本机数据类型相对应。
  • 嵌入式文档和数组减少了对昂贵连接的需求。
  • 动态架构支持FLUENT多态性。

MongoDB应用场景

适合场景:

1.网站数据,实时的插入,更新与查询。
2.由于性能很高,可做持久化缓存层。
3.存储大尺寸,低价值的数据。
4.高伸缩性的集群场景。
5.BSON格式非常适合文档化数据的存储及查询。

不适合场景:

1.高度事务性的系统,例如银行或会计系统。
2.传统的商业智能应用,针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。

丰富查询语言

MongoDB支持丰富的查询语言。读写操作(CRUD)以及:

高可用性

MongoDB的复制工具,称为复制集,规定:

  • 自动故障转移和
  • 数据冗余

关于JSON http://www.w3school.com.cn/json/index.asp

因为基于分布式,所以很容易扩展

MongoDB手册内容:https://docs.mongodb.com/manual/contents/

常见问题:https://docs.mongodb.com/manual/faq/?_ga=2.212716946.782092130.1530968130-633546892.1528366727

MongoDB和关系型数据库对比

736e0d294e3631e7ac934d9c3230a7f7d06.jpg

关系型数据库数据结构

67af353e5bc9a76a0e806deb5fd911d3cfb.jpg

Mongodb配置

  1. 建立配置文件目录
    在mongodb文件夹data 用来存放数据
    data中新建文件夹db 和 logs
    db 用来存放数据
    logs 用来存放日志

    logs文件夹中mongodb.log文件

  2. 建立配置文件mongodb.conf
    dbpath=D:\soft\Mongodb\data\db #数据存放路径
    logpath=D:\soft\Mongodb\data\log\mongodb.log #日志存放路径
    logappend=true #错误日志采用追加模式
    journal=true #启用日志文件,默认启用
    quiet=true #这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
    port=27017 #端口号 默认为27017

MongoDB安装

• epel自带的mongodb版本为2.6,我们需要安装3.4版本

• 官方安装文档https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

• cd /etc/yum.repos.d/

• vim mongodb-org-3.4.repo    //加入如下内容

[mongodb-org-3.4]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

• yum list |grep mongodb //可以看到mongodb相关的rpm包

• cd /usr/local/src

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz 

• yum install -y mongodb-org

下载php-mongodb扩展

wget http://pecl.php.net/get/mongo-1.6.12.tgz

解压

tar xvzf mongo-1.6.12

在安装过程中可能会报以下错误

/var/tmp/mongo/contrib/php-ssl.h:33:25: error: openssl/evp.h: No such file or directory

需要安装openssl-devel

yum install openssl-devel

在php.ini文件中添加extension=mongo.so

extension=mongo.so

重启Apache 或者Nginx 

 

实例:

下载:

1:在线下载
  wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz  最新版
2:官网下载
  https://www.mongodb.com/download-center?ct=atlasheader#atlas
配置包管理系统(yum).      -----从官网下载最新的

创建一个/etc/yum.repos.d/mongodb-org-4.0.repo文件,以便您可以使用以下方法直接安装MongoDByum:

[root@localhost 01]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
[root@localhost yum.repos.d]# vim mongodb-org-3.4.repo   //加入如下内容
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc


[root@localhost yum.repos.d]# yum list | grep mongo             #查看mongodb相关的rpm包功

安装包
[root@localhost yum.repos.d# yum install -y mongodb-org
[root@localhost 01]# cd /usr/local/src
[root@localhost src]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz
[root@localhost src]# tar -zxvf mhttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz
[root@localhost src]# cd mongodb-linux-x86_64-4.0.9
[root@localhost src]# mkdir log
[root@localhost src]# mkdir db
[root@localhost src]# ./bin/mongod --dbpath=./db --logpath=./log/mongodb.log --fork --auth                  #以后台运行方式启动


[root@localhost 01]# cd
[root@localhost 01]# vim /etc/mongod.conf           #查看配置文件
bindIP:127.0.0.1,192.168.2.229    #添加绑定的IP


[root@localhost 01]# systemctl start mongod       #启动mongod
[root@localhost 01]# ps aux | grep mongo         #查看进程
mongod    13690 33.8  5.1 1067732 50992 ?       Sl   18:44   0:01 /usr/bin/mongod -f /etc/mongod.conf
root      15856  0.0  0.0 112720   972 pts/1    S+   18:44   0:00 grep --color=auto mongo

[root@localhost 01]# netstat -lntp #查看端口,加绑定的IP,有没有添加成功
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      828/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      930/master          
tcp        0      0 192.168.133.133:27017   0.0.0.0:*               LISTEN      13690/mongod        
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      13690/mongod        
tcp6       0      0 :::22                   :::*                    LISTEN      828/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      930/master 

输入netstat -nalupt | grep mongo

tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 4623/./bin/mongod

 

MongoDB连接

•  systemctl start mongod //启动服务

• 在本机可以直接运行命令mongo进入到mongodb shell中

• 如果mongodb监听端口并不是默认的27017,则在连接的时候需要加--port 选项,例如

• mongo --port 27018

• 连接远程mongodb,需要加--host,例如

• mongo --host  127.0.0.1

• 如果设置了验证,则在连接的时候需要带用户名和密码

• mongo -uusername -ppasswd --authenticationDatabase db //这个和MySQL挺像

实例:

连接

[root@localhost 01]# mongo

连接远程mongodb,需要加--host,例如

[root@localhost 01]# mongo --host  127.0.0.1 --port 27018   #链接127.0.0.1的IP
按ctrl+D,退出来

[root@localhost 01]# mongo --host  192.168.2.229 --port 53   #链接192.168.2.229的IP

MongoDB shell version v4.0.0
connecting to: mongodb://192.168.133.133:27017/
MongoDB server version: 4.0.0
Server has startup warnings: 
2018-07-08T18:44:54.774+0800 I CONTROL  [initandlisten] 
2018-07-08T18:44:54.774+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-07-08T18:44:54.774+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-07-08T18:44:54.774+0800 I CONTROL  [initandlisten] 
2018-07-08T18:44:54.776+0800 I CONTROL  [initandlisten] 
2018-07-08T18:44:54.776+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-07-08T18:44:54.776+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-07-08T18:44:54.776+0800 I CONTROL  [initandlisten] 
2018-07-08T18:44:54.776+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-07-08T18:44:54.776+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-07-08T18:44:54.776+0800 I CONTROL  [initandlisten] 
---
Enable MongoDB's free cloud-based monitoring service to collect and display
metrics about your deployment (disk utilization, CPU, operation statistics,
etc).

The monitoring data will be available on a MongoDB website with a unique
URL created for you. Anyone you share the URL with will also be able to
view this page. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command:
db.enableFreeMonitoring()
---

>                         #CTRL+D   退出来
bye

 

MongoDB用户管理

use admin//需要切换到admin库

db.createUser( { user: "admin", customData: {description: "superuser"}, pwd: "admin122", roles: [ { role: "root", db: "admin" } ] } )          #创建用户admin

注意:pwd后面是密码,

user指定用户,customData为说明字段,可以省略,pwd为密码,roles指定用户的角色,db指定库名

use admin //切换到admin库

db.system.users.find()  //列出所有用户,需要切换到admin库

show users  //查看当前库下所有的用户

db.dropUser('admin') //删除用户

若要用户生效,还需要编辑启动脚本vim /usr/lib/systemd/system/mongod.service,在OPTIONS=后面增--auth

重启服务       systemctl restart mongod

mongo -u "admin" -p "admin122" --authenticationDatabase "admin"

• use db1

• db.createUser( { user: "test1", pwd: "123aaa", roles: [ { role: "readWrite", db: "db1" }, {role: "read", db: "db2" } ] } )

• test1用户对db1库读写,对db2库只读。

• 之所以先use db1,表示用户在 db1 库中创建,就一定要db1库验证身份,即用户的信息跟随随数据库。比如上述 test1虽然有 db2 库的读取权限,但是一定要先在db1库进行身份验证,直接访问会提示验证失败。

• use db2

• db.auth("test1", "123aaa")

实例:

给mongob用户设置密码
[root@localhost 01]# mongo     #进入库里面    
> use admin//需要切换到admin库
switched to db admin 
> db.createUser( { user: "admin", customData: {description: "superuser"}, pwd: "admin122", roles: [ { role: "root", db: "admin" } ] } )               #回车
Successfully added user:{
         "user":"admin",
         "customData" :{
                "description" : "superuser"
         },
         "roles" : [
                 {            "role" : "root",
                              "db" : "admin"
                 }
        ]
}
> db.create           #会自动查找相关的命令
db.createCollection  db.createRole(  db.createUser(  db.createView(  
> db.system.users.find()            //列出所有用户,需要切换到admin库

> show users       //查看当前库下所有的用户
{
	"_id" : "test.admin",
	"user" : "admin",
	"db" : "test",
	"customData" : {
		"description" : "superuser"
	},
	"roles" : [
		{
			"role" : "root",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
> db.createUser( { user: "aming", pwd: "123456", roles: [ { role: "read", db: "testadb" } ] } )                   创建一个用户阿明
Successfully added user: {
	"user" : "aming",
	"roles" : [
		{
			"role" : "read",
			"db" : "testadb"
		}
	]
}

> db.dropUser('admin') //删除用户
> db.drop
test.drop
> db.dropUser('aming')
true
> show users
> db.createUser( { user: "aming", pwd: "123456", roles: [ { role: "read", db: "testadb" } ] } )
Successfully added user: {
	"user" : "aming",
	"roles" : [
		{
			"role" : "read",
			"db" : "testadb"
		}
	]
}
> show users
{
	"_id" : "admin.aming",           #库是admin.用户是aming
	"user" : "aming",
	"db" : "admin",
	"roles" : [
		{
			"role" : "read",
			"db" : "testadb"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}

> 


若要用户生效,还需要编辑启动脚本
[root@localhost 01]# vim /usr/lib/systemd/system/mongod.service ,在OPTIONS=后面增--auth
OPTIONS=--auth -f

然后启动服务
[root@localhost ~]# systemctl restart mongod
Warning: mongod.service changed on disk. Run 'systemctl daemon-reload' to reload units.
Job for mongod.service failed because the control process exited with error code. See "systemctl status mongod.service" and "journalctl -xe" for details.


启动错误。原因:修改了配置文件,按照提示执行systemctl daemon-reload命令
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart mongod
[root@localhost ~]# ps aux | grep mongo              #查看auth是否添加成功
mongod    16728 26.5  5.4 1067724 54032 ?       Sl   19:15   0:01 /usr/bin/mongod --auth -f /etc/mongod.conf
root      16759  0.0  0.0 112720   972 pts/1    S+   19:15   0:00 grep --color=auto mongo


测试,没有授权能不能登录。
[root@localhost ~]# mongo --host 192.168.133.133 --port 27017
MongoDB shell version v4.0.0
connecting to: mongodb://192.168.133.133:27017/
MongoDB server version: 4.0.0
> use admin
switched to db admin
> show users;
2018-07-08T19:21:53.338+0800 E QUERY    [js] Error: command usersInfo requires authentication :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.getUsers@src/mongo/shell/db.js:1757:1
shellHelper.show@src/mongo/shell/utils.js:848:9
shellHelper@src/mongo/shell/utils.js:755:15
@(shellhelp2):1:1
>

MongoDB用户管理

• use db1

• db.createUser( { user: "test1", pwd: "123aaa", roles: [ { role: "readWrite", db: "db1" }, {role: "read", db: "db2" } ] } )

• test1用户对db1库读写,对db2库只读。

• 之所以先use db1,表示用户在 db1 库中创建,就一定要db1库验证身份,即用户的信息跟随随数据库。比如上述 test1虽然有 db2 库的读取权限,但是一定要先在db1库进行身份验证,直接访问会提示验证失败。

• use db2

• db.auth("test1", "123aaa")          #在命令行里面登录test用户(格式>db.auth("test1", "123aaa")    )

实例:

授权登录
[root@localhost 01]# mongo --host 192.168.133.133 --port=27017 -u "admin" -p "admin122" --authenticationDatabase "admin"
[root@localhost ~]# mongo --host 192.168.133.133 --port=27017 -u "aming" -p "123456" --authenticationDatabase "admin"
MongoDB shell version v4.0.0
connecting to: mongodb://192.168.133.133:27017/
MongoDB server version: 4.0.0
> use admin
>  show users
> use db2 
> db.auth('test1','123aaa')
Error                 #错误的原因:用户是db1的,在db2下操作所以验证错误

> use db1
> db.auth('test1','123aaa')
1
> 

 

MongoDB用户角色

• Read:允许用户读取指定数据库

• readWrite:允许用户读写指定数据库

• dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile

• userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户

• clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。

• readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限

• readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限

• userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限

• dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。

• root:只在admin数据库中可用。超级账号,超级权限
实例:

MongoDB库管理

• db.version()  //查看版本

• use userdb  //如果库存在就切换,不存在就创建

• show dbs //查看库,此时userdb并没有出现,这是因为该库是空的,还没有任何集合,只需要创建一个集合就能看到了

• db.createCollection('clo1') //创建集合clo1,在当前库下面创建

• db.dropDatabase() //删除当前库,要想删除某个库,必须切换到那个库下

• db.stats()  //查看当前库的信息

• db.serverStatus()   //查看mongodb服务器的状态

MongoDB创建集合

• db.createCollection("mycol", { capped : true, size : 6142800, max : 10000 } )  //语法:db.createCollection(name,options)

• name就是集合的名字,options可选,用来配置集合的参数,参数如下

• capped true/false (可选)如果为true,则启用封顶集合。封顶集合是固定大小的集合,当它达到其最大大小,会自动覆盖最早的条目。如果指定true,则也需要指定尺寸参数。

• autoindexID  true/false (可选)如果为true,自动创建索引_id字段的默认值是false。

• size (可选)指定封顶最大大小字节封顶集合。如果封顶如果是 true,那么你还需要指定这个字段。单位B

• max (可选)指定封顶集合允许在文件的最大数量。

实例:

创建集合


> db.createCollection("mycol",{capped : ture,autoindexID :true.size : 6142800,max : 10000})               #显示错误,原因版本比较老
> show tables            #查看集合
> db.createCollection("mycol",{capped : ture,size : 6142800,max : 10000})
> show tables     #查看集合
mycol         #创建成功 了

MongoDB数据管理

show collections //查看集合,或者使用show  tables

• db.Account.insert({AccountID:1,UserName:"123",password:"123456"})  //如果集合不存在,直接插入数据,则mongodb会自动创建集合

• db.Account.update({AccountID:1},{"$set":{"Age":20}}) //更新

• db.Account.find()   //查看所有文档

• db.Account.find({AccountID:1})   //根据条件查询

• db.Account.remove({AccountID:1})  //根据条件删除

• db.Account.drop() //删除所有文档,即删除集合

• use dbname  //先进入对应的库

• db.printCollectionStats()  // 然后查看集合状态

实例:

 

使用show collections查看集合
> show collections
mycol 

> db.Account.insert({AccountID:1,UserName:"123",password:"123456"})  //如果集合不存在,直接插入数据,则mongodb会自动创建集合,如果存在了。就插入进去
WriteResult({"nINSERTED" : 1})
> show tables
Account 
mycol

> db.Account.insert({AccountID:2,UserName:"zhang",password:"abcde"})
WriteResult({"nINSERTED" : 1})                             #创建集合zhang
> db.Account.update({AccountID:1},{"$set":{"Age":20}})       //更新
> db.Account.find()   //查看所有文档,查看更新的结果
> db.Account.find({AccountID:1})   //根据条件查询,查询集合2
> db.Account.remove({AccountID:1})  //根据条件删除

> db.Account.find()   //查看所有文档,查看有没有删除成功

> show tables   //查看表,发现创建的删除了
mycol 
> db.Account.drop() //删除所有文档,即删除集合
> db.mycol.drop(0
true
> show tables   //查看表,发现都删除了


> db.col2.insert({AccountID:1,UserName:"123",oassword:"123456"})       #col2是名字,随便定义
WriteResult({"nINSERTED" : 1})
> db.printCollectionStats()    // 然后查看集合状态

PHP连接MongoDB-mongodb.so

• cd /usr/local/src/

• git clone https://github.com/mongodb/mongo-php-driver

• cd mongo-php-driver

• git submodule update --init

• /usr/local/php/bin/phpize

• ./configure --with-php-config=/usr/local/php/bin/php-config

• make && make install

• vi /usr/local/php/etc/php.ini //增加 extension = mongodb.so

• /usr/local/php/bin/php -m

• 大家还可以到pecl官网上下载mongodb的扩展源码包,

• cd /usr/local/src/

• wget https://pecl.php.net/get/mongodb-1.3.0.tgz

• tar zxvf mongodb-1.3.0.tgz

• cd mongodb-1.3.0

• /usr/local/php/bin/phpize       

• ./configure --with-php-config=/usr/local/php-fpm/bin/php-config

• make && make install

• vi /usr/local/php/etc/php.ini //增加 extension = mongodb.so

• /usr/local/php/bin/php -m       #检测有没有mongodb的扩展

/etc/init.d/php-fpm restart         #重启服务

 

• 到pecl官网上下载mongo的扩展源码包

• cd /usr/local/src/

• wget https://pecl.php.net/get/mongo-1.6.16.tgz

• tar zxvf mongodb-1.6.16.tgz

• cd mongodb-1.6.16

• /usr/local/php/bin/phpize

• ./configure --with-php-config=/usr/local/php/bin/php-config

• make && make install

• vi /usr/local/php/etc/php.ini //增加 extension = mongo.so

• /usr/local/php/bin/php -m        #检测有没有mongodb的扩展

实例:

安装mongodb的扩展


[root@localhost 01]# cd /usr/local/src/
[root@localhost src]# ls
[root@localhost src]# git clone https://github.com/mongodb/mongo-php-driver   #克隆到目录里面

[root@localhost src]# cd mongo-php-driver
[root@localhost mongo-php-driver]# git submodule update --init    #执行抓包
[root@localhost 01]#  /usr/local/php/bin/phpize

[root@localhost 01]# ./configure --with-php-config=/usr/local/php/bin/php-config

[root@localhost 01]#  make && make install

[root@localhost 01]# vi /usr/local/php/etc/php.ini        //在extension=redis.so下面添加,增加 extension = mongodb.so
[root@localhost 01]#  /usr/local/php/bin/php -m

mongodb的扩展源码包,


[root@localhost 01]# cd /usr/local/src/

[root@localhost src]#  wget https://pecl.php.net/get/mongo-1.6.16.tgz 

[root@localhost src]#  tar zxvf mongodb-1.6.16.tgz
[root@localhost 01]# cd mongodb-1.6.16

[root@localhost mongodb-1.6.16]# /usr/local/php/bin/phpize

[root@localhost mongodb-1.6.16]#  ./configure --with-php-config=/usr/local/php/bin/php-config

[root@localhost mongodb-1.6.16]# make && make install

[root@localhost mongodb-1.6.16]]# ls /usr/local/php-fpm/lib/php/extensions/no-bedug-non-zts-20131343/         #查看是否生成一个mongo.so的文件
memcache.so     mongodb.so  mongo.so  opcache.so   opcache.o   redis.so

[root@localhost mongodb-1.6.16]]# vi /usr/local/php/etc/php.ini     //增加 extension = mongo.so
[root@localhost mongodb-1.6.16]]#  /usr/local/php/bin/php -m         #查看是否添加成功,有mongo.so,说明模块安装成功了


[root@localhost mongodb-1.6.16]]# /etc/init.d/php-fpm restart      #重启服务

 

测试mongo扩展

• 参考文档 https://docs.mongodb.com/ecosystem/drivers/php/

• http://www.runoob.com/mongodb/mongodb-php.html

• vi /usr/local/apache2/htdocs/1.php //增加
<?php

$m = new MongoClient(); // 连接

$db = $m->test; // 获取名称为 "test" 的数据库

$collection = $db->createCollection("runoob");           runoob集合

echo "集合创建成功";

?>

• curl  localhost/1.php

实例:


[root@localhost 01]# vi /usr/local/apache2/htdocs/1.php
<?php

$m = new MongoClient(); // 连接

$db = $m->test; // 获取名称为 "test" 的数据库

$collection = $db->createCollection("runoob");          

echo "集合创建成功";

?>
[root@localhost 01]# curl  localhost/1.php
集合创建成功

测试是否创建成功
[root@localhost 01]# mongo --host 192.168.2.229 --port 27017 -u admin -p 'admin122' --authenticationDatabase db 
> use test
switched to db test
> show tables
>
>

查看启动脚本,去掉用户名和密码认证
[root@localhost 01]# vim /usr/local/lib/systemd/system/mongodb.service
去掉--auth

[root@localhost 01]# systemctl restart mongod         #重启服务
[root@localhost 01]# systemctl daemon-reload
[root@localhost 01]# systemctl restart mongod 

[root@localhost 01]# curl  localhost/1.php
集合创建成功
[root@localhost 01]# mongo --host 192.168.2.229 --port 27017
> use test
Switched to db test
> show tables
runoob          #发现创建的集合
>
>

 

数据库架构:主备+分库 、主从+读写分离

一、数据库架构原则

  1. 高可用

  2. 高性能

  3. 一致性

  4. 扩展性

二、常见的架构方案

方案一:主备架构,只有主库提供读写服务,备库冗余作故障转移

7287bebef719ad209dc8157e6247d171bb1.jpg

  1. 高可用分析:高可用,主库挂了,keepalive(只是一种工具)会自动切换到备库。这个过程对业务层是透明的,无需修改代码或配置。

  2. 高性能分析:读写都操作主库,很容易产生瓶颈。大部分互联网应用读多写少,读会先成为瓶颈,进而影响写性能。另外,备库只是单纯的备份,资源利用率50%,这点方案二可解决。

  3. 一致性分析:读写都操作主库,不存在数据一致性问题。

  4. 扩展性分析:无法通过加从库来扩展读性能,进而提高整体性能。

  5. 可落地分析:两点影响落地使用。第一,性能一般,这点可以通过建立高效的索引和引入缓存来增加读性能,进而提高性能。这也是通用的方案。第二,扩展性差,这点可以通过分库分表来扩展。

方案二:双主架构,两个主库同时提供服务,负载均衡

f4317c6546dc7e11a2d1746427cfa6ad0ec.jpg

  1. 高可用分析:高可用,一个主库挂了,不影响另一台主库提供服务。这个过程对业务层是透明的,无需修改代码或配置。

  2. 高性能分析:读写性能相比于方案一都得到提升,提升一倍。

  3. 一致性分析:存在数据一致性问题。请看,一致性解决方案

  4. 扩展性分析:当然可以扩展成三主循环,但笔者不建议(会多一层数据同步,这样同步的时间会更长)。如果非得在数据库架构层面扩展的话,扩展为方案四。

  5. 可落地分析:两点影响落地使用。第一,数据一致性问题,一致性解决方案可解决问题第二,主键冲突问题,ID统一地由分布式ID生成服务来生成可解决问题。

方案三:主从架构,一主多从,读写分离

193374bd3c95b0309101af5b5afa412927f.jpg

  1. 高可用分析:主库单点,从库高可用。一旦主库挂了,写服务也就无法提供。

  2. 高性能分析:大部分互联网应用读多写少,读会先成为瓶颈,进而影响整体性能。读的性能提高了,整体性能也提高了。另外,主库可以不用索引,线上从库和线下从库也可以建立不同的索引(线上从库如果有多个还是要建立相同的索引,不然得不偿失;线下从库是平时开发人员排查线上问题时查的库,可以建更多的索引)。

  3. 一致性分析:存在数据一致性问题。请看,一致性解决方案

  4. 扩展性分析:可以通过加从库来扩展读性能,进而提高整体性能。(带来的问题是,从库越多需要从主库拉取binlog日志的端就越多,进而影响主库的性能,并且数据同步完成的时间也会更长)

  5. 可落地分析:两点影响落地使用。第一,数据一致性问题,一致性解决方案可解决问题第二,主库单点问题,笔者暂时没想到很好的解决方案。

注:思考一个问题,一台从库挂了会怎样?读写分离之读的负载均衡策略怎么容错?

方案四:双主+主从架构,看似完美的方案

a80f7723dade1f40ee37a9fb80a100cb2ae.jpg

  1. 高可用分析:高可用。

  2. 高性能分析:高性能。

  3. 一致性分析:存在数据一致性问题。请看,一致性解决方案

  4. 扩展性分析:可以通过加从库来扩展读性能,进而提高整体性能。(带来的问题同方案二

  5. 可落地分析:同方案二,但数据同步又多了一层,数据延迟更严重

三、一致性解决方案

第一类:主库和从库一致性解决方案

f6349153dd150b48f87bf79512d61842767.jpg

注:图中圈出的是数据同步的地方,数据同步(从库从主库拉取binlog日志,再执行一遍)是需要时间的,这个同步时间内主库和从库的数据会存在不一致的情况。如果同步过程中有读请求,那么读到的就是从库中的老数据。如下图。

841057a7a5a935e855d03e998012bd25d10.jpg

  1. 直接忽略,如果业务允许延时存在,那么就不去管它。

  2. 强制读主,采用主备架构方案,读写都走主库。用缓存来扩展数据库读性能 。有一点需要知道:如果缓存挂了,可能会产生雪崩现象,不过一般分布式缓存都是高可用的

b5ad42405c596e21aa233bce2f68a83c459.jpg

3、选择读主,写操作时根据库+表+业务特征生成一个key放到Cache里并设置超时时间(大于等于主从数据同步时间)。读请求时,同样的方式生成key先去查Cache,再判断是否命中。若命中,则读主库,否则读从库。代价是多了一次缓存读写,基本可以忽略。

1177fc9d4c14438b77c5d41a7c2540c3592.jpg

    4、半同步复制,等主从同步完成,写请求才返回。就是大家常说的“半同步复制”semi-sync。这可以利用数据库原生功能,实现比较简单。代价是写请求时延增长,吞吐量降低。

      5、数据库中间件,引入开源(mycat等)或自研的数据库中间层。个人理解,思路同选择读主。数据库中间件的成本比较高,并且还多引入了一层。

adde250b3fe84b0fade1dc277814eede0c8.jpg

第二类:DB和缓存一致性解决方案

70462a2e48ff931ef96fb043f04af88aa70.jpg

先来看一下常用的缓存使用方式:

第一步:淘汰缓存;

第二步:写入数据库;

第三步:读取缓存?返回:读取数据库;

第四步:读取数据库后写入缓存。

如果按照这种方式,图一,不会产生DB和缓存不一致问题;图二,会产生DB和缓存不一致问题,即4.read先于3.sync执行。如果不做处理,缓存里的数据可能一直是脏数据。解决方式如下:

dca2a121498512e2202fb10e4cdabe59da4.jpg

四、个人的一些见解

架构演变

  1. 架构演变一:方案一 -> 方案一+分库分表 -> 方案二+分库分表 -> 方案四+分库分表;

  2. 架构演变二:方案一 -> 方案一+分库分表 -> 方案三+分库分表 -> 方案四+分库分表;

  3. 架构演变三:方案一 -> 方案二 -> 方案四 -> 方案四+分库分表;

  4. 架构演变四:方案一 -> 方案三 -> 方案四 -> 方案四+分库分表;

个人见解

  1. 加缓存和索引是通用的提升数据库性能的方式;

  2. 分库分表带来的好处是巨大的,但同样也会带来一些问题,详见数据库之分库分表-垂直?水平?

  3. 不管是主备+分库分表还是主从+读写分离+分库分表,都要考虑具体的业务场景。58到家发展四年,绝大部分的数据库架构还是采用方案一和方案一+分库分表,只有极少部分用方案三+读写分离+分库分表。另外,阿里云提供的数据库云服务也都是主备方案,要想主从+读写分离需要二次架构。

  4. 记住一句话:不考虑业务场景的架构都是耍流氓。

 

 

 

参考链接:

https://mp.weixin.qq.com/s/PujuYPRZoE809_um8ERiIA

常见问题:

提示要更该内核,不用在意

bc9aa29fc8b8483fd49b0514cb0eda81dc8.jpg

2、

d7bdc784b54a32e60a45adf38c664776a50.jpg

答:这个zhang用户 并没有show user的权限。

3、用新创建的用户能登录,也能use admin切换到admin,但是show users失败,请问什么原因?

创建用户如:

db.createUser({user:"zhouxue",pwd:"123",roles:[{role:"read",db:"testdb"}]})

967dbb382b334cf808d31569af6ccfa3bc7.jpg

答:用户 没有show users的权限。

4、创建集合,还区分第一个字母大小写?小写的无法更新或添加数据,大写的就可以,区分大小写。。

ecfd4844e337ff15a642e7c65e54f662cd0.jpg

5、Windows不能在本地计算机启动MongoDB,错误代码 100

Windows不能在本地计算机启动MongoDB,错误代码 100

2d693df0781a7a410c79bf51e3751a75bde.jpg

解决办法:

1. MongoDB安装目录\data\将此文件夹下的mongod.lock删除

2. 查看官方文档或按照上一篇安装文章检查是否设置dbpath或logpath等,如果没有设置,默认是安装在C盘.

https://blog.csdn.net/qq_20545159/article/details/48653533

6、如何启动mongodb服务

1,首先找到mongodb安装位置
2,使用控制台进入mongodb的bin目录
3,在bin目录下输入 mongod --dbpath 存放mongodb的数据位置
4,在bin目录下输入mongo命令,进入mongodb的命令行

 

 

 

参考链接  : 

MongoDB、Hbase、Redis等NoSQL优劣势、应用场景  : https://mp.weixin.qq.com/s/Ok-T97bNETY-vhiB8oJtbg

 

链接:

linux 下安装MongoDB 和配置PHP扩展(86_64) : https://www.cnblogs.com/orangegem/p/7129230.html

MongoDB详解(一) :http://blog.51cto.com/hmtk520/2109487

MongoDB详解(二) :  http://blog.51cto.com/hmtk520/2113270

MongoDB 自增 id 的生成   :  https://mp.weixin.qq.com/s/KnRsJ4qnb6PA4v1AVFwVNw

Centos6.x 安装Mongodb 以及Mongodb php扩展 : http://www.voidcn.com/code/p-fnxzhzis-m.html

Mongodb 教程    : http://www.voidcn.com/course/project/bairlz
The Little MongoDB Book 中文版    :    http://www.voidcn.com/course/project/kitwwb

mongodb 3.4 集群搭建:分片+副本集 : https://mp.weixin.qq.com/s/8_-F36j6FQ0nXLiGqJJtXA

( 易百教程 ) MongoDB教程  : https://www.yiibai.com/mongodb/

MongoDB中文社区  :  http://www.mongoing.com/

mongodb的学习过程  :  http://blog.51cto.com/xiaoluoge/1624732

mongodb的基本语法  :  http://blog.51cto.com/xiaoluoge/1624764

MongoDB之常见操作命令汇总  :https://mp.weixin.qq.com/s/StOhmX8FP9GsKcGAXva2Bw

MongoDB安装:https://mp.weixin.qq.com/s/GRsj9PRlLPoKFhMuTe-FOw

 MongoDB教程 : https://www.w3cschool.cn/mongodb/

MongoDB基本命令  : https://www.qdfuns.com/article/15571/5a50897c698fa803a47ea96fc07a281f.html

Linux系统安装MongonDB : https://www.qdfuns.com/article/31238/7845b8244e34014159b284e9cca615e3.html

 

菜鸟 MongoDB 教程 : http://www.runoob.com/mongodb/mongodb-tutorial.html

(刘逾)使用MariaDB数据库管理系统 : https://www.linuxprobe.com/chapter-18.html

MongoDB常用API及优化 :https://blog.csdn.net/paul_wei2008/article/details/19349695

mongodb : https://www.cnblogs.com/xybaby/tag/mongodb/

f27bc63e6d5f7bd7dae8022b20a6c6349b2.jpg

谈谈工作中使用mongo遇到的坑   :  https://mp.weixin.qq.com/s/gwcpAUFlQXnInU-vYhnAqA

MongoDB、Hbase、Redis等NoSQL优劣势、应用场景   : https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247486785&idx=1&sn=420bbde89e04959bf5662a431d016d2e&chksm=e91b685dde6ce14b594eed1f5151881e4287c6ced79ccdb958d45a285fa5cf28dd29c8fd895e&token=1865724735&lang=zh_CN#rd  

 

mongodb 系列  : https://www.cnblogs.com/xybaby/tag/mongodb/

23abb70c6e96dc89f0309ea6a9fba76607b.jpg

c#操作MangoDB 之MangoDB CSharp Driver驱动详解   :  https://www.cnblogs.com/knowledgesea/p/5050969.html

MongoDB高级查询详细   :  https://www.cnblogs.com/knowledgesea/p/4634464.html

MongoDB下载安装与简单增删改查  :   https://www.cnblogs.com/knowledgesea/p/4631712.html

Ubuntu安装mongoDB报错       :   https://www.jianshu.com/p/e03764a32760

 

MongoDB基于GridFS实现文件的分布式存储  :      http://blog.51cto.com/rfyiamcool/1219848

centos7部署MongoDB数据库复制集(超详细) 荐          :         http://blog.51cto.com/11638832/2128933

centos7部署Mongodb复制集结合分片(超详细)        :     http://blog.51cto.com/11638832/2129455

【MongoDB】查看集合是否分片     :http://blog.51cto.com/l0vesql/2151905

【MongoDB】管理命令收集      :  http://blog.51cto.com/l0vesql/2151897

【MongoDB】事务      : http://blog.51cto.com/l0vesql/2134631

【MongoDB】4.0版本事务上手测试             : http://blog.51cto.com/l0vesql/2134532

【NoSQL】mongo_detail.py中均衡器信息的处理思路            :    http://blog.51cto.com/l0vesql/2132662

【NoSQL】抛弃VIP构建MongoDB RepSet +Consul高可用切换系统        : http://blog.51cto.com/l0vesql/2058464

mongoDB副本集的搭建              :           http://blog.51cto.com/l0vesql/1973850

MongoDB复制集及数据分片详解       :         http://blog.51cto.com/scholar/1673939

MongoDB启用身份验证             :   http://blog.51cto.com/ityunwei2017/2052443

 

详解MongoDB复制集            :      http://blog.51cto.com/13728740/2176550

MongoDB复制集选举原理及管理详解      :       http://blog.51cto.com/13728740/2175905

Mongodb分片原理详解及架构部署      :        http://blog.51cto.com/13728740/2175637

MongoDB在线yum源安装及基本命令详解       :    http://blog.51cto.com/13728740/2175395

管理Mongodb 集群所用到的系统管理及监控        : http://blog.51cto.com/rfyiamcool/1193765

 

 

Linux下Mongodb安装和启动配置 荐                :                 http://blog.51cto.com/ityunwei2017/1915871

 

MongoDB(一)     :     http://blog.51cto.com/cuchadanfan/1700711

MongoDB(二) :          http://blog.51cto.com/cuchadanfan/1701135

MongoDB(三)      :  http://blog.51cto.com/cuchadanfan/1701493

MongoDB(四)之副本集    :        http://blog.51cto.com/cuchadanfan/1706723

MongoDB(五)之分片        :          http://blog.51cto.com/cuchadanfan/1708143

 

mongodb 3.4 集群搭建:分片+副本集       :      https://www.cnblogs.com/ityouknow/p/7344005.html

mongodb 3.4 集群搭建升级版 五台集群           :         https://www.cnblogs.com/ityouknow/p/7566682.html

 

放弃redis使用mongodb做任务队列支持增删改管理 荐      : http://blog.51cto.com/rfyiamcool/1404953

Mongodb千万级数据在python下的综合压力测试及应用探讨 荐   : http://blog.51cto.com/rfyiamcool/1329351

基于python的REST框架eve测试与mongodb的数据操作 荐    :   http://blog.51cto.com/rfyiamcool/1325511

centos7部署MongoDB数据库复制集(超详细)荐   :   http://blog.51cto.com/11638832/2128933

MongoDB安装及用户名密码管理       : http://blog.51cto.com/nanchunle/1701434

MongoDB (31篇) :https://blog.csdn.net/qq_20545159/article/category/5832341

MongoDb优化指南   : https://mp.weixin.qq.com/s/fA4Y69Xi7iZPdF8LwBSayg

 

Ubuntu 18.04下部署MongoDB复制集(副本集 ): https://www.linuxidc.com/Linux/2018-11/155147.htm

MongoDB主从复制和副本集 : https://www.linuxidc.com/Linux/2018-11/155606.htm

MongoDB 副本集配置详解 : https://www.linuxidc.com/Linux/2018-09/153963.htm

MongoDB集群架构之副本集架构 :https://www.linuxidc.com/Linux/2018-10/154874.htm

MongoDB 副本集升级方法及注意事项  : https://www.linuxidc.com/Linux/2017-11/148304.htm

MongoDB副本集的常用操作及原理 : https://www.linuxidc.com/Linux/2017-05/143913.htm

使用zabbix监控mongodb的方法 :https://www.jb51.net/article/79882.htm

如何利用MongoDB实现高性能,高可用的双活应用架构? :  https://mp.weixin.qq.com/s/8woD6b5vzFMvMSyyhuKmeA

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3803405/blog/1841864

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值