搭建复制集

目标

通过在一个电脑上装三个数据库实例来搭建一个复制集,步骤如下:

  1. 启动一个MongoDB实例;
  2. 将3个实例搭建成一个复制集
  3. 对复制集参数的常规调整

准备

  1. 安装最新版本的MongoDB
  2. 配置环境变量,将Mongo的bin目录配置到时PATH变量(如果是Windows就加到环境变量里)
  3. 确保10GB以上的硬盘空间

创建数据目录

因为是3个实例,所以要创建3个不同的目录来保存数据文件、配置文件及日志文件。

实例目录

/data/db1
/data/db2
/data/db3

可通过下面一条命令创建(MacOS及Linux)

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

windows下一个一个建吧

日志文件

统一命名为mongod.log,每个目录下面一个

配置文件

统计命名为mongod.conf,每个目录下面一个

准备配置文件

端口

28017、28018、28019,每个实例指向不同的端口

配置文件(mongod.conf)

Linux/MacOS
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  ## 复制集的名字为 rs0
processManagement:
  fork: true ## 进程在后台运行
Windows
systemLog:
  destination: file
  path: c:\data\db1\mongod.log
  logAppend: true
storage:  
  dbPath: c:\data\db1
net:  
  bindIp: 0.0.0.0
  port: 28017
replication: 
  replSetName: rs0

启动MongoDB进程

每个实例都需要启动一下,通过ps命令可以查看到进程是不是启动了

ps -ef |grep mongod

Linux/MacOS

mongod -f /data/db1/mongod.conf

Windows

窗口不能关,要不然进程就关了

mongod -f c:\data\db1\mongod.conf

配置复制集

方法1

hostname替换成实际的主机名,需要 /etc/hosts 文件中做了配置,能解析

mongo --port 28017
> rs.initiate()
> rs.add("HOSTNAME:28018")
> rs.add("HOSTNAME:28019")

运行结果记录

> rs.initiate()
{
    "info2" : "no configuration specified. Using a default configuration for the set",
    "me" : "MacBook-Pro.local:28017",
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1577280751, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1577280751, 1)
}
rs0:SECONDARY>
rs0:PRIMARY> rs.add("MacBook-Pro.local:28018")
{
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1577280789, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1577280789, 1)
}
rs0:PRIMARY> rs.add("MacBook-Pro.local:28019")
{
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1577280794, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1577280794, 1)
}

方法2

mongo --port 28017
> rs.initiate({
  _id: "rs0",
  members: [
      {
        _id: 0,
        host: "localhost:28017" 
      },
      {
        _id: 1,
        host: "localhost:28018" 
      },
      {
        _id: 2,
        host: "localhost:28019" 
      }
  ]
})

验证配置

在28017上插入数据,然后在28018上查看结果

28017

rs0:PRIMARY> db.test.findOne()
null
rs0:PRIMARY> db.test.insert({a:1})
WriteResult({ "nInserted" : 1 })
rs0:PRIMARY> db.test.findOne()
{ "_id" : ObjectId("5e03695cbed9486c92da1acd"), "a" : 1 }
rs0:PRIMARY> db.test.insert({a:2})
WriteResult({ "nInserted" : 1 })
rs0:PRIMARY> db.test.find()
{ "_id" : ObjectId("5e03695cbed9486c92da1acd"), "a" : 1 }
{ "_id" : ObjectId("5e03696cbed9486c92da1ace"), "a" : 2 }

28018

 
rs0:SECONDARY> rs.slaveOk() ## 从结点可以读数据
rs0:SECONDARY> db.test.find() ## 否则这条报错
rs0:SECONDARY> db.test.find()
{ "_id" : ObjectId("5e03695cbed9486c92da1acd"), "a" : 1 }
rs0:SECONDARY> db.test.find()
{ "_id" : ObjectId("5e03695cbed9486c92da1acd"), "a" : 1 }
{ "_id" : ObjectId("5e03696cbed9486c92da1ace"), "a" : 2 }
rs0:SECONDARY>
posted @ 2023-11-10 10:44  Cetus-Y  阅读(10)  评论(0编辑  收藏  举报