很长时间没有写文章了,继续水一篇吧。今天来介绍下 MongoDB 的安装与复制集的搭建。

MongoDB 的安装本身并不复杂,相信你如果安装以下方式一步一步来,很容易。OK,首先看下 MongoDB 的安装部分

安装 MongoDB

MongoDB 官方网站 下载自己合适的版本

file

我这里选择的是 Ubuntu20,选择的是 tgz 格式

创建数据目录

mkdir -p /data /data/db

下载 并解压 MongoDB

cd /data
curl -o https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-5.0.6.tgz
tar -xvf mongodb-linux-x86_64-ubuntu2004-5.0.6.tgz

将 mongo 添加到环境变量中

vim /etc/profile
export PATH=$PATH:/data/mongodb-linux-x86_64-ubuntu2004-5.0.6/bin
source /etc/profile

启动 MongoDB

mongod --dbpath /data/db --port 27017 --logpath /data/db/mongod.log --fork

以上就是 MongoDB 的安装,接下来重点来说下 如何搭建 MongoDB 的复制集

搭建 MongoDB 复制集

同理也是先创建数据目录,假设我们配置三个节点,一主两从

创建数据目录

mkdir -p /data{1,2,3}

编写配置文件

正常情况下复制集的每个mongod进程应该位于不同的服务器。我们现在在一台机器上运行3个进程,因此要为它们各自配置:

  • 不同的端口。示例中将使用 28017/28018/28019.
  • 不同的数据目录。示例中将使用:
    • /data/db1
    • /data/db2
    • /data/db3
  • 不同日志文件路径。示例中将使用:
    • /data/db1/mongod.log
    • /data/db2/mongod.log
    • /data/db3/mongod.log

创建各自的配置文件 创建 db1 配置文件

vim /data/db1/mongod.conf

填写如下内容

systemLog:
  destination: file
  path: /data/db1/mongod.log   # 日志文件路径
  logAppend: true
storage:
  dbPath: /data/db1    # 数据目录
net:
  bindIp: 0.0.0.0
  port: 28017   # 端口
replication:
  replSetName: rs0
processManagement:
  fork: true

创建 db1 配置文件

vim /data/db2/mongod.conf

填写如下内容

vim /data/db2/mongod.conf

systemLog:
  destination: file
  path: /data/db2/mongod.log   # 日志文件路径
  logAppend: true
storage:
  dbPath: /data/db2    # 数据目录
net:
  bindIp: 0.0.0.0
  port: 28018   # 端口
replication:
  replSetName: rs0
processManagement:
  fork: true

创建 db3 配置文件

vim /data/db3/mongod.conf

填写如下内容

vim /data/db3/mongod.conf

systemLog:
  destination: file
  path: /data/db3/mongod.log   # 日志文件路径
  logAppend: true
storage:
  dbPath: /data/db3    # 数据目录
net:
  bindIp: 0.0.0.0
  port: 28019   # 端口
replication:
  replSetName: rs0
processManagement:
  fork: true

启动实例

mongod -f db1/mongod.conf
mongod -f db2/mongod.conf
mongod -f db3/mongod.conf

配置复制集

首先检查本机的 hostname

hostname 

例如我的 hostname 是 VM-24-10-ubuntu

进入到 28017 的 shell

mongo localhost:28017

创建复制集

rs.initiate()

添加另外两个从节点 rs.add("HOSTNAME",28018)

rs.add("VM-24-10-ubuntu",28018)
rs.add("VM-24-10-ubuntu",28019)

查看复制集状态:

rs.status()

大概率会输出以下信息就表明复制集配置成功

