1 集群架构(概念篇)
MongoDB有三种集群部署模式,分别是主从复制(Master-Slave)、副本集(ReplicaSet)、分片集(Sharding)。采用集群架构复制的目的:保证数据生产部署时的冗余和可靠性,采用不同的机器来保存副本,数据不会因为单点故障而丢失。读写分离,提高数据的读取能力。故障转移、故障恢复。
1.1 MongoDB核心组件
💥Mongod: 处理所有的数据请求、管理数据的增删改查操作。默认的数据目录/data/db,默认端口27017,默认主机地址localhost。
💥Mongo:MongoDB提供的一个Mongo shell客户端,便于用户与MongoDB之间的交互。启动Mongo默认连接到localhost:270127的test数据库。
💥Mongos: 用于MongoDB分片集的路由选择,对来自于应用层的查询请求进行处理,平判断所请求的数据位于分片集的哪个位置。
1.2 主从复制
1️⃣主从复制模式的集群只能有一个主节点,主节点提供所有的增删改查服务,从节点不提供服务,但是可以通过设置从节点提供查询服务,这样可以减少主节点的压力。2️⃣此外,每个从节点都要知道主节点的地址以及主节点的各个操作,从节点定期轮询主节点获取操作,并对自己的数据副本进行这些操作,从而保证主从节点数据的一致性。3️⃣主节点出现故障,只能人工介入指定新的主节点,在此期间整个集群数据只能被读而无法修改。
1.3 副本集
Primary主节点:与主从复制一样,副本集中也只能有一个主节点,向外对客户端提供数据读写的服务,执行的写操作信息保存在oplog中。不同的是,副本集中的主节点发生故障时,仲裁节点触发选举,在所有的从节点中选出一个作为新的主节点,即使后续旧的主节点恢复正常,也会以从节点的身份加入到集群。
Secondary从节点:从节点只提供读数据的服务,并且从节点定期轮询oplog日志文件,根据日志内容同步更新自身的数据,使之保持与主节点一致。
Arbiter仲裁节点:仲裁节点不存储任何数据,只记录集群的节点数以及主节点发生故障时触发选举机制进行仲裁。仲裁节点和其他节点之间的唯一通信就是选举期间的投票、心跳信息。
1.4 分片集
副本集可以解决主节点发生故障所导致的数据丢失或不可用的问题,但遇到需要存储海量数据的情况,副本集就无法解决了。此时就用到了MongoDB的分片集操作,所谓分片就是将数据拆分并分散存储在不同机器上的过程。
什么时间进行分片操作:1.单个节点的磁盘空间不足时。2.单个mongod已经不能满足写数据的性能要求,通过分片让写压力分散到各个分片服务器上。3.把大量数据放到内存里提高性能,通过分片利用多台分片服务器的内存资源。
Shard Server分片服务器:每一个分片服务器都是一个mongod进程,用于存储实际的数据块。实际生产中,一个分片服务器往往有多台机器组成一个副本集来共同承担,防止因主节点的单点故障而崩溃整个系统。
Config Server配置服务器:同样是一个mongod进程,用来保存集群和分片的元数据,在集群启动的最开始时建立。
Route Server路由服务器:是一个独立的mongos进程(即不储存数据的mongod进程),启动时要从配置服务器加载集群信息到缓存中(分片集群要首先启动配置服务器的原因),并将客户端的请求路由给每个分片服务器,在各分片服务器返回结果后进行聚合并返回客户端。
2 集群搭建
2.1 部署副本集(伪分布式)
建议开三个终端界面,分别操作三个节点,这样操作比较直观。
1️⃣首先需要有三个节点或者说三个mongod进程
localhost:27017
localhost:27018
localhost:27019
2️⃣创建并配置三个配置文件来开启三个节点
/user/local/mongodb4.4.1/conf/rs_mongod1.conf
/user/local/mongodb4.4.1/conf/rs_mongod2.conf
/user/local/mongodb4.4.1/conf/rs_mongod3.conf
配置文件内容如下:
三个配置文件中的port端口为对应节点的端口,必须更改成
涉及到路径的配置项path、dbpath里面的路径目录文件都必须创建,带后缀的是文件不带后缀的是目录,别创建错了
replSetName是副本集的名字,一个副本集里的三个节点的三个配置文件里都必须一样。
systemLog: destination: file path: /var/log/mongodb/rs_mongod1.log logAppend: true storage: dbPath: /usr/local/mongodb4.4.1/data/rs_mongod1 journal: enabled: true processManagement: fork: true net: bindIp: localhost port: 27017 replication: oplogSizeMB: 100 replSetName: my_repl enableMajorityReadConcern: true
3️⃣使用配置文件开启节点服务
开启节点服务需要先进入配置文件所在目录,开启服务成功后才能连接节点
#开启节点服务
sudo mongod --config rs_mongod1.conf
#连接节点,进入shell操作界面
#mongo后面的是连接节点的ip和端口
mongo localhost:27017
4️⃣主节点初始化
刚刚创建的三个节点默认都是从节点,从节点在未设置可读之前无法读取数据,故此时show dbs会报错,这就需要初始化主节点,使其中的一个从节点成为主节点。
var rsconf={_id:"my_repl", members:[ {_id:1,host:“localhost:27017"}, {_id:2,host:“localhost:27018"}, {_id:3,host:“localhost:27019"} ] } rs.initiate(rsconf) #初始化Primary rs.status( ) #查看副本集状态
此时,进行初始化操作的节点就会成为主节点。
5️⃣从节点、仲裁节点设置
下面的三个操作都是在主节点的shell里完成的,主节点才有权对其他节点进行设置
#将该节点作为从节点加入集群中 rs.add("localhost:27019") #将节点设置成仲裁节点 rs.addArb("localhost:27019") #从集群中删除节点 rs.remove("localhost:27019")
从节点设置为可读
rs.slaveOK()
对哪个节点的操作就要在哪个节点的shell界面进行设置
💥💥💥副本集操作完成后不能直接关闭终端,必须必须必须使用两次exit先退出shell再退出节点服务最后关闭虚拟机,否则下次再开启节点服务时,会因为直接关闭终端或者虚拟机而导致服务异常关闭,从而无法正常开启服务,处理起来会很麻烦。