好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

MongoDB高效读写海量数据的方法

MongoDB 简介

高性能,易部署,易使用

常见应用场景

分布式的日志收集: elk 单节点最多 32g , mongodb 越多越好 传感器(电子产品) --- 数据库 --- MongoDB 地理地图 网络爬虫

大数据时代的3V

海量 Volume 多样 Variety 实时 Velocity

大数据库时代的3高

高并发 高可扩 高性能

MongoDB 集群

1. 一主一从

docker-compose.yml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

version: '2'

services:

   master:

     image: mongo:3.4

     volumes:

       - /data/mongodbml/master : /data/db

     command : mongod --dbpath /data/db --master

   slaver: image:mongo:3.4

     volumes:

       - /data/mongodbml/slaver : /data/db

     command : mongod --dbpath /data/db --slave -- source master:27017

     links:

       - master

注意:  默认从库是不能读取,需要设置  SlaveOk  的状态:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

docker-compose up -d

 

docker ps

 

docker exec -it masterid /bin/bash

 

mongo

> show databases;

> use test ;

> db .userinfo.insert({ "name" : "master" });

> db .userinfo. find ({});

exit

 

docker exec -it slaveid /bin/bash

 

mongo

> show databases;

> db .getMongo().setSlaveOk();

> use test ;

> db .userinfo. find ({});

 

 

docker-compose rm

缺点:  当主库挂了,需要手动切换到从库

2. 一主二从

docker-compose.yml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

version: '2'

services:

   rs1:

     image: mongo:3.4

     volumes:

       - /data/mongodbtest/replset/rs1 : /data/db

     command : mongod --dbpath /data/db --replset myset

   rs2: image:mongo:3.4

     volumes:

       - /data/mongodbtest/replset/rs2 : /data/db

     command : mongod --dbpath /data/db --replset myset

   rs3: image:mongo:3.4

     volumes:

       - /data/mongodbtest/replset/rs3 : /data/db

     command : mongod --dbpath /data/db --replset myset

设置:  安排  rs1  进主节点, rs2 、 rs3  进从节点。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

docker-compose up -d

 

docker ps

 

docker exec -it rs1id /bin/bash

 

mongo

 

> rs.initiate()

 

myset:SECONDARY> rs.add( 'rs2:27017' );

myset:PRIMARY> rs.add( 'rs3:27017' );

myset:PRIMARY> rs.conf()

 

myset:PRIMARY> show databases;

myset:PRIMARY> use test ;

myset:PRIMARY> db .userinfo.insert({ "name" : "rs1" });

myset:PRIMARY> db .userinfo. find ({});

exit

 

docker exec -it rs2id /bin/bash

 

mongo

 

myset:SECONDARY> rs.status();

myset:SECONDARY> rs.slaveOk();

myset:SECONDARY> show databases;

myset:SECONDARY> use test ;

myset:SECONDARY> db .userinfo. find ({});

exit

 

docker exec -it rs3id /bin/bash

 

mongo

 

myset:SECONDARY> rs.slaveOk();

myset:SECONDARY> show databases;

myset:SECONDARY> use test ;

myset:SECONDARY> db .userinfo. find ({});

测试: 强行停止主库  rs1 ,检查从库是否能分配并切换到主库 ,在继续强行停止分配后的主库  rs2

?

1

2

3

4

5

6

7

8

9

docker stop rs1id

 

docker exec -it rs2id /bin/bash

 

docker stop rs2id

 

docker exec -it rs3id /bin/bash

 

docker-compose rm

结论:

当主节点  rs1  挂了,会有从节点过来替代原有主库的位置,但是当仅剩最后一个从库时,无法切换为主库。

当主节点  rs1  重新启动恢复后,只会立马变为从库,不再是主库。除非等到现在的主库挂了,才有可能重新回到主库的位置。

问题: 当主节点  rs1  挂了,会有从节点过来替代原有主库的位置,但是具体是哪一个从库没有办法控制。所以我们需要添加一个 冲裁  来解决这个问题。

3. 一主一从一仲裁

docker-compose.yml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

version: '2'

services:

   master:

     image: mongo:3.4

     volumes:

       - /data/mongodbnode/replset/rs1 : /data/db

     command : mongod --dbpath /data/db --replset newset --oplogSize 128

   slave: image:mongo:3.4

     volumes:

       - /data/mongodbnode/replset/rs2 : /data/db

     command : mongod --dbpath /data/db --replset newset --oplogSize 128

   arbiter: image:mongo:3.4

     command : mongod --dbpath /data/db --replset newset  --smallfiles --oplogSize 128

配置:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

docker-compose up -d

 

docker ps

 

docker exec -it masterid /bin/bash

 

mongo

 

> rs.initiate()

 

newset:SECONDARY> rs.add( 'slave:27017' );

newset:PRIMARY> rs.add( 'arbiter:27017' , true );

newset:PRIMARY> re.conf()

 

newset:PRIMARY> show databases;

newset:PRIMARY> use test ;

newset:PRIMARY> db .userinfo.insert({ "name" : "master" });

newset:PRIMARY> db .userinfo. find ({});

exit

 

docker exec -it slaveid /bin/bash

newset:SECONDARY> res.slaveOk();

newset:SECONDARY> use test ;

newset:SECONDARY> db .userinfo. find ({});

exit

 

 

docker exec -it arbiterid /bin/bash

newset:ARBITER> res.slaveOk();

newset:ARBITER> show databases;

newset:ARBITER> db .userinfo. find ({});

注意:  当存在  arbiter 节点 (只是仲裁,并不存储数据)

到此这篇关于MongoDB高效读写海量数据的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://HdhCmsTestcnblogs测试数据/Run2948/p/MongoDB_Massive_Data_Efficient_ReadWrite.html

查看更多关于MongoDB高效读写海量数据的方法的详细内容...

  阅读:22次