利用NoSQL数据库

当系统中某业务的数据已经无法用分库分表来解决的时候,就应该考虑是否需要利用NoSQL数据库来补充传统关系型数据库了。因为它有着天生分布式的能力,能够提供优秀的读写性能,可以很好地补充传统关系型数据库的短板。但是只是互补关系不能完全替代。

提高写入性能

数据库系统大多使用的是传统的机械磁盘,对于机械磁盘的访问方式有两种:一种是随机 IO;另一种是顺序 IO。

以 MySQL 的 InnoDB 存储引擎来说,更新 binlog、redolog、undolog 都是在做顺序 IO,而更新 datafile 和索引文件则是在做随机 IO,而为了减少随机 IO 的发生,关系数据库已经做了很多的优化,比如说写入时先写入内存,然后批量刷新到磁盘上,但是随机 IO 还是会发生。

而NoSQL大多是直接写入内存,为了持久化会做顺序IO以日志形式写入磁盘。它们的核心思想就是将随机 IO 变成顺序的 IO,从而提升写入的性能。

场景补充

例如商品的搜索场景,如果直接使用传统数据库的模糊查询,性能是根据无法接受的。这个时候就可以使用NoSQL来进行场景补充例如:开源组件 Elasticsearch 来支持搜索的请求

Elasticsearch 作为一种常见的 NoSQL 数据库,就以倒排索引作为核心技术原理,为你提供了分布式的全文搜索服务,这在传统的关系型数据库中使用 SQL 语句是很难实现的。

提升扩展性

在扩展性方面,很多 NoSQL 数据库也有着先天的优势。例如本来规划好的分库分表大小,但是上线后发现不够了,如果再扩展就会遇到很麻烦的数据迁移过程,所以这个时候也可以考虑使用 NoSQL 数据库来彻底解决扩展性的问题。例如 MongoDB 就有三个扩展性方面的特性。

  • 其一是 Replica,也叫做副本集,你可以理解为主从分离,也就是通过将数据拷贝成多份来保证当主挂掉后数据不会丢失。
  • 其二是 Shard,也叫做分片,你可以理解为分库分表,即将数据按照某种规则拆分成多份,存储在不同的机器上。
  • 其三是负载均衡,就是当 MongoDB 发现 Shard 之间数据分布不均匀,会启动 Balancer 进程对数据做重新的分配,最终让不同 Shard Server 的数据可以尽量的均衡。