将商品名称做分词,然后建立起分词和商品ID的对应关系:
用户搜索电冰箱,就可以给他展示商品ID为1和3的两件商品。
而Elasticsearch提供了分布式的全文搜索服务,这在传统的关系型数据库中使用SQL语句是很难实现。所以NoSQL可以在某些业务场景下代替传统数据库提供数据存储服务。
提升扩展性
电商系统增加评论系统,评估比较乐观,觉得电商系统评论量级不会增长很快,就简单分了8个库,每个库分16张表。
但是评论系统上线之后,存储量级增长异常迅猛,不得不拆分更多库表,而数据也要重新迁移到新库表。
这时,你考虑是否可以考虑使用NoSQL数据库来彻底解决扩展性的问题,经过调研你发现它们在设计之初就考虑到了分布式和大数据存储的场景,比如像MongoDB就有三个扩展性方面的特性。
Replica
副本集,可理解为主从分离,也就是通过将数据拷贝成多份来保证当主挂掉后数据不会丢失。同时呢,Replica还可以分担读请求。Replica中有主节点来承担写请求,并且把对数据变动记录到oplog里(类似于binlog);从节点接收到oplog后就会修改自身的数据以保持和主节点的一致。一旦主节点挂掉,MongoDB会从从节点中选取一个节点成为主节点,可以继续提供写数据服务。
Shard
分片,分库分表,即将数据按照某种规则拆分成多份,存储在不同的机器上。MongoDB的Sharding特性一般需要三个角色来支持,一个是Shard Server,它是实际存储数据的节点,是一个独立的Mongod进程;二是Config Server,也是一组Mongod进程,主要存储一些元信息,比如说哪些分片存储了哪些数据等;最后是Route Server,它不实际存储数据,仅仅作为路由使用,它从Config Server中获取元信息后,将请求路由到正确的Shard Server中。
负载均衡
当MongoDB发现Shard之间数据分布不均匀,会启动Balancer进程对数据做重新的分配,最终让不同Shard Server的数据可以尽量的均衡。当我们的Shard Server存储空间不足需要扩容时,数据会自动被移动到新的Shard Server上,减少了数据迁移和验证的成本。
NoSQL内置的扩展性可以让我们不再需要对数据库做分库分表和主从分离,也是对传统数据库一个良好的补充。
课程小结
1.在性能方面,NoSQL数据库使用一些算法将对磁盘的随机写转换成顺序写,提升了写的性能;
2.在某些场景下,比如全文搜索功能,关系型数据库并不能高效地支持,需要NoSQL数据库的支持;
3.在扩展性方面,NoSQL数据库天生支持分布式,支持数据冗余和数据分片的特性。