MongoDB副本集、分片综合应用

本文详细介绍了MongoDB的副部集和分片技术,包括其基本概念、工作原理、部署步骤、配置管理以及实战应用,旨在帮助读者理解和掌握这两种关键功能,以实现高可用性、数据冗余和系统扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

MongoDB 副部集(Secondary Replica Set)和分片(Sharding)技术是 MongoDB 中的两个重要功能,它们提供了高可用性、数据冗余和可扩展性。副部集技术用于实现数据冗余和故障转移,确保在出现故障时,系统能够继续正常运行。分片技术则用于实现数据水平拆分,提高系统的性能和可扩展性。

实验目的

1. 了解 MongoDB 副部集和分片技术的基本概念、工作原理和优缺点。
2. 掌握 MongoDB 副部集和分片技术的部署、配置和管理方法。
3. 学习如何根据系统需求合理配置 MongoDB 副部集和分片参数,以实现高性能、高可用性和可扩展性。
4. 通过模拟实际应用场景,提高分析和解决问题的能力,以及实际操作经验。

MongoDB副本集

1.环境准备

首先配置副本路径,也就是配置三个实例,在配置之前先停止正在运行的mongod.exe,也就是我们的服务。副本集各服务器的基本信息及角色分配如下表。

将之前配置好的mongodb里的bin复制至mongodb1中,在mongodb1中新建db文件夹和log文件夹存在对应的数据库数据以及日志数据。

2.启动三个实例


需要使用replSet命令,在每一个bin目录下启动,注意路径不要写错

mongod port 27017 dbpath "d:\mongodb\mongodb\data\db" logpath
"d:\mongodb\mongodb\data\log\mongo.log" replSet rs0
mongod port 27019 dbpath "d:\mongodb\mongodb1\db" logpath
"d:\mongodb\mongodb1\log\mongo1.log" replSet rs0
mongod port 27020 dbpath "d:\mongodb\mongodb2\db" logpath
"d:\mongodb\mongodb2\log\mongo2.log" replSet rs0

第一个实例(之前就创建好的了,所以在启动前一定要关闭服务):

第二个实例 

第三个实例(也不要关闭窗口)

3.配置集群


进入其中一个实例,配置设置

use admin
config={ id:"rs0",members:[
{ id:0,host:"localhost:27017","priority":3},{ id:1,host:"localhost:27019","priority":2},{ id:2,host:"localhost:27020","priority":1}]}
rs.initiate(config)

其中第一个“id”为复制集的ID标识,即"id":“rs0”;第二个“id”是复制集内成员的标识,即"id":0。
priority为节点优先级,数字越高,优先级越高

使用命令来查看复制集状态  

rs.status() 

验证MongoDB复制集 

接下来需要验证一下复制集的数据同步。
在主节点(127.0.0.1:27017)上的test库collection集合c1中插入数据。 

use test
db.c1.insert({name:"zpq",age:1})

登陆另一个从节点(127.0.0.1:27019)验证是否同步,命令

mongo 127.0.0.1:27019
或者
mongo localhost:27019
或者
mongo port 27019(因为IP都是一样的,就不需要指定IP了) 

我们需要运行命令: 副本集的从库持久设置

rs.slaveOk() 

4.MongoDB复制集简单维护 

我们可以通过修改上面这些参数来进行复制集的维护;首先登陆到主节点mongo 127.0.0.1:27017,因为只能在主节点上操作。
1.增加从节点

rs.add(“ip:port”)
rs.add({" id":4,“host”:“ip:port”,“priority”:1,“hidden”:false})

2.增加投票节点 

rs.addArb(“ip:port”)rs.addArb({" id":5,“host”:“ip:port”})rs.add({" id":5,“host”:“new node:port”,“arbiterOnly”:true})

3.删除节点 

rs.remove(“ip:port”)

4.修改节点参数 

(1)config = rs.conf()
(2)config.members[i].参数 = 值
(3)rs.reconfig(config, {“force”:true})或
rs.reconfig(config),前面是强制重新配置

 5.主节点降级 

rs.stepDown(整数),意思是在整数秒内降级

6.查看配置文件

rs.conf() 

7.查看复制集状态

rs.status() 

还有很多很多维护事项。注意:
修改副本集成员配置时的限制:不能修改_id;
不能将接收rs.reconfig命令的成员的优先级设置为 0;
不能将仲裁者成员(投票节点或选举节点)变为非仲裁者成员(从节点),不能将非仲裁者成员(从节点)变为仲裁者成员(投票节点或选举节点);不能将 buildIndexes:false 改为 true;

MongoDB分片 

1.部署分片集群

环境配置 


