Mongo集群化部署+高可用架构

news2024/12/26 11:06:42

数据库开发系列


文章目录

  • 数据库开发系列
  • 前言
  • 一、MongoDB存储引擎
  • 二、MongoDB 复制(副本集)
  • 三、为什么需要分片集群架构
  • 四、高可用分片集群架构(+复制集)
  • 总结


前言

数据库的演进
随着计算机的发展,越来越多的数据需要被处理,数据库是为处理数据而产生。从概念上来说,数据库是指以一定的方式存储到一起,能为多个用户共享,具有更可能小的冗余,与应用程序彼此独立的数据集合。从功能上来说,就是数据管理软件。

到了2000年随着互联网的发展,数据量呈现爆发式增长。海量数据的诞生,传统的关系型数据库在应对大规模,超大流量的时候就显得力不从心。借此,NoSQL数据库跟NewSQLl数据库就此登场。

NoSQL 全称 “not only sql”,所有非关系型的数据库都统称为NoSQL数据库,NoSQL数据库主要有四种类型,文档数据库(MongoDB为代表),键值数据库(Redis为代表),宽列存储(Hbase为代表)和图形数据库(Neo4J为代表)。

NewSQL数据库,提供了与NoSQL相同的扩展性,但仍属于关系型模型,还保留SQL作为查询语言,保证了ACID事务性。代表数据库有Spanner,CockroachDB。
在这里插入图片描述

数据库发展到今天,可以说是百花齐放,随着2020年阿里云数据库进入全球魔力四象限的Leader象限,这也是中国数据库40年来首次进入全球顶级数据库行列,标志着国产数据库开始崛起。

数据库索引技术
数据库是用来处理数据的,那高效的存储、检索数据,是数据库管理系统必备的技能。数据库中用于提高检索效率很重要的一项技术就是索引。

数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。数据结构是为算法服务的,算法是要作用在特定的数据结构上的。数据库提高检索效率使用的是索引,数据库索引是一种树形数据结构,如MongoDB使用的是B-tree、MySQL使用的是B+tree。
参考https://blog.csdn.net/dbaxiaosa/article/details/127750957

MongoDB介绍
本文重点介绍MongoDB,它虽然诞生于NoSQL,但4.0版本之后,已经不仅仅是NoSQL了,可以与上文中任何一位NewSQL的代表PK。MongoDB是一个开源、高性能、无模式的文档数据库,旨在简化开发和扩展。


一、MongoDB存储引擎

WiredTiger是在MongoDB3.0版本引入的,并且在MongoDB3.2版本开始成为MongoDB默认的存储引擎。相比较MMAPv1,WiredTiger功能更强大,而且具有更高的性能。3.0版本之前是采用的 MongoDB的MMAPv1存储引擎。

文件空间分配方式改进
MMAPv1存储引擎是在数据库级别分配文件的,将每个数据库中所有的集合和索引都混合存储在数据库文件中,即使删除了某个集合或索引,其占用的磁盘空间也很难及时自动回收。WiredTIger则在集合和索引级别分配文件,将每个数据库中所有的集合和索引都存储在单独的文件中,集合或索引删除后,其对应文件即可删除,磁盘空间回收方便。
WiredTiger的一些数据文件:
mongod.lock:用于防止多个进程连接同一个WiredTiger数据库
.wt文件:存储各个集合的数据,每个文件100MB
WiredTiger.wt:用于存储所有集合的元数据信息
WiredTiger.turtle:用于存储WiredTiger.wt的元数据信息
journal文件夹:用于存储日志文件(Write ahead log)

WiredTiger对内存的使用情况
wiredTiger对内存使用会分为两大部分,一部分是内部内存,另外一部分是文件系统的缓存。内部内存默认值有一个计算公式{ 50% of(RAM-1GB) ,or256MB },索引和集合的内存都被加载到内部内存,索引是被压缩的放在内部内存,集合则没有压缩。wiredTiger会通过文件系统缓存,自动使用其他所有的空闲内存,放在文件系统缓存里面的数据,与磁盘上的数据格式一致,可以有效减少磁盘I/O。

