每天一篇,深入学习MongoDB复制集

复制集概念:

复制集是额外的数据副本,是跨多个服务器同步数据的过程,提供了冗余并增加了数据的可用性,通过它可以对硬件故障和中断的服务进行数据恢复

复制集工作原理:

MongoDB复制集最少需要两个节点。

主节点:负责处理客户端的请求,

从节点:负责复制主节点上的数据

搭配方式:一主一从或一主多从

注:客户端在主节点写入数据,在从节点读取数据,主从进行数据交互,保证数据的一致性

MongoDB复制集部署

(1)配置复制集
[[email protected] ~]# mkdir -p /data/moongodb/mongodb{2,3,4}   //创建多实例
[[email protected] ~]# cd /data/mongodb/
[[email protected] mongodb]#
mongo  mongod2.log  mongodb2  mongodb3  mongodb4
[[email protected] mongodb]# mkdir logs
[[email protected] mongodb]# ls
logs  mongo  mongodb2  mongodb3  mongodb4
[[email protected] mongodb]# touch logs/mongodb{2,3,4}.log
[[email protected] mongodb]# cd logs/
[[email protected] logs]# ls
mongodb2.log  mongodb3.log  mongodb4.log
[[email protected] logs]# chmod 777 *.log  //赋予最大权限
[[email protected] logs]# ls
mongodb2.log  mongodb3.log  mongodb4.log
[[email protected] logs]# ll
总用量 0
-rwxrwxrwx. 1 root root 0 7月  17 08:59 mongodb2.log
-rwxrwxrwx. 1 root root 0 7月  17 08:59 mongodb3.log
-rwxrwxrwx. 1 root root 0 7月  17 08:59 mongodb4.log
(2)编辑4个MongoDB实例的配置文件
[[email protected] etc]# vim mongod.conf
replication:                    //注释此项
  replSetName: root123         //添加复制集名称(自取),注意前面空两格  

[[email protected] etc]# mongod -f /etc/mongod.conf  --shutdown  //关闭服务
killing process with pid: 1084
[[email protected] etc]# mongod -f /etc/mongod.conf  //开启服务
about to fork child process, waiting until server is ready for connections.
forked process: 11329
child process started successfully, parent exiting
注:修改配置文件后需重启服务,文件生效

[[email protected] etc]# cp -p mongod.conf mongod2.conf
cp:是否覆盖"mongod2.conf"? y
[[email protected] etc]# vim mongod2.conf
path:/data/mongodb/logs/mongodb2.log        //日志存放位置
dbpath:/data/mongodb/mongodb2               //数据存放位置
port:                                      //修改端口号,端口号不能相同

[[email protected] etc]# cp -p mongod2.conf mongod3.conf
[[email protected] etc]# cp -p mongod2.conf mongod4.conf
[[email protected] etc]# vim mongod3.conf         //改序号和端口号即可,其它和2相同配置
[[email protected] etc]# vim mongod4.conf
[[email protected] etc]# mongod -f /etc/mongod2.conf
[[email protected] etc]# mongod -f /etc/mongod3.conf
[[email protected] etc]# mongod -f /etc/mongod4.conf

[[email protected] etc]# netstat -antp | grep mongod      //四台实例都已开启
tcp        0      0 0.0.0.0:27019           0.0.0.0:*               LISTEN      11599/mongod
tcp        0      0 0.0.0.0:27020           0.0.0.0:*               LISTEN      11627/mongod
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      11459/mongod
tcp        0      0 0.0.0.0:27018           0.0.0.0:*               LISTEN      10252/mongod
(3)配置三个节点的复制集
[[email protected] etc]# systemctl stop firewalld.service    //关闭防火墙
[[email protected] etc]# setenforce 0

