关于后端:MongoDB-副本集

57次阅读

共计 7207 个字符,预计需要花费 19 分钟才能阅读完成。

每日一句

Perfection is not just about control. It’s also about letting go.
完满不是管制进去的,是暴发进去的。

概述

MongoDB 中的正本集(Replica Set)是一组保护雷同数据集的 mongod 服务。正本集可提供冗余和高可用性,是所有生产部署的根底。

正本集相似于有主动故障复原性能的主从集群。艰深的讲就是用多台机器进行同一数据的异步同步,从而使多台机器领有同一数据的多个正本,并且当主库当掉时在不须要用户干涉的状况下主动切换其余备份服务器做主库。而且还能够利用正本服务器做只读服务器,实现读写拆散,进步负载。

冗余和数据可用性

复制提供冗余并进步数据可用性。通过在不同数据库服务器上提供多个数据正本,复制可提供肯定级别的容错性能,以避免失落单个数据库服务器。

在某些状况下,复制能够提供减少的读取性能,因为客户端能够将读取操作发送到不同的服务上,在不同数据中心保护数据正本能够减少分布式应用程序的数据地位和可用性。

您还能够为专用目标保护其余正本,例如劫难复原,报告或备份。

MongoDB 中的复制

正本集是一组保护雷同数据集的 mongod 实例。

正本集蕴含多个数据承载节点和可选的一个仲裁节点。在承载数据的节点中,一个且仅一个成员被视为主节点,而其余节点被视为主要(从)节点。主节点接管所有写操作。

正本集只能有一个次要可能确认具备 {w:“most”} 写入关注的写入;

尽管在某些状况下,另一个 mongod 实例可能临时认为本人也是次要的。次要记录其操作日志中的数据集的所有更改,即 oplog。

辅助 (正本) 节点复制主节点的 oplog 并将操作利用于其数据集,以使辅助节点的数据集反映主节点的数据集。如果次要人员不在,则符合条件的中学将举办选举以选出新的次要人员。

主从复制和正本集区别

主从集群和正本集最大的区别就是正本集没有固定的“主节点”;

整个集群会选出一个“主节点”,当其挂掉后,又在剩下的从节点中选中其余节点为“主节点”,正本集总有一个沉闷点 (主、primary) 和一个或多个备份节点(从、secondary)。

正本集的三个角色

正本集有两种类型三种角色

两种类型

  • 主节点(Primary)类型:数据操作的次要连接点,可读写。
  • 主要(辅助、从)节点(Secondaries)类型:数据冗余备份节点,能够读或选举。

三种角色

  • 次要成员(Primary):次要接管所有写操作。就是主节点。
  • 正本成员(Replicate):从主节点通过复制操作以保护雷同的数据集,即备份数据,不可写操作,但能够读操作(但须要配置)。是默认的一种从节点类型。
  • 仲裁者(Arbiter):不保留任何数据的正本,只具备投票选举作用。当然也能够将仲裁服务器保护为正本集的一部分,即正本成员同时也能够是仲裁者。也是一种从节点类型。

对于仲裁者的额定阐明:

您能够将额定的 mongod 实例增加到正本集作为仲裁者。

仲裁者不保护数据集。仲裁者的目标是通过响应其余正本集成员的心跳和选举申请来保护正本集中的仲裁。因为它们不存储数据集,所以仲裁器能够是提供正本集仲裁性能的好办法,其资源老本比具备数据集的全功能正本集成员更便宜。

如果您的正本集具备偶数个成员,请增加仲裁者以取得次要选举中的“大多数”投票。仲裁者不须要专用硬件。

仲裁者将永远是仲裁者,而次要人员可能会退出并成为主要人员,而主要人员可能成为选举期间的次要人员。

如果你的正本 + 主节点的个数是偶数,倡议加一个仲裁者,造成奇数,容易满足大多数的投票。如果你的正本 + 主节点的个数是奇数,能够不加仲裁者。

实例:一主三从一仲裁

通过实例来演示这种架构的搭建。

创立主节点

提醒:在创立主节点之前记得保障没有 mongd 过程在运行中。

  1. 创立目录:存放数据和日志
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27017/data/db
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27017/log
  1. 新建或批改配置文件
vim /usr/yltrcc/mongodb/replica_sets/myrs_27017/mongod.conf

# 增加如下内容
systemLog:
  #MongoDB 发送所有日志输入的指标指定为文件
  destination: file
  #mongod 或 mongos 应向其发送所有诊断日志记录信息的日志文件的门路
  path: "/usr/yltrcc/mongodb/replica_sets/myrs_27017/log/mongod.log"
  #当 mongos 或 mongod 实例重新启动时,mongos 或 mongod 会将新条目附加到现有日志文件的开端。logAppend: true
storage:
  #mongod 实例存储其数据的目录。storage.dbPath 设置仅实用于 mongod。dbPath: "/usr/yltrcc/mongodb/replica_sets/myrs_27017/data/db"
  journal:
    #启用或禁用持久性日志以确保数据文件放弃无效和可复原。enabled: true