你需要分析是否对默认的内存做调优。一条比较好的原则就是wt的缓存足够大,能够缓存整个应用的工作集。
查看wt的缓存统计信息:
db.serverStatus().wiredTiger.cache
文档级别的并发控制
WiredTiger存储引擎使用文档级别锁,同一时刻多个写操作可以修改同一个集合中不同的文档,但不能修改同一个文档。这使得WiredTiger存储引擎的并发处理能力比MMAPv1更好。

通过检查点和预写日志实现数据持久化
按照MongoDB默认的配置,WiredTiger的写操作会先写入Cache(BTree结构),当Cache大小达到128KB时便将其持久化到预写日志文件(Write ahead log)。WiredTiger每60s或日志文件大小达到2GB时会做一次检查点Checkpoint,产生指定时间点的数据库快照(内存中数据的一致性视图),将快照中的所有数据以一致性方式持久化到数据文件中,保证数据文件和内存数据是一致的。Wiredtiger连接初始化时,首先将数据恢复至最新的快照状态,然后根据预写日志文件恢复数据,以保证存储可靠性。
内存使用上限可配置
使用WiredTiger存储引擎时,MongoDB数据缓存分两部分:内部缓存和文件系统缓存。内部缓存大小可以使用–wiredTigerCacheSizeGB参数来设置,默认值为:1GB或RAM的60%到1GB之间,取两值中较大者。文件系统缓存大小则不固定,MongoDB自动使用系统空闲的内存,且数据在文件系统缓存中是压缩存储的。
数据压缩
使用WiredTiger存储引擎时,数据库的集合与索引、日志文件都是压缩存储的,节省了磁盘空间。WiredTiger默认情况下,集合数据使用块压缩算法,索引数据则使用前缀压缩算法。这使得数据占用磁盘空间少,读写速度快,花费I/O时间少。
集合中数据比较少时,压缩和无压缩的写性能相单,无压缩读性能反而比压缩读性能好。当集合数据很多时,压缩的读写性能则都要比无压缩的读写性能好。

二、MongoDB 复制(副本集)

MongoDB复制是将数据同步在多个服务器的过程。
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
复制还允许您从硬件故障和服务中断中恢复数据。
注:MongoDB复制是异步的,若配置了从Secondary读取数据,则需要业务接受数据延迟。

为什么需要复制?
保障数据的安全性
数据高可用性 (24*7)
灾难恢复
无需停机维护(如备份,重建索引,压缩)
分布式读取数据

MongoDB复制原理
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。

mongodb各个节点常见的搭配方式为:一主一从、一主多从。
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

副本集特征:
N 个节点的集群
任何节点可作为主节点
所有写入操作都在主节点上
自动故障转移
自动恢复
在这里插入图片描述

创建分片语法

//创建mongo实例
mongod  --bind_ip "0.0.0.0" --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --logpath "YOUR_LOG_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"  --logappend --fork
//启动一个新的副本集
rs.initiate()
//添加副本集
rs.add(HOST_NAME:PORT)
//查看副本集状态使用 
rs.status() 
//查看副本集的配置
rs.conf()

参数解析

