博客数据库要连接Elasticsearch,使用MySQL还是MongoDB更合理

本文主要是介绍博客数据库要连接Elasticsearch,使用MySQL还是MongoDB更合理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

若进行博客等文本类数据的读写以及专业搜索引擎的连接的解决方案对比,可以肯定的下结论:MongoDB的解决方案中要远远好于MySQL的解决方案。

一、从开发工序角度

MySQL的文章读写方式

**方式一:**文章标题、作者、标签、时间和内容存关系表,图片存OSS,地址存关系表

file

上述方式因为OSS和MySQL没有事务关系,因此需要编辑文章过程中存储图片和存储草稿都是分开设计,后台写入是分开执行,查询过程更适合前端异步获取图片,另外OSS需要额外的访问授权。

最最关键的问题是OSS收费!

**方式2:**文章标题、作者、标签、时间和内容存关系表,图片存本地,地址存关系表,Nginx作为图片查询代理

file

上图中实线为写入过程,虚线为查询过程。写入本地文件的过程依然无法保证事务,因此仍需要后台分开执行,查询过程Nginx的业务授权非常麻烦,需要引入Openresty和授权服务器的对接,而且文件的存储存在文件数超过操作系统最大限制的可能,图片缺乏可靠性备份机制。

唯一的好处就是图片存储本地不用额外付费。

我们再看看MongoDB文章读写方式

file

如上图方式一:整存整取,MongoDB可以将文章标题、作者、标签、时间和内容,图片存在一个集合中,那么图片为BSON格式,形成整存整取,若文章+图片的完整文档不超过16M,是BSON比较合适。
若文档因为图过大,超过16M,就使用方式二,使用MongoDB提供的GridFS插件存取。

**方式一:**从开发工序上最简单,但不适合太大图片,导致文档整体超过16M。

**方式二:**相当于需要访问不同的MongoDB数据库,从代码复杂度上就要更高,而且一致性控制不如方式一好。

其他优势:这两种方式都可以得到MongoDB的统一访问控制保护。这两种方式都使图片通过副本集实现可靠性备份。

但最最关键的是没有MySQL变扭的超出技术范围的架构考虑,到底用OSS要收费,还是用Http代理的免费模式,容忍可靠性、复杂性及安全性问题超级大的情况。

二、从性能角度看

1、文章插入性能

从目前MongoDB4实测情况看,给定时间段内数据写入量级越大,MongoDB的完成时间就比MySQL的完成时间越短。因此博客网站平台或者博客爬虫系统,写入的数据量特别大的情况下,MongoDB可以提供更优越的负载能力。

2、伸缩性

MongoDB和MySQL都可以进行数据库级的内存缓存,但是MongoDB可以将文档最大可能的缓存在内存中,得到最优的性能表现。若内存不够的情况出现就会溢出到磁盘中,那么性能就会减弱,这个时候可以通过水平分区实现,更好的内存表现。

MySQL的分片必须通过自研或引入第三方的分片应用实现手动分片,即一张数据表迁移到不同MySQL库中,按照数据记录进行分表,最终达到分片应用对多库实现负载均衡的目的,这种方式的缺点就是实现分片的过程非常复杂和麻烦。

MongoDB的分片属于其核心架构之一,也是NoSQL天然所擅长的能力,因此MongoDB可以在用户不干预的情况下实现集合分片,这比MySQL的手动分片不知道要轻松多少。

file

上图中Mongos路由器作为接口,连接整个集群,将所有的读写请求指引到合适的分片上,配置服务器持久化分片集群的元数据,以及数据在分片之间进行迁移的历史信息,而且配置服务器本身也是高可靠的。

三、与Elasticsearch连接角度看

MySQL连接Elasticsearch

一种方式可以通过CDC(数据变更捕获)工具抓取binglog到Kafka,再由Kafka管道输出到Elasticsearch

另一种方式通过JDBC轮询数据库,再推送Elasticsearch

file

第一种方式在引入CDC抓取工具,例如debezium后,会让整个流程非常复杂,经历的环节过多,仍要控制好Kafka的按键分区和折叠模式,数据管道也要解决关系结构向文档结构的ETL过程。

当然方式一也可以不用Kafka,直接走Logstash管道的过滤通道,但是第三方CDC抓取工具就要再考虑一层与Logstash的对接过程。

第二种方式虽然简单,不过JDBC轮询对MySQL有不小的影响,而且业务表需要提供变化日志表,再有Logstash等清洗程序再做ETL合并同步,这个过程也不容易。

我们再看MongoDB连接Elasticsearch

通过mongo-connector可以轻松实现MongoDB到Elasticsearch的数据实时同步

file

mongo-connector通过监听Oplog,非常类似MySQL CDC工具对binglog的监听,实时对数据进行采集并直接同步到Elasticsearch中,因为MongoDB和Elasticsearch都是无模式的文档型数据库,因此ETL过程可以由mongo-connector工具实现MongoDB集合向ES索引的无缝写入,会省去ETL过程很大的麻烦。

四、总结

从上面的架构描述上,其实已经强有力的论证了MongoDB无论作为存储文档型的博客文章也好,还是与其他专有搜索引擎同步也好,相对于MySQL,是更好的解决方案。

前往读字节的知乎——了解更多关于大数据的知识
在这里插入图片描述
公众号“读字节” 分布式,大数据,软件架构的深度,专业解读

这篇关于博客数据库要连接Elasticsearch,使用MySQL还是MongoDB更合理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1043125

相关文章

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u

如何使用Spring boot的@Transactional进行事务管理

《如何使用Springboot的@Transactional进行事务管理》这篇文章介绍了SpringBoot中使用@Transactional注解进行声明式事务管理的详细信息,包括基本用法、核心配置... 目录一、前置条件二、基本用法1. 在方法上添加注解2. 在类上添加注解三、核心配置参数1. 传播行为(

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.