设计数据密集型应用(DDI)读书笔记(5)
前言
这周读书群的进度来到第六章,个人进度已经读完了整本DDIA,但是读书笔记还是要写的,权当复盘,第六章的内容相对而言不那么复杂,所以这篇文章的篇幅可能有点短
CH6:分区
分区和复制是两个概念,重新强调一下,复制是将同样的数据保存在不同的机器,而分区是将一份数据拆分成多份,而多份数据可能会存在于不同的机器上。
书里最开始提到了就是键值的分区,首要的就是根据 hash 值分区,也就是 mongo 等分布式数据库使用的分区形式,根据 hash 值分区的好处在于可以均衡的将数据均匀分布到对应的节点上,但是坏处也非常明显,数据无法进行范围查询,这个和mysql的索引有点类似,hash索引可以保证数据查找的效率,但是无法应对范围查询。但是对于mongo等数据库来说 根据随机id索引进行范围查询的场合实在是不多,所以无伤大雅。
对于生产环境来说,根据id进行查询肯定是无法满足实际的业务需求的,这里书里就提到了二级索引的概念,二级索引说白了其实就是关系型数据库里对字段建立的索引,二级索引主要有两个形式:根据文档的二级索引以及根据关键词(term)的二级索引,根据文档的二级索引就是mongo使用的索引方式:对文档中的某个字段建立索引,每个分片中都会建立索引,进行查询的时候会对所有分片进行查询,根据关键词的二级索引则是对文档内容进行分词,然后统一保存在制定的索引存储节点中,查询的时候只需要对指定的节点进行查询即可。根据文档进行索引的好处在于写入相对较快,只需要每个节点在更新的时候进行写入即可。而根据关键词的索引则相对麻烦,需要对关键词进行分词,且一个字段往往可能包含了多个关键词,在写入的时候需要写入多个不同的关键词分片,而多个关键词分片可能会存储在不同的节点上,这就导致写入开销相对较大(书里提到dynamo写入全部节点可能需要 1 s 以上)
接着书里提到了 平衡策略,书里先是提了一个反面教材:hash mod n 这个策略之前呆的公司用过以至于过于过于深刻:根据节点个数对数据进行分区保存,导致的结果也很明显:当你有新的节点加入的时候会非常难受,需要对所有数据进行重hash分配,所有说一般不要使用这种方式。另外一种则是预分配分区数量,在固定的分区数量内对分区进行合并和分裂存储,这种方式也是现在ES等数据库使用的方法。
书里最后提到的则是路由的方式,请求路由有三个方法,一种是客户端直接请求对应节点,还有则是通过一个统一的网关路由到对应节点,最后一种是请求任意节点再路由到对应节点。这个部分的内容 zk有很多相关的实践,就不多谈了。