首页 > 数据库 >MongoDB复制集

MongoDB复制集

时间:2024-04-17 20:03:01浏览次数:40  
标签:优先级 选举 MongoDB 复制 投票 数据 节点

MongoDB的复制集

复制集及原理

MongoDB复制集的主要意义在于实现服务高可用

复制集的现实依赖于两个方面的功能:

  • 数据写入时将数据迅速复制到另一个独立节点上
  • 在接受写入的节点发生故障时自动选举出一个新的替代节点

复制集在实现高可用的同时,还有以下作用:

  • 数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟
  • 读写分离:不同类型的压力分别在不同的节点上执行
  • 异地容灾:在数据中心故障时候快速切换到异地

一个典型的复制集由3个以上具有投票权的节点组成:

  • 一个主节点(PRIMARY)︰接受写入操作和选举时投票
  • 两个(或多个)从节点(SECONDARY)∶复制主节点上的新数据和选举时投票
  • 不推荐使用Arbiter(投票节点)

数据是如何复制的

  • 当一个修改操作,无论是插入、更新或删除,到达主节点时,它对数据的操作将被记录下来(经过一些必要的转换),这些记录称为oplog。
  • 从节点通过在主节点上打开一个tailable游标不断获取新进入主节点的oplog,并在自己的数据上回放,以此保持跟主节点的数据一致。不推荐使用Arbiter(投票节点)

通过选举完成故障恢复

  • 具有投票权的节点之间两两互相发送心跳(2s)
  • 当5次心跳未收到时判断为节点失联
  • 如果失联的是主节点,从节点会发起选举,选出新的主节点
  • 如果失联的是从节点则不会产生新的选举
  • 选举基于 RAFT一致性算法实现,选举成功的必要条件是大多数投票节点存活
  • 复制集中最多可以有50个节点,但具有投票权的节点最多7个

选举的因素

整个集群必须有大多数节点存活

被选举为主节点的节点必须:

  • 能够与多数节点建立连接
  • 具有较新的 oplog
  • 具有较高的优先级(如果有配置)

复制集的常见选项

复制集节点有以下常见的选配项:

  • 是否具有投票权(v 参数):有则参与投票
  • 优先级(priority 参数):优先级越高的节点越优先成为主节点。优先级为0的节点无法成为主节点
  • 隐藏(hidden 参数):复制数据,但对应用不可见。隐藏节点可以具有投票仅,但优先级必须为0
  • 延迟(slaveDelay 参数):复制 n 秒之前的数据,保持与主节点的时间差

复制集的注意事项

关于硬件:

  • 因为正常的复制集节点都有可能成为主节点,它们的地位是一样的,因此硬件配置上必须一致;
  • 为了保证节点不会同时宕机,各节点使用的硬件必须具有独立性。

关于软件:

  • 复制集各节点软件版本必须一致,以避免出现不可预知的问题

增加节点不会增加系统写性能

标签:优先级,选举,MongoDB,复制,投票,数据,节点
From: https://www.cnblogs.com/xu-xiaofeng/p/18141618

相关文章

  • docker镜像的复制
    有时候pull镜像很慢或者失败,需要从其他的机器传到服务器,就可以使用docker镜像的复制转贴,思路就是先把本地镜像打包,然后用ftp工具传到目标服务器,最后服务器解包还原打包dockersave-o~/alpine.3.16.taralpine:3.16还原dockerload-ialpine.3.16.tar打tag,这条命令就是......
  • k8s快速创建MongoDB
    1.创建MongoDBpvc文件如果不需要持久存储可以忽略kind:PersistentVolumeClaimapiVersion:v1metadata:name:mongodb-datanamespace:t1-zdblspec:storageClassName:nfs-client#这里使用的存储类accessModes:-ReadWriteManyresources:reques......
  • 某些网站的内容无法复制甚至无法选择的问题
    对于无法复制的情况,一般是javascript控制的,在浏览器禁用即可。谷歌浏览器中,设置-隐私和安全-网站设置,拉到下方可以在‘内容’下看到javascript,选择不允许网站使用javascript最省事的是安装一个谷歌插件,一键禁用或启动javascript对于无法选择的情况,一般是通过CSS属性设置user......
  • docker部署mongodb
    docker部署mongodb拉取镜像dockerpullmongo启动mongo(dockerrun和dockercompose)dockerrun--auth:需要密码才能访问容器服务。-eMONGO_INITDB_ROOT_USERNAME:设置用户名-eMONGO_INITDB_ROOT_PASSWORD:设置密码dockerrun--restart=always--namemongodb-v~/dock......
  • mysql复制数据库
    mysql复制数据库,导出导入方法一:使用mysqldump创建新的数据库createdatabasenew_db同一个mysql服务器复制数据库方法mysqldumpold_db-u账户-p密码|mysql-P端口new_db-u账户-p密码不同mysql服务器复制数据库方法mysqldumpold_db-u账户-p密码|m......
  • mysql主从复制
    master配置[mysqld]datadir=/data/mysqlsocket=/var/lib/mysql/mysql.socklog-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pidlog-bin=mysql-bin#启用二进制日志server-id=98#服务器唯一ID,可以任意设置,但必须唯一#binlog-ignore-db=mysql#不......
  • redis主从复制
    目录一、什么是redis主从复制1、主从复制架构2、redis为什么需要主从复制二、搭建主从复制1、涉及主机2、编译安装redis2.1、获取软件安装包,安装编译环境2.2、编译安装2.3、配置变量2.4、验证目录结构2.5、准备目录及文件3、前台启动redis3.1、消除三个警告提示4、使用systemctl管......
  • 随机链表的复制
     随机链表的复制 /*//DefinitionforaNode.classNode{intval;Nodenext;Noderandom;publicNode(intval){this.val=val;this.next=null;this.random=null;}}*/classSolution{publicNode......
  • python-深浅复制,可变/不可变对象
    #深复制(拷贝)'''importcopya=[1,2,3,[4,5,6]]#深拷贝a_deepcopy=copy.deepcopy(a)print(id(a))#140399549872448print(id(a_deepcopy))#140399549873280a[2]=100print(a)#[1,2,100,[4,5,6]]print(a_deepcopy)#[1,2,3......
  • 深拷贝、浅拷贝、直接复制的区别
    深拷贝、浅拷贝、直接复制的区别不妨举一个例子,有一个名为Date的类和一个名为Time的类,如下定义:classDate:def__init__(self,year,month,day):self.year=yearself.month=monthself.day=daydef__str__(self):returnf......