
Mongodb
baijiwei
做好产品, 写好代码
展开
-
MongoDB更新同步的oplog位置
在MongoDB中, 副本集节点之间为了保持一致性, 需要通过oplog的同步与回放来进行。MongoDB采用的是节点向源节点主动拉取的方式, 从源节点拉取oplog, 目的节点需要及时通知其他节点它的最新的同步到的时间点。如上图所示, 2个Secondary从Primary上面拉取oplog,每当secondary的时间点发生改变, 会调用replSetUpdatePosition来告诉在...原创 2018-12-30 13:33:43 · 3157 阅读 · 1 评论 -
MongoDB 单文档原子操作的实现
transaction的支持在 MongoDB 里面是逐渐进行的, 从3.2版本开始支持单文档的原子操作, 这是后续的多文档原子操作, 以及4.0 的副本集的事务, 以及后续的计划推出的4.2的分片的事务操作的基础。本文着重描述一下单文档的原子操作。原子性: 就是一个操作要么成功, 要么失败。具体来说, 就是一个插入、更新或者删除操作, 应该只有commit或者rollback两种结果中的一种。...原创 2019-01-12 20:18:17 · 1813 阅读 · 0 评论 -
MongoDB连接池的实现
几乎每一种数据库都会有连接池, 来减少频繁的创建删除连接的开销, 在MongoDB里面是通过信号量线程同步方式来对创建、销毁进行管理。信号量基础int sem_init(sem_t *sem, int pshared, unsigned int value)sem是要初始化的信号量,pshared表示此信号量是在进程间共享(=1)还是线程间共享(=0),value是信号量的初始值。int...原创 2019-01-13 13:27:33 · 14179 阅读 · 3 评论 -
MongoDB CRUD以及command的代码实现
我们在使用MongoDB的时候, 经常需要使用mongo shell或者各种语言的driver的API来进行CRUD以及数据库管理操作的command, 那么它是如何实现的?MongoDB wire protocolMongoDB通过一种特殊的client/server 之间的协议:wire protocol。它是一种基于socket的request/response之间的通信协议。用户通过m...原创 2019-01-20 14:17:17 · 2113 阅读 · 3 评论 -
MongoDB副本集的节点状态转化
mongodb的副本集可以实现自动主从切换的过程,原创 2019-02-17 09:08:16 · 1755 阅读 · 0 评论 -
MongoDB 分片sharding概述
当MongoDB由于存储的数据越来越多, 由于性能原因, 或者单个主机资源限制, 垂直扩容没有办法进一步的时候, 我们就需要开始考虑水平扩容了。与垂直扩容不同的是, 水平扩容不需要新添加的机器有多么强大的功能,它的设计理念是将业务数据尽可能平均的划分成一段一段的, 每一段分布在一台机器上, 这样, 当系统需要进一步扩容的时候,只需要添加机器, 将现有数据的一部分迁移到新添加的机器上, 旧的系统就...原创 2019-02-24 07:48:18 · 956 阅读 · 0 评论 -
WiredTiger的journal日志实现
journal日志是实现WiredTiger持久化的关键, 所有的插入、更新操作, 都会在journal里面写入一条日志, 并且在服务器意外退出的时候, 通过checkpoint和该checkpoint之后的日志, 能够迅速的回复服务器的状态。在Wiredtiger里面, 通过log来表示journal相关的实现, 接下来, 我们看下是如何实现的。WT_CONNECTION_IMPL中log相...原创 2019-05-02 17:44:39 · 1765 阅读 · 0 评论 -
WiredTiger hazard指针
在WiredTiger里面, 采用Hazard pointers来管理一个内存页是否可以被Evict, 本文分析下其实现过程。Hazard pointersHazard pointers是在多线程环境下实现资源无锁访问的一种方法, 它采用内存换时间的方法:...原创 2019-04-30 19:17:53 · 778 阅读 · 0 评论 -
MongoDB的事务实现
WiredTiger对事务的支持, 是MongoDB支持事务的基础, 这里介绍一下WT下事务的实现过程。transaction 相关的数据结构__wt_txn_global在WT_CONNECTION中, 有一个全局的事务相关的上下文结构体__wt_txn_global, 用来记录事务实现的全局信息。 在open connection的时候调用__wt_txn_global_init来构建和...原创 2019-05-12 11:13:30 · 5451 阅读 · 0 评论 -
MongoDB的并行锁机制
zzz原创 2019-05-12 14:27:02 · 4651 阅读 · 0 评论 -
ReplicSet Replication Rollback
回滚的场景在旧的Primary节点内, 有可能有新的节点内部没有的数据, 导致主从之间的数据不一致。如下: Node t0 t1 t2 t3 t4 Primary 1 2 3 4 5 Secondary1 1 2 3 4 Secondary2 1 2 3 假设在t...原创 2018-07-07 17:21:32 · 537 阅读 · 0 评论 -
副本集Oplog同步原理
副本集是mongodb的基础组件,是实现高可用、自动选主、读写分离以及数据一致性的基础。 比较概括的说, 副本集是将同一份数据保存在不同的节点上面, 这些节点通过一致性的协议(RAFT), 实现数据的同步, 并且选出一个主节点, 该节点对外提供读写服务, 当该主节点发生故障的时候, 自动从剩余的从节点内选出新的主节点。本文主要针对副本集的整体架构进行分析, 先来看一下架构图: 从这里原创 2017-10-21 14:03:00 · 2418 阅读 · 0 评论 -
副本集RAFT协议的实现(2):选主,主从切换
在mongodb的副本集中, 使用了raft协议进行选主、主从切换等来保证副本集的高可用。副本集节点之间通过心跳, 来探测和通知节点的状态, 通过oplog的各个节点的last applied time以及config状态决定采取的处理措施。本文重点介绍一下选主和主从切换这两个方面的实现。选主关于选举的代码主要在:src/mongo/db/repl/replication_coordinator_i原创 2017-11-04 14:51:30 · 2455 阅读 · 1 评论 -
MatchExpression(2):实现
对于任何query, 输入都会有一个bson类型的filter, MatchExpressionParser的作用就是把Bson对象转换为一个树形的MatchExpression对象。 本节详细介绍这个过程的实现。MatchExpressionParser 只有一个public的函数:static StatusWithMatchExpression parse( const BSON原创 2017-09-28 19:09:52 · 1796 阅读 · 0 评论 -
MatchExpression(1): 查询操作符
MatchExpression 是查询过程的第一步, 它是由一个Bson生成的, 根据bson的的各种设定, 产生一个树型的expression结构, 该树形结构中的节点是有一个个的查询操作符。 理解和掌握Mongodb里面第一的操作符的类型和属性, 是掌握MatchExpression的关键。比较查询操作符相等 $eqsyntax: {field: {$eq: xxx}}xxx 是一个具体的值原创 2017-09-28 13:43:03 · 1705 阅读 · 0 评论 -
Mongodb的逻辑优化过程
逻辑优化过程在关系型数据库里面, 是一个非常复杂的过程, 幸运的是, 在Mongodb里面, 到目前为止, 相对来说, 其实现还是比较简单的。该过程主要通过 CanonicalQuery 类来实现。 该过程主要包含三个方面的优化: 1、Normoralize tree; 2、sort tree; 3、 validate tree;我们分别来看看这3个方面的优化的实现。1. Normo原创 2017-10-07 16:53:42 · 880 阅读 · 0 评论 -
Mongodb查询计划的生成
查询计划的生成, 主要是通过QueryPlanner::plan 作为入口, 里面包含了基本的逻辑, 但是真正的QuerySolutionNode 是通过QueryPlannerAccess类来实现。具体的实现非常的复杂, 我们先看一下 下图的整个调用过程, 以及QueryPlanner的结构图, 然后再诸葛的分析一下相关的代码实现。 tailable 有设定的情况 通过make原创 2017-10-08 12:26:56 · 930 阅读 · 0 评论 -
mongodb的查询过程
mongodb的查询过程是一个比较复杂的过程, 从查询语句到查询计划的执行, 中间经历了如下的几个步骤:生成语法树 (matchExpression);逻辑优化过程:由MatchExpression 生成 CanoncalQuery;生成查询计划: 由CanoncalQuery生成QuerySolution和 MultiPlanStage;生成PlanExecutor;执行计划 查询过程的原创 2017-09-28 22:02:27 · 3729 阅读 · 0 评论 -
执行计划PlanExecutor
PlanExecutor的主要作用是选出最佳的QuerySolution, 并且执行该solution。 整个PlanExecutor 对象的结构如下图: 1. 生成PlanExecutor对象 这里采用了工厂模式, PlanExecutor::make产生指定的PlanExecutor对象;2. 选择最佳计划从上图可见,这里分成4中情况:SubplanStage, 主要是针对$or 的处理,原创 2017-10-10 18:18:49 · 1056 阅读 · 0 评论 -
ReplicationExecutor的实现原理
副本集在维护以及更新结构的过程中, 需要执行大量的任务, 这些任务的执行需要满足一定的条件, 例如, 先触发的时间先执行, 或者等待一段时间以后执行某个任务, 又或者有的任务需要全局锁, 有的只需要集合锁等等。 Mongodb 内部通过ReplicationExecutor来实现这些任务的执行。 从功能上面讲,ReplicationExecutor的作用和golang里面的channel是非常类似原创 2017-10-28 18:28:49 · 803 阅读 · 0 评论 -
Mongodb 的索引架构
索引在任何的数据库里面都起着至关重要的作用, 在mongoDB里面, 基本的增删改查操作都需要访问索引, 通过一个集合的名字, 如何找到相关的索引, 并且对其进行操作哪?如下, 是Mongodb Index的整体架构: collection类对于任何一个存在的集合的明仔, 我们通过catalog 找到一个它对应的Collection对象, 该对象会保存这 个集合的所有的索引的信息IndexC原创 2017-10-13 13:40:19 · 1431 阅读 · 0 评论 -
副本集RAFT协议的实现(1):heartbeat
在mongodb的副本集中, 使用了raft协议进行选主,主从切换等来保证副本集的高可用。副本集节点之间通过心跳, 来探测和通知节点的状态以及状态的变化因该采取的处理措施。本文重点介绍一下这两个方面的实现。节点之间的hearbeat的发送当一个副本集启动以后, 就需要进行heartbeat, 或者当副本集的状态发生了改变需要(主从切换, 某个接点掉线等), 都需要取消就得heartbeat, 并且开原创 2017-11-04 10:30:51 · 1459 阅读 · 0 评论 -
Mongodb 源码分析:整体架构
工作中主要负责Mongodb数据库, 一直在学习Mongodb的源码, 很希望能够搞清楚Mongodb内部的具体实现。 从Mongodb中文社区和其他人的博客里面学到了很多, 因此, 开了这个博客希望把自己学到的一些分享给大家。任何源码的分析都是从整体架构来开始的, Mongodb的整体架构跟其他的关系型的数据库很类似, 都是有一些关键的模块组成, 如: 存储引擎, 查询引擎等, 但是Mongod原创 2017-09-23 13:35:30 · 12720 阅读 · 2 评论 -
MongoDB中并发控制(MVCC)
每当有新的数据写入, 首先是写入内存的缓存, 以及WAL log, 每隔一定的时间60秒或者WAL log文件达到一定的大小, 比如2G, 进行一次checkpoint, 结合checkpoint与WAL log可以做到在意外出现故障的时候, 快速的回复内存状态。cursorCacheevictreconcileblock managerWAL log...原创 2019-06-09 15:51:37 · 3979 阅读 · 0 评论