这里有精心准备的PPT,大家可以先过目一下
PPT链接
为什么需要搭建mongodb集群?
- 数据备份
- 数据恢复
- 读写分离
首先我们先准备一个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
为了方便演示,我们采用一主一从的方式
因为是一主一从,所以我们启动两个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容器了
接下来就需要配置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
现在我们的主从复制集群已经搭建完毕了,我们可以在主节点添加数据同步至从节点,也可以根据mongoose配置的策略进行从节点的读取
如何查看读取了哪一个从节点?
先进入端口为27017和27018的数据库
db.getProfilingStatus()
日志等级查看
db.setProfilingLevel(level)
level:
0: 关闭
1: 记录慢查询
2: 记录所有操作
为了测试,我们先讲等级设置为1,记录所有操作
db.system.profile.find() //查询所有操作记录
27017下可以看到插入记录
27018下可以看到查询记录
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 //集群监控