设为首页 收藏本站
查看: 683|回复: 0

[经验分享] mongodb和redis设计原理简析

[复制链接]

尚未签到

发表于 2015-11-12 10:55:31 | 显示全部楼层 |阅读模式
redis: 1、NIO通信    因都在内存操作,所以逻辑的操作非常快,减少了CPU的切换开销,所以为单线程的模式(逻辑处理线程和主线程是一个)。    reactor模式,实现自己的多路复用NIO机制(epoll,select,kqueue等)   单线程处理多任务
2、数据结构   hash+bucket结构,当链表的长度过长时,会采取迁移的措施(扩展原来两倍的hash表,把数据迁移过去,expand+rehash)
3、存储全量持久化(遍历redisDB,读取bucket中的key,value),save命令阻塞主线程,bgsave开启子进程进行snapshot持久化操作,生成rdb文件。           在shutdown时,会调用save操作          数据发生变化,在多少秒内触发一次bgsave           sync,master接受slave发出来的命令
增量持久化(aof),先写到日志buffer,再flush到日志文件中(flush的策略可以配置的,而已单条,也可以批量),       只有flush到文件上的,才真正返回客户端。        要定时对aof文件和rdb文件做合并操作(在快照过程中,变化的数据先写到aof buf中,等子进程完成快照<内存snapshot>后,再进行合并aofbuf变化的部分以及全镜像数据)。 mongodb:1、通信
多线程方式,主线程监听新的连接,连接后,启动新的线程做数据的操作(IO切换),dispatch和io操作分析以下是相关的线程  – interruptThread---只处理信号量。
  – DataFileSync::run(后台)---调用MemoryMappedFile::flush方法将内存中的数据(脏页)刷到磁盘上。 我们知道,mongodb是调用mmap把磁盘中的数据映射到内存中的,所以必须有一个机制时刻的刷数据到硬盘才能保证可靠性,多久刷一次是与syncdelay参数相关的。
  – FileAllocator::run---用于分配新文件,它决定分配文件的大小,例如用翻倍的方式。
  – durThread--做批量提交和回滚工作。
  – SnapshotThread::run---将生成快照文件帮助快速恢复
  – ClientCursorMonitor::run---将管理用户的游标,每4秒调用一次idleTimeReport()方法,每一分钟调用sayMemoryStatus()方法
  – PeriodicTask::Runner::run---将从动态数组std::vector<PeriodicTask* > _tasks中获取周期性任务执行
  – TTLMonitor::run---理TTL,通过调用doTTLForDB()方法检查所有db。
  – replSlaveThread---是当前结点作为secondary时的同步线程
  – replMasterThread---是当前结点作为master时的同步线程。
  – webServerThread
  – 处理数据库请求的主线程
  

2、数据结构
数据库-->collection-->record
每一个数据库都有自己独立的文件。如果你开启了directoryperdb选项,那你每个库的文件会单独放在一个文件夹里。
数据库文件在内部会被切分成单个的块,每个块只保存一个名字空间的数据。在MongoDB中,名字空间用于区分不同的存储类别。比如每个collection有一个独立的名字空间,每个索引也有自己的名字空间。
在一个块中,会保存多条记录,每条记录是BSON&#26684;式的,记录与记录之间通过双向链表进行连接
索引数据也存在数据文件中,不过索引是被组织成B Tree结构,而不是双向链表。
对每个数据库,有一个命名空间文件,用于保存每个名字空间对应的元数据。我们通过查询这些元数据来找到对应的名字空间的存储块位置。
如果你开启了jorunaling日志,那么还会有一些文件存储着你所有的操作记录

3、存储  MMap方式把文件地址映射到内存的地址空间,直接操作内存地址空间就可以操作文件,不用再调用write,read操作。  – DataFileSync::run(后台)---调用MemoryMappedFile::flush方法将内存中的数据(脏页)刷到磁盘上。 我们知道,mongodb是调用mmap把磁盘中的数据映射到内存中的,所以必须有一个机制时刻的刷数据到硬盘才能保证可靠性,多久刷一次是与syncdelay参数相关的。
  journal(进行恢复用)是Mongodb中的redo log,而Oplog则是负责复制的binlog(对应Mysql)。
  
  如果打开journal,那么即使断电也只会丢失100ms的数据,这对大多数应用来说都可以容忍了。从1.9.2&#43;
  ,mongodb都会默认打开journal功能,以确保数据安全。而且journal的刷新时间是可以改变的,2-300ms的
  范围,使用 --journalCommitInterval 命令。
  Oplog和数据刷新到磁盘的时间是60s,对于复制来说,不用等到oplog刷新磁盘,在内存中就可以直接复
  制到Sencondary节点。
         版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138252-1-1.html 上篇帖子: redis数据类型之zset(Sorted-Sets) 下篇帖子: redis持久化配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表