需要搭建帮助的可以去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. 尝试在副节点中插入数据