Docker搭建mongodb主从复制集群(nodejs+mongoose)

释放双眼,带上耳机,听听看~!

这里有精心准备的PPT,大家可以先过目一下
PPT链接

为什么需要搭建mongodb集群?

  1. 数据备份
  2. 数据恢复
  3. 读写分离

首先我们先准备一个nodejs实例
以express脚手架为例
http://www.expressjs.com.cn/starter/generator.html

先配置node连接mongodb的配置信息


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1const mongoose = require('mongoose');
2mongoose.connect(
3  "mongodb://192.168.77.137:27017,192.168.77.137:27018/test?replicaSet=rs", //连接多个数据库用来配合主从集群
4  {
5    useNewUrlParser: true,
6    poolSize: 5,
7    readPreference: "secondary" //集群配置
8  });
9//判断连接是否生效
10const conn = mongoose.connection;
11
12conn.on("open", () => {
13    console.log('mongodb连接成功');
14})
15conn.on("error", () => {
16    console.log('mongodb连接失败');
17});
18
19

骨架和路由的配置


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
1const express = require('express');
2const router = express.Router();
3const mongoose = require("mongoose");
4const user = mongoose.model('user', mongoose.Schema({
5  username: { type: String },
6  password: { type: String },
7  user_ssh: { type: String }
8}, { collection: "user", versionKey: false, strict: true }));
9
10/* GET home page. */
11router.get('/', function (req, res, next) {
12  res.render('index', { title: 'Express' });
13});
14
15router.get('/test', async function (req, res, next) {
16  const data = await user.find({username:"zzw"});
17  res.send(data);
18});
19
20router.get('/add', async function (req, res, next) {
21  const data = await user.create({username:"zzw"});
22  res.send(data);
23});
24
25router.get('/err', function (req, res, next) {
26  process.exit();
27});
28module.exports = router;
29
30

更多配置请看这里


1
2
3
4
5
6
7
1primary    //默认模式,所有的读操作都从当前副本集主节点
2primaryPreferred   //多数情况下,从主节点读取数据,但是如果主节点不可用了,会从从节点读取
3secondary  //所有读操作都从副本集的从节点读取
4secondaryPreferred //多数情况下, 从从节点进行读操作,但是如果从节点都不可用了,从主节点读取
5nearest    //从副本集中延迟最低的成员读取,不考虑成员的类型
6
7

然后我们可以开始配置mongodb集群了

保证您的机器已经安装了docker
https://www.docker.com/

安装mongodb


1
2
3
4
5
6
7
11. docker search mongo  //搜索所有mongo镜像
22. docker pull mongo   //拉取官方镜像
33. docker imsages   //查看所有镜像
44. docker run -p 27017:27017 -v $PWD -d mongo //$pwd选择当前目录为mongodb工作目录,也可以自己指定
55. docker ps -a //查看mmongo工作状态
6
7

Docker搭建mongodb主从复制集群(nodejs+mongoose)

为了方便演示,我们采用一主一从的方式

因为是一主一从,所以我们启动两个mongodb的docker容器,如果您搭建一主多从,则多启动几个容器即可


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1docker run -d -p 27017:27017 --name="mongo_master" -v $PWD mongo --noprealloc --smallfiles --replSet rs
2
3docker run -d -p 27018:27017 --name="mongo_slave" -v $PWD mongo --noprealloc --smallfiles --replSet rs
4
5//$pwd指定当前目录为mongodb的工作目录
6//noprealloc
7默认false:使用预分配方式来保证写入性能的稳定,预分配在后台进行,并且每个预分配的文件都用0进行填充。这会让MongoDB始终保持额外的空间和空余的数据文件,从而避免了数据增长过快而带来的分配磁盘空间引起的阻塞。
8设置noprealloc= true来禁用预分配的数据文件,会缩短启动时间,但在正常操作过程中,可能会导致性能显著下降
9//smallfiles
10smallfiles:是否使用较小的默认文件。默认为false,不使用。
11设置为true,使用较小的默认数据文件大小。smallfiles减少数据文件的初始大小,并限制他们到512M,也减少了日志文件的大小,并限制他们到128M。
12如果数据库很大,各持有少量的数据,会导致mongodb创建很多文件,会影响性能
13//replSet
14使用此设置来配置复制副本集。指定一个副本集名称作为参数,所有主机都必须有相同的名称作为同一个副本集。
15
16

更详细的mongodb.conf配置文件解析链接
https://my.oschina.net/pwd/blog/399374

现在我们已经启动了两个mongodb容器了
Docker搭建mongodb主从复制集群(nodejs+mongoose)

接下来就需要配置mongodb的集群文件了


1
2
3
4
5
6
7
1//以刚运行的27017端口的mongodb数据库为主节点进入数据库
2//一次执行一下命令
3mongo --port 27017   //连接数据库
4myconf = {"_id":"rs","members":[{"_id":0,"host":"192.168.77.111:27017"},{"_id":1,"host":"192.168.77.137:27018"}]}  //配置mongodb集群文件
5rs.initiate(myconf)   //初始化配置文件
6
7

此时我们的mongodb配置文件已经初始化完毕


1
2
3
4
5
6
1rs.isMaster();  //查看主节点配置信息
2rs.slaveOk();  //设置为从节点
3rs.status();     //查看状态
4rs.conf();        //查看配置
5
6

Docker搭建mongodb主从复制集群(nodejs+mongoose)

现在我们的主从复制集群已经搭建完毕了,我们可以在主节点添加数据同步至从节点,也可以根据mongoose配置的策略进行从节点的读取

如何查看读取了哪一个从节点?

先进入端口为27017和27018的数据库

db.getProfilingStatus()
日志等级查看

db.setProfilingLevel(level)
level:
0: 关闭
1: 记录慢查询
2: 记录所有操作

为了测试,我们先讲等级设置为1,记录所有操作

db.system.profile.find() //查询所有操作记录

27017下可以看到插入记录
Docker搭建mongodb主从复制集群(nodejs+mongoose)

27018下可以看到查询记录
Docker搭建mongodb主从复制集群(nodejs+mongoose)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1ts://命令执行时间
2
3info://命令的内容
4
5query://代表查询
6
7order.order: //代表查询的库与集合
8
9reslen://返回的结果集大小,byte数
10
11nscanned://扫描记录数量
12
13nquery://后面是查询条件
14
15nreturned://返回记录数及用时
16
17millis://所花时间
18
19

重新指定主节点


1
2
3
4
5
6
7
8
1rs.conf();
2cfg=rs.conf();
3cfg.members[0].priority=1
4cfg.members[1].priority=1
5cfg.members[2].priority=10
6rs.reconfig(cfg);
7
8

同样的我们也可以在local数据集下oplog.rs集合中查看所有的增删改操作记录,也正是这个文件保证了主从数据的一致性

参考链接:
https://blog.csdn.net/adparking/article/details/41823393 //数据监控
https://blog.csdn.net/jhc23/article/details/81099281 //日志监控
https://my.oschina.net/pwd/blog/399374 //mongodb配置文件解析
https://www.cnblogs.com/jinjiangongzuoshi/p/9301062.html //主从搭建步骤
https://www.cnblogs.com/Joans/p/7723554.html //oplog.rs集合解析
https://blog.csdn.net/ochangwen/article/details/52400958 //集群监控

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索