QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

NoSQL 架构实践(一)——以 NoSQL 为辅

  • 2011-02-18
  • 本文字数:2379 字

    阅读完需:约 8 分钟

前面《为什么要使用 NoSQL》《关系数据库还是 NoSQL 数据库》两篇从大体上介绍了为什么要用 NoSQL,何时该用 NoSQL。经常有朋友遇到困惑,看到 NoSQL 的介绍,觉得很好,但是却不知道如何正式用到自己的项目中。很大的原因就是思维固定在 MySQL 中了,他们问得最多的问题就是用了 NoSQL,我如何做关系查询。那么接下来,我们看下怎么样在我们的系统中使用 NoSQL。

怎么样把 NoSQL 引入到我们的系统架构设计中,需要根据我们系统的业务场景来分析,什么样类型的数据适合存储在 NoSQL 数据库中,什么样类型的数据必须使用关系数据库存储。明确引入的 NoSQL 数据库带给系统的作用,它能解决什么问题,以及可能带来的新的问题。下面我们分析几种常见的 NoSQL 架构。

(一)NoSQL 作为镜像

不改变原有的以 MySQL 作为存储的架构,使用 NoSQL 作为辅助镜像存储,用 NoSQL 的优势辅助提升性能。

图 1 -NoSQL 为镜像(代码完成模式 )

复制代码
// 写入数据的示例伪代码
//data 为我们要存储的数据对象
data.title=”title”;
data.name=”name”;
data.time=”2009-12-01 10:10:01”;
data.from=”1”;
id=DB.Insert(data);// 写入 MySQL 数据库
NoSQL.Add(id,data);// 以写入 MySQL 产生的自增 id 为主键写入 NoSQL 数据库

如果有数据一致性要求,可以像如下的方式使用

复制代码
// 写入数据的示例伪代码
//data 为我们要存储的数据对象
bool status=false;
DB.startTransaction();// 开始事务
id=DB.Insert(data);// 写入 MySQL 数据库
if(id>0){
status=NoSQL.Add(id,data);// 以写入 MySQL 产生的自增 id 为主键写入 NoSQL 数据库
}
if(id>0 && status==true){
DB.commit();// 提交事务
}else{
DB.rollback();// 不成功,进行回滚
}

上面的代码看起来可能觉得有点麻烦,但是只需要在 DB 类或者 ORM 层做一个统一的封装,就能实现重用了,其他代码都不用做任何的修改。

这种架构在原有基于 MySQL 数据库的架构上增加了一层辅助的 NoSQL 存储,代码量不大,技术难度小,却在可扩展性和性能上起到了非常大的作用。只需要程序在写入 MySQL 数据库后,同时写入到 NoSQL 数据库,让 MySQL 和 NoSQL 拥有相同的镜像数据,在某些可以根据主键查询的地方,使用高效的 NoSQL 数据库查询,这样就节省了 MySQL 的查询,用 NoSQL 的高性能来抵挡这些查询。

图 2 -NoSQL 为镜像(同步模式)

这种不通过程序代码,而是通过 MySQL 把数据同步到 NoSQL 中,这种模式是上面一种的变体,是一种对写入透明但是具有更高技术难度一种模式。这种模式适用于现有的比较复杂的老系统,通过修改代码不易实现,可能引起新的问题。同时也适用于需要把数据同步到多种类型的存储中。

MySQL 到 NoSQL 同步的实现可以使用 MySQL UDF 函数,MySQL binlog 的解析来实现。可以利用现有的开源项目来实现,比如:

有了这两个 MySQL UDF 函数库,我们就能通过 MySQL 透明的处理 Memcached 或者 Http 协议,这样只要有兼容 Memcached 或者 Http 协议的 NoSQL 数据库,那么我们就能通过 MySQL 去操作以进行同步数据。再结合 lib_mysqludf_json ,通过 UDF 和 MySQL 触发器功能的结合,就可以实现数据的自动同步。

(二)MySQL 和 NoSQL 组合

MySQL 中只存储需要查询的小字段,NoSQL 存储所有数据。

图 3 -MySQL 和 NoSQL 组合

复制代码
// 写入数据的示例伪代码
//data 为我们要存储的数据对象
data.title=”title”;
data.name=”name”;
data.time=”2009-12-01 10:10:01”;
data.from=”1”;
bool status=false;
DB.startTransaction();// 开始事务
id=DB.Insert(“INSERT INTO table (from) VALUES(data.from)”);// 写入 MySQL 数据库, 只写 from 需要 where 查询的字段
if(id>0){
status=NoSQL.Add(id,data);// 以写入 MySQL 产生的自增 id 为主键写入 NoSQL 数据库
}
if(id>0 && status==true){
DB.commit();// 提交事务
}else{
DB.rollback();// 不成功,进行回滚
}

把需要查询的字段,一般都是数字,时间等类型的小字段存储于 MySQL 中,根据查询建立相应的索引,其他不需要的字段,包括大文本字段都存储在 NoSQL 中。在查询的时候,我们先从 MySQL 中查询出数据的主键,然后从 NoSQL 中直接取出对应的数据即可。

