Mongodb原始碼分析

2021-12-29 20:40:56 字數 1959 閱讀 2800

在之前的一篇文章中,介紹了mongos的啟動流程,在那篇文章的結尾,介紹了mongos使用balancer來進行均衡,今天就繼續講其實現方式。

可以看到balancer類裡包含乙個balancerpolicy,其指向乙個均衡策略,該策略會實現查詢並收集要遷移的chunk。

這裡先看一下balancer的類定義,如下:

class balancer : public backgroundjob

private:

typedef balancerpolicy::chunkinfo candidatechunk;

typedef shared_ptr candidatechunkptr;

//mongos名稱(hostname:port)

string _myid;

// balancer 啟動時間

time_t _started;

// 前移的chunks數量

int _balancedlasttime;

// 均衡策略(確定要遷移的chunks)

balancerpolicy* _policy;

//初始化,檢查balancer 能否鏈結到servers.該方法可能丟擲網路異常       

bool _init();

/*** 收集關於shards及chunks的資訊,以及可能需要遷移的chunks

* @param conn: 指向config server(s)連線

* @param candidatechunks (in/out): 可能需要遷移的chunks

*/void _dobalanceround( dbclientbase& conn, vector* candidatechunks );

/*** 逐個遷移chunk.並返回最終遷移的chunk數量

* @param candidatechunks 可能需要遷移的chunks

* @return number of chunks effectively moved

*/int _movechunks( const vector* candidatechunks );

/*在config server(s)中標記並前balancer為活動狀態.*/

void _ping( dbclientbase& conn );

//當configdb中的所有服務均可用時,返回true

bool _checkoids();

};可以看出balancer繼承自backgroundjob,所以它是以後臺方式執行的。了解了該類的方法和屬性之後,下面我們著手看一下mongos主函式中啟動balancer.go()的呼叫流程。因為balancer繼承自backgroundjob,所以還要看一下backgroundjob裡go()方法的執行**, 如下:

執行緒方式執行下面的jobbody方法

backgroundjob& backgroundjob::go()

//. background object can be only be destroyed after jobbody() ran

void backgroundjob::jobbody( boost::shared_ptr status )

....

if( status->deleteself )

delete this;

}上面**最終會將執行流程轉到balancer類的run()方法,如下

void balancer::run()

break;

}//構造鏈結串資訊

connectionstring config = configserver.getconnectionstring();

//宣告分布式鎖

distributedlock balancelock( config , "balancer" );

while ( ! inshutdown() )

&nbs

Mongodb原始碼分析 查詢結果集封裝

在這個系列的開頭幾篇文章中,曾經介紹了mongodb的查詢流程,因為篇幅所限,並未介紹對cursor進行遍歷查詢時,如何將查詢記錄裝填進結果集中。今天就針對諸如 select top n 這類返回一定數量記錄的查詢操作,來分析mongodb是如何將查詢結果裝填到結果集中的。這裡要說明的是 之前文章中...

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

思科VPP原始碼分析(dpo機制原始碼分析)

vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...