当数据库遇到分布式,你会怎么做?
本地索引 文档分区所以,在这种索引方法中,每个分区是完全独立的,每个分区维护自己的二级索引,仅覆盖该分区中的文档。当数据写入时(添加、删除、更新),只需要处理分区内数据的索引更新。数据查询时,则需要将查询发送到所有的分区,并合并所有返回的结果。 这种查询分区数据库的方法有时被称为分散/聚集(scatter/gather),并且可能会是二级索引上的读取查询相当昂贵。即使并行查询分区,已容易导致尾部延迟放大。MongoDB、Cassandra、ElasticSearch、SolrCloud都是使用这种文档分区二级索引。 全局索引 关键词分区,这种索引方法跟主键分区的方式是一样的。相对于文档分区索引,读取更有效率,不需要分散/聚集所有分区,客户端只需要向包含关键词的分区发出请求。缺点在于写入速度较慢且较为复杂,因为写入单个文档可能会影响索引的多个分区。 理想情况下,索引总是最新的。写入数据库的每个文档都会立即反映在索引中。在基于关键词的全局索引中,这需要跨分区的分布式事务,并不是所有的数据库都支持。在实践中,对全局二级索引的更新通常是异步的。 分区再平衡 随着数据集大小增加、查询吞吐量的增加,需要更多的机器来处理。这些都需要数据和请求从一个节点移动到另一个节点,这一过程称为再平衡(reblancing)。 再平衡通常要满足以下几点要求: 再平衡之后,负载(数据存储、读取和写入请求)应该在集群中的节点之间公平地共享 再平衡发生时,数据库应该继续接受读取和写入 节点之间只移动必须的数据,以便快速再平衡,并减少网络和磁盘I/O负载 平衡策略可以分为几种:固定数量的分区、动态数量的分区和按节点比例分区 固定数量的分区 创建比节点更多的分区,并为每个节点分配多个分区。如果一个节点被添加到集群中,新节点可以从当前每个节点中窃取一些分区,直到分区再次公平分配。ElasticSearch使用这种方式分区策略。 只有分区在节点间移动,分区的数量不会改变,键所对应的分区也不会改变,唯一改变的是分区所在的节点。这种变更不是实时的(网络上传输数据需要时间),传输过程中,原有分区仍然会接手读写请求。 (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |