MongoDB搭建副本集(超详细!!!)

需要搭建帮助的可以去taobao搜索G9T技术服务,谢谢!!!

需要搭建帮助的可以去taobao搜索G9T技术服务,谢谢!!!

1. 搭建⼀个副本集

replica set Name :rs0 
rs00 -port 27030 
rs01 -port 27040 
rs02 -port 27050 

step 1 : 创建副本集文件夹 

 

 /mongodb/rs01/data/db 
 /mongodb/rs01/log/mongod.log

step2: 配置文件:mongod.conf 

在rs01下⾯创建mongod.conf文件

并粘贴以下数据,修改dbpath、path为对应的文件或文件,port修改为未使⽤的端⼝号 (根据自己路径进行修改)

# 数据库路径 
storage: 
  dbPath: D:\distributied_database\mongodb_test2\rs0_01\data\db  # 指定数据库文件的
存储路径,确保此路径存在以存储 MongoDB 的数据。 
# ⽇志路径 
systemLog: 
  destination: file 
  path: D:\distributied_database\mongodb_test2\rs0_01\mongod.log  # 指定⽇志文件路
径,⽤于记录 MongoDB 的操作⽇志。 
  logAppend: true  # 启⽤⽇志追加模式,避免⽇志被覆盖。 
processManagement: 
#启⽤在后台运⾏mongos或mongod进程的守护进程模式。 
#fork: true 
#指定⽤于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID 
    pidFilePath: D:\distributied_database\mongodb_test2\rs0_01\log/mongod.pid 
 # ⽹络设置 
net: 
#服务实例绑定所有IP,有副作⽤,副本集初始化的时候,节点名字会⾃动设置为本地域名,⽽不
是ip #bindIpAll: true 
#服务实例绑定的IP 
    bindIp: 127.0.0.1 
#bindIp 
#绑定的端⼝ 
    port: 27030 
replication: 
#副本集的名称 
    replSetName: rs0 

step3 启动mongoDB⼀个实例(服务),有两种⽅式 

1. ⽅法⼀,打开⼀个终端,把config文件路径替换成⾃⼰的路径(打开三个cmd进行三次)

mongod --config="D:\distributied_database\mongodb_test2\rs0_03\mongod.conf"

看到光标在闪动,即表⽰服务启动成功,不要关闭该终端。如果要关闭该服务可以直接ctrl+c,或者直接关闭该 终端即可 2. ⽅法⼆,windows注册服务,以管理员的⾝份打开⼀个cmd 运⾏以下命令(打开三个cmd进行三次)

mongod --config="D:\distributied_database\mongodb_test2\rs0_02\mongod.conf" - install --serviceName=MongoDB_rs02 --serviceDisplayName=MongoDB_rs02

--serviceName 参数是注册服务的名字,可以⾃定义,这⾥我们就使⽤副本名称+编号的形式,rs02 表⽰副本 集为rs0的第2个副本实例 --serviceDisplayName 在Windows服务管理器中显⽰的服务名,与- serviceName保持⼀致即可 然后接着看到以下信息,表明启动成功 

step4 重复上⾯step1-step3,再配置并启动两个从节点

step5 打开⼀个cmd 连接任意启动的节点

 mongsh -port 27030

