MongoDB特点及功能介绍

2023-05-16

一、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数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
    • 需要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.需要停机,如果数据量较小可以不停机  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB特点及功能介绍 的相关文章

随机推荐