您的位置:首页 > 数据库 > Mongodb

MongoDB特点及功能介绍

2017-09-12 11:29 204 查看

一、MongoDB 介绍

1、基本概念

MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSQL数据库产品中最热门的一种。

它在许多场景下可用于替代传统的关系型数据库或键/值存储方式, MongoDB使用C++开发。

MongoDB的官方网站地址是: http://www.mongodb.org/,大家可以在此获得更详细的信息。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。

MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
它是一个面向集合的,模式自由的文档型数据库。

MongoDB特点及其使用范围

MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。根据官方网站的描述, Mongo适合用于以下场景:

网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。
用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。

MongoDB的使用也会有一些限制,例如它不适合:

高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。<
4000
/span>
需要SQL的问题

2、对比



二、mongodb安装

1、配置yum

1
$ vim /etc/yum.repos.d/mongodb.repo
2
[mongodb]
3
name=MongoDB Repository
4
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
5
gpgcheck=0
6
enabled=1

2、安装



1

$ yum install mongo-10gen mongo-10gen-server



下载软件包mongodb-linux-x86_64-2.6.0.tgz

1
$ tar zxf mongodb-linux-x86_64-2.6.0.tgz -C /usr/local/
2
$ mv /usr/local/mongodb-linux-x86_64-2.6.0 /usr/local/mongodb
3
$ vim /root/.bash_profile
4
PATH=$PATH:$HOME/bin:/usr/local/mongodb/bin
5
$ . /root/.bash_profile

3、修改配置文件



1

$ vim /etc/mongod.conf


2

dbpath=/home/mongodb    #数据库路径


3

logpath=/home/mongodb/mongod.log    #日志文件路径


4

logappend=true    #日志文件末尾添加(追加日志方式)


5

fork = true    #在后台运行


6

port = 27017    #端口


7

#keyFile = /data/mongodb/key/key_20001    #复制集keyfile文件


8

pidfilepath = /home/mongodb/mongod.pid    #pid文件路径


9

#master = true    #指定为主机器,如果是从则为slave = true


10

source = 127.0.0.1    #指定主机器的IP地址,如果是主source =127.0.0.1


11

auth = true    #用户验证


12

directoryperdb = true    #单独数据库目录


13

#slavedelay= 10    #从库配置,指从复制检测的时间间隔


14

#replSet = rsmongo    #复制集名称


15

directoryperdb = true    #创建数据目录


16

#bind_ip = 10.25.36.20    #绑定IP



4、启动mongodb

1
$ mongod -f /etc/mongod.conf
2
3
$ mongod --config=/etc/mongod.conf

三、mongodb 主备搭建(目前常用复制集代替主备)

前提确保防火墙开通

1、主机器(master)



1

master: 172.16.101.251


2

mongodb home: /home/mongodb


3

data file: /home/mongodb


4

log file: /home/mongodb



2、从机器(slave)

1
slave: 172.16.101.244
2
mongodb home: /home/mongodb/
3
data file: /home/mongodb
4
log file: /home/mongodb
注意:这里可以使用mongodump或者scp命令把主机器的mongodb的所有目录和文件远程拷贝到从机器上去,之前不要去启动,主机器,否则启动从的时候会报错

(在日志文件中可以看到错误:mongodb ERROR: Client::~Client _context should be null but is not;client:replslave)

这样的话, 只需要把数据文件data目录下的所有文件删除,重新启动即可

3、修改配置文件



1

master: 172.16.101.251


2

logpath=/home/mongodb/mongod.log


3

logappend=true


4

fork = true


5

port = 27017


6

dbpath=/home/mongodb


7

pidfilepath = /home/mongodb/mongod.pid


8

source = 127.0.0.1


9

master = true


10

slave: 172.16.101.244


11

logpath=/home/mongodb/mongod.log


12

logappend=true


13

fork = true


14

port = 27017


15

dbpath=/home/mongodb


16

pidfilepath = /home/mongodb/mongod.pid


17

slave = true


18

source = 10.0.0.39


19

slavedelay= 10


20

oplogSize=2048    #同步操作记录文件大小(MB)


21

smallfiles=true    #使用较小的默认文件



4、启动

启动master

1
$ mongod --fork --config=/etc/mongod.conf
启动slave



1

$ mongod --fork --config=/etc/mongod.conf



5、测试

