mongodb学习之:副本集

前面一张介绍了主从模式,现在mongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模式。副本集不能在一台电脑上操作。需要准备3台电脑进行搭建。副本集就是mongoDB副本所组成的一个集群。

同步原理是,写操作发生在主库,从库同步主库的OpLog日志。

集群中没有特定的主库,主库是选举产生,如果主库down了,会再选举出一台主库。

下面来看具体的搭建。使用三台电脑进行搭建,分别是

192.168.0.12:27017   zhf-maple

192.168.0.11:27017   zhf-linux

192.168.0.4:27017    ubuntu

[email protected]:/home/zhf/桌面# cat /etc/hosts

127.0.0.1 localhost

192.168.0.12 zhf-maple

192.168.0.11    zhf-linux

192.168.0.4     ubuntu

在其他两台电脑的/etc/hosts文件也分别添加对应的域名进去

在三台电脑上分别创建node0,node1,node2文件夹然后分别运行命令

mongod --dbpath /home/zhf/node0 --replSet rs0

mongod --dbpath /home/zhf/node1 --replSet rs0

mongod --dbpath /home/zhf/node2 --replSet rs0

此时进入任意一个mongod服务器。使用admin集合。然后运行rs.initiate()

> use admin
switched to db admin
> rs.initiate()
{
    "info2" : "no configuration explicitly specified -- making one",
    "me" : "zhf-linux:27017",
    "info" : "Config now saved locally.  Should come online in about a minute.",
    "ok" : 1
}

确认配置
> rs.conf()
{
    "_id" : "rs0",
    "version" : 1,
    "members" : [
        {
            "_id" : 0,
            "host" : "zhf-linux:27017"
        }
    ]
}

测试在primary上添加从库
rs0:PRIMARY> rs.add(‘ubuntu:27017‘)
{ "ok" : 1 }

查看状态。health:1代表正常启动,stateStr可以看到哪个是主的,哪个是从的
rs0:PRIMARY> rs.status()
{
    "set" : "rs0",
    "date" : ISODate("2018-01-16T09:38:21Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "zhf-linux:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 587,
            "optime" : Timestamp(1516095474, 1),
            "optimeDate" : ISODate("2018-01-16T09:37:54Z"),
            "electionTime" : Timestamp(1516095459, 1),
            "electionDate" : ISODate("2018-01-16T09:37:39Z"),
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "ubuntu:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 27,
            "optime" : Timestamp(1516095474, 1),
            "optimeDate" : ISODate("2018-01-16T09:37:54Z"),
            "lastHeartbeat" : ISODate("2018-01-16T09:38:20Z"),
            "lastHeartbeatRecv" : ISODate("2018-01-16T09:38:19Z"),
            "pingMs" : 54,
            "syncingTo" : "zhf-linux:27017"
        }
    ],
    "ok" : 1
}

再次添加从库。此时2个secondary,一个primary就已经启动起来了
rs0:PRIMARY> rs.add(‘zhf-maple:27017‘)
{ "down" : [ "zhf-maple:27017" ], "ok" : 1 }
rs0:PRIMARY> rs.status()
{
    "set" : "rs0",
    "date" : ISODate("2018-01-16T09:38:42Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "zhf-linux:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 608,
            "optime" : Timestamp(1516095516, 1),
            "optimeDate" : ISODate("2018-01-16T09:38:36Z"),
            "electionTime" : Timestamp(1516095459, 1),
            "electionDate" : ISODate("2018-01-16T09:37:39Z"),
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "ubuntu:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 48,
            "optime" : Timestamp(1516095516, 1),
            "optimeDate" : ISODate("2018-01-16T09:38:36Z"),
            "lastHeartbeat" : ISODate("2018-01-16T09:38:41Z"),
            "lastHeartbeatRecv" : ISODate("2018-01-16T09:38:42Z"),
            "pingMs" : 7,
            "syncingTo" : "zhf-linux:27017"
        },
        {
            "_id" : 2,
            "name" : "zhf-maple:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 0,
            "optime" : Timestamp(0, 0),
            "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
            "lastHeartbeat" : ISODate("2018-01-16T09:38:42Z"),
            "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
            "pingMs" : 0,
            "lastHeartbeatMessage" : "Received heartbeat from member with the same member ID as ourself: 0"
        }
    ],

接下来在primary上进行数据更新:

s0:PRIMARY> use maple
switched to db maple
rs0:PRIMARY> db.insert({‘name‘:‘zhanghongfeng‘})
2018-01-16T17:56:06.625+0800 TypeError: Property ‘insert‘ of object maple is not a function
rs0:PRIMARY> db.maple.insert({‘name‘:‘zhanghongfeng‘})
WriteResult({ "nInserted" : 1 })

此时在secondary上查看数据库

rs0:SECONDARY> use maple
switched to db maple
rs0:SECONDARY> db.maple.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }

查找的时候提示not master and slaveOk=false。原因在于mongodb默认是从主节点读写数据的,副本节点上不允许读(更不能写入),需要设置副本节点可以读。通过db.getMongo().setSlaveOk()进行设置
rs0:SECONDARY> db.getMongo().setSlaveOk()
rs0:SECONDARY> db.maple.find()
{ "_id" : ObjectId("5a5dcc538c0f7da3bc2f819f"), "name" : "zhanghongfeng" }

这样就能查询到对应的数据了,表明在副本节点上进行了同步