processManagement:
  #启用在后盾运行 mongos 或 mongod 过程的守护过程模式。fork: true
  #指定用于保留 mongos 或 mongod 过程的过程 ID 的文件地位,其中 mongos 或 mongod 将写入其 PID
  pidFilePath: "/usr/yltrcc/mongodb/replica_sets/myrs_27017/log/mongod.pid"
net:
  #服务实例绑定所有 IP,有副作用,正本集初始化的时候,节点名字会主动设置为本地域名,而不是 ip #bindIp
  #All: true
  #服务实例绑定的 IP
  bindIp: localhost,192.168.20.131
  #bindIp #绑定的端口
  port: 27017
replication:
  #正本集的名称
  replSetName: myrs
  1. 启动节点服务
/usr/yltrcc/mongodb/bin/mongod -f /usr/yltrcc/mongodb/replica_sets/myrs_27017/mongod.conf

创立从节点 1

  1. 创立目录:存放数据和日志
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27018/data/db
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27018/log
  1. 新建或批改配置文件
vim /usr/yltrcc/mongodb/replica_sets/myrs_27018/mongod.conf

# 增加如下内容
systemLog:
  #MongoDB 发送所有日志输入的指标指定为文件
  destination: file
  #mongod 或 mongos 应向其发送所有诊断日志记录信息的日志文件的门路
  path: "/usr/yltrcc/mongodb/replica_sets/myrs_27018/log/mongod.log"
  #当 mongos 或 mongod 实例重新启动时,mongos 或 mongod 会将新条目附加到现有日志文件的开端。logAppend: true
storage:
  #mongod 实例存储其数据的目录。storage.dbPath 设置仅实用于 mongod。dbPath: "/usr/yltrcc/mongodb/replica_sets/myrs_27018/data/db"
  journal:
    #启用或禁用持久性日志以确保数据文件放弃无效和可复原。enabled: true
processManagement:
  #启用在后盾运行 mongos 或 mongod 过程的守护过程模式。fork: true
  #指定用于保留 mongos 或 mongod 过程的过程 ID 的文件地位,其中 mongos 或 mongod 将写入其 PID
  pidFilePath: "/usr/yltrcc/mongodb/replica_sets/myrs_27018/log/mongod.pid"
net:
  #服务实例绑定所有 IP,有副作用,正本集初始化的时候,节点名字会主动设置为本地域名,而不是 ip #bindIp
  #All: true
  #服务实例绑定的 IP
  bindIp: localhost,192.168.20.131
  #bindIp #绑定的端口
  port: 27018
replication:
  #正本集的名称
  replSetName: myrs
  1. 启动节点服务
/usr/yltrcc/mongodb/bin/mongod -f /usr/yltrcc/mongodb/replica_sets/myrs_27018/mongod.conf

创立从节点 2

  1. 创立目录:存放数据和日志
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27019/data/db
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27019/log
  1. 新建或批改配置文件
vim /usr/yltrcc/mongodb/replica_sets/myrs_27019/mongod.conf

# 增加如下内容
systemLog:
  #MongoDB 发送所有日志输入的指标指定为文件
  destination: file
  #mongod 或 mongos 应向其发送所有诊断日志记录信息的日志文件的门路
  path: "/usr/yltrcc/mongodb/replica_sets/myrs_27019/log/mongod.log"
  #当 mongos 或 mongod 实例重新启动时,mongos 或 mongod 会将新条目附加到现有日志文件的开端。logAppend: true
storage:
  #mongod 实例存储其数据的目录。storage.dbPath 设置仅实用于 mongod。dbPath: "/usr/yltrcc/mongodb/replica_sets/myrs_27019/data/db"
  journal:
    #启用或禁用持久性日志以确保数据文件放弃无效和可复原。enabled: true
processManagement:
  #启用在后盾运行 mongos 或 mongod 过程的守护过程模式。fork: true
  #指定用于保留 mongos 或 mongod 过程的过程 ID 的文件地位,其中 mongos 或 mongod 将写入其 PID
  pidFilePath: "/usr/yltrcc/mongodb/replica_sets/myrs_27019/log/mongod.pid"
net:
  #服务实例绑定所有 IP,有副作用,正本集初始化的时候,节点名字会主动设置为本地域名,而不是 ip #bindIp
  #All: true
  #服务实例绑定的 IP
  bindIp: localhost,192.168.20.131
  #bindIp #绑定的端口
  port: 27019
replication:
  #正本集的名称
  replSetName: myrs
  1. 启动节点服务
/usr/yltrcc/mongodb/bin/mongod -f /usr/yltrcc/mongodb/replica_sets/myrs_27019/mongod.conf

创立从节点 3

  1. 创立目录:存放数据和日志
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27020/data/db
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_27020/log
  1. 新建或批改配置文件
vim /usr/yltrcc/mongodb/replica_sets/myrs_27020/mongod.conf

