搭建复制集
目标
通过在一个电脑上装三个数据库实例来搭建一个复制集,步骤如下:
- 启动一个MongoDB实例;
- 将3个实例搭建成一个复制集
- 对复制集参数的常规调整
准备
- 安装最新版本的MongoDB
- 配置环境变量,将Mongo的bin目录配置到时PATH变量(如果是Windows就加到环境变量里)
- 确保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>
螃蟹在剥我的壳,笔记本在写我,漫天的我落在枫叶上雪花上,而你在想我。
--章怀柔