rs0:PRIMARY> rs.status()
{
        "set" : "rs0",
        "date" : ISODate("2022-02-13T06:50:24.900Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "syncSourceHost" : "",
        "syncSourceId" : -1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "majorityVoteCount" : 2,
        "writeMajorityCount" : 2,
        "votingMembersCount" : 3,
        "writableVotingMembersCount" : 3,
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1644735017, 1),
                        "t" : NumberLong(1)
                },
                "lastCommittedWallTime" : ISODate("2022-02-13T06:50:17.798Z"),
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1644735017, 1),
                        "t" : NumberLong(1)
                },
                "appliedOpTime" : {
                        "ts" : Timestamp(1644735017, 1),
                        "t" : NumberLong(1)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1644735017, 1),
                        "t" : NumberLong(1)
                },
                "lastAppliedWallTime" : ISODate("2022-02-13T06:50:17.798Z"),
                "lastDurableWallTime" : ISODate("2022-02-13T06:50:17.798Z")
        },
        "lastStableRecoveryTimestamp" : Timestamp(1644734967, 1),
        "electionCandidateMetrics" : {
                "lastElectionReason" : "electionTimeout",
                "lastElectionDate" : ISODate("2022-02-13T05:31:27.617Z"),
                "electionTerm" : NumberLong(1),
                "lastCommittedOpTimeAtElection" : {
                        "ts" : Timestamp(1644730287, 1),
                        "t" : NumberLong(-1)
                },
                "lastSeenOpTimeAtElection" : {
                        "ts" : Timestamp(1644730287, 1),
                        "t" : NumberLong(-1)
                },
                "numVotesNeeded" : 1,
                "priorityAtElection" : 1,
                "electionTimeoutMillis" : NumberLong(10000),
                "newTermStartDate" : ISODate("2022-02-13T05:31:27.671Z"),
                "wMajorityWriteAvailabilityDate" : ISODate("2022-02-13T05:31:27.695Z")
        },
        "members" : [
                {
                        "_id" : 0,
                        "name" : "VM-24-10-ubuntu:28017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 5754,
                        "optime" : {
                                "ts" : Timestamp(1644735017, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2022-02-13T06:50:17Z"),
                        "lastAppliedWallTime" : ISODate("2022-02-13T06:50:17.798Z"),
                        "lastDurableWallTime" : ISODate("2022-02-13T06:50:17.798Z"),
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "electionTime" : Timestamp(1644730287, 2),
                        "electionDate" : ISODate("2022-02-13T05:31:27Z"),
                        "configVersion" : 5,
                        "configTerm" : 1,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                },
                {
                        "_id" : 1,
                        "name" : "VM-24-10-ubuntu:28018",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 4519,
                        "optime" : {
                                "ts" : Timestamp(1644735017, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1644735017, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2022-02-13T06:50:17Z"),
                        "optimeDurableDate" : ISODate("2022-02-13T06:50:17Z"),
                        "lastAppliedWallTime" : ISODate("2022-02-13T06:50:17.798Z"),
                        "lastDurableWallTime" : ISODate("2022-02-13T06:50:17.798Z"),
                        "lastHeartbeat" : ISODate("2022-02-13T06:50:23.171Z"),
                        "lastHeartbeatRecv" : ISODate("2022-02-13T06:50:23.175Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncSourceHost" : "VM-24-10-ubuntu:28017",
                        "syncSourceId" : 0,
                        "infoMessage" : "",
                        "configVersion" : 5,
                        "configTerm" : 1
                },
                {
                        "_id" : 2,
                        "name" : "VM-24-10-ubuntu:28019",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 4505,
                        "optime" : {
                                "ts" : Timestamp(1644735017, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1644735017, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2022-02-13T06:50:17Z"),
                        "optimeDurableDate" : ISODate("2022-02-13T06:50:17Z"),
                        "lastAppliedWallTime" : ISODate("2022-02-13T06:50:17.798Z"),
                        "lastDurableWallTime" : ISODate("2022-02-13T06:50:17.798Z"),
                        "lastHeartbeat" : ISODate("2022-02-13T06:50:23.162Z"),
                        "lastHeartbeatRecv" : ISODate("2022-02-13T06:50:24.161Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncSourceHost" : "VM-24-10-ubuntu:28018",
                        "syncSourceId" : 1,
                        "infoMessage" : "",
                        "configVersion" : 5,
                        "configTerm" : 1
                }
        ],
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1644735017, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1644735017, 1)
}

其中 members 表示一共有三个节点

验证 复制集是否成功

首先我们登陆不同的窗口,先进入到 28018 的 shell 中

mongo localhost:28018

我们执行 db.test.find() ,发现会出现如下信息

rs0:SECONDARY> db.test.find()
Error: error: {
        "topologyVersion" : {
                "processId" : ObjectId("620893c513e98a234398ed77"),
                "counter" : NumberLong(6)
        },
        "ok" : 0,
        "errmsg" : "not master and slaveOk=false",
        "code" : 13435,
        "codeName" : "NotPrimaryNoSecondaryOk",
        "$clusterTime" : {
                "clusterTime" : Timestamp(1644730937, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1644730937, 1)
}

其实这已经表明我们的复制集已经配置成功了,告诉我们 not master and slaveOk=false ,表示不是主节点,并且不让我们在从节点进行读取操作。

我们可以设置允许在从节点进行读取,进行如下配置

rs.slaveOk()

我们的这个版本会提示我们 slaveOk 将会在下个版本进行移除,推荐我们使用secondaryOk()

WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.

rs.secondaryOk()

我们在此进行查询,发现没有数据

db.test.find()

接下来,我们在主节点写入一条数据,然后再在从节点 28018 上进行查询看看

mongo localhost:28107

db.test.insertOne({name:"hedeqiang"})

# 以下是输出信息
{
        "acknowledged" : true,
        "insertedId" : ObjectId("62089b314032bdf9aa397e21")
}

ok,我们在从节点 28018 上进行查看

rs0:SECONDARY> db.test.find()
{ "_id" : ObjectId("62089b314032bdf9aa37e21"), "name" : "hedeqiang" }

以上就是本次的全部内容,之后会进行一些其他内容的讲解。比如MongoDB 的选举之类。

关于极客返利

极客返利 是由我个人开发的一款网课返利、返现平台。包含 极客时间返现、拉勾教育返现、掘金小册返现、GitChat返现。目前仅包含这几个平台。后续如果有需要可以考虑其他平台。 简而言之就是:你买课,我返现。让你花更少的钱,就可以买到课程。

https://geekfl.com

https://geek.laravelcode.cn

版权许可

本作品采用 知识共享署名 4.0 国际许可协议 进行许可。

转载无需与我联系,但须注明出处,注明文章来源 MongoDB 的安装与复制集的搭建

联系我

编程怪事
暂无回复
0 / 180