这种架构模式把 MySQL 和 NoSQL 的作用进行了融合,各司其职,让 MySQL 专门负责处理擅长的关系存储,NoSQL 作为数据的存储。它有以下优点:

  • 节省 MySQL 的 IO 开销。由于 MySQL 只存储需要查询的小字段,不再负责存储大文本字段,这样就可以节省 MySQL 存储的空间开销,从而节省 MySQL 的磁盘 IO。我们曾经通过这种优化,把 MySQL 一个 40G 的表缩减到几百 M。
  • 提高 MySQl Query Cache 缓存命中率。我们知道 query cache 缓存失效是表级的,在 MySQL 表一旦被更新就会失效,经过这种字段的分离,更新的字段如果不是存储在 MySQL 中,那么对 query cache 就没有任何影响。而 NoSQL 的 Cache 往往都是行级别的,只对更新的记录的缓存失效。
  • 提升 MySQL 主从同步效率。由于 MySQL 存储空间的减小,同步的数据记录也减小了,而部分数据的更新落在 NoSQL 而不是 MySQL,这样也减少了 MySQL 数据需要同步的次数。
  • 提高 MySQL 数据备份和恢复的速度。由于 MySQL 数据库存储的数据的减小,很容易看到数据备份和恢复的速度也将极大的提高。
  • 比以前更容易扩展。NoSQL 天生就容易扩展。经过这种优化,MySQL 性能也得到提高。

比如手机凤凰网就是这种架构 http://www.cnblogs.com/sunli/archive/2010/12/20/imcp.html

总结

以 NoSQL 为辅的架构还是以 MySQL 架构的思想为中心,只是在以前的架构上辅助增加了 NoSQL 来提高其性能和可扩展性。这种架构实现起来比较容易,却能取得不错的效果。如果正想在项目中引入 NoSQL,或者你的以 MySQL 架构的系统目前正出现相关的瓶颈,希望本文可以为你带来帮助。


感谢张凯峰对本文的审校。

2011-02-18 23:1120057

评论

发布
暂无评论
发现更多内容

TiDB 入选 2023 年中国云原生数据库十大厂商推荐

PingCAP

数据库 云原生 TiDB 金融业

软件测试/测试开发丨Python面向对象 学习笔记

测试人

Python 软件测试 测试开发

python3中,//、/ 的区别

GoodTime

Python 水仙花数 // /

爬虫业务中,为什么使用高匿代理ip仍然会被识别出来呢?

巨量HTTP

数据采集 代理IP http代理

BDTC2023:CloudberryDB开源创新与实践

酷克数据HashData

Databend 部署与运维概要:本地部署 Meta 服务并利用 Kubernetes 管理 Query 服务

Databend

E往无前|腾讯云大数据ES索引原理剖析及写入性能优化最佳实践

腾讯云大数据

ES

独立站新手教程引流篇:YouTube SEO优化指南!

九凌网络

【论文解读】模型即服务-介绍MaaS中所涉及的关键技术

合合技术团队

人工智能 大数据 合合信息 论文解读

荣耀Magic6系列旗舰新品及MagicOS 8.0发布会

荣耀开发者服务平台

安全 UX 交互 人机协作 loT

怎么在GridView中限制显示字数

GoodTime

C# asp.net GridView

市场上常见的5种LED异形屏

Dylan

设计 场景 LED LED显示屏

云原生应用开发模式的一个构想

Jade@pluto-lang

Serverless Faas 云原生(Cloud Native) aws lambda Pluto

推特(Twitter)蓝V,怎么升级蓝V

跨境

twitter VISA

PTS 3.0:可观测加持的下一代性能测试服务

阿里巴巴云原生

阿里云 云原生 性能压测

干货满满!学习有限元分析软件Abaqus的几个必备理论

思茂信息

abaqus abaqus软件 abaqus有限元仿真 有限元分析

什么是仿真软件?推荐几个简单易上手的几款CAE软件!

智造软件

CAE 仿真软件 仿真技术 CAE软件

主编夜话,2023 技术圈儿大事件盘点丨 RTE 开发者日报 Vol.115

声网

平凯数据库亮相 2023 信息技术应用创新论坛

PingCAP

数据库 信息化 TiDB

天猫店铺所有商品数据接口(Tmall.item_search_shop)

tbapi

天猫API接口 天猫商品数据接口 天猫店铺所有商品数据接口 天猫店铺商品接口

码住!8个小众宝藏的开发者学习类网站

伤感汤姆布利柏

学习 效率 低代码 低代码开发工具

AIBP,我的下一个职业规划

法老猫

AIGC LLMs AIBP

cannot load "mso.dll" vs2008 web开发问题

GoodTime

web开发 VS2008

什么是意向锁?它和意向书有什么区别?

王磊

Java 面试

支付宝 v3 验签如何实现

盐焗代码虾

Java 支付宝 验签

NoSQL架构实践(一)——以NoSQL为辅_Java_孙立_InfoQ精选文章