- 博客(33)
- 资源 (6)
- 收藏
- 关注
原创 postgresql笔记几则
1. select count(*) from A,统计所有数据包括null数据,这里会使用到聚合索引,如果判断聚合suoyou
2014-06-07 13:51:16
707
原创 HBase上region操作append加了行锁为什么还要mvcc等待之前的操作完成?
Hbase region上在做修改操作时有两个关键的lock: updatesLock,rowlock.updatesLock保证memstore的刷新和其上的修改不能同时发生,memstore刷新时加写锁,其它情况加读锁.rowlock顾名思义就是操作那一行的lock.操作时先updatesLock上的写锁,然后是rowlock如append操作代码如下(下面的代码来自于hbase0
2014-01-10 19:21:54
1803
原创 mysql在做每次子查询时是否会缓存上次子查询的结果?
以前一直以为数据库在做子查询时会重新做全部的查询,后来发现postgresql在做子查询时如果来自父查询的参数未发生改变,那么其是可以直接计算结果而不用再次执行子查询的,那么mysql是怎么处理的呢,再次翻出mysql(5.6.10)的源码简单调试了下发现以下结论:1. 在执行子查询无关的exists not exists时如:select * from a where exists
2014-01-05 18:47:31
4076
原创 mongodb 分片的思考
通过前面源码的分析感觉mongodb的分片加上replset就是全部了,啥问题都应该解决了,后来看到了foursquare发生mongodb宕机事件,看了一下宕机事件的分析,当时阅读代码还并未阅读到分片部分,但是准备阅读分片时就决定一定要仔细将分片机制研究清楚,然后可以分析下foursquare宕机原因.后来阅读完分片代码后明白了其分片策略,当时怎么也想不通为什么会产生shard不平衡的状况呢,一
2012-12-27 21:35:01
1596
原创 mongodb源码分析(二十五)mongos writeback
这里的writeback也许可以翻译成回写,是指发生如下情况,来自mongos对mongod的数据请求,但是请求时发现版本不对了(发生了chunk的迁移)那么这里的请求将得不到响应,这里的请求需要以某种方式回到mongos,然后再次发往正确的mongod,这就是所谓的writeback.下面直接来看代码.先来看一份简化了的插入操作代码.void receivedInsert(Message&
2012-12-27 21:08:22
2375
2
原创 mongodb源码分析(二十四)mongos数据的平衡
本文将分析mongodb中数据平衡的策略.先来看看流程.mongodb开启一线程banlance专门负责数据的平衡工作,其查看系统中所有的shard,发现有不平衡的情况就选择将其中shard服务器的chunk迁移到其它服务器让整个系统达到平衡.来看看平衡策略.1. shard数据大小超过了shard配置的数据大小,从中选取chunk迁移到别处.2. 找到shard中有违法tag规则的chu
2012-12-27 15:43:57
2657
原创 mongodb源码分析(二十三)mongos chunk的迁移
本文我们分析一个chunk的迁移,下文中将分析mongodb的shard平衡策略,之所以分开成两篇文章分析是因为chunk的偏移设计命令太多,太长.下面首先来看看chunk的迁移流程.1. 将要迁移chunk端A首先记录chunk迁移数据的位置.2. 通知远端B,让其执行_recvChunkStart开始chunk的迁移.3. B端首先从A端system.indexes读取索引,并将
2012-12-26 21:40:41
3830
原创 mongodb源码分析(二十二)mongos chunk的拆分
本文我们分析mongodb chunk的拆分,chunk的分拆分两种情况.1. chunk范围[min,max]这表明这个chunk还没拆分,第一次拆分考虑到后面插入更多的数据,所以拆分时chunk将从实际的最大值max1处拆分,拆分后的chunk范围如下:[min,max1),[max1,max].对于这种[value,max]的拆分拆分点选择这个chunk的最小值min1,得到[value
2012-12-25 20:34:35
3953
1
原创 mongodb源码分析(二十一)mongos 查询与添加
本来简单讲讲mongos对于查询 添加 的流程,修改和删除的处理流程简单其也与添加差不多不再分析,对于添加 修改和删除,mongos都只是将其发往正确的mongod服务器让其处理,对于查询稍微麻烦点,因为查询多个mongod服务器的结果回来时汇总需要mongos自身完成其排序.下面来看具体代码吧,在mongos的初始化部分我们已经知道向mongos发送的请求,其处理函数是Request::proc
2012-12-25 16:10:46
2743
原创 mongodb源码分析(二十)mongos分片的配置
本文描述分片设置命令的流程.在分析分片设置命令流程前先来看看configserver服务器config数据库中各个collection的作用.version: 保存当前configserver的版本信息,这个是随mongodb升级而变动的.settings: 保存分片系统设置信息如chunksize大小,balancer配置信息.shards: 保存shard中的配置信息包括每
2012-12-24 20:23:50
5055
1
转载 MongoDb Architecture
转载一篇mongodb架构的文章,原文地址MongoDb Architecture需要翻墙.NOSQL has become a very heated topic for large web-scale deployment where scalability and semi-structured data driven the DB requirement towards
2012-12-23 13:19:29
1883
原创 mongodb源码分析(十九)mongos的初始化以及连接池分配回收
mongos是mongodb提供的自动分片组件,在提供分片功能的mongodb系统中,几乎所有的请求都将通过mongos转发到mongod中,然后mongos再汇总,最后返回给客户端.本来就来分析分析mongos的初始化,为后面通过mongos的查询,删除,修改,增加记录 mapreduce aggregate以及mongos的自动分片与负载均衡做准备.下面来看代码,其入口为mongo\s\ser
2012-12-19 17:44:10
5127
1
原创 mongodb源码分析(十八)replication replset tags
本无意写这篇文章,但是之前在分析replset时有一个线程一直没弄明白其作用,后来偶然间在阅读tags时搞明白了notifierthread的作用,tags的实现过程很隐晦.不仔细阅读,很难弄明白,所以这里专门写一篇文章来分析replset tags的实现.首先来看看一份带tags的replset config.这里的dc可以理解为datacenter或者任何自己觉得好理解的词,dc后
2012-12-18 20:54:36
1877
原创 mongodb源码分析(十七)replication replset状态转换图
本文接上面两篇分析replset模式的文章,来看看replset的状态转换图.看不到全图的请看这里:replication replset状态转换图 本图中某些部分并未画到.1. 服务器进入RS_SHUNNING状态后如果配置更改后其会再次进入RS_SECONDARY等状态.2. 心跳协议无法连接时是自己端将远端服务器标识为RS_DOWN,远端服务器处于什么状
2012-12-17 15:25:57
1439
原创 mongodb源码分析(十六)replication replset同步以及状态的切换
上一篇文章分析了replset的初始化,下面我们继续分析replset的同步部分,这里涉及到2个线程,一个函数.producerThread: 对于非primary的服务器,选取一个目标服务器并从其读出操作日志.startsyncthread: 从producerthread处读取操作日志然后replay.msgCheckNewState函数: 负责各个服务器状态的切换,seco
2012-12-16 22:00:08
3517
1
原创 mongodb源码分析(十五)replication replset模式的初始化
相对于主从模式,replset模式复杂得多,其中的主从对应于这里的primary,secondary概念,primary和secondary之间可以切换,primary掉线后能够自动的选取一个secondary成为新的primary,当然这里也是有限制的,本文将会分析到.首先来看replset模式用到的几个集合.local.oplog.rs: 记录replset模式下的操作日志,mas
2012-12-14 17:01:10
6071
原创 mongodb源码分析(十四)replication主从模式
mongodb提供数据的复制机制,老的master/slave和新的replset模式,本文分析老的master/slave机制,replset在下一篇文中分析.master/slave机制是一台主服务器,其它的从服务器,从服务器从主服务器中读出操作记录,然后在自己这端重现操作,达到和主服务器一致的目的.主从服务器是启动时设定的,之间无法动态的切换,其提供数据的备份机制,默认情况下从服
2012-12-13 19:26:15
1932
原创 mongodb源码分析(十三)持久化
先来看看持久化的流程.默认情况下持久化是开启的,需要关闭启动时--nodur或者--nojournal.在开启journal时mongodb保留了多数据库的两份映射,每一个文件有两个映射的初始地址_view_write和_view_private,_view_private是为了持久化而生的.这就是为什么用mongostat查看系统信息时会看到vsize是mapped的2倍多了,因为一
2012-12-13 13:14:38
4597
原创 由mongodb的栈大小引起的疑问
今天在QQ群聊天时一个群友问mongodb接收一个连接时产生一个线程来处理,线程的栈是多大10M吗.我记得阅读代码时看到过对于linux系统设置的栈大小是1M,但是群友通过cat /proc/proc_id/task/thread_id/limits查看时Max stack size为10M啊,并不是1M,我也不理解,为什么会这样回去重新阅读代码发现没错啊,确实设置的是1M的栈大小.
2012-12-12 15:54:24
1477
原创 mongodb源码分析(十二)数据的更新
相对于删除操作,更新操作复杂得多,因为其操作很多,mongodb提供了很多更新的操作符,另外还要考虑到更新时如果原来的数据doc空间不够还得删除原来的doc再添加新的doc,相当于做了两次操作,这里的过程同样会影响collection中所有的索引.下面来看代码吧,更新操作的入口为: void receivedUpdate(Message& m, CurOp& op) {
2012-12-11 21:04:40
6116
原创 mongodb源码分析(十一)数据的删除
本文我们将删除,删除操作概括起来就是遍历将collection中数据对应的索引删除,然后是删除数据,最后将删除的空间加入到之前文章描述的deletelist中.下面我们来看具体的代码吧.删除的入口是receiveDelete函数. void receivedDelete(Message& m, CurOp& op) { DbMessage d(m);
2012-12-10 21:38:05
2106
原创 mongodb源码分析(十)数据的插入
本文我们分析mongodb中数据的插入流程.插入的简单流程可以归结于如下:1. 如果存在对应collection则从collection中分配空间,然后将数据保存到分配的空间中,不存在则先从database中分配对应的collection,若database不存在则分配database,建立xx.ns和xx.0 等文件.2. 根据插入数据更新collection中的索引.下面来看代码,
2012-12-10 21:08:39
3768
原创 mongodb源码分析(九)mongodb的存储管理
1. mongodb中能够保存的最大collection数目.mongodb官网(Using a Large Number of Collections,)的信息如下:By default MongoDB has a limit of approximately 24,000 namespaces per database. Each namespace is 628 bytes
2012-12-10 19:29:29
4671
原创 mongodb源码分析(八)查询4之mongod文档的匹配
前面用两篇文章讲解了游标的产生流程,下面我们将继续讲解文档的匹配过程.查询的流程很简单就是取出document然后与条件比对,比对成功,在开启shard时还要继续查看当前document是否在在当前的chunkManager中,最后将查看当前文档是否已经记录了,若已经记录则跳过,需要排序则这里将满足要求的文档排序. 当我使用mongodb时我对于查询有几个疑问1.
2012-12-06 16:01:05
3563
1
原创 mongodb源码分析(七)查询3之mongod的cursor的产生(续)
上一篇文章我们说道了mongod对于QueryPlan的选取,由于篇幅过长,所以另起一篇文章接上一篇文章继续谈plan的实际查询流程. 上一篇文章说完了QueryPlanSet::make我们回到:MultiPlanScanner::init. // if _or == false, don't use or clauses for index sele
2012-12-05 18:32:58
2655
2
原创 mongodb源码分析(六)查询3之mongod的cursor的产生
上一篇文章分析了mongod的数据库加载部分,下面这一篇文章将继续分析mongod cursor的产生,这里cursor的生成应该是mongodb系统中最复杂的部分.下面先介绍几个关于mongodb的游标概念.basicCursor: 直接扫描整个collection的游标,可设置初始的扫描位置,扫描为顺序扫描.ReverseCursor: 反向扫描游标,相对于顺序扫描,这里是
2012-12-05 16:22:11
9441
1
原创 mongodb源码分析(五)查询2之mongod的数据库加载
上一篇文章分析到了客户端查询请求的发送,接着分析服务端的处理动作,分析从服务端响应开始到数据库正确加载止,主要流程为数据库的读入过程与用户的认证. mongod服务对于客户端请求的处理在mongo/db/db.cpp MyMessageHandler::process中,其中调用了函数assembleResponse完成请求响应,我们就从这个函数开始入手分析,代码很长,删
2012-12-04 18:32:21
3442
1
原创 mongodb源码分析(四)查询1之mongo的查询请求
在之前的2篇文章中分别分析了mongod和mongo的启动流程,下面开始将分析mongodb的查询,由于查询部分流程比较长,将分成mongo端的请求,mongod端的数据库的加载,mongod query的选取,mongod文档的匹配与数据的响应几部分来分析。 首先进入mongo的查询请求部分.mongo的查询请求部分归纳起来很简单就是将请求分装成一个Message结构,然后将
2012-12-04 13:32:40
8859
1
原创 mongodb源码分析(三)mongo的启动
mongo是mongodb的一个C++写的javascript交互式的可执行客户端。为了分析mongod对于服务请求的响应,这里分析下mongo。先来看看mongo的启动,mongo的启动代码在mongo/shell/dbshell.cpp中。其支持两个javascript 引擎,因为用visual stdio2012调试时默认编译的是spidermonkey,那么就分析spidermonkey那
2012-12-03 20:47:28
5517
1
原创 mongodb源码分析(二)mongod的启动
mongod是mongodb的存储服务器,其代码入口在mongo/db/db.cpp中,mongod的大部分代码都在mongo/db这个文件夹中。int main(int argc, char* argv[]) { int exitCode = mongoDbMain(argc, argv); ::_exit(exitCode); } static int mo
2012-12-03 18:35:55
5960
1
原创 mongodb2.2源码分析(一)概述
学习了一段时间的mongodb,有必要写些文章记录下自己的研究结果。后面我将陆续对mongodb2.2的查询,插入,删除,修改,日志等等部分实现流程进行分析,分析将覆盖mongo,mongod,mongos三部分。网上已经有一篇对于mongodb的源码分析:http://www.cnblogs.com/daizhj/category/260889.html我在学习mongodb时也参考过,作者写得
2012-12-03 15:54:15
5518
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人