1
master: 172.16.101.251
2
use testdb;
3
db.createCollection('replicationColletion', {'capped':true, 'size':10240,
4
5
6
slave: 172.16.101.244
7
show dbs;    #是
8
use testdb;
9
show tables;    #是

四、常用命令



1

1. use database; #创建一个数据库或进入一个数据库


2

2. db.dropDatabase(); #删除当前所在的数据库


3

3. show dbs; #查看所有数据库


4

4. db; #查看当前所在的数据库


5

5. db.createCollection('replicationColletion', {'capped':true, 'size':10240,


6

db. replicationColletion.save(userInfo); #插入数据


7

db.replicationColletion.find(); #


8

或       db. replicationColletion.save({ "name" : "ysb" , "age" : "20"}) #直


9

6. db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);


10

7. db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}},


11

8. db.users.remove({age: 132}); #删除数据


12

9. db.replicationColletion.drop() #删除集合


13

10. show collections #查看集合


14

11. db.replicationColletion.count() #查看集合中数据数量


15

12. db.getCollection("replicationColletion") #查看指定名称的聚集


16

13. show tables; #查看库下所有表 (集合)


17

14. db. replicationColletion.stats(); #查看一个集合的状态


18

>db.crashinfo.stats();


19

{


20

"ns" : "mobo.crashinfo", #集合的名称


21

"count" : 634, #集合中的数量


22

"size" : 726784, #集合中数据占用空间大小,,不包括


23

"avgObjSize" : 1146.3470031545742, #平均对象


24

"storageSize" : 1740800, #给整个集合分配的存储空


25

"numExtents" : 4, #连续分配的数据块


26

"nindexes" : 1, #索引个数,每个集合至少有一个


27

"lastExtentSize" : 1310720, #最近分配的块的大小


28

"paddingFactor" : 1,


29

"systemFlags" : 1,


30

"userFlags" : 0,


31

"totalIndexSize" : 32704, #所有索引大小总和


32

"indexSizes" : { #列出集合的所有索引字段,以及索引大


33

"_id_" : 32704


34

},


35

"ok" : 1


36

}


37

15. db.printCollectionStats(); #查看当前所有集合状态


38

16. db. replicationColletion.totalSize(); #查看聚集集合总大小


39

17. db. replicationColletion.storageSize(); #查看聚集集


40

18. db.themes.find({themeId: {$in: [8,9]}},{packageFile:true});


41

19. db.system.users.find(); #查看系统下所有用户


42

20. db.addUser('user_reader','123',false); #添加用户,


43

21. db.auth("user_reader","123"); #认证用户


44

22. db.removeUser("userName"); #删除用户


45

23. mongodump -h 10.60.145.18 -d anthcraft -o /home #备份数据库


46

24. mongorestore –drop #恢复数据库


47

25. db.counters.save({"model" : "apkunikey","_id" : ObjectId("


48

26. db.counters.validate() #验证集合有效性


49

27. mongodump --db mobo --collection statistics --query '{"stime":"2014


50

28. db.shutdownServer() #关闭


51

29. db.printSlaveReplicationInfo() #查看slave同步状态


52

30. db.printReplicationInfo() #查看repli同步状态



五、优化器Profiler

1
0:不开启
2
1:记录慢查询
3
2:记录所有命令
4
5
6
>db.getProfilingLevel()
7
0
8
>
9
{ "was" : 0, "slowms" : 100, "ok" : 1 }
10
11
12
查询profiler记录
13
>db.system.profile.find( { millis : { $gt : 1 } } ) #时间大
14
>db.system.profile.find().sort({$natural:-1}).limit(1) #最新产
15
explain查看执行计划
16
>db.themes.find({themeId: {$in: [8,9]}},{packageFile:true}) .explain()

六、问题定位



1

>db.currentOp(true) #查看当前活动进程


2

"opid" : 46271161, #操作进程号


3

"active" : true,


4

"secs_running" : 3448,


5

"op" : "none", #操作类型(查新、更新)


6

"ns" : "local.sources", #查看哪个集合


7

"query" : {         #具体查询内容


8

    },


9

"desc" : "replslave",


10

"threadId" : "0x7f330e4ed700",


11

"waitingForLock" : false,


12

"numYields" : 0,


13

"lockStats" : {


14

"timeLockedMicros" : {


15

"R" : NumberLong(0), #-1代表读锁,0代表无所,1代表写锁


16

"W" : NumberLong(110330)


17

    },


18

"timeAcquiringMicros" : {


19

"R" : NumberLong(0),


20

"W" : NumberLong(2266)


21

>db.killOp() #结束进程



七、复制集

1
仲裁库19:
2
主库20:
3
从库21:
4
从库175:
5
----------------------------------------------------------------------------
6
[root@NJ-36.21 home]# tar zxf mongodb-linux-x86_64-2.4.8.tgz -C /usr/local/
7
[root@NJ-36.21 home]# mv /usr/local/mongodb-linux-x86_64-2.4.8
8
/usr/local/mongodb/
9
[root@NJ-36.21 home]# vi /root/.bash_profile
10
PATH=$PATH:$HOME/bin:/usr/local/mongodb/bin
11
[root@NJ-36.21 data]#mkdir -p /data/mongodb_20002/etc
12
[root@NJ-36.21 data]#mkdir -p /data/mongodb_20002/key
13
[root@NJ-36.21 etc]#cat /data/mongodb_20002/etc/mongod.conf
14
dbpath=/data/mongodb_20002
15
logpath=/data/mongodb_20002/mongod.log
16
pidfilepath = /data/mongodb_20002/mongod.pid
17
keyFile = /data/mongodb_20002/key/key_20002
18
#使用openssl生成key文件: openssl rand -base64 741
19
>/data/mongodb_20002/key/key_20002
20
#修改权限: chmod 300 /data/mongodb_20002/key/key_20002
21
#官网上的是600的,必须要改为300,如果不是的话,会在启动的时候mongodb.log里写权限太开放的
22
#拷贝key文件,保证所有节点都一致
23
auth = true
24
logappend=true
25
fork = trueLast update: 2015/03/11 08:53 7/8 一、 MongoDB 介绍
26
CYou DBA 安全等级:保密 Printed on 2015/04/09 12:08
27
port = 20002
28
#source = 127.0.0.1
29
replSet = rsmongo
30
directoryperdb = true
31
32
33
启动:
34
[root@NJ-36.19 mongodb_20000]# mongod --fork
35
--config=/data/mongodb_20002/etc/mongod.conf
36
登入:
37
[root@NJ-36.19 mongodb_20000]# mongo --port 20000
38
39
40
主上操作:
41
[root@NJ-36.20 mongodb_20001]#mongo --port 20001
42
>cfg_rsmongo = { _id:"rsmongo", members:[
43
{_id:0,host:'10.25.36.20:20001',priority:2},
44
{_id:1,host:'10.25.36.21:20002',priority:1},
45
{_id:2,host:'10.25.36.175:20003',priority:1},
46
{_id:3,host:'10.25.36.19:20000',arbiterOnly:true}]
47
};
48
49
50
>rs.initiate(cfg_rsmongo);
51
查看状态:
52
>rs.status();
53
>rs.isMaster();
54
使从库可读:
55
rsmongo:SECONDARY>show tables;
56
Tue May 6 15:08:53.224 error: { "$err" : "not master and slaveOk=false",
57
58
59
rsmongo:SECONDARY>db.getMongo().setSlaveOk();
60
61
62
切换测试:
63
杀掉主库:
64
[root@NJ-36.20 mongodb_20001]#ps -ef | grep mongo
65
root 23159 1 0 14:31 ? 00:00:40 mongod --fork --config=/data
66
root 25434 21787 0 15:40 pts/0 00:00:00 grep mongo
67
[root@NJ-36.20 mongodb_20001]#kill -2 23159
68
观察仲裁日志: 175替换为主库
69
tail -f mongod.log
70
Tue May 6 15:42:40.118 [initandlisten] connection accepted from
71
Tue May 6 15:42:50.844 [conn283] end connection 10.25.36.20:23601 (2
72
Tue May 6 15:42:52.043 [rsHealthPoll] DBClientCursor::init call() failed
73
Tue May 6 15:42:52.069 [rsHealthPoll] replset info 10.25.36.20:20001
74
Tue May 6 15:42:52.070 [rsHealthPoll] replSet info 10.25.36.20:20001 is
75
Tue May 6 15:42:52.070 [rsHealthPoll] replSet member 10.25.36.20:20001 is
76
Tue May 6 15:42:52.402 [conn284] replSet info voting yea for 10.25.36.175:
77
Tue May 6 15:42:54.045 [rsHealthPoll] replSet member 10.25.36.175:20003 is
78
Tue May 6 15:42:54.072 [rsHealthPoll] replset info 10.25.36.20:20001
79
Tue May 6 15:42:56.073 [rsHealthPoll] replset info 10.25.36.20:20001
80
当主库恢复时:会自动切换回去
81
Tue May 6 15:44:10.164 [conn288] end connection 10.25.36.175:40253 (2
82
Tue May 6 15:44:10.164 [initandlisten] connection accepted from
83
Tue May 6 15:44:18.088 [rsHealthPoll] replSet member 10.25.36.175:20003 is
84
Tue May 6 15:44:18.088 [rsMgr] stepping down 10.25.36.175:20003 (priority 1),
85
Tue May 6 15:44:18.096 [rsMgr] stepping down 10.25.36.175:20003 failed: {
86
Tue May 6 15:44:24.763 [conn289] replSet info voting yea for 10.25.36.20:
87
Tue May 6 15:44:28.161 [rsHealthPoll] replSet member 10.25.36.20:20001 is

八、添加新节点

1

两种方式:


2



3



4

一、直接运用oplog复制数据


5

1.装好mongo软件,配置好参数,启动


6

2.在primary上执行添加操作 rs.add("10.25.36.25:20004")


7

3.查看状态rs.status()


8

这种方式简单方便,但是需要注意它只根据oplog同步,如果oplog将之前的数据覆盖将不能同步恢复,


9



10



11

二、先拷贝物理文件,在恢复


12

1.需要停机,如果数据量较小可以不停机
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: