在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...