上一篇我们了解了MongoDB的基本概念与单节点环境搭建,本篇我们来学习如何搭建一个高可用的复制集集群。

1 关于MongoDB复制集

MongoDB复制集的主要意义在于实现服务的高可用,它是MongoDB的一个原生的高可用设计,不需我们额外引入一些组件来实现,因此实现起来相当便利

主要功能

一是数据写入时将数据迅速地复制到另一个独立的节点上;

二是在接受写入的节点发生故障时自动选举出一个新的替代节点;

附加功能

数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的度延迟;

读写分离:不同类型的压力分别在不同的节点上执行;

异地容灾:在数据中心故障时快速切换到异地;

典型结构

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

(1)一个主节点(Primary),接受写入操作和选举时投票;

(2)两个(或多个)从节点(Secondary),复制主节点上的新数据和选举时投票;

如何复制

当一个Mongo的修改操作(CRUD)成功,在主节点时它对数据的操作会被记录下来,这些记录被称为oplog,并传递给从节点。从节点通过不断获取新进入主节点的oplog,并在自己的数据上进行回放,以此保持和主节点的数据一致。

如何选举

具有投票权的节点之间两两互相发送心跳,当5次心跳未收到时则会判断节点为失联。如果失联的是主节点,从节点会发起选举,选出新的主节点。如果失联的是从节点,不会产生新的选举。

整个选举过程基于Raft一致性算法实现,选举成功的必要条件是大多数投票节点存活(这也是为啥大多数需要选举的中间件集群要保持奇数个节点的原因),整个复制集中可以<=50个,但具有投票权的节点<=7个。

2 实践准备工作

准备VMware Workstation

跟上一篇一样,这次我们仍然会通过VMware Workstation启动几个虚拟机来完成搭建实践。

准备三台CentOS 7.x虚拟机

这里模拟的是三个Mongo节点的主从复制集,因此分别命名为mongo-master、mongo-slave1、mongo-slave2。

为了较好的模拟,在三个虚拟机中分别配置一下hosts文件:

vi /etc/hosts

在hosts文件中加入以下内容(IP地址为你配置的虚拟机IP):

192.168.58.100 mongo-master
192.168.58.101 mongo-slave1
192.168.58.102 mongo-slave2

可以验证一下能否通过主机名互相ping通。

下载Mongo Server到三台虚拟机

下载地址:https://www.mongodb.com/try/download/community

目前Server社区版最新版本为4.4.5:

这里,我们复制到的目录假设为:/usr/local/mongodb/tgz

复制完成后,分别进行解压压缩包,然后将其重命名:

tar -zvxf mongodb-linux-x86_64-rhel70-4.4.5.tgz
mv ./mongodb-linux-x86_64-rhel70-4.4.5 /usr/local/mongodb

准备三个Mongo节点的目录和文件

进入目录:cd /usr/local/mongodb

创建db目录:mkdir /usr/local/mongodb/data/db

创建日志目录:mkdir /usr/local/mongodb/logs

创建日志文件:touch /usr/local/mongodb/logs/mongodb.log

准备三个Mongo节点的配置文件

进入目录:cd /usr/local/mongodb

创建mongo配置文件:vi mongodb.conf

复制以下内容进入mongodb.conf:

systemLog:
destination: file
path: /usr/local/mongodb/logs/mongodb.log # log path
logAppend: true
storage:
dbPath: /usr/local/mongodb/data/db # data directory
net:
bindIp: 0.0.0.0
port: 27017 # port
replication:
replSetName: localrs
processManagement:
fork: true

添加三个Mongo节点的环境变量

修改profile文件:

cat >>/etc/profile<<"EOF"
>export PATH=$PATH:/usr/local/mongodb/bin
>EOF

刷新profile文件:

source /etc/profile

修改.bashrc文件:

cat >>/root/.bashrc<<"EOF"
>export PATH="$PATH:/usr/local/mongodb/bin"
>EOF

这时可以在任何目录下输入mongo命令就可以进入mongo了。

添加三个Mongo节点的开机启动

进入system目录:cd /lib/systemd/system

执行以下命令:

cat >>mongodb.service<<"EOF"

在>提示符下复制以下内容:

