您的当前位置:首页MongoDB 复制(副本集)

MongoDB 复制(副本集)

2023-11-12 来源:哗拓教育

MongoDB复制是将数据同步在多个服务器的过程。

复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。

复制还允许您从硬件故障和服务中断中恢复数据。

什么是复制?
  • 保障数据的安全性
  • 数据高可用性 (24*7)
  • 灾难恢复
  • 无需停机维护(如备份,重建索引,压缩)
  • 分布式读取数据
  • MongoDB复制原理

    mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。

    mongodb各个节点常见的搭配方式为:一主一从、一主多从。

    主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

    MongoDB复制结构图如下所示:

    技术分享图片

    以上结构图总,客户端总主节点读取数据,在客户端写入数据到主节点是, 主节点与从节点进行数据交互保障数据的一致性。

    副本集特征:
  • N 个节点的集群
  • 任何节点可作为主节点
  • 所有写入操作都在主节点上
  • 自动故障转移
  • 自动恢复
  • MongoDB副本集设置

    在本教程中我们使用同一个MongoDB来做MongoDB主从的实验, 操作步骤如下:

    1、关闭正在运行的MongoDB服务器。

    现在我们通过指定 --replSet 选项来启动mongoDB。--replSet 基本语法格式如下:

    mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"
    实例
    mongod --port 27017 --dbpath "D:set upmongodbdata" --replSet rs0

    以上实例会启动一个名为rs0的MongoDB实例,其端口号为27017。

    启动后打开命令提示框并连接上mongoDB服务。

    在Mongo客户端使用命令rs.initiate()来启动一个新的副本集。

    我们可以使用rs.conf()来查看副本集的配置

    查看副本集姿态使用 rs.status() 命令

    副本集添加成员

    添加副本集的成员,我们需要使用多条服务器来启动mongo服务。进入Mongo客户端,并使用rs.add()方法来添加副本集的成员。

    语法

    rs.add() 命令基本语法格式如下:

    >rs.add(HOST_NAME:PORT)
    实例

    假设你已经启动了一个名为mongod1.net,端口号为27017的Mongo服务。 在客户端命令窗口使用rs.add() 命令将其添加到副本集中,命令如下所示:

    >rs.add("mongod1.net:27017")>

    MongoDB中你只能通过主节点将Mongo服务添加到副本集中, 判断当前运行的Mongo服务是否为主节点可以使用命令db.isMaster() 。

    MongoDB的副本集与我们常见的主从有所不同,主从在主机宕机后所有服务将停止,而副本集在主机宕机后,副本会接管主节点成为主节点,不会出现宕机的情况。

    MongoDB 复制(副本集)

    标签:配置   存储   情况   特征   节点   获取   索引   故障   灾难   

    小编还为您整理了以下内容,可能对您也有帮助:

    MongoDB复制集/副本集(Replica Set)搭建

    mongo副本集/复制集是mongo高可用性特征之一,是有自动故障恢复功能的主要集群。由一个Primary节点和一个或多个Secondary节点组成。

    复制是在多台服务器之间同步数据的过程,由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点

    Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据

    通过上述方式来保持复制集内所有成员存储相同的数据集,提供数据的高可用

    Failover (故障转移,故障切换,故障恢复)

    Rendancy(数据冗余)

    避免单点,用于灾难时恢复,报表处理,提升数据可用性

    读写分离,分担读压力

    对用户透明的系统维护升级

    主节点记录所有的变更到oplog日志

    辅助节点(Secondary)复制主节点的oplog日志并且将这些日志在辅助节点进行重放(做)

    各个节点之间会定期发送心跳信息,一旦主节点宕机,则触发选举一个新的主节点,剩余的辅助节点指向新的主

    10s内各辅助节点无法感知主节点的存在,则开始触发选举

    通常1分钟内完成主辅助节点切换,10-30s内感知主节点故障,10-30s内完成选举及切换

    用户恢复数据,防止数据丢失,实现灾难恢复

    人为误操作导致数据删除,程序Bug导致数据损坏等

    首要复制节点,由选举产生,提供读写服务的节点,产生oplog日志

    备用(辅助)复制节点,Secondary可以提供读服务,增加Secondary节点可以提供复制集的读服务能力

    在故障时,备用节点可以根据设定的优先级别提升为首要节点。提升了复制集的可用性

    Arbiter节点只参与投票,不能被选为Primary,并且不从Primary同步数据

    Arbiter本身不存储数据,是非常轻量级的服务。

    当复制集成员为偶数时,最好加入一个Arbiter节点,以提升复制集可用性

    Mongodb版本3.0以上, 三台服务器均为64位

    三台服务器    --------  Primary(Centos7)、 Secondary(Centos7)、 Secondary(Debian8);架设IP分别为 192.168.1.1、1.2、 1.3

    三台服务器关闭防火墙    -------- systemctl  stop firewalld.service

    三台服务器修改mongo配置文件    --------  vi  /etc/mongod.conf 

            侦听地址除了 localhost 外再加上服务器IP; 设置复制集名字(RepliSetName)。

    开启mongod服务: mongod

    三台服务器mongo各自初始化: rs.initiate()

    Primary上副本集配置:

    rsconf(配置名称,可随意取)={_id:"副本集名",member:[{_id:0,host:"IP:port",priority:2},{_id:1,host:"IP:port",priority:1},{_id:2,host:"IP:port",priority:1}]}

    在初始化:rs.initiate(变量名,如下面的config)

    Secondary上配置:

    rs.slaveOk()    #承认自己是Secondary

    三台服务器上互相添加副本集成员:

    rs.add("IP:port"), 如在Primary上 rs.add("192.168.1.2:27017"), rs.add("192.168.1.3:27017")

    查看状态

    rs.status()

    3、rs(replication set) 常用命令:

    初始化副本集  ----  rs.initiate()

    mongo查看状态 ---- rs.status()

    初始化副本集配置

    rsconf = {_id: "rs0",

    members: [{

    _id: 0,

    host: ":27017"}]}

    rs.initiate( rsconf )

    验证副本集配置  ----  rs.config()

    增加副本集成员  ----  rs.add("Ip:port")

    移除副本集成员  ----  rs.remove("IP:port")    #此步骤在Primary上操作

    改变成员变量的优先级

    cfg = rs.conf()

    cfg.members[0].priority = 3

    cfg.members[1].priority = 1

    cfg.members[2].priority = 2

    rs.reconfig(cfg)

    配置延迟副本集

    cfg = rs.conf()

    cfg.members[0].priority = 0

    cfg.members[0].hidden = true

    cfg.members[0].slaveDelay = 3600

    rs.reconfig(cfg)

    #  07/03/2017

    搭建MongoDB副本集&分片

    顾名思义,副本集是一个集合,即MongoDB实例的集合,集合中的每个成员拥有相同的数据集合;一个副本集包含多个数据节点和一个可选的仲裁节点,在数据节点中,只有一个可以作为主节点(Primary Node),其他节点只能是第二节点(Secondary Nodes)。

    主节点接收所有的写操作,一个副本集只能有一个能够确认写入的主节点(Primary Node),如下图:

    第二节点复制主节点的操作日志并且将所有的操作应用到自己的数据集合中,复制过程是异步的,如果主节点不可用,一个可以被选举的第二节点将会被选举为主节点,所以在副本集中,即使一个或者多个成员没有正常运行,但整个副本集仍然可以正常工作;主副节点关系如下图:

    在某些情况下(比如受硬件条件所限,只有一个主节点和一个副节点,无法添加更多的副节点),你可以选择将mongod实例添加进副本集,并作为仲裁者(仲裁者只负责选举新的主节点,不持有数据),在副本集中,如果主节点与其他节点无法通信的时间超过配置的时间值( electionTimeoutMillis ),那么副本集将视主节点出现故障,此时将会重新选举一个正常副节点来作为新的主节点,从而让整个副本集系统正常工作,如下图:

    副本集的搭建的步骤为:同时启动多个mongod实例(可以在一台服务器上,也可以在不同的服务器上),然后在每个实例的配置文件中配置相应的配置项,最后启动实例后,登录并且在做一次配置即可。

    注意: 文中都是通过配置文件的方式来启动mongod实例的,你也可以通过启动参数来启动实例,同时本文中的mongod实例是通过 supervisor 来管理的,关于如何通过supervisor管理进程,可以自行查阅相关资料或者参考 这里

    对于每一个配置项,如果不明白每个配置项的释义,请参考: mongo配置文件 。另外,如果实例在同一台机器上,则针对每个实例,需要区分 path , pidFilePath , port , dbPath 这几个的配置值,并且每个配置文件中的 replSetName 必须相同。

    在supervisorctl中执行update,此时三个实例便启动成功。

    分片是将MongoDB中的数据集分割成多个数据片,每片数据存放在不同的MongoDB实例中,可以理解为将一个MongoDB数据集拆分成多个小型数据集,而小数据集分布在相同或者不同的物理机器上,分割只是从物理层面进行分割,逻辑上仍然属于同一个数据集合。

    分片包含三部分, 如下图所示:

    注意: 不同的分片集群必须使用不同的配置服务器(Config Servers),不能使用同一个配置服务器(Config Servers)

    分片实例的搭建与副本集类似,都是配置不同的配置文件,然后启动相应的实例:

    这里只给出了关键配置项,其他配置项根据自己的实际情况配置,图中的 replSetName 表示当前实例属于哪个副本集,该副本集中的每个节点的该配置项必须一致, clusterRole 表示当前节点在分片中的的角色,可选值有: shardsvr 和 configsvr , shardsvr 表示该节点是作为Shards节点提供服务,而 configsvr 表示该节点作为Config Server节点提供服务。

    至此,分片搭建完成。

    如何配置MongoDB副本集

    MongoDB 已经成为市面上最知名的 NoSQL 数据库。MongoDB 是面向文档的,它的无模式设计使得它在各种各样的WEB 应用当中广受欢迎。

    MongoDB 已经成为市面上最知名的 NoSQL 数据库。MongoDB 是面向文档的,它的无模式设计使得它在各种各样的WEB 应用当中广受欢迎。最让我喜欢的特性之一是它的副本集(Replica Set),副本集将同一数据的多份拷贝放在一组 mongod 节点上,从而实现数据的冗余以及高可用性。

    这篇教程将向你介绍如何配置一个 MongoDB 副本集。

    副本集的最常见配置需要一个主节点以及多个副节点。这之后启动的复制行为会从这个主节点到其他副节点。副本集不止可以针对意外的硬件故障和停机事件对数据库提供保护,同时也因为提供了更多的节点从而提高了数据库客户端数据读取的吞吐量。

    配置环境

    这个教程里,我们会配置一个包括一个主节点以及两个副节点的副本集。

    为了达到这个目的,我们使用了3个运行在 VirtualBox 上的虚拟机。我会在这些虚拟机上安装 Ubuntu 14.04,并且安装 MongoDB 官方包。

    我会在一个虚拟机实例上配置好所需的环境,然后将它克隆到其他的虚拟机实例上。因此,选择一个名为 master 的虚拟机,执行以下安装过程。

    首先,,我们需要给 apt 增加一个 MongoDB 密钥:

    然后,将官方的 MongoDB 仓库添加到 source.list 中:

    $ sudo su

    # echo "deb "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list

    接下来更新 apt 仓库并且安装 MongoDB。

    现在对 /etc/mongodb.conf 做一些更改

    第一行的作用是表明我们的数据库需要验证才可以使用。keyfile 配置用于 MongoDB 节点间复制行为的密钥文件。replSet 为副本集设置一个名称。

    接下来我们创建一个用于所有实例的密钥文件。

    这将会创建一个含有 MD5 字符串的密钥文件,但是由于其中包含了一些噪音,我们需要对他们清理后才能正式在 MongoDB 中使用。

    grep 命令的作用的是把将空格等我们不想要的内容过滤掉之后的 MD5 字符串打印出来。

    现在我们对密钥文件进行一些操作,让它真正可用。

    接下来,关闭此虚拟机。将其 Ubuntu 系统克隆到其他虚拟机上。

    这是克隆后的副节点1和副节点2。确认你已经将它们的MAC地址重新初始化,并且克隆整个硬盘。

    请注意,三个虚拟机示例需要在同一个网络中以便相互通讯。因此,我们需要它们弄到“互联网"上去。

    这里推荐给每个虚拟机设置一个静态 IP 地址,而不是使用 DHCP。这样它们就不至于在 DHCP 分配IP地址给他们的时候失去连接。

    像下面这样编辑每个虚拟机的 /etc/networks/interfaces 文件。

    在主节点上:

    在副节点1上:

    在副节点2上:

    由于我们没有 DNS 服务,所以需要设置设置一下 /etc/hosts 这个文件,手工将主机名称放到此文件中。

    在主节点上:

    在副节点1上:

    在副节点2上:

    使用 ping 命令检查各个节点之间的连接。

    配置副本集

    验证各个节点可以正常连通后,我们就可以新建一个管理员用户,用于之后的副本集操作。

    在主节点上,打开 /etc/mongodb.conf 文件,将 auth 和 replSet 两项注释掉。

    在一个新安装的 MongoDB 上配置任何用户或副本集之前,你需要注释掉 auth 行。默认情况下,MongoDB 并没有创建任何用户。而如果在你创建用户前启用了 auth,你就不能够做任何事情。你可以在创建一个用户后再次启用 auth。

    修改 /etc/mongodb.conf 之后,重启 mongod 进程。

    $ sudo service mongod restart

    现在连接到 MongoDB master:

    连接 MongoDB 后,新建管理员用户。

    重启 MongoDB:

    $ sudo service mongod restart

    再次连接到 MongoDB,用以下命令将 副节点1 和副节点2节点添加到我们的副本集中。

    现在副本集到手了,可以开始我们的项目了。参照 官方驱动文档 来了解如何连接到副本集。如果你想要用 Shell 来请求数据,那么你需要连接到主节点上来插入或者请求数据,副节点不行。如果你执意要尝试用副本集操作,那么以下错误信息就蹦出来招呼你了。

    如果你要从 shell 连接到整个副本集,你可以安装如下命令。在副本集中的失败切换是自动的。

    如果你使用其它驱动语言(例如,JavaScript、Ruby 等等),格式也许不同。

    希望这篇教程能对你有所帮助。你可以使用Vagrant来自动完成你的本地环境配置,并且加速你的代码。

    MongoDB 3.0 正式版发布下载

    CentOS编译安装MongoDB

    CentOS 编译安装 MongoDB与mongoDB的php扩展

    CentOS 6 使用 yum 安装MongoDB及服务器端配置

    Ubuntu 13.04下安装MongoDB2.4.3

    MongoDB入门必读(概念与实战并重)

    Ubunu 14.04下MongoDB的安装指南

    《MongoDB 权威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]

    Nagios监控MongoDB分片集群服务实战

    基于CentOS 6.5操作系统搭建MongoDB服务

    MongoDB 的详细介绍:请点这里MongoDB 的下载地址:请点这里

    via: How to set up a Replica Set on MongoDB

    作者:Christopher Valerio 译者:mr-ping 校对:wxy

    本文由 LCTT 原创翻译,Linux中国 荣誉推出

    本文永久更新链接地址:

    MongoDB副本集同步原理解析

    在MongoDB的副本集中,节点之间是通过oplog来同步数据。Primary节点每执行一次数据写入,都会记录一条oplog,Secondary节点会持续不断的自Primary拉取oplog并在本地回放,从而确保各节点达到数据最终一致性。

    Primary节点并发写入数据,时间点分别为t1、t2和t3,按时间先后排序为 t1 -> t2 -> t3;如果t1和t3先落库,t2后落库,那么在oplog集合中如何能保证有序呢?

    MongoDB底层通用的存储引擎为WiredTiger、In-Memory,以WiredTiger为例,MongoDB管理层调用WiredTiger引擎接口向oplog集合中插入文档(即记录);

    WiredTiger会以 oplog 的 ts 字段作为 key、文档内容作为 value,写入一条 KV 记录,wiredtiger 会保证存储(btree 或 lsm 的方式都能保证)的文档按 key 来排序,这样就解决 “Primary节点oplog如何保证有序” 的问题;

    并发写入多条oplog ts1、ts2、ts3和ts4,其中 ts1<ts2<ts3<ts4,如果ts1、ts2和ts4先写入primary成功,ts3存在延迟,还未写入,此时secondary节点自pirmary拉取oplog在本地回放,如何保证有序呢?

    MongoDB(wiredtiger 引擎)的解决方案是在读取oplog时进行,保证Secondary 节点看到一定是顺序的,具体实现机制如下:

    如此既可以确保 “secondary节点在本地回放oplog时有序”

    Secondary节点回放oplog在保证有序的前提下,如何保证高效呢?如下:

    如果OpQueue队列中的oplog有对同一个collection的操作,后续并发进行数据回放时,如何保证同一个collections中两条oplog的执行顺序呢?

    参考文档:

    MongoDB 如何保证 oplog 顺序?

    MongoDB复制集同步原理解析

    显示全文