需要搭建帮助的可以去taobao搜索许风继续吹技术服务,谢谢!!!
主要任务
环境搭建:准备 MongoDB 的安装环境,包括各个节点的硬件和网络配置。
MongoDB 安装:在各节点上安装 MongoDB。
副本集配置:配置 MongoDB 实例以支持副本集,包括设置 `replicaSet` 参数等。
副本集初始化:启动副本集,初始化主节点并添加从节点。
副本集文档同步:验证各节点的数据同步功能,观察从节点是否能够通过 oplog 实现实时的文档同步。
副本集故障转移:测试副本集的自动故障转移功能,通过停止主节点模拟故障,观察副本集是否能自动选举新的主节点。
1 : 创建副本集文件夹
/mongodb/rs01/data/db
/mongodb/rs01/log/mongod.log
配置文件:mongod.conf
# 数据库路径
storage:
dbPath: "D:/sharded_cluster/lc01/data/db" # 指定数据库文件的存储路径,确保此路径存在以存储 MongoDB 的数据。
# 日志路径
systemLog:
destination: file
path: "D:/sharded_cluster/lc01/log/mongod.log" # 指定日志文件路径,用于记录 MongoDB 的操作日志。
logAppend: true # 启用日志追加模式,避免日志被覆盖。
#processManagement:
#启⽤在后台运⾏mongos或mongod进程的守护进程模式。
#fork: true
#指定⽤于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
#pidFilePath: D:\distributied_database\mongodb_test2\rs0_02\log\mongod.pid
# 网络设置
net:
# 服务实例绑定的 IP
bindIp: 127.0.0.1
# 绑定的端口
port: 27030
replication:
# 副本集的名称
replSetName: lc01
sharding:
# 分片角色
clusterRole: shardsvr
windows注册服务,以管理员的⾝份打开⼀个cmd 运⾏以下命令路径替换成⾃⼰的路径
mongod --config="D:\sharded_cluster\lc01\mongod.conf" - install --serviceName=MongoDB_lc01 --serviceDisplayName=MongoDB_lc01
启动mongoDB:--serviceDisplayName 在Windows服务管理器中显⽰的服务名,与--serviceName保持⼀致即可 然后接着看到以下信息,表明启动成功
net start MongoDB_lc0
启动服务,打开⼀个cmd 连接任意启动的节点
mongosh -port 27030
在连接的终端初始化副本集
var conf = {
"_id":"lc",
"members":[
{"_id":0,host:"localhost:27030"},
{"_id":1,host:"localhost:27040"},
{"_id":2,host:"localhost:27050"}
]
}
## 调⽤initiate()初始化设置
rs.initiate(conf)
2. 将⼀个副本集Secondary节点改造成⼀个Arbiter节点 我们将副本rs0_02改成仲裁者(Arbiter)
step1. 停⽌副本lc2 的服务
step2. mongosh 进入主节点,我的主节点port=27030
net stop MongoDB_lc01
mongosh -port 27030
step3. 删除 lc2,其 port=27040
rs.remove("localhost:27040")
step4. 重启 lc2
net start MongoDB_lc2
step5. 在主节点中添加一个仲裁者,即把MongoDB_lc2添加成仲裁者(Arbiter)
rs.addArb("localhost:27040")
db.adminCommand({
"setDefaultRWConcern" : 1,
"defaultWriteConcern" : {
"w" : 2
}
})
Step6. 查看副本集状态
for(var i=0;i<rs.status().members.length;i++)
{ print(rs.status().members[i].name +":"+ rs.status().members[i].stateStr) }
三、 副本集的数据读写操作 step1. 登录主节点27030,写入和读取数据:
use article
db
db.comment.find()
[
{
_id: ObjectId('672781110e1cd225c886b01d'),
articleid: '100000',
content: '今天天⽓真好,阳光 明媚',
userid: '1001',
nickname: 'Rose',
createdatetime: ISODate('2024-11-03T13:56:33.729Z')
}
]
step2. 登录从节点27040
db.comment.insert({"articleid":"100000","content":"今天天⽓不太好,阴 绵
绵","userid":"1001","nickname":"Rose","createdatetime":new Date()}
... )
发信不能写数据,但是能读取数据
rs0 [direct: primary] artcle> db.comment.find()
[
{
_id: ObjectId('672781110e1cd225c886b01d'),
articleid: '100000',
content: '今天天⽓真好,阳光 明媚',
userid: '1001',
nickname: 'Rose',
createdatetime: ISODate('2024-11-03T13:56:33.729Z')
}
]
rs0 [direct: primary] artcle> db.comment.find()
[
{
_id: ObjectId('672781110e1cd225c886b01d'),
articleid: '100000',
content: '今天天⽓真好,阳光 明媚',
userid: '1001',
nickname: 'Rose',
createdatetime: ISODate('2024-11-03T13:56:33.729Z')
}
]
step3. 仲裁者节点,不存放任何业务数据的,可以登录查看
rs0 [direct: arbiter] test> show dbs
MongoServerError[NotPrimaryOrSecondary]: node is not in primary or recovering
state
rs0 [direct: arbiter] test> use local
switched to db local
rs0 [direct: arbiter] local> show collections
oplog.rs
replset.election
replset.initialSyncId
replset.minvalid
replset.oplogTruncateAfterPoint
startup_log
system.replset
system.rollback.id
system.tenantMigration.oplogView [view]
system.views
rs0 [direct: arbiter] local>
4. 主节点的选举原则
选举规则是根据票数来决定谁获胜: 票数最⾼,且获得了“⼤多数”成员的投票⽀持的节点获胜。 “⼤多数”的定义为:假设复制集内投票成员 数量为N,则⼤多数为 N/2 + 1。例如:3个投票成员,则⼤多数的值是2。当复制集内存活成员数量不⾜⼤ 多数时,整个复制集将⽆法选举出Primary,复制集将⽆法提供写服务,处于只读状态。 若票数相同,且都获得了“⼤多数”成员的投票⽀持的,数据新的节点获胜。 数据的新旧是通过操作⽇志 oplog来对比的。
使⽤rs.conf来查看各个节点的priority
rs.conf()
可以修改优先级 比如,下⾯提升从节点的优先级: 1)先将配置导入cfg变量
cfg=rs.conf()
2)然后修改值(ID号默认从0开始):
cfg.members[1].priority=2
3. 重新加载配置
rs.reconfig(cfg)
故障测试
1. 副本节点故障测试 关闭27050副本节点: 发现,主节点和仲裁节点对27040的⼼跳失败。因为主节点还在,因此,没有触发投票 选举。 如果此时,在主节点写入数据。
关闭27050从节点:是在任务处理器关闭
27030 主节点插入数据输入成功
db.comment.insert({"_id":"1","articleid":"100001","content":"我们不应该把清晨浪费在
⼿机上,健康很重要,⼀杯温⽔幸福你我他。","userid":"1002","nickname":"相忘于江
湖","createdatetime":new Date("2019-08-
05T22:08:15.522Z"),"likenum":NumberInt(1000),"state":"1"})
2. 主节点故障测试cfg=rs.conf() 关闭27030主节点
重启27050,并发现27050由从节点变为主节点
mongosh -port 27050
在新的主节点27050插入数据,发现插入成功
db.comment.insert({"_id":"2","articleid":"100001","content":"我夏天空腹喝凉开⽔,冬
天喝温开⽔","userid":"1005","nickname":"伊⼈憔悴","createdatetime":new Date("2019-
08-05T23:58:51.485Z"),"likenum":NumberInt(888),"state":"1"})
3. 仲裁节点和主节点故障 先关掉仲裁节点27050, 关掉现在的主节点27050 登录27030后,发现,27030仍然 是从节点
关闭掉仲裁节点27040, 关掉现在的主节点27050 登录27030
加入了 27040 仲裁节点成员,则主节点一定是 27030,因为没得选了,仲裁节点不参 与选举,但参与 投票。
4. 仲裁节点和从节点故障 先关掉仲裁节点27040, 关掉现在的副本节点27050
10 秒后,27030主节点⾃动降级为副本节点。(服务降 级) 副本集不可写数据了,已 经故障了。
Compass连接副本集
1. compass连接主节点:
2. compass 连接从节点:
3. 尝试在副节点中插入数据
use article
db["comment"].find()