[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target [Service]
Type=forking
ExecStart=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/mongodb.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/mongodb/bin/mongod --shutdown --config /usr/local/mongodb/mongodb.conf
PrivateTmp=true [Install]
WantedBy=multi-user.target

输入EOF结束。

然后,设置mongodb.service的执行权限:

chmod +x mongodb.service

最后,设置mongodb.service开机自启动:

systemctl enable mongodb.service

3 快速配置MongoDB复制集

在主节点配置复制集

进入mongo shell:mongo

>rs.initiate()local
rs:SECONDARY> rs.add("mongo-slave1:27017") # 注意这里master节点还处于SECONDARY角色了
localrs:PRIMARY> rs.add("mongo-slave2:27017") # 注意这里master节点已经被选为PRIMARY角色了

在两个从节点配置复制集

localrs:SECONDARY>rs.secondaryOk()

测试复制集是否可用

首先,在主节点进入shell并插入一条数据:

localrs:PRIMARY>db.yzjc.insertOne({"name":"cscec-jc-team"})
localrs:PRIMARY> db.yzjc.find().pretty()
{ "_id" : ObjectId("608b74155839b06ac76a938d"), "name" : "cscec-jc-team" }

然后,分别在两个从节点查询刚刚在主节点新插入的数据是否已经同步:

localrs:SECONDARY> db.yzjc.find().pretty()
{ "_id" : ObjectId("608b74155839b06ac76a938d"), "name" : "cscec-jc-team" }

可以看到,已经同步到了两个从节点了。

参考资料

唐建法,《MongoDB高手课》(极客时间)

郭远威,《MongoDB实战指南》(图书)

△推荐订阅学习

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

MongoDB入门实战教程(2)的更多相关文章

  1. Kafka入门实战教程(7):Kafka Streams

    1 关于流处理 流处理平台(Streaming Systems)是处理无限数据集(Unbounded Dataset)的数据处理引擎,而流处理是与批处理(Batch Processing)相对应的.所 ...

  2. ZooKeeper入门实战教程(一)-介绍与核心概念

    1.ZooKeeper介绍与核心概念1.1 简介ZooKeeper最为主要的使用场景,是作为分布式系统的分布式协同服务.在学习zookeeper之前,先要对分布式系统的概念有所了解,否则你将完全不知道 ...

  3. Node+Express+MongoDB+Socket.io搭建实时聊天应用实战教程(一)--MongoDB入门

    前言 本文并不是网上流传的多少天学会MongoDB那种全面的教程,而意在总结这几天使用MongoDB的心得,给出一个完整的Node+Express+MongoDB+Socket.io搭建实时聊天应用实 ...

  4. Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(二)--node解析与环境搭建

    前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战.写教程一方面在自己写的过程中需要考虑更多的东西,另一方面希望能对node入门者有 ...

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

    MongoDB入门必读(概念与实战并重) 一.概述 MongoDB是一个基于分布式文件存储的数据库开源项目.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案. MongoDB是一个 ...

  6. mybatis实战教程(mybatis in action),mybatis入门到精通

    转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过hibernate了那这个就非常的简单) (再加 ...

  7. mybatis实战教程(mybatis in action),mybatis入门到精通(转)

    转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加 ...

  8. mongodb入门教程二

    title: mongodb入门教程二 date: 2016-04-07 10:33:02 tags: --- 上一篇文章说了mongodb最基本的东西,这边博文就在深入一点,说一下mongo的一些高 ...

  9. mongodb入门教程

    title: mongodb入门教程 date: 2016-04-06 14:47:18 tags: --- 为什么要认识呢,因为这玩意就一傻逼 借用一下百科的介绍 MongoDB 是一个介于关系数据 ...

  10. MongoDb 入门教程

    MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的高性能数据存储解决方案,经常被用于非关系型数据的存储,能存储海量的数据. 常 ...

随机推荐

  1. Apollo批量给新创建的用户授可编辑权限

    背景: 我们要在Apollo中批量给新创建的用户授可编辑权限 apollo系统版本: java-2.1.0 管理员账号:Apollo 可编辑账号:guoyabin 过程: 在没写这段代码的时候从网上搜 ...

  2. Javascript try catch finally

    很少用到javascript的异常捕获,突然需要,发现挺全的,小小记录下,留爪. 直接打码: //public.js //异常输出 function exception(ex) { console.l ...

  3. 2. RabbitMQ 的详细安装步骤(两种方式,第一种:yum 安装;第二种:docker 容器安装)

    2. RabbitMQ 的详细安装步骤(两种方式,第一种:yum 安装:第二种:docker 容器安装) @ 目录 2. RabbitMQ 的详细安装步骤(两种方式,第一种:yum 安装:第二种:do ...

  4. D常用快捷键大全(转)

    Ctrl+PageUp将光标移至本屏的第一行,屏幕不滚动.Ctrl+PageDown将光标移至本屏的最后一行,屏幕不滚动.Ctrl+↓向下滚动屏幕,光标跟随滚动不出本屏.Ctrl+↑向上滚动屏幕,光标 ...

  5. nodejs读写redis和mongo

    nodejs读写redis https://redis.io/commands https://www.npmjs.com/package/redis var redis = require('red ...

  6. 基于AST实现国际化文本提取

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:霜序 前言 在阅读本文之前,需要读者有一些 babel 的 ...

  7. 【完结】【一本通提高】2025dsfzB哈希和哈希表做题笔记

    2025年dsfz - 上学期B层字符串哈希专题做题笔记 笔记部分请看我的字符串哈希学习笔记 题目编号 标题 估分 正确 提交 Y 2066 Problem  A [一本通提高篇哈希和哈希表]乌力波( ...

  8. Java编程--可变参数、foreach循环

    /** * 可变参数与foreach循环 * 可变参数:方法可以接受任意多个参数 * 方法格式(参数类型...变量) * 使用方法传入的该变量时当作数组对待 * foreach循环:快速对数组进行操作 ...

  9. 看完这章你也会黑盒edu通杀

    负责声明: 请勿利用文章内的相关技术从事非法测试,由于传播.利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关.该文章仅供学习用途 ...

  10. 【经验】C++通过文件句柄获取文件路径(两种方式)

    方法一 主要参考博客:根据文件句柄获得文件名(这篇超级清晰,就是有一点点小问题) 通过文件句柄获得文件路径(这篇不是很好用,但是思路大体是一致的) 主要思路: 根据HANDLE 创建映射文件,调用Ge ...