--oplogSize 日志操作文件的大(默认磁盘剩余空间的5%--dbpath   数据文件路径
--logpath  日志文件路径
--port        端口号,默认是27017
--replSet   复制集的名字,一个replica sets中的每个节点的这个参数都要用一个复制集名字,这里是test.
--replSet test/  这个后面跟的是其他standard节点的ip和端口
--maxConns   最大连接数
--fork       后台运行
--logappend   日志文件循环使用,如果日志文件已满,那么新日志覆盖最久日志。

三、为什么需要分片集群架构

当业务遇到如下问题时,可以使用分片集群解决:
1、存储容量受单机限制,即磁盘资源遭遇瓶颈。
2、读写能力受单机限制,可能是CPU、内存或者网卡等资源遭遇瓶颈,导致读写能力无法扩展。

关于负载均衡
MongoDB分片集群的自动负载均衡目前是由mongos的后台线程来做,并且每个集合同一时刻只能有一个迁移任务。负载均衡主要根据集合在各个shard上chunk的数量来决定的,相差超过一定阈值(和chunk总数量相关)就会触发chunk迁移。

负载均衡默认是开启的,为了避免chunk迁移影响到线上业务,可以通过设置迁移执行窗口,例如只允许凌晨02:00~06:00期间进行迁移。

use config
db.settings.update(
{ _id: "balancer" },
{ $set: { activeWindow : { start : "02:00", stop : "06:00" } } },
{ upsert: true }
)

四、高可用分片集群架构(+复制集)

一个 MongoDB分片集群由以下组件组成:
1、shard:每个分片包含分片数据的一个子集。每个分片都可以部署为副本集。
2、mongos:mongos充当查询路由器,在客户端应用程序和分片集群之间提供接口。
3、config servers:配置服务器存储集群的元数据和配置设置。从 MongoDB 3.4 开始,配置服务器必须部署为副本集 (CSRS)。
总之:shard、config servers组建部署副本集保障高可用,mongos是单点架构,可以部署多个节点保障高可用。
在这里插入图片描述
参照关系型数据库,我们来看看MongoDB中的对象。
在这里插入图片描述
部署测试(待完成):


总结

通过本文的学习,应该对mongodb的分布式架构有了深刻了理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/442910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python+vue 服装穿搭信息管理系统

本系统采用自上往下的方法开发,基本定位如下功能: 本课题要求实现一套服装信息管理系统的设计与实现,系统主要包括管理员模块和用户模块功能模块。 由于本系统需要在不同设备上都能运行,而且电脑配置要求也要越低越好&#xff0c…

SpringMVC框架详解(学习总结)

目录 什么是MVC SpringMVC概述 SpringMVC常见开发方式 SpringMVC执行流程 SpringMVC核心组件介绍 快速构建Spring MVC程序 SpringMVC参数绑定 SpringMVC跳转方式 SpringMVC处理json请求和响应 SpringMVC静态资源处理 SpringMVC操作session和cookie SpringMVC拦截器 …

基于nuxt3的语雀文档批量导出

语雀文档批量导出 快速访问 Github Blog 项目由来 语雀是一个不错的笔记与文档知识库,但是最近发现他开始割韭菜了, 知识库的公开开始收费,就想着把内容都导出自己来部署,发现并没有批量操作,amazing,…

美国运营商PTCRB认证PTCRB认证怎么做PTCRB认证是什么?

大家好,今天我想和大家分享一下什么是PTCRB认证! PTCRB是指个人通信服务型号认证评估委员会,由北美移动运营商于1997年成立。目前的运营商已经不仅限于北美,而是涵括全球范围内的移动运营商成员。其目的是为包括Cellular GERAN&a…

Session使用和原理分析图与实现原理-- 代码演示说明 Session 的生命周期和读取的机制代码分析

目录 Web 开发会话技术 -Session —session 技术 session 基本原理 Session 可以做什么 如何理解 Session Session 的基本使用 session 底层实现机制 原理分析图 代码演示 CreateSession.java 测试 Session 创的机制, 注意抓包分析​编辑 ReadSession.j…

C盘文件删除怎么做?3个方法教你清理C盘!

案例:C盘文件怎么删除? 【我的电脑使用了一年多了,现在C盘已经快满了,想知道C盘里的文件哪些可以进行删除?感谢!】 C盘是计算机系统盘,存储了操作系统和应用程序等重要文件,因此&a…

机器视觉助力锂电行业升级转型—章鱼博士视控一体化解决方案

摘要: 机器视觉在工业领域中充当了模拟人眼的作用,通过其高效的感知能力、精确的检测准确性、可定制性和较低的人工成本等特点,已逐渐成为工业智能化转型的核心功能。在锂电池领域,机器视觉扮演着许多重要的角色,包括生…

使用Docker部署wikitten个人知识库

使用Docker部署wikitten个人知识库 一、wikitten介绍1.wikitten简介2.wikitten特点 二、本地实践环境介绍三、本地环境检查1.检查Docker服务状态2.检查Docker版本 四、部署wikitten个人知识库1.创建数据目录2.下载wikitten镜像3.创建wikitten容器4.查看wikitten容器状态5.检查w…

【unity实战】随机地下城生成4——小地图的制作(2d,3d通用)(含源码)

原理: 新建一个摄像机,用来查看小地图,我们分个图层只能新建的摄像机才可以拍摄到 如果对摄像机和渲染纹理还不理解的,强烈推荐先看完我的另一篇文章 【Unity游戏开发教程】零基础带你从小白到超神14——灯光、摄像机、天空盒、镜子的制作 新建一个摄像机,记得删除Audio …

关于使用el-input-number设置不让删除为空,让强制为最小值1,以及从1删除,但是发现输入框还是没有最小值的问题

哈喽,大家好啊,最近用到了element的el-input-number 计数器 但是有个问题一直困扰我,就是我发现竟然可以删除输入的值,也不会强制改成最小值 但是因为业务这里不允许数量为空的情况,所以我找了很久,终于实…

JavaSE学习进阶day07_01 Stream流

第二章 Stream流 在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端。 2.1 引言 传统集合的多步遍历代码 几乎所有的集合(如Collection接口或Map接口等)都支…

SpringBoot学习

什么是springBoot 使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。简而言之,Spring Boot通过提供默认配置的方式整合了所有的框架,让我们可以更加简单、快速、方便地构建应用程序。 并不是对spring的功能增强&#xf…

基于AT89C52单片机的温湿度检测设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87704704 源码获取 主要内容: 设计一套基于51单片机的温湿度Protus仿真监控系统,采用SHT11、DHT11或DS189B20等传感器模块,用LC…

【分享】集简云 x 微步在线丨零代码连接钉钉宜搭与用友U8,让企业数字化升级更轻松

微步在线 • 介绍 微步成立于2015年,是数字时代网络安全技术创新型企业,专注于精准、高效、智能的网络威胁发现和响应,开创并引领中国威胁情报行业的发展,提供“云流量端点”全方位威胁发现和响应产品及服务,帮助客户…

第八章 网络安全基础

网络安全概述 基本概念 网络安全通信的基本属性: 机密性;只有发送方与预定接收方能够理解报文内容消息完整性;发送方和接收方希望确保信息未被篡改,或发生篡改一定会被检测到可访问性与可用性;可访问与可用性是网络信…

mybatis02-核心配置文件、返回主键值、SQL片段、事务处理、动态SQL

Mybatis02 一、mybatis核心配置文件 在主配置config.xml中,定义了很多标签&#xff0c;现在只是使用了一部分标签&#xff0c;主配置文件中可以出现的标签 用dtd文 件进行约束。 1、标签的配置规范&#xff0c;查看dtd规范文件 <?xml version"1.0" encoding&…

centos7.6部署ELK集群(二)之kibana7.7.0集群部署

32.4. 部署kibana7.7.0&#xff08;在主节点上操作&#xff09; 32.3.13. 下载kibana curl -L -O https://artifacts.elastic.co/downloads/kibana/kibana-7.7.0-linux-x86_64.tar.gz 32.3.14. 解压至安装目录 tar –xvf kibana-7.7.0-linux-x86_64.tar.gz -C /vmdata/ 32.…

【极简】windows下,vuejs打包,用Nginx部署http服务

做法 如果你熟悉vue&#xff0c;一般要“运行”会在目录用npm run dev&#xff0c;但是npm run dev 命令只用做本地调试&#xff0c;共开发者预览页面。 同部署到服务器供其他终端访问是不同的&#xff0c;如果要提供给其他浏览器或终端使用&#xff0c;则需要部署到具体的服…

算法记录 | Day34 贪心算法

1005.K次取反后最大化的数组和 class Solution:def largestSumAfterKNegations(self, A: List[int], K: int) -> int:A sorted(A, keyabs, reverseTrue) # 将A按绝对值从大到小排列for i in range(len(A)):if K > 0 and A[i] < 0:A[i] * -1K - 1if K > 0:A[-1] *…

FPGA双口RAM使用

模块名称&#xff1a; dpram() IP Core 双口RAM&#xff0c;有俩组数据线和地址线&#xff0c;读写可以同时进行&#xff0c;FIFO读写可以同时进行&#xff0c;可以看作是双口。分为Simple two-dual RAM和true two-dual RAM。简单双口RAM&#xff0c;一个端口只读&#xff0c;…