MongoDB副本集群搭建和基础配置

MongoDB副本集群

文章目录

  • MongoDB副本集群
    • 1.MongoDB副本集介绍
      • 1.1.副本集角色:
    • 2.副本集介绍
      • 2.1.副本集目录规划
    • 3.MOngoDB副本集
      • 3.1.创建多实例目录
      • 3.2.创建配置文件
      • 3.3.创建数据目录
      • 3.4.启动所有节点
      • 3.5.查看启动情况
    • 4.初始化集群集
      • 4.1.生成副本集群
      • 4.2.测试数据同步
      • 4.3.从库插入数据报错
      • 4.4.从库插入无法数据临时解决方法
      • 4.5.登陆的永久解决方法

1.MongoDB副本集介绍

MongoDB的副本集就是主从复制,由于之前3.0版本之前就有主从复制的说法,后来更新迭代,起名叫副本集
副本集建议最少3台机器,一个主及诶单,两个从节点,如果是偶数台机器,需要在部署一个仲裁节点,否则会这导致集群选举异常
副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成。通过复制(Replication),将数据的更新由Primary推送到其他实例上,在一定的延迟之后,每个MongoDB实例维护相同的数据集副本。通过维护冗余的数据库副本,能够实现数据的异地备份,读写分离和自动故障转移
从节点登陆数据后,无法查看数据,需要执行rs.slaveOK()之后才可以查看集群信息

1.1.副本集角色:

主节点
负责读写
副本节点
同步主节点 shell下连接默认不可读
仲裁节点
不是必须的,不存储数据,也不参与竞选,只投票

2.副本集介绍

MongoDB副本集群搭建和基础配置_第1张图片

MongoDB副本集群搭建和基础配置_第2张图片

MongoDB副本集群搭建和基础配置_第3张图片
MongoDB副本集群搭建和基础配置_第4张图片

MongoDB副本集群搭建和基础配置_第5张图片

2.1.副本集目录规划

以/opt/Mongo+端口号为单机多实例存放目录

3.MOngoDB副本集

3.1.创建多实例目录

[root@localhost mongo_clusetr]# mkdir -p /opt/mongo_clusetr/mongodb_2801{7,8,9}/{conf,logs,pid}

3.2.创建配置文件

vim /opt/mongo_clusetr/mongodb_28017/conf/mongodb.yml
systemLog:
  destination: file
  logAppend: true
  path: /opt/mongo_clusetr/mongodb_28017/logs/mongodb.log

storage:
  journal:
    enabled: true
  dbPath: /data/mongo_clusetr/mongodb_28017/data
  directoryPerDB: true
  wiredTiger:
    engineConfig:
        cacheSizeGB: 1
        directoryForIndexes: true
    collectionConfig:
        blockCompressor: zlib
    indexConfig:	
        prefixCompression: true

processManagement:
  fork: true
  pidFilePath: /opt/mongo_clusetr/mongodb_28017/pid/mongod.pid

net:
  port: 27017 
  bindIp: 127.0.0.1,192.168.40.4
reclication:
  oplogSizeMB: 1024
  replSetName: dba1

2.3.创建其他两个配置文件

[root@localhost mongo_clusetr]# cp mongodb_28017/conf/mongodb.yml mongodb_28018/conf/
[root@localhost mongo_clusetr]# cp mongodb_28017/conf/mongodb.yml mongodb_28019/conf/

修改端口号
[root@localhost mongo_clusetr]# sed -i 's#28017#28108#g' /opt/mongo_clusetr/mongodb_28018/conf/mongodb.yml 
[root@localhost mongo_clusetr]# sed -i 's#28017#28109#g' /opt/mongo_clusetr/mongodb_28019/conf/mongodb.yml 

3.3.创建数据目录

[root@localhost mongo_clusetr]# mkdir /data/mongo_clusetr/mongodb_2801{7,8,9}

3.4.启动所有节点

启动第一个节点
[root@localhost mongo_clusetr]# mongodb/bin/mongod -f mongodb_28017/conf/mongodb.yml 
启动第二个节点
[root@localhost mongo_clusetr]# mongodb/bin/mongod -f mongodb_28018/conf/mongodb.yml
启动第三个节点
[root@localhost mongo_clusetr]# mongodb/bin/mongod -f mongodb_28019/conf/mongodb.yml

