介绍
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:端口 | 数据库路径 | 日志路径 |
1 | localhost: 4006 | D:\mongodb\shard1\db | D:\mongodb\shard1\log |
2 | localhost: 4007 | D:\mongodb\shard2\db | D:\mongodb\shard2\log |
3 | localhost: 4008 | D:\mongodb\shard3\db | D:\mongodb\shard3\log |
4 | localhost: 4009 | D:\mongodb\shard4\db | D:\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端口查看分片情况