小项目一般不会用到,只有当并发量大,宕机机率高的情况下才需要使用副本集模式

模式介绍

mongodb集群有三种模式,主从模式,副本集模式、sharding分片模式。主从模式官网也不再推荐上生产环境,主要是安全性太低。副本集和sharding模式目前是用的最广的方案,通常这2种方案的选择通过数据量和并发数来权衡。

早期的MongoDB版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主。目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主。在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据

使用场景

在GB级别的基本上副本集方案可满足,TB级别或以上采用sharding模式,解决单机容量和单机并发能力。这两种既有自己的优势也有自己的缺点,比如sharding模式分片越多,性能自然下降越多

官方建议的副本集节点数量是3个,1个主节点+2个从节点。或者是1个主节点+1个从节点+1个仲裁节点。仲裁节点的作用是在主节点不可用时,通过算法找到最适合的从节点成为新的主节点。不建议将仲裁节点和数据节点放在同一个服务器上

示例

这里开启三个本地Mongo服务来测试
./1/mongodb.conf (主1)

dbpath=D:\MongoDB\Server\4.0\1\db
port=27000
replSet=datamip/127.0.0.1:27001
# keyFile=D:\MongoDB\Server\4.0\keys\mongodb-keyfile

./2/mongodb.conf (从2)

dbpath=D:\MongoDB\Server\4.0\2\db
port=27001
replSet=datamip/127.0.0.1:27000
# keyFile=D:\MongoDB\Server\4.0\keys\mongodb-keyfile

./3/mongodb.conf (仲裁3)

dbpath=D:\MongoDB\Server\4.0\3\db
port=27002
replSet=datamip/127.0.0.1:27000
# keyFile=D:\MongoDB\Server\4.0\keys\mongodb-keyfile

KeyFile

在生产环境我们需要增加安全认证机制KeyFile,集群之间的安全认证
注意:三个节点必须要用同一份keyfile,在一台机器生成,拷贝到另外两台,并且修改成 600 的文件权限

生成 keyfile

$ openssl rand -base64 745 > /data/mongoConfig/keys/mongodb-keyfile

设置副本集、仲裁副本

$ mongo 127.0.0.1:27000
// 创建auth用户 (设置keyfile之后需要)
> db.createUser({ user: "admin", pwd: "admin", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })

// 设置副本集
> db.runCommand({
    "replSetInitiate": {
        "_id": "datamip",
        "members": [
            { "_id": 1, "host": "127.0.0.1:27000" },
            { "_id": 2, "host": "127.0.0.1:27001" }
        ]
    }
})

// 设置仲裁
> db.addArb("127.0.0.1:27002")

// 查看状态 (主、备、仲裁) 的状态
datamip:PRIMARY > rs.status()

在 mongodb.conf 启动配置文件中增加 keyFile 配置项

keyFile=/data/mongoConfig/keys/mon-keyfile

重启服务

注意:关闭服务需要先关闭[从],再关闭[主],最后一个关闭的将是 PRIMARY 主机

$ mongod -f /opt/mongodb/mongodb.conf

keyfiile登录 就相当于开启了 auth登录

$ mongo 127.0.0.1:27000 -u admin -p admin
datamip:PRIMARY > show dbs

默认不可以在 SECOUND 中使用 db命令,需要执行 salveOk 来开放权限

$ mongo 127.0.0.1:27001 -u admin -p admin
datamip:SECONDARY > rs.slaveOk()
datamip:SECONDARY > show dbs