ip:端口数据库路径日志路径
1localhost:
4006
D:\mongodb\shard1\dbD:\mongodb\shard1\log
2localhost:
4007
D:\mongodb\shard2\dbD:\mongodb\shard2\log
3localhost:
4008
D:\mongodb\shard3\dbD:\mongodb\shard3\log
4localhost:
4009
D:\mongodb\shard4\dbD:\mongodb\shard4\log

每一个分片都应该安装MongoDB实例,和前面的主从复制类似,也需要将bin文件复制到每个分片中,并且创建db文件以及log文件存放数据库数据和日志数据

启动分片服务

首先关闭之前打开的数据库服务

启动分片服务1


然后进入要分片的数据库bin目录中,启动cmd

mongod shardsvr replSet shard1 dbpath "D:\mongodb\shard1\db" port 4006logpath "D:\mongodb\shard1\log\shard1.log"

--shardsvr为分片声明
不要关闭此窗口,最小化即可
再次进入要分片的数据库bin目录中,启动cmd

mongod shardsvr replSet shard1 dbpath "D:\mongodb\shard2\db" port 4007logpath "D:\mongodb\shard2\log\shard2.log" 

启动分片服务2


进入要分片的数据库bin目录中,再再次启动cmd 

>mongod shardsvr replSet shard2 dbpath "D:\mongodb\shard3\db" port 4008logpath "D:\mongodb\shard3\log\shard2.log"

进入要分片的数据库bin目录中,再再再次启动cmd

mongod shardsvr replSet shard2 dbpath "D:\mongodb\shard4\db" port 4009logpath "D:\mongodb\shard4\log\shard2.log" 

进入分片一 初始化分片集 

 

config1={ id:"shard1",members:[
{ id:0,host:"localhost:4006",priority:1},{ id:1,host:"localhost:4007",priority:2}]}

进入分片二 初始化分片集 

 

config2={ id:"shard2",members:[
{ id:0,host:"localhost:4008",priority:2},{ id:1,host:"localhost:4009",priority:1}]}
rs.initiate(config2)

配置启动 Config Server


每个文件夹添加data和log 

三个实例共三个cmd窗口

启动Config1:


进入要分片的数据库bin目录中

mongod configsvr replSet confset dbpath "D:\mongodb\config1\db" port
4002 logpath "D:\mongodb\config1\log\config1.log"

--configsvr 这里我们完全可以像启动普通mongodb服务一样

启动,不需要添加—shardsvr和configsvr参数。因为这两个参数的作用就是改变启动端口的,所以我们自行指定了端口就可以。
三个实例共三个cmd窗口

启动Config2: 
mongod configsvr replSet confset dbpath "D:\mongodb\config2\db" port
4003 logpath "D:\mongodb\config1\log\config2.log"

启动Config3: 
mongod configsvr replSet confset dbpath "D:\mongodb\config3\db" port
4004 logpath "D:\mongodb\config1\log\config3.log"

 进入任何一个配置服务器的节点初始化配置服务器的群集
重新打开一个cmd,再bin目录下

配置设置

config3={ id:"confset",configsvr:true,members:[
{ id:0,host:"localhost:4002"},{ id:1,host:"localhost:4003"},{ id:2,host:"localhost:4004"}]}
rs.initiate(config3)

 配置路由服务器 Route Process
可以创建专门的文件夹存放日志

在进入要分片的数据库bin目录中启动cmd

mongos configdb confset/127.0.0.1:4002,127.0.0.1:4003,127.0.0.1:4003 logpath
"D:\mongodb\mongos\log\mongos.log" port 4000

mongos: mongos就是一个路由服务器,它会根据管理员设置的“片键”将数据分摊到自己管理的mongod集群,数据和片的对应关系以及相应的配置信息保存在"config服务器"上。

配置分片sharding,添加分片索引

bin目录下使用MongoDB Shell登录到mongos,添加Shard节点

sh.addShard("shard1/localhost:4006,localhost:4007")

sh.addShard("shard2/localhost:4008,localhost:4009")

查看分片集

db.getSiblingDB("config").shards.find() 

mongodb分片测试 

登入4000端口


指定要分片的数据库

sh.enableSharding("test")

指定数据库里需要分片的集合和片键,片键根据实际情况选择

sh.shardCollection("test.c2",{"id":1})//1表示范围分片,“hashed”表示哈希分片 

如果集合已经包含数据,则必须在分片集合之前创建一个支持分片键的索引,如果集合为空,则mongodb将创建索引。
向test库里的c2集合插入10000条数据

for (var i = 1; i<=10000;i++) db.c2.save({id:i,"test1":"testval"+i})
#查看c2信息

sh.status() 

 这里可能是数据量太少了,出来的结果并不是我想像的那样,根据官方说明,单调变化的键上进行分片,考虑使用哈希分片

robo 3T查看分片集


robo 3T链接4000端口进行查看

也可以连接两个shard端口查看分片情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值