Mongo分库方案选型

Mongo分库方案选型 Mongo分库方案两种形式分析: 1. mongo sharding方式:1.1. 深翻页的问题举例:当mongo的分片是5片时,分页查询(如果按照创建时间倒叙查询)第一页,每页50条数据,则mongo sharding在每个分片上取50条数据,一共50*5条数据,然后进行汇总,计算出前50条正确数据作为返回结果。如果是翻页到1000页,那么mongo sharding需要从…

大家好,又见面了,我是你们的朋友全栈君。

 

Mongo分库方案两种形式分析:

 

1. mongo sharding方式:

1.1. 深翻页的问题

举例:当mongo的分片是5片时,分页查询(如果按照创建时间倒叙查询)第一页,每页50条数据,则mongo sharding在每个分片上取50条数据,一共50*5条数据,然后进行汇总,计算出前50条正确数据作为返回结果。如果是翻页到1000页,那么mongo sharding需要从5个分片上分别查询50*1000=5万条条数据,然后汇总成50*1000*5 = 25万条数据,然后计算第1000页的数据,这样系统会占用很大的系统资源,很容易造成系统异常。这个问题暂时没有什么可以解决的办法。

1.2. mongo sharding再平衡时,有可能查询数据出现重复的问题

当mongo sharding根据 sharding key,将数据存入mongo的5个片(1,2,3,4,5)时,一般会产生5个分片数据不均匀的问题,假如1,2的分片数据较多,3,4,5的分片数据量较少,那么mongo sharding再平衡策略会将1,2分片上的数据平衡到3,4,5分片上,如果此时数据正在进行平衡,那么查询1,2分片上的数据平衡到3,4,5的那部分的数据时,而且没有命中索引的情况时,有可能出现重复数据的现象。现有的解决方式是,在晚上调用量少的时候进行数据平衡,白天数据访问量大的时候关闭再数据平衡。

1.3. mongo分片扩展

分片不能够无限扩大,实际使用中一般分成个位数分片,很难做到无限扩展。

1.4. sharding的key不能变更

sharding key 一旦指定,不可更改。更改之后,访问数据的分片逻辑会变,导致服务不可用。
 

2. 采用物理分库方式:

2.1 分库要自己代码实现

需要自己代码中实现根据不同的context访问不同的数据库,即实现根据分库的key,路由到不同的物理库上。

2.2 不同的分库交叉访问问题

不能够像mongo sharding那样直接交叉访问库,如果要进行交叉访问库,只能在程序中自己实现。

2.3 负载均衡

mongo sharding内部实现了负载均衡,如果采用物理分成多个mongo库,实现负载均衡需要自己代码实现。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149535.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 手把手实现Java图书管理系统(附源码)_图书管理系统项目背景

    手把手实现Java图书管理系统(附源码)_图书管理系统项目背景基于JavaWeb开发的图书管理系统实现功能数据库运行环境图书馆作为一种信息资源的集散地,图书和用户借阅资料繁多,包含很多的信息数据的管理,现今,有很多的图书馆都是初步开始使用,甚至尚未使用计算机进行信息管理。图书馆信息管理作为计算机应用的一个分支,有着手工管理无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点很大程度的提高了管理图书馆信息的工作效率,节省了大量资金,方便了师生对图书的借阅和归还。图书馆管理系统代表了图书馆管理的信息化,不仅是体现图书馆现代化形

  • Java基础学习笔记总结

    Java基础学习笔记总结Java基础学习笔记一Java介绍Java基础学习笔记二Java基础语法之变量、数据类型Java基础学习笔记三Java基础语法之流程控制语句、循环Java基础学习笔记四Java基础语法之

  • VIM加速

    VIM加速

  • 线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的用法

    线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的用法线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的用法注:使用结构CRITICAL_SECTION需加入头文件#include“afxmt.h”定义一个全局的锁CRITICAL_SECTION的实例和一个静态全局变量CRITICAL_SECTION cs;//可以理解为锁定一个资源static int n_

  • MySQL清空表数据

    MySQL清空表数据清空表数据一共有三种方式1、truncate(速度很快)自增字段清空从1开始全表清空首选2、drop直接删表…啥都没了啥都没了…………3、delete速度慢的一批自增字段不清空MySQL清空表数据命令:truncate说明:删除内容、释放空间但不删除定义,也就是数据表的结构还在。与drop不同的是,它只是清空表数据而已,它比较温柔。truncatetable表名注意:不能与where一起使用。truncate删除数据后是不可以rollback

  • ubuntu定时执行任务

    ubuntu定时执行任务前几天女神给我发了条消息,“为什么我每天早上九点都会收到你给我发的天气信息的邮件?”然后……当然,我是不可能告诉她,我是用crontab来定时执行python脚本滴!好了,废话不多说,直接进入正题!ubuntu定时执行脚本cron是一个Linux下的后台进程,用来定期的执行一些任务。因为我用的是Ubuntu,所以这篇文章中的所有命令也只能保证在Ubuntu下有效。查看cron是否运行ps-

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号