3.5.查看启动情况

[root@localhost mongo_clusetr]# netstat -anpt |grep 2801
tcp        0      0 192.168.40.4:28017      0.0.0.0:*               LISTEN      12177/mongodb/bin/m 
tcp        0      0 127.0.0.1:28017         0.0.0.0:*               LISTEN      12177/mongodb/bin/m 
tcp        0      0 192.168.40.4:28018      0.0.0.0:*               LISTEN      12639/mongodb/bin/m 
tcp        0      0 127.0.0.1:28018         0.0.0.0:*               LISTEN      12639/mongodb/bin/m 
tcp        0      0 192.168.40.4:28019      0.0.0.0:*               LISTEN      13021/mongodb/bin/m 
tcp        0      0 127.0.0.1:28019         0.0.0.0:*               LISTEN      13021/mongodb/bin/m

4.初始化集群集

定义副本集群
config = {
_id : "dba1",
members : [
{_id : 0, host : "db:28017"},
{_id : 1, host : "db:28018"},
{_id : 2, host : "db:28019"},
] }

使副本集群生效
rs.initiate(config)

查看副本集状态
rs.status()

4.1.生成副本集群

MongoDB副本集群搭建和基础配置_第6张图片

输入之后直接生效,直接变成主库

MongoDB副本集群搭建和基础配置_第7张图片

4.2.测试数据同步

登录主库
[root@localhost mongo_clusetr]# mongodb/bin/mongo db:28017
查看当前所在库和表
dba1:PRIMARY> db
test
dba1:PRIMARY> show tables

在主库写入数据
dba1:PRIMARY> db.te.insert({"name":"zhang","age":10})
WriteResult({ "nInserted" : 1 })

在主库查看数据
dba1:PRIMARY> db.te.find()
{ "_id" : ObjectId("636f63745a73f86992679cef"), "name" : "zhang", "age" : 10 }
{ "_id" : ObjectId("636f63be5a73f86992679cf0"), "name" : "gao", "age" : 11 

4.3.从库插入数据报错

可以看到主库是可以正常插入数据的,但是从库不能读不能写入数据

副本集默认是只能复制但是不能读写的

dba1:SECONDARY> show tables
2022-11-12T17:18:03.351+0800 E QUERY    [thread1] Error: listCollections failed: {
	"operationTime" : Timestamp(1668244677, 1),
	"ok" : 0,
	"errmsg" : "not master and slaveOk=false",
	"code" : 13435,
	"codeName" : "NotMasterNoSlaveOk",
	"$clusterTime" : {
		"clusterTime" : Timestamp(1668244677, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
} 

4.4.从库插入无法数据临时解决方法

这个是MongoDB库的一种保护机制,下面我们来解决这个问题。

但是每次登陆都需要只用这个命令。

解决方法
rs.slaveOK();

执行命令
dba1:SECONDARY> rs.slaveOk();
WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.

然后我们就可以正常的查看数据了
dba1:SECONDARY> db.te.find()
{ "_id" : ObjectId("636f63745a73f86992679cef"), "name" : "zhang", "age" : 10 }
{ "_id" : ObjectId("636f63be5a73f86992679cf0"), "name" : "gao", "age" : 11 }

4.5.登陆的永久解决方法

如果不想每次登陆都使用这个命令

下面为大家提供方法

我的用户时root可以在数据库用户下找到.mongorc.js的隐藏文件
[root@localhost ~]# ls -la | grep .mongorc.js
-rw-------.  1 root root         0 Jul 25 16:57 .mongorc.js

在文件中写入内容

[root@localhost ~]# vim.mongorc.js
[root@localhost ~]# cat .mongorc.js 
rs.slaveOK();

我们再次登陆数据库

可以看到不用再次输入命令可以直接查看
[root@localhost mongo_clusetr]# mongodb/bin/mongo db:28018
dba1:SECONDARY> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB

cat .mongorc.js
rs.slaveOK();


我们再次登陆数据库

可以看到不用再次输入命令可以直接查看
[root@localhost mongo_clusetr]# mongodb/bin/mongo db:28018
dba1:SECONDARY> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB

你可能感兴趣的:(MongoDB,数据库,mongodb)