【私货】MongoDB 副本集的运维部署

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 【私货】MongoDB 副本集的运维部署

前面几篇文章,我分享了关于MongoDB索引和常见的命令,今天趁给团队分享了MongoDB实战,继续给大家聊聊MongoDB的副本集配置部署。


副本集介绍

什么是副本集?副本集是MongoDB的复制系统,用于将数据同步到各个服务器的过程。

前面的文章中我演示的基本都是单节点mongod服务器,单节点在测试环境还行,但是在线上生产环境就不合适了,因为如果单节点出问题了,会导致应用宕机。

所以这个时候我们可以MongoDB的复制功能,使用多节点进行部署,其中一台服务器节点宕机了,还有其他节点运行,进行故障转移,让应用不会受到影响,从而更为高可用。

说到故障转移,MongoDB最初支持一种叫「主从模式」(master-slave)这种模式下MongoDB不会做自动故障转移的。这种模式现在已经不推荐使用了,这里就不过多介绍了。

由于副本集新增节点或者删除节点都非常方便,建议即使你一开始是单节点也以副本集的方式启动,方便后续进行节点添加。


成员介绍

副本集成员这里主要介绍仲裁者arbiter, 延迟备份节点这两种成员。

说到仲裁者,这里需要说一个副本集成员之间选举主节点过程有一个满足「大多数」原则 即 n/2 + 1 。仲裁者作用就是「参与选举」,不保存数据。解决在一开始我们应用程序量很小的时候,没有资源,不想保存三分及以上数据副本。


rs.add({"_id": 3, "host": "server-3:27017", "arbiterOnly": true})


这里注意:

  1. 最多只能使用一个仲裁者
  2. 奇数节点不需要仲裁者
  3. 尽可能使用奇数个数据节点,不使用仲裁者

说完仲裁者,我们说一下「延迟备份节点」,在给团队内部做分享的时候,我们公司的运维大神专门强调要讲这个,这个是有历史血泪的。

延迟备份节点主要作用避免有人不小心删除了主数据库,或者应用程序有一个严重Bug导致把所有数据玩坏了。为了避免这一类问题,设置一个延迟备份节点。强烈建议线上配置,这是有血泪史的。


rs.add( { _id:4, host: "server-4:27020", priority: 0, hidden:true, slaveDelay:7200, votes:0, buildIndexes:true, arbiterOnly:false } )

其实这也算是一个备份方式之一,保底计划。


副本集初始化


副本集成员启动之后,配置这里我放在最后一节来说,这里我们直接说副本集启动后的初始化操作。

成员初始化操作主要有4个步奏:

  1. 成员在local.me自己创建标志符,删除本地已存在的数据,进行数据同步
  2. 将同步源的所有记录数据克隆到本地,这一步是最耗时的
  3. 将第一个oplog同步中操作记录下来。
  4. 创建索引,同步创建索引期间的所有操作

通过上面的4个步奏,就完成了副本集初始化。


副本集备份

备份的方式简单小结有以下四种方式:

一、 文件系统快照:其中文件系统快照需要文件系统本身支持,mongod开启日记系统,后面我配置会说。

二、 复制数据目录:就是复制数据目录所有文件,在备份我们需要防止数据文件不能发生改变,否则将不可用。

保证数据不变,可以通过


db.fsyncLock() 进行锁定所有数据库,运行之后后续操作会加入队列等待。