原文地址:https://www.cnblogs.com/zhanghongfeng/p/8325289.html

时间: 2024-10-01 02:42:40

mongodb学习之:副本集的相关文章

【六】MongoDB管理之副本集

一.复制介绍 所谓的复制就是在多个主机之间同步数据的过程. 1.数据冗余及可用性 复制技术提供数据冗余及可用性,在不同的数据库服务器上使用多个数据副本,复制技术防止单个数据库服务器出现数据故障而出现数据丢失.通过设置从库,你能在上面进行灾难切换.数据备份.报表服务等.在某些应用场景下,你还能提高读的能力,客户端通过将读和写请求分发到不同的服务器上面. 2.MongoDB复制技术 副本集是一组共享相同数据集的mongod实例.当所有写请求发向主库,而其他从库从主库上应用这些操作,以保证所有成员数据

mongoDB主从和副本集群配置

mongoDB主从和副本集群配置 Mongodb是时下流行的NoSql数据库(MongoDB是一个基于分布式文件存储的数据库),它的存储方式是文档式存储,并不是Key-Value形式.   优势: 快速!(当然,这和具体的应用方式有关,通常来说,它比一般的关系型数据库快5位左右.) 很高的可扩展性–轻轻松松就可实现PB级的存储(但是可能我们并不需要PB级的存储,10TB可能就够了) 他有一个很好的 replication 模式 (replica sets) 有很完善的Java API 他的存储格

MongoDB学习笔记~Mongo集群和副本集

一些概念 对于Mongo在数据容灾上,推荐的模式是使用副本集模式,它有一个对外的主服务器Primary,还有N个副本服务器Secondary(N>=1,当N=1时,需要有一台仲裁服务器Arbiter,当N>1时不需要Arbiter),它们之前是通过内部机制实现同步的,并且当Primary挂了后,它会通过内部的心跳机制,选举别一台Secondary成为一个Primary,与外界(Route)进行通讯. 工业标准 在标准上,我们的副本集推荐使用奇数个服务器(3,5,7,9),但经过我的测试,只要大

NoSQL -- Mongodb 安装 使用 副本集 备份恢复

Mongodb 是由c++编写的基于分布式文件存储的开源数据库系统,介于关系数据库和非关系数据库之间,支持查询语言很强大.高负载情况下,添加多个节点保证服务器性能,旨在为web应用提供可扩展的高性能存储:mongodb将数据存储为一个文档,由键值对(key=>value)组成,类似json对象. 官网:https://www.mongodb.com/ 应用: CERN,著名的粒子物理研究所,欧洲核子研究中心大型强子对撞机的数据使用MongoDB: Craiglist,上使用MongoDB的存档数

MongoDB 3.0副本集搭建

环境配置 MongoDB安装 下载yum源配置 wget https://repo.mongodb.org/yum/redhat/mongodb-org-3.0.repo  mv mongodb-org-3.0.repo  /etc/yum.repos.d/ 安装mongodb yum -y install mongodb-org 修改mongodb配置文件 # 修改监听地址为0.0.0.0 net:   port: 27017   bindIp: 0.0.0.0 # 修改副本集配置 repli

mongodb安装和副本集的搭建

CentOS 编译安装 Mongodb Centos 7.0 + Mongodb 2.6.6 (实测 笔记 ) 环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7.0-1406-x86_64-DVD.iso安装步骤: 1.安装基本软件包 [[email protected] ~]# yum install vim wget lsof gcc gcc-c++ bzip2 -y [[email protected] ~]# yum in

Docker搭建MongoDB 4.0副本集

环境: 系统版本:CentOS 7.5 内核:4.18.7-1.el7.elrepo.x86_64 Docker-ce: 18.06 MongoDB: 4.0.3 宿主机IP:192.168.1.1 MongoDB1端口:30001 MongoDB2端口:30002 MongoDB3端口:30003 一.安装docker.docker-compose wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker

MongoDB shell 2 副本集方法

rs.initiate()   rs.addArb()   rs.help()   rs.printReplicationInfo() 查看到副本集操作日志 rs.remove() 减少副本集节点 rs.freeze() “冻结”mongodb实例 rs.status() 查看副本集状态 db.printSlaveReplicationInfo 查看复制集的同步状态 rs.add() 增加副本集节点 rs.stepDown() 将当前主库“降级” rs.slaveOk()   rs.conf()

mongodb 复制(副本集)

复制(副本集) 什么是复制 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性 复制还允许从硬件故障和服务中断中恢复数据 为什么要复制 数据备份 数据灾难恢复 读写分离 高(24* 7)数据可用性 无宕机维护 副本集对应用程序是透明 复制的工作原理 复制至少需要两个节点A.B... A是主节点,负责处理客户端请求 其余的都是从节点,负责复制主节点上的数据 节点常见的搭配方式为:一主一从.一主多从 主节点记录在其上的所有操作,从节点定期轮询主节点获取

MongoDB 搭建副本集

副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成.通过Replication,将数据的更新由Primary推送到其他实例上,在一定的延迟之后,每个MongoDB实例维护相同的数据集副本.通过维护冗余的数据库副本,能够实现数据的异地备份,读写分离和自动故障转移. 一,MongoDB版本和环境 在Windows上创建包含三个节点的副本集,使用的环境: 数据库:MongoDB 版本 3.2.9 Server