Mongodb是一种开源的文档型数据库,是专为可扩展性,高性能和高可用性而设计的数据库,是非关系型数据库中功能最丰富,最像关系型数据库的,它支持的数据结构非常松散,是类似 json的bjson 格式,因此可以存储比较复杂的数据类型。

Mongodb的特点

高性能:Mongodb 提供高性能的数据持久性,尤其是支持嵌入式数据模 型减少数据库系统上的 I/O操作,索引支持能快的查询,并且可以包括 来嵌入式文档和数组中的键 丰富的语言查询:Mongodb 支持丰富的查询语言来支持读写操作 (CRUD)以及数据汇总,文本搜索和地理空间索引
高可用性:Mongodb 的复制工具,成为副本集,提供自动故障转移和数据冗余
水平可扩展性:Mongodb 提供了可扩展性,作为其核心功能的一部分,分片是将数据分布在一组计算机上.
支持多种存储引擎:WiredTiger 存储引擎和、MMAPv1存储引擎和 InMemory 存储引擎

2015年3月 Mongodb 3.0支持wiredTiher存储引擎,提供文档级别锁

2018年8月 Mongodb 4.0支持多文档事务

Mongodb的数据格式

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、 JavaScript、Perl、Python等)这些特性使JSON成为理想的数据交换语言.易于人阅读 和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

BSON是一种类JSON的一种二进制形式的存储格式,简称Binary JSON,它和JSON一 样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如 Date和BinData类型。
它的优点是灵活性高,但它的缺点是空间利用率不是很理想.
BSON有三个特点:轻量性、可遍历性、高效性.

mongodb的二进制包安装

准备3台机器

echo '192.168.91.137 mongodb01.test.com
192.168.91.138 mongodb02.test.com
192.168.91.139 mongodb03.test.com' >> /etc/hosts
hostnamectl set-hostname mongodb01.test.com
hostnamectl set-hostname mongodb02.test.com
hostnamectl set-hostname mongodb03.test.com
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz
tar -zxvf mongodb-linux-x86_64-4.0.9.tgz -C /home/
ln -s /home/mongodb-linux-x86_64-4.0.9 /home/mongodb
mkdir -p /home/data/mongodb
mkdir -p /home/mongodb/{conf,logs,pid}
echo 'PATH=$PATH:/home/mongodb/bin' >> /etc/profile
source /etc/profile

mongodb的配置文件
一定要照着这样的yml格式来写,缩进不能有误。

cat /home/mongodb/conf/mongodb.conf
systemLog:
  destination: file   #Mongodb 日志输出的目的地,指定一个 file 或者 syslog,如果指定 file,必须指定 systemlog.path
  logAppend: true  #当实例重启时,不创建新的日志文件,在老的日志文件末尾继续添加
  path: /home/mongodb/logs/mongodb.log    #日志路径

storage:
  dbPath: /home/data/mongodb    #数据存储目录
  journal:       #回滚日志
    enabled: true
  directoryPerDB: true    #默认 false,不适用 inmemory engine
  wiredTiger:
     engineConfig:
        cacheSizeGB: 1   #将用于所有数据缓存的最大小
        directoryForIndexes: true #默认false 索引集合storage.dbPath存储在数据单独子目录

processManagement:    #使用处理系统守护进程的控制处理
  fork: true  # fork and run in background  后台运行
  pidFilePath: /home/mongodb/pid/mongod.pid  # location of pidfile 创建 pid 文件

net:
  port: 27017            #监听端口
  bindIp: 192.168.91.137  #绑定 ip,没做密码前,不加127.0.0.1,不能用mongo localhost关闭mongodb
  #bindIp: 127.0.0.1,192.168.91.137
#security:   
  #authorization: enabled

mongodb的启动

[root@mongodb01 conf]# mongod -f /home/mongodb/conf/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 21403
child process started successfully, parent exiting

#得到这个输出就行了,查看下进程

[root@mongodb01 conf]# ps -ef | grep mongodb
root      21403      1  5 19:58 ?        00:00:02 mongod -f /home/mongodb/conf/mongodb.conf
root      21428   6870  0 19:59 pts/0    00:00:00 grep --color=auto mongodb