cp -R /data/db/* /backup/

db.fsyncUnlock() # 解锁数据库能再次进行写操作

三、mongodump:备份恢复速度较慢,不推荐

四、延迟备份节点: 原则上不算备份策略,但是比较重要通过它来延迟防止数据误操作。


副本集部署


最后我们终于说到了副本集配置,这里我们配置好mongod.conf配置,replaSetName设置为test_rs名,配置如下:

storage:
  dbPath: /test/mongodb/rs1  # 配置路径
  journal:
    enabled: true # 开启日记系统
systemLog:
  destination: file
  logAppend: true
  path: /test/log/mongodb/rs1.log  # 日志
processManagement:
  pidFilePath: /var/run/mongodb/rs1.pid
net:
  port: 27018
  bindIp: 1.2.3.4 # 绑定固定IP
replication:
   replSetName: "test_rs" # 选定配置名
security:
  authorization: enabled
  keyFile: /test/mongodb/key/test_rs.key


除了上面的配置外,我们可以通过配置init.d的启动脚本,大家可以去github上面进行搜索一下,有很多启动脚本通过 sudo service mongodb.rs1 start 进行启动处理,通过多个节点进行启动加入到副本集。

由于mongo默认是没有密码的,对于数据库的配置,除了配置帐号密码以外,如果我们是在腾讯云或者阿里云服务器上,需要配置安全组,只允许内网固定几台机器IP,固定端口访问。


配置优化


除了MongoDB配置启动好了,我们还需要对服务器做一些配置调整,主要有以下几点:

  1. 禁止内存过度分配:overcommit_memory=2
  2. 禁用大内存页面HugePage:
  3. 修改文件描述符 > 20000 或者无限制
  4. 关闭定期任务,比如软件包自动更新,消耗CPU及内存资源,造成服务抖动异常(类似Redis异步任务hgetall)

其中vercommit_memory设置1,满足所有内存分配请求(redis部署),设置2分配虚拟空间不超过swap与一小部分过度分配的和,设置0,让内核猜测过度分配大小。

禁止大内存:如果不能全部存进内存,不考虑超过内存容量情况,就可以用大内存,但是不能全部存进去的话,那么大块数据会导致更多IO,而且「脏数据」落地到硬盘可能从KB到MB。

至此我们服务部署上线结束,由于个人经验所限,难免有些疏忽遗漏甚至错误,欢迎留言指出,非常感谢。


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
2月前
|
存储 NoSQL MongoDB
MongoDB 复制(副本集)
10月更文挑战第17天
37 2
MongoDB 复制(副本集)
|
27天前
|
存储 NoSQL MongoDB
【赵渝强老师】部署MongoDB复制集
本文介绍了如何在单个节点上搭建MongoDB复制集环境,通过监听不同端口实现多节点配置。详细步骤包括创建数据目录、编辑配置文件、启动节点、初始化复制集、查看状态以及测试主从库的读写操作。文中还提供了视频讲解和代码示例,帮助读者更好地理解和操作。
|
3月前
|
存储 NoSQL Shell
MongoDB复制(副本集)总结
这篇文章是关于MongoDB副本集的总结,包括复制原理、设置副本集、案例分析等内容。
47 1
|
3月前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
221 3
|
4月前
|
运维 Kubernetes 负载均衡
震惊!容器化运维竟藏如此大招,容器调度与服务编排让你的软件部署 “逆天改命”
【8月更文挑战第31天】在数字化时代,容器化技术革新了软件开发与运维方式,其高效、灵活及可移植的特点为企业应用部署提供了全新方案。容器调度与服务编排作为核心环节,通过优化资源分配、提升系统可靠性和可扩展性,实现了自动化管理。Kubernetes 等工具不仅简化了容器调度,还通过 Deployment、Service、Ingress 等资源对象实现了复杂应用架构的自动化运维,大幅提高了资源利用率和系统稳定性,减少了人工干预,加速了企业数字化转型。
57 2
|
4月前
|
存储 NoSQL MongoDB
今日分享MongoDB一键部署脚本
今日分享MongoDB一键部署脚本
39 0
|
4月前
|
运维 安全 网络安全
自动化运维:使用Python脚本实现批量部署
【8月更文挑战第2天】在现代IT基础设施管理中,自动化运维成为提升效率、减少人为错误的关键。本文将通过一个实际的Python脚本示例,展示如何实现服务器的批量部署,包括环境准备、代码实现及执行过程。文章旨在为运维工程师提供一种简化日常任务的方法,同时强调安全性和可维护性的重要性。
|
4月前
|
运维 安全 测试技术
自动化运维的利剑:Ansible在企业级部署中的应用与挑战
本文深入探讨了Ansible,这一领先的IT自动化工具,如何在企业级部署中扮演关键角色。我们将通过实际案例分析,揭示Ansible在简化配置管理、加速应用部署和提高运维效率方面的优势。同时,文章也将不回避Ansible实施过程中可能遇到的技术挑战与限制,并提供针对性的解决策略。阅读本文后,您将获得一个全面的视角,理解Ansible在现代企业运维中不可或缺的地位,以及如何克服其面临的主要问题。
85 1
|
4月前
|
NoSQL MongoDB Windows
MongoDB 读写分离——Windows MongoDB 副本集配置
MongoDB 读写分离——Windows MongoDB 副本集配置
84 0
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的批量运维管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的批量运维管理系统附带文章源码部署视频讲解等
40 0