写点什么

建立博客数据库并连接 ES 用 MySQL 还是 MongoDB 更合理

用户头像
读字节
关注
发布于: 2021 年 03 月 01 日
建立博客数据库并连接ES用MySQL还是MongoDB更合理

若进行博客等文本类数据的读写以及搜索引擎连接的解决方案对比,这就包括了搜索引擎数据同步,文章属性、文章内容、文章内图片以及图片属性的存储和查询,可以肯定的下结论:MongoDB 的解决方案中要远远好于 MySQL 的解决方案。

一、从开发工序角度

MySQL 的文章读写方式

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

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

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

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

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

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

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

如上图方式一:整存整取,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 的手动分片不知道要轻松多少。

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

三、与 Elasticsearch 连接角度看

MySQL 连接 Elasticsearch

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

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

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

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

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

我们再看 MongoDB 连接 Elasticsearch

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

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

四、总结

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


公众号 read-byte “读字节” 大数据,分布式软件架构的深度,专业解读

前往读字节的知乎——了解更多关于大数据的知识

https://www.zhihu.com/people/fangshun/answers


发布于: 2021 年 03 月 01 日阅读数: 48
用户头像

读字节

关注

公号“读字节”大数据、软件架构的深入解读 2018.05.29 加入

西安守护石信息科技 创始人 方顺

评论

发布
暂无评论
建立博客数据库并连接ES用MySQL还是MongoDB更合理