# 增加如下内容
systemLog:
  #MongoDB 发送所有日志输入的指标指定为文件
  destination: file
  #mongod 或 mongos 应向其发送所有诊断日志记录信息的日志文件的门路
  path: "/usr/yltrcc/mongodb/replica_sets/myrs_27020/log/mongod.log"
  #当 mongos 或 mongod 实例重新启动时,mongos 或 mongod 会将新条目附加到现有日志文件的开端。logAppend: true
storage:
  #mongod 实例存储其数据的目录。storage.dbPath 设置仅实用于 mongod。dbPath: "/usr/yltrcc/mongodb/replica_sets/myrs_27020/data/db"
  journal:
    #启用或禁用持久性日志以确保数据文件放弃无效和可复原。enabled: true
processManagement:
  #启用在后盾运行 mongos 或 mongod 过程的守护过程模式。fork: true
  #指定用于保留 mongos 或 mongod 过程的过程 ID 的文件地位,其中 mongos 或 mongod 将写入其 PID
  pidFilePath: "/usr/yltrcc/mongodb/replica_sets/myrs_27020/log/mongod.pid"
net:
  #服务实例绑定所有 IP,有副作用,正本集初始化的时候,节点名字会主动设置为本地域名,而不是 ip #bindIp
  #All: true
  #服务实例绑定的 IP
  bindIp: localhost,192.168.20.131
  #bindIp #绑定的端口
  port: 27020
replication:
  #正本集的名称
  replSetName: myrs
  1. 启动节点服务
/usr/yltrcc/mongodb/bin/mongod -f /usr/yltrcc/mongodb/replica_sets/myrs_27020/mongod.conf

创立仲裁节点

  1. 创立目录:存放数据
mkdir -p /usr/yltrcc/mongodb/replica_sets/myrs_arb
  1. 启动节点服务
/usr/yltrcc/mongodb/bin/mongod --port 27030 --dbpath /usr/yltrcc/mongodb/replica_sets/myrs_arb --replSet myrs --bind_ip 192.168.20.131

初始化配置正本集和主节点

应用客户端命令连贯任意一个节点,但这里尽量要连贯主节点(27017 节点)

/usr/yltrcc/mongodb/bin/mongo --host=192.168.20.131 --port=27017

后果,连贯上之后,很多命令无奈应用,,比方 show dbs 等,必须初始化正本集才行。

应用命令:rs.initiate()

增加从节点

在主节点增加从节点,将其余成员退出到正本集

命令:rs.add("192.168.20.131:27018")

增加仲裁从节点

增加一个仲裁节点到正本集

命令:rs.addArb("192.168.20.131:27030")

设置从节点读操作权限

以后从节点只是一个备份,不是奴隶节点,无奈读取数据,写当然更不行。因为默认状况下,从节点是没有读写权限的,能够减少读的权限,但须要进行设置。

应用命令:rs.slaveOk()或者 rs.slaveOk(true)

勾销读权限命令:rs.slaveOk(false)

提醒:留神肯定要连贯到从节点上,不要连贯到主节点上了。

答疑

  1. 1 主 1 从 1 仲裁 不能够吗?

这种是不必增加仲裁节点的,非仲裁者的数量要大于投票节点的大多数,具体请查看:https://docs.mongodb.com/manual/reference/write-concern/

Spring Data MongoDB 连贯正本集

语法格局mongodb://host1,host2,host3/articledb?connect=replicaSet&slaveOk=true&replicaSet= 正本集名字

参数阐明

  • slaveOk=true:开启正本节点读的性能,可实现读写拆散。
  • connect=replicaSet:主动到正本集中抉择读写的主机。如果 slaveOK 是关上的,则实现了读写拆散

实例

连贯 replica set 三台服务器 (端口 27017, 27018, 和 27019),间接连贯第一个服务器,无论是 replicaset 一部分或者主服务器或者从服务器,写入操作利用在主服务器 并且散布查问到从服务器。

配置文件 application.yml

spring:
  #数据源配置
  data:
    mongodb:
      # 正本集的连贯字符串
      # uri: mongodb://192.168.40.141:27017,192.168.40.141:27018,192.168.40.141:27019/articledb?connect=replicaSet&slaveOk=true&replicaSet=myrs
      #正本集有认证的状况下,字符串连贯
      uri: mongodb://bobo:123456@192.168.40.141:27017,192.168.40.141:27018,192.168.40.141:27019/articledb?connect=replicaSet&slaveOk=true&replicaSet=myrs

美文佳句

夜深了,我躺在床上久久不能入睡,轻轻走到窗前。尽管西安的天空依然灰蒙蒙的,但我晓得,头顶的天空上,又多了一颗闪亮的星星,那是您,正悄悄地在云朵上看着我呢。释怀吧,太姥姥,您给我的和煦,会始终给我力量,心愿您一路走好,带着所有和煦的回顾……

你好,我是 yltrcc,日常分享技术点滴,欢送关注我的公众号:ylcoder

正文完
 0