[[email protected] etc]#mongo
> show dbs
> cfg={"_id":"root123","members":[{"_id":0,"host":"192.168.200.184:27017"},{"_id":1,"host":"192.168.200.184:27018"},{"_id":2,"host":"192.168.200.184:27019"}]}                             //配置节点复制集
{
    "_id" : "root123",
    "members" : [
        {
            "_id" : 0,
            "host" : "192.168.200.184:27017"
        },
        {
            "_id" : 1,
            "host" : "192.168.200.184:27018"
        },
        {
            "_id" : 2,
            "host" : "192.168.200.184:27019"
        }
    ]
}
> db.stats()
{
    "db" : "test",
    "collections" : 0,
    "views" : 0,
    "objects" : 0,
    "avgObjSize" : 0,
    "dataSize" : 0,
    "storageSize" : 0,
    "numExtents" : 0,
    "indexes" : 0,
    "indexSize" : 0,
    "fileSize" : 0,
    "fsUsedSize" : 0,
    "fsTotalSize" : 0,
    "ok" : 1,                                  //状态ok=1,复制成功
    "$clusterTime" : {
        "clusterTime" : Timestamp(0, 0),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

123:SECONDARY> rs.status()                  //查看复制集状态
{
    "set" : "root123",
    "date" : ISODate("2018-07-17T03:24:03.253Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "syncingTo" : "",
    "syncSourceHost" : "",
    "syncSourceId" : -1,
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1531797840, 1),
            "t" : NumberLong(1)
        },
        "readConcernMajorityOpTime" : {
            "ts" : Timestamp(1531797840, 1),
            "t" : NumberLong(1)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1531797840, 1),
            "t" : NumberLong(1)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1531797840, 1),
            "t" : NumberLong(1)
        }
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.200.184:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",                //状态1为主
            "uptime" : 980,
            "optime" : {
                "ts" : Timestamp(1531797840, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2018-07-17T03:24:00Z"),
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "infoMessage" : "could not find member to sync from",
            "electionTime" : Timestamp(1531797808, 1),
            "electionDate" : ISODate("2018-07-17T03:23:28Z"),
            "configVersion" : 1,
            "self" : true,
            "lastHeartbeatMessage" : ""
        },
        {
            "_id" : 1,
            "name" : "192.168.200.184:27018",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",               //状态2为从
            "uptime" : 45,
            "optime" : {
                "ts" : Timestamp(1531797840, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1531797840, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2018-07-17T03:24:00Z"),
            "optimeDurableDate" : ISODate("2018-07-17T03:24:00Z"),
            "lastHeartbeat" : ISODate("2018-07-17T03:24:02.633Z"),
            "lastHeartbeatRecv" : ISODate("2018-07-17T03:24:02.920Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncingTo" : "192.168.200.184:27017",
            "syncSourceHost" : "192.168.200.184:27017",
            "syncSourceId" : 0,
            "infoMessage" : "",
            "configVersion" : 1
        },
        {
            "_id" : 2,
            "name" : "192.168.200.184:27019",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",              //状态2为从
            "uptime" : 45,
            "optime" : {
                "ts" : Timestamp(1531797840, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1531797840, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2018-07-17T03:24:00Z"),
            "optimeDurableDate" : ISODate("2018-07-17T03:24:00Z"),
            "lastHeartbeat" : ISODate("2018-07-17T03:24:02.633Z"),
            "lastHeartbeatRecv" : ISODate("2018-07-17T03:24:02.896Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncingTo" : "192.168.200.184:27017",
            "syncSourceHost" : "192.168.200.184:27017",
            "syncSourceId" : 0,
            "infoMessage" : "",
            "configVersion" : 1
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1531797840, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1531797840, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
root123:PRIMARY>            //最后显示此状态

注:初始化配置时保证从节点没有数据
(4)添加和删除节点
root123:PRIMARY> rs.add("192.168.200.184:27020")
{
    "ok" : 1,
    "operationTime" : Timestamp(1531799035, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1531799035, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
root123:PRIMARY> rs.stats()
"_id" : 3,
            "name" : "192.168.200.184:27020",     //添加成功
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",             //也为从节点
            "uptime" : 26,
            "optime" : {
                "ts" : Timestamp(1531799060, 1),
                "t" : NumberLong(1)
            },

root123:PRIMARY> rs.remove("192.168.200.184:27020")
{
    "ok" : 1,                                   //删除成功
    "operationTime" : Timestamp(1531799257, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1531799257, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
(5)模拟故障自动转移
[[email protected] mongodb]# ps aux | grep mongod
root      12342  1.3  5.8 1465664 58768 ?       Sl   11:07   0:38 mongod -f /etc/mongod3.conf
root      12387  1.0  5.9 1442988 59124 ?       Sl   11:07   0:29 mongod -f /etc/mongod4.conf
root      12428  1.4  6.4 1582772 64516 ?       Sl   11:07   0:40 mongod -f /etc/mongod.conf
root      12667  1.5  6.2 1459800 62268 ?       Sl   11:17   0:35 mongod -f /etc/mongod2.conf
root      13655  0.0  0.0 112676   984 pts/0    S+   11:55   0:00 grep --color=auto mongod
[[email protected] mongodb]# kill -9 12428
[[email protected] mongodb]# mongo
root123:SECONDARY> rs.status()
"members" : [
        {
            "_id" : 0,
            "name" : "192.168.200.184:27017",
            "health" : 0,                  //第一台健康值为0,已经不存在
            "state" : 8,
            "stateStr" : "(not reachable/healthy)",
            "uptime" : 0,
            "optime" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
            },

{
            "_id" : 2,
            "name" : "192.168.200.184:27019",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",         //27019跳为主节点
            "uptime" : 2039,
            "optime" : {
                "ts" : Timestamp(1531799828, 1),
                "t" : NumberLong(2)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1531799828, 1),
                "t" : NumberLong(2)
            },

多学多练,快乐无限~!!!

原文地址:http://blog.51cto.com/13687553/2145361

时间: 2024-07-31 09:09:16

每天一篇,深入学习MongoDB复制集的相关文章

MongoDB复制集及数据分片详解

前言 MongoDB是一个由C++语言编写的基于分布式文件存储的数据库,是当前NoSQL数据库中比较热门的一种,旨在为Web应用提供可扩展的高性能数据存储解决方案.本文介绍MongoDB复制集及数据分片. MongoDB 简介 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.支持的数据结构非常松散,因此可以存储比较复杂的数据类型.最大的特点是其支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询

MongoDB复制集部署和基本管理

MongoDB复制集部署和基本管理 MongoDB复制集概述 复制集(Replica Sets)是额外的数据副本,是跨多个服务器同步数据的过程,复制集提供了冗余并增加了数据的可用性,通过复制集可以对硬件故障和中断服务进行恢复. 复制集由下列优点: 让数据更安全 高数据可用性(7*24) 灾难恢复 无停机维护(如备份.索引重建.故障转移) 读缩放(额外的副本读取) 副本集对应用程序是透明的 复制集工作原理 MongoDB的复制集至少需要两个节点.其中一个节点是主节点(Primary),负责处理客户

mongodb复制集的实现

复制集(Replica Sets),是一个基于主/从复制机制的复制功能,进行同一数据的异步同步,从而使多台机器拥有同一数据的都多个副本,由于有自动故障转移和恢复特性,当主库宕机时不需要用户干预的情况下自动切换到其他备份服务器上做主库,一个集群最多可以支持7个服务器,并且任意节点都可以是主节点.所有的写操作都被分发到主节点,而读操作可以在任何节点上进行,实现读写分离,提高负载. 资源有限测试一个VM开3个实例: 环境:centos7.0 192.168.1.21:20011 P 192.168.1

MongoDB复制集原理

版权声明:本文由孔德雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/136 来源:腾云阁 https://www.qcloud.com/community MongoDB的单实例模式下,一个mongod进程为一个实例,一个实例中包含若干db,每个db包含若干张表.MongoDB通过一张特殊的表local.oplog.rs存储oplog,该表的特点是:固定大小,满了会删除最旧记录插入新记录,而且只支持append操作,因

mongodb复制集配置步骤

mongodb复制集配置步骤 2012-11-09 14:10:24|  分类: mongodb|举报|字号 订阅 复制升级版的主从复制,它实现了故障自动转移功能,同时从节点支持读 一,节点类型: a)    主节点:支持读写 b)    从节点:支持读(需设置) c)    仲裁节点:参与投票同时也支持读(需设置) 二,实验 主节点:192.168.129.47 从节点:192.168.129.48 仲裁节点:192.168.129.49 1.主节点配置如下: vi  /etc/rc.loca

一步一步教你搭建基于docker的MongoDB复制集群环境

一步一步教你搭建基于docker的MongoDB复制集群环境 1.安装docker 2.创建MongoDB的Image 3.搭建MongoDB的集群 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中. 1.ubuntu14.04安装docker 参考文档 http://docs.docker.com/installation/ubuntulinux/ 参考文档 http://docs.docker.com/mac/started/ pc@pc-Th

MongoDB复制集数据库拆分和版本升级实战

MongoDB复制集数据库拆分和版本升级实战 问题描述 复制集rs_1上承载了所有的数据库业务,而加内存已经无法满足应用程序压力. 解决方案 考虑拆分复制集rs_1的部分数据库到rs_2,并同时升级数据库版本到2.6. 架构图 准备 评估升级可能性 1. 连接2.6 mongo shell到2.4 复制集辅助成员,在admin库执行db.upgradeCheckAllDBs().   2. 评估升级到2.6的应用程序兼容性问题,参考:http://docs.mongodb.org/manual/

MongoDB 复制集

关于读写分离 由于写入主之后,同步到从有一个时间,所以读写分离会引发数据一致性问题. MongoDB 通过复制集(Replica Set)来实现读写分离. MongoDB复制集(Replica Set) 通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用. 当遇到复制集轮转升级.Primary宕机.网络分区等场景时,复制集可能会选举出一个新的Primary,而原来的Primary则会降级为Secondary,即发生主备切换.所以,MongoDB复制集里Primary

MongoDB复制集架构

MongoDB复制集架构 由数据结点,投票结点组成,需要配置集群信息,可自动检测集群中的结点健康状态,当有结点出故障时,自动下线和切换主从结点.适用于数据量较大,高可用服务 通常,为了防止单点故障应用程序需要做集群.然而在数据库中除了防止单点故障,还需要做到数据库备份,读写分离,故障转移等.而 MongoDB 的 Replica Set 恰恰都能满足这些要求. Replica Set角色 Replica Set 的成员是一堆有着同样的数据内容 mongod 的实例集合,包含以下三类角色: 主节点