超级详细!关于分布式数据库MongoDB的搭建副本集、初始化文档、 副本集的数据读写操作、副本集Secondary节点改造成⼀个Arbiter节点、故障转移详细!!!操作

需要搭建帮助的可以去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()

需要搭建帮助的可以去taobao搜索许风继续吹技术服务,谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值