1.MongoDB集群介绍
MongoDB集群搭建有三种方式:
1、Master-Slave模式
2、Replica-Set方式
3、Sharding方式
在MongoDB 2.x系列的版本,有一个主从复制模式,但是MongoDB官方也不推荐使用,而从MongoDB 3.2开始,主从复制模式已经被标记成过时了,不推荐使用;
从MongoDB 4.0 开始已经完全移除了主从复制模式,推荐使用副本集和分片集群模式;
副本集就是有自动故障转移功能的主从复制模式;
主从复制和副本集最大的区别就是副本集没有固定的“主节点”,整个集群会选出一个“主节点”,当其挂掉后,又在剩下的从节点中选中其他节点为“主节点”,
当原来的主节点修复之后,原来的主节点会再次恢复为主节点,备节点不再是主节点的角色。
副本集的方式还有一个角色,那就是仲裁节点,它不存储数据,他的作用就是当主节点出现故障,选举出备节点作为主节点,继续保证集群可用。客户端连接时只连接主节点或者备节点,不用连接仲裁节点。
副本集至少需要3个节点, 可以3个全部做副本集, 也可以让其中一个做仲裁;
副本集中只有1台主可以进行读和写,其余节点只能读;
副本集之间的复制是通过oplog日志现实的,oplog是节点中local库中的一个集合,备份节点通过查询这个集合就可以知道需要进行复制的操作;
每个节点通过心跳去查看其他节点的状态;
当从节点宕机,不用影响副本集的使用;
当主节点宕机,各个节点通过选举的方式来选择下一个主节点;
若所有的从都宕机只剩下Primary(主),则Primary会变成Secondary(从),不能提供服务;
MongoDB 3.2.0版本前是基于Bully选举算法(霸道选举算法),从3.2.0开始默认使用基于Raft算法的选举策略;
2. 副本集集群搭建
1、以三个节点为例,配置三个副本集的配置文件;
(我们是在一台linux下操作的,端口号不能重复,实际在项目中是在多台linux操作,那么区别就是端口号可以一样)
节点1的配置文件 master.conf:
dbpath=/usr/local/software/mongodb-4.2.0/data/master
logpath=/usr/local/software/mongodb-4.2.0/logs/master.log
pidfilepath=/usr/local/software/mongodb-4.2.0/logs/master.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=0.0.0.0
port=27018
oplogSize=10000
fork=true
节点2的配置文件 slave.conf:
dbpath=/usr/local/software/mongodb-4.2.0/data/slave
logpath=/usr/local/software/mongodb-4.2.0/logs/slave.log
pidfilepath=/usr/local/software/mongodb-4.2.0/logs/slave.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=0.0.0.0
port=27019
oplogSize=10000
fork=true
节点3 的配置文件 arbiter.conf:
dbpath=/usr/local/software/mongodb-4.2.0/data/arbiter
logpath=/usr/local/software/mongodb-4.2.0/logs/arbiter.log
pidfilepath=/usr/local/software/mongodb-4.2.0/logs/arbiter.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=0.0.0.0
port=27020
oplogSize=10000
fork=true
注意要保证上面配置的路径的文件夹都要存在,不存在的话要创建好;
directoryperdb:设置为true,修改数据目录存储模式,每个数据库的文件存储在DBPATH指定目录的不同的文件夹中,使用此选项,可以配置的MongoDB将数据存储在不同的磁盘设备上,以提高写入吞吐量或磁盘容量,默认为false;
注意:在运行一段时间的数据库中开启该参数,会导致原始的数据都会消失(注释参数则会回来),因为数据目录不同了,除非迁移现有的数据文件到directoryperdb产生的数据库目录中,如:
mv test.* test/
把test数据文件迁移到directoryperdb产生的数据库test目录中,所以需要在规划好之后确定是否要开启;
logappend:写日志的模式:设置为true为追加;
replSet:使用此设置来配置复制副本集,指定一个副本集名称作为参数,所有主机都必须有相同的名称作为同一个副本集;
oplogSize:指定的复制操作日志(OPLOG)的最大大小,mongod创建一个OPLOG的大小基于最大可用空间,对于64位系统,OPLOG通常是5%的可用磁盘空间;
一旦mongod第一次创建OPLOG,改变oplogSize将不会影响OPLOG的大小;
2、然后依次启动每个节点,切换到mongodb的bin目录下;
./mongod -f master.conf
./mongod -f slave.conf
./mongod -f arbiter.conf
3、创建集群:
连接登录第一个节点:
./mongo 127.0.0.1:27018
使用admin数据库:
use admin
执行配置:
var cfg={_id:“testrs”, members:[
{_id:0,host:“127.0.0.1:27018”,priority:2},
{_id:1,host:“127.0.0.1:27019”,priority:1},
{_id:2,host:“127.0.0.1:27020”,arbiterOnly:true}
]
};
初始化副本集:
rs.initiate(cfg);
稍等几秒,然后查看集群状态:
rs.status();
重点查看 “stateStr”:“PRIMARY”, 信息;
4、主节点测试:
可以正常插入数据,可以读,可以写;
从节点连接:
从节点默认情况下不能写,也不能查,比如你查询数据库会出错:not master and slaveOk=false,这个错误是正常的,默认情况下从节点不允许读和写操作,可以执行rs.slaveOk()命令让从机器能进行读操作;
5、故障测试:
主节点挂掉:在备节点上查看集群状态,会发现备节点成为主节点:primary。
这里如果再次将挂掉的master节点启动,那么等一会儿原来的master节点会变为primary主节点,而不是由slave备节点继续充当主节点;
3. MongoDB分片集群
(与redis非常相似: 副本集–>redis的哨兵, 分片 -->redis cluster)
100G数据,原来放在一个mongodb上的,现在把它放到3个mongodb上,这就是分片,然后3个mongodb上的数据总和还是100G;
分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程,将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载,其基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责存储总数据中的一部分,最后通过一个路由均衡器来对各个分片进行路由均衡,通过一个名为mongos的路由进程进行操作,mongos知道数据和片的对应关系(通过配置服务器),大部分使用场景都是解决磁盘空间的问题,查询则尽量避免跨分片查询;
使用分片的时机:
1,机器的磁盘不够用了,使用分片解决磁盘空间的问题;
2,单个mongod已经不能满足写数据的性能要求,通过分片让写压力分散到各个分片上;
3,希望把大量数据放到内存中提高性能,通过分片使用分片服务器来分摊压力;
MongoDB分片sharding集群方式是基于副本集,整个sharding方式的集群中,有三类角色,分别是shard,config,router;
shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server 角色可以由几台服务器组成一个Peplica Set 承担,防止主机单点故障;
Config:配置节点,不会存储数据,会存储元数据信息,比如片键的范围;
router:路由节点,是mongo集群与外部客户端连接的入口,提供客户端连接访问,对客户端透明,让客户端感觉使用像是单节点数据库;
1、三台配置服务形成副本集(存储元数据信息,一般冗余3台),
2、三台分片服务形成一个副本集(提供两组或多组分片服务副本集),
3、客户端直接与三台路由服务连接交互,配置服务和分片服务对客户端是透明的;