目录
分片介绍
在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。
当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。
副本集介绍
副本集就是为了解决mongodb的可靠性, MongoDB复制是将数据同步在多个服务器的过程。 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性。 复制还允许您从硬件故障和服务中断中恢复数据。
MongoDB副本集部署(windows)
环境准备
本教程演示mongodb4.4.24 副本集部署(一主两从,伪分布式)
节点 | 配置 |
---|---|
主节点 | localhost:27017 |
从节点1 | localhost:27018 |
从节点2 | localhost:27019 |
启动实例(服务)
语法:
bin>mongod -port 端口号 -dbpath 数据路径 -logpath 日志路径 -replSet 副本集名称
示例:
>mongod -port 27018 -dbpath D:\MongoDB1\data -logpath D:\MongoDB1\log\mongo1.log -replSet rs0
主节点:
从节点1(以管理员身份启动):
从节点2:
以上三个节点启动的都是一次性服务,所以窗口不要关闭!
配置副本集
维持服务不要关闭,进入任何一个节点内:
进行配置:
1.切换到admin数据库
use admin
2.配置集群:
config={_id:"rs0",members:[
... {_id:0,host:"localhost:27017","priority":3},
... {_id:1,host:"localhost:27018","priority":2},
... {_id:2,host:"localhost:27019","priority":1}]}
说明:第一个“_id”为副本集名称,“priority”为优先级,数字越大,优先级越高。
3.使得配置生效
rs.initiate(config)
生效后可能会出现节点显示错误:
(明明是主节点,但却显示从节点)
只需要查看副本集状态即可更正:
rs.status()
从节点配置
1、刚刚配置好的副本集中的从节点是无法进行数据库操作的:
2、要先进行从节点永久化设置:
3、或者使用(推荐使用):
副本集验证
1、在主节点中增加数据
2、在从节点上验证:
说明副本集群部署成功。
MongoDB数据库分片
环境准备
分片 | 节点 | IP:端口 | 数据库路径 | 日志路径 |
1 | shard1(主) | localhost:4006 | D:\mongodb\shard1\db | D:\mongodb\shard1\log |
1 | shard2(副) | localhost:4007 | D:\mongodb\shard2\db | D:\mongodb\shard2\log |
2 | shard3(副) | localhost:4008 | D:\mongodb\shard3\db | D:\mongodb\shard3\log |
2 | shard4(副) | localhost:4009 | D:\mongodb\shard4\db | D:\mongodb\shard4\log |
1.每一个分片都应该安装MongDB实例,和前面的主从复制类似,也需要将bin文件复制到每个分片中,并且创建db文件以及log文件存放数据和日志数据
启动分片服务
1.首先关闭之前打开的数据库服务
启动分片服务1
2.然后进入要分片的数据库bin目录中,启动cmd
D:\shard1\bin>mongod --shardsvr --replSet shard1 -port 4006 -dbpath D:\shard1\shard11\data -logpath D:\shard1\shard11\log\shard11.log
--shardsvr为分片声明
不要关闭此窗口,最小化即可
1.再次进入要分片的数据库bin目录中,启动cmd
D:\shard1\bin>mongod --shardsvr --replSet shard1 -port 4007 -dbpath D:\shard1\shard12\data -logpath D:\shard1\shard12\log\shard12.log
启动分片服务2
2.再再进入要分片的数据库bin目录中,启动cmd
D:\shard2\bin>mongod --shardsvr --replSet shard2 -port 4008 -dbpath D:\shard2\shard21\data -logpath D:\shard2\shard21\log\shard21.log
3.再再再次进入要分片的数据库bin目录中,启动cmd
D:\shard2\bin>mongod --shardsvr --replSet shard2 -port 4009 -dbpath D:\shard2\shard22\data -logpath D:\shard2\shard22\log\shard22.log
进入分片1 初始化分片集
进行配置:
1.切换到admin数据库
2.配置集群:
config={_id:"shard1",members:[{_id:0,host:"localhost:4006",priority:2},{_id:1,host:"localhost:4007",priority:1}]}
进入分片2 初始化分片集
1.切换到admin数据库
2.配置集群:
config={_id:"shard2",members:[{_id:0,host:"localhost:4008",priority:2},{_id:1,host:"localhost:4009",priority:1}]}
rs.initiate(config)
配置启动 Config Server
值得注意的是:在MongDB 3版本config服务必须配置为从副本集,所以直接用前面配置哦偶好了的副本启动即可
1.老样子,每个文件夹添加data和log
config实例 | 端口号 | 数据库路径 | 日志路径 |
config1 | 4002 | D:\mongodb\config1\db | D:\mongodb\config1\log |
config2 | 4003 | D:\mongodb\config2\db | D:\mongodb\config2\log |
三个实例共三个cmd窗口
启动Config1:
1.进入要分片的数据库bin目录中
D:\config\bin>mongod --configsvr --replSet confset -port 4002 -dbpath D:\config\config1\data -logpath D:\config\config1\log\conf1.log
2.-configsvr这里我们完全可以像启动普通mongodb服务一样启动,不需要添加一-shardsvr和0configsvr 参数。因为这两个参数的作用就是改变启动端口的,所以我们自行指定了端口就可以。 三个实例共三个cmd窗口[一次性启动服务,不要关闭cmd窗口,最小化即可]
启动Config2:
D:\config\bin>mongod --configsvr --replSet confset -port 4003 -dbpath D:\config\config2\data -logpath D:\config\config2\log\conf2.log
配置路由服务器Route Process
1.可以创建专门的文件夹存故日志
2.在进入要分片的数据库bin目录中启动cmd
D:\MongDB2\bin>mongos --configdb confset/localhost:4002,localhost:4003 -logpath D:\mongos\log\mongos.log -port 4000
3.mongos: mongos就是一个路由服务器,它会根据管理员设置的"片键"将数据分摊到自己管理的 mongod集群,数据和片的对应关系以及相应的配置信息保存在"config服务器”上。
配置分片sharding,添加分片索引
1.bin目录下使用MongoDB Shel登录到mongos,添加Shard节点
mongos> sh.addShard("shard1/localhost:4006,localhost:4007")
mongos> sh.addShard("shard2/localhost:4008,localhost:4009")
查看分片集
db.getSiblingDB("config").shards.find()
MongoDB分片测试
1.登入4000端口
2.切换到admin数据库
3.配置集群:
指定要分片的数据库
mongos> sh.enableSharding("test")
4.指定数据库里需要分片的集合和片键,片键根据实际情况选择
mongos> sh.shardCollection("test.c2",{"id":1})//1表示范围分片,“hashed”表示哈希分片
5.如果集合已经包含数据,则必须在分片集合之前创建一个支持分片键的素引,如果集合为空,则 mongodb将创建素引。
6.向test库里的c2集合插入10000条数据
mongos> for(var i=1; i<=10000;i==) db.c2.save({id:i,"test1":"testval"+i})
#查看c2信息
mongos> sh.status()
这里可能是数据量太少了,出来的结果并不是我想像的那样,根据官方说明,单调变化的键上进行分 片,考虑使用哈希分片。
robo 3T查看分片集
robo 3T链接4000端口进行查看
也可以连接两个shard端口查看分片情况
最后
重新打开mongodb服务,即可像原来一样使用,但是数据存储方式和原来已经不一样了,变成了分布 式的分片存储。
tips:
- 电脑版本比较高,所以的cmd需要使用管理员身份运行
- 启动服务均为一次性服务,关闭cmd即为关闭服务,所以在未完成前,请勿关闭
- 实例均未添加至系统环境变量,请在bin目录下启动
- 虽然窗口很多,操作不太友好,但是在win系統下,还是多有耐心一点,linux会简单一些,详情 看书上。