MongoDB更新同步的oplog位置

2021-09-05 15:22:59 字數 2916 閱讀 1607

在mongodb中, 副本集節點之間為了保持一致性, 需要通過oplog的同步與回放來進行。mongodb採用的是節點向源節點主動拉取的方式, 從源節點拉取oplog, 目的節點需要及時通知其他節點它的最新的同步到的時間點。

如上圖所示, 2個secondary從primary上面拉取oplog,每當secondary的時間點發生改變, 會呼叫replsetupdateposition來告訴

在mongod內, 有乙個專門的名字為syncsourcefeedback的執行緒,它負責向與節點匯報當前節點的進度, primary本身是不需要的, 因為它不需向其他節點同步資料,當然不儲存資料的節點, 例如arbiter型別的節點也不需要。 有2個類專門負責這項任務: syncsourcefeedback與reporter, 其呼叫關係如下圖所示:

syncsourcefeedback負責:

void syncsourcefeedback::run(executor::taskexecutor* executor,

backgroundsync* bgsync,

replicationcoordinator* replcoord)

}//是否程式退出

if (_shutdownsignaled)

_positionchanged = false;}}

// 源節點是否發生了變化

const hostandport target = bgsync->getsynctarget();

if (target.empty())

// loop back around again; the keepalive functionality will cause us to retry

continue;

}if (synctarget != target)

// 產生reporter

reporter reporter(executor,

makepreparereplsetupdatepositioncommandfn(replcoord, synctarget, bgsync),

synctarget,

keepaliveinterval,

syncsourcefeedbacknetworktimeoutsecs);

_reporter = &reporter;

}//上報位置資訊

auto status = _updateupstream(&reporter);

}}status syncsourcefeedback::_updateupstream(reporter* reporter)

auto status = reporter->join();

if (!status.isok())

// sync source blacklisting will be done in backgroundsync and syncsourceresolver.

return status;

}

reporter主要呼叫executor::taskexecutor來完成command的request, callback以及response。

command是通過topologycoordinator::preparereplsetupdatepositioncommand來實現, 然後通過reporter::trigger()開始乙個command, reporter::join()等待結束。

status reporter::join() );

return _status;

}status reporter::trigger() else if (_isactive_inlock())

auto scheduleresult =

_executor->schedulework([=](const executor::taskexecutor::callbackargs& args) );

_status = scheduleresult.getstatus();

_prepareandsendcommandcallbackhandle = scheduleresult.getvalue();

return _status;

}void reporter::_prepareandsendcommandcallback(const executor::taskexecutor::callbackargs& args,

bool fromtrigger)

invariant(_remotecommandcallbackhandle.isvalid());

_prepareandsendcommandcallbackhandle = executor::taskexecutor::callbackhandle();

_keepalivetimeoutwhen = date_t();

}void reporter::_sendcommand_inlock(bsonobj commandrequest, milliseconds nettimeout) );

_status = scheduleresult.getstatus();

_remotecommandcallbackhandle = scheduleresult.getvalue();

}

從上面的**看到, 基本上所有的功能都是通過executor::taskexecutor* const _executor 來實現的, 最終通過executor::taskexecutor::scheduleremotecommand完成呼叫。

mongodb 陣列更新

原因 線上資料中,陣列項某個value存在前置空格 資料格式如下 手動輸入的,json串格式可能有問題 存在空格的資料為 key key1 導致原因使用者在提交時不小心加了個空格 可能是複製貼上的 程式也沒有對這部分做處理 本來可以從後台管理系統修改,但是諮詢產品,這部分修改貌似有問題,但記不清楚了...

mongodb更新資料

updates函式接受3個引數 critera 指定查詢,選擇將要更新的文件 objnew 指定更新資訊,也可用操作符完成 options 指定更新文件時的選項,可選值有upsert和multi.upsert 如果資料存在就更新,否則建立資料。multi 指定是否更新所有匹配文件,或者只更新第乙個匹...

mongodb 更新多個字段 MongoDB的使用

今天來學習乙個新的資料庫,叫做mongodb資料庫,我們先來了解一下mongodb資料庫的概念,再一起學習如何使用mongodb資料庫吧 db.help 檢視庫級別的命令db.mycoll.help 檢視collection級別的命令sh.help 檢視發片的命令rs.help 檢視副本集的命令he...