mongodb的客户端连接

[root@mongodb01 ~]# mongo mongodb01.test.com
MongoDB shell version v4.0.9
connecting to: mongodb://mongodb01.test.com:27017/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("3f8e084f-56bf-4935-8765-72be1499da4e") }
MongoDB server version: 4.0.9
Server has startup warnings: 
2019-05-12T19:58:15.569+0800 I STORAGE  [initandlisten] 
2019-05-12T19:58:15.569+0800 I STORAGE  [initandlisten] ** WARNING: The configured WiredTiger cache size is more than 80% of available RAM.
2019-05-12T19:58:15.569+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/faq-memory-diagnostics-wt
2019-05-12T19:58:17.062+0800 I CONTROL  [initandlisten] 
2019-05-12T19:58:17.062+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-05-12T19:58:17.062+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2019-05-12T19:58:17.062+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2019-05-12T19:58:17.062+0800 I CONTROL  [initandlisten] 
2019-05-12T19:58:17.062+0800 I CONTROL  [initandlisten] 
2019-05-12T19:58:17.062+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2019-05-12T19:58:17.062+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2019-05-12T19:58:17.062+0800 I CONTROL  [initandlisten] 
2019-05-12T19:58:17.062+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2019-05-12T19:58:17.062+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2019-05-12T19:58:17.062+0800 I CONTROL  [initandlisten] 
> 

这就算起来了。然后有5个警告需要处理一下
(1)这个是我的虚拟机就1G内存,然后配置的比较大,这里说超过了80%的可用内存,然后提供了解决办法
http://dochub.mongodb.org/core/faq-memory-diagnostics-wt

How do I calculate how much RAM I need for my application?
With WiredTiger, MongoDB utilizes both the WiredTiger internal cache and the filesystem cache.

Starting in MongoDB 3.4, the default WiredTiger internal cache size is the larger of either:

50% of (RAM - 1 GB), or
256 MB.
For example, on a system with a total of 4GB of RAM the WiredTiger cache will use 1.5GB of RAM (0.5 * (4 GB - 1 GB) = 1.5 GB). Conversely, a system with a total of 1.25 GB of RAM will allocate 256 MB to the WiredTiger cache because that is more than half of the total RAM minus one gigabyte (0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB).

(2)这个是没加密码,后边会处理
(3)使用root用户运行,这个不推荐的,这个需要研究下怎么处理
(4)(5)这2个都是内核参数相关的东西,需要改一下参数就OK了

echo never > /sys/kernel/mm/transparent_hugepage/enabled 
echo never > /sys/kernel/mm/transparent_hugepage/defrag 

mongodb的优雅关闭方式

先给关闭掉,优化一下再启动
关闭可以用kill,但是这里不推荐

[root@mongodb01 ~]# ps -ef | grep mongodb
root      21774   6870  0 21:21 pts/0    00:00:00 grep --color=auto mongodb

这里介绍一个优雅的关闭方式

使用mongo localhost登录客户端,用admin用户,执行db.shutdownServer()的方法关闭服务

[root@mongodb01 ~]# mongo localhost
MongoDB shell version v4.0.9
connecting to: mongodb://localhost:27017/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("9dd7c6e3-921a-4974-affb-6ad86b45efed") }
MongoDB server version: 4.0.9
Server has startup warnings: 
2019-05-12T20:36:34.263+0800 I STORAGE  [initandlisten] 
2019-05-12T20:36:34.263+0800 I STORAGE  [initandlisten] ** WARNING: The configured WiredTiger cache size is more than 80% of available RAM.
2019-05-12T20:36:34.263+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/faq-memory-diagnostics-wt
2019-05-12T20:36:41.055+0800 I CONTROL  [initandlisten] 
2019-05-12T20:36:41.055+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-05-12T20:36:41.055+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2019-05-12T20:36:41.055+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2019-05-12T20:36:41.055+0800 I CONTROL  [initandlisten] 
> use admin
switched to db admin
> db.shutdownServer()
server should be down...
2019-05-12T20:38:39.471+0800 I NETWORK  [js] trying reconnect to localhost:27017 failed
2019-05-12T20:38:39.472+0800 I NETWORK  [js] reconnect localhost:27017 failed failed 
> exit
bye
2019-05-12T20:39:04.500+0800 I NETWORK  [js] trying reconnect to localhost:27017 failed
2019-05-12T20:39:04.500+0800 I NETWORK  [js] reconnect localhost:27017 failed failed 
2019-05-12T20:39:04.500+0800 I QUERY    [js] Failed to end session { id: UUID("9dd7c6e3-921a-4974-affb-6ad86b45efed") } due to SocketException: socket exception [CONNECT_ERROR] server [couldn't connect to server localhost:27017, connection attempt failed: SocketException: Error connecting to localhost:27017 (127.0.0.1:27017) :: caused by :: Connection refused]
[root@mongodb01 ~]# ps -ef | grep mongodb
root      21606   6870  0 20:39 pts/0    00:00:00 grep --color=auto mongodb

mongodb的授权认证

先把mongodb启动,创建一个超级管理员用户,相当于mysql里的grant all on . to ‘root’@’%’ identified by ‘******’;
也可以把超级管理员改成别的名字

> db.createUser({user: "root",pwd: "******",roles: [ { role: "root", db: "admin" } ]})
Successfully added user: {
	"user" : "root",
	"roles" : [
		{
			"role" : "root",
			"db" : "admin"
		}
	]
}

还要修改配置文件加上,不改配置文件不起作用

security:   
  authorization: enabled

重启下mongodb,再测试一下

[root@mongodb01 conf]#  mongo mongodb01.test.com
MongoDB shell version v4.0.9
connecting to: mongodb://mongodb01.test.com:27017/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("de41e39d-171f-4d63-b27f-3567ce61ae9b") }
MongoDB server version: 4.0.9
> show dbs //相当于MySQL的show databases();

#这里是这样的,做了授权认证后,需要db.auth(‘root’,’******’)这样才能show出结果,否则
mongodb3.6报错告诉用户需要执行授权
mongodb4.0后什么也不返回

还有这样的登录方式
通过加了授权认证的mongodb,关闭mongodb服务,也可以用以下的方法

[root@mongodb01 ~]# mongo mongodb01.test.com -u root -p******
MongoDB shell version v4.0.9
connecting to: mongodb://mongodb01.test.com:27017/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("910dfc14-13d5-4fe8-8d0d-e0095d0c62d8") }
MongoDB server version: 4.0.9
Server has startup warnings: 
2019-05-12T22:04:33.581+0800 I STORAGE  [initandlisten] 
2019-05-12T22:04:33.581+0800 I STORAGE  [initandlisten] ** WARNING: The configured WiredTiger cache size is more than 80% of available RAM.
2019-05-12T22:04:33.581+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/faq-memory-diagnostics-wt
2019-05-12T22:04:35.051+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2019-05-12T22:04:35.052+0800 I CONTROL  [initandlisten] 
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> use admin
switched to db admin
> db.shutdownServer()
server should be down...
2019-05-12T22:09:18.455+0800 I NETWORK  [js] trying reconnect to mongodb01.test.com:27017 failed
2019-05-12T22:09:18.455+0800 I NETWORK  [js] reconnect mongodb01.test.com:27017 failed failed 
> exit
bye
2019-05-12T22:09:22.516+0800 I NETWORK  [js] trying reconnect to mongodb01.test.com:27017 failed
2019-05-12T22:09:22.516+0800 I NETWORK  [js] reconnect mongodb01.test.com:27017 failed failed 
2019-05-12T22:09:22.516+0800 I QUERY    [js] Failed to end session { id: UUID("910dfc14-13d5-4fe8-8d0d-e0095d0c62d8") } due to SocketException: socket exception [CONNECT_ERROR] server [couldn't connect to server mongodb01.test.com:27017, connection attempt failed: SocketException: Error connecting to mongodb01.test.com:27017 (192.168.91.137:27017) :: caused by :: Connection refused]

总结

(1)最后一个警告
WARNING: You are running this process as the root user, which is not recommended.
这个我目前还没解决办法

(2)线上的Mongodb,不要给公网IP,一定得加密码。网上也有这种mongodb的未授权漏洞的问题,修改端口,不使用默认的端口。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