在连接的终端初始化副本集

 var conf = { 
"_id":"rs0", 
"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. 停⽌副本rs0_02的服务

以管理员的⾝份打开⼀个cmd 运⾏以下命令(修改为自己设置副本集名称)

net stop MongoDB_rs02

 step2. mongosh 进入主节点,我的主节点port=27030

mongosh -port 27030 

step3. 删除rs0_02,其port=27040 

 rs.remove("localhost:27040")

删除成功后会返回⼀个结果:

 step4. 重启rs0_02

net start MongoDB_rs02

step5. 在主节点中添加⼀个仲裁者,即把MongoDB_rs02添加成仲裁者(Arbiter) 

  

rs.addArb("localhost:27040")

 可能会遇到以下错误

 只需要在终端中执⾏以下语句即可:

db.adminCommand({ 
"setDefaultRWConcern" : 1, 
"defaultWriteConcern" : { 
"w" : 2 
    } 
})

step7. 查看副本集状态 

for(var i=0;i<rs.status().members.length;i++) 
{ print(rs.status().members[i].name +":"+ rs.status().members[i].stateStr) }

3. 副本集的数据读写操作

⽬标:测试三个不同⾓⾊的节点的数据读写情况。

step1. 登录主节点27030,写入和读取数据: 

 use artcle
db 
db.comment.insertOne({"articleid":"100000","content":"今天天⽓真好,阳光 明
媚","userid":"1001","nickname":"Rose","createdatetime":new Date()}) 
{ 
  acknowledged: true, 
  insertedId: ObjectId('672781110e1cd225c886b01d')
}
 db.comment.find() 
[ 
  { 
    _id: ObjectId('672781110e1cd225c886b01d'), 
    articleid: '100000', 
    content: '今天天⽓真好,阳光 明媚', 
    userid: '1001', 
    nickname: 'Rose', 
    createdatetime: ISODate('2024-11-03T13:56:33.729Z') 
  } 
]

 

step2. 登录从节点27040 

 

use article
db.comment.insert({"articleid":"100000","content":"今天天⽓不太好,阴绵绵","userid":"1001","nickname":"Rose","createdatetime":new Date()} ... )

 

 发信不能写数据,但是能读取数据

 db.comment.find() 
[ 
  { 
    _id: ObjectId('672781110e1cd225c886b01d'), 
    articleid: '100000', 
    content: '今天天⽓真好,阳光 明媚', 
    userid: '1001', 
    nickname: 'Rose', 
    createdatetime: ISODate('2024-11-03T13:56:33.729Z') 
  }
]
 db.comment.find() 
[ 
  { 
    _id: ObjectId('672781110e1cd225c886b01d'), 
    articleid: '100000', 
    content: '今天天⽓真好,阳光 明媚', 
    userid: '1001', 
    nickname: 'Rose', 
    createdatetime: ISODate('2024-11-03T13:56:33.729Z') 
  } 
]

 

step3. 仲裁者节点,不存放任何业务数据的,可以登录查看 

show dbs 
use local
show collections 

 4. 主节点的选举原则

MongoDB在副本集中,会⾃动进⾏主节点的选举,主节点选举的触发条件: 1) 主节点故障 2) 主节点⽹络 不可达(默认⼼跳信息为10秒) 3) ⼈⼯⼲预(rs.stepDown(600))

⼀旦触发选举,就要根据⼀定规则来选主节点。

选举规则是根据票数来决定谁获胜: 票数最⾼,且获得了“⼤多数”成员的投票⽀持的节点获胜。 “⼤多数”的定义为:假设复制集内投票成员 数量为N,则⼤多数为 N/2 + 1。例如:3个投票成员,则⼤多数的值是2。当复制集内存活成员数量不⾜⼤ 多数时,整个复制集将⽆法选举出Primary,复制集将⽆法提供写服务,处于只读状态。 若票数相同,且都获得了“⼤多数”成员的投票⽀持的,数据新的节点获胜。 数据的新旧是通过操作⽇志 oplog来对比的在获得票数的时候,优先级(priority)参数影响重⼤。 可以通过设置优先级(priority)来设置额外票数。优 先级即权重,取值为0-1000,相当于可额外增加 0-1000的票数,优先级的值越⼤,就越可能获得多数成员的投 票(votes)数。指定较⾼的值可使成员更有资格成为主要成员,更低的值可使成员更不符合条件。默认情况 下,优先级的值是1

使⽤rs.conf来查看各个节点的priority

rs.conf()

 

可以修改优先级 比如,下⾯提升从节点的优先级:

1.先将配置导入cfg变量

cfg=rs.conf()

 

2.然后修改值(ID号默认从0开始):

cfg.members[1].priority=2

 

3. 重新加载配置 

rs.reconfig(cfg) 

 

5.故障测试 

1. 副本节点故障测试

关闭27050副本节点: 发现,主节点和仲裁节点对27040的⼼跳失败。因为主节点还在,因此,没有触发投票 选举。 如果此时,在主节点写入数据

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. 主节点故障测试

关闭27030节点 发现,从节点和仲裁节点对27030的⼼跳失败,当失败超过10秒,此时因为没有主节点了,会 ⾃动发起 投票。 ⽽副本节点只有27050,因此,候选⼈只有⼀个就是27050,开始投票。 27040向27050投了 ⼀票,27050本⾝⾃带⼀票,因此共两票,超过了“⼤多数” 27040是仲裁节点,没有选举权,27050不向其投 票,其票数是0. 最终结果,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仍然是从节点,副本集中没有主 节点了,导致此时,副本集是只读状态, ⽆法写入。 为啥不选举了?因为27030的票数,没有获得⼤多数,即 没有⼤于等于2,它只有默认的⼀票(优先级 是1) 如果要触发选举,随便加入⼀个成员即可。

如果只加入27040仲裁节点成员,则主节点⼀定是27030,因为没得选了,仲裁节点不参与选举,但参与 投票。(不演⽰)

如果只加入27050节点,会发起选举。因为27030和27050都是两票,则按照谁数据新,谁当主节点。

 

4. 仲裁节点和从节点故障

先关掉仲裁节点27040, 关掉现在的副本节点27050 10秒后,27030主节点⾃动降级为副本节点。(服务降 级) 副本集不可写数据了,已经故障了。

6.Compass连接副本集

1. compass连接主节点:

2. compass连接从节点:

3. 尝试在副节点中插入数据

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值