1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        MongoDB 常用運(yùn)維實(shí)踐總結(jié)

        共 9511字,需瀏覽 20分鐘

         ·

        2021-03-15 20:10

        一、MongoDB 集群簡(jiǎn)介

        MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫,其目的在于為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。下面將以3臺(tái)機(jī)器介紹最常見的集群方案。具體介紹,可以查看官網(wǎng) https://docs.mongodb.com/v3.4/introduction/。

        1、集群組件的介紹

        • mongos(路由處理):作為Client與MongoDB集群的請(qǐng)求入口,所有用戶請(qǐng)求都會(huì)透過Mongos協(xié)調(diào),它會(huì)將數(shù)據(jù)請(qǐng)求發(fā)到對(duì)應(yīng)的Shard(mongod)服務(wù)器上,再將數(shù)據(jù)合并后回傳給用戶。
        • config server(配置節(jié)點(diǎn)):即:配置服務(wù)器;主要保存數(shù)據(jù)庫的元數(shù)據(jù),包含數(shù)據(jù)的分布(分片)以及數(shù)據(jù)結(jié)構(gòu),mongos收到client發(fā)出的需求后,會(huì)從config server加載配置信息并緩存于內(nèi)存中。 一般在生產(chǎn)環(huán)境會(huì)配置不只一臺(tái)config server,因?yàn)樗4娴脑獢?shù)據(jù)極為重要,若損壞則影響整個(gè)集群運(yùn)作。
        • shard(分片實(shí)例存儲(chǔ)數(shù)據(jù)):shard就是分片。MongoDB利用分片的機(jī)制來實(shí)現(xiàn)數(shù)據(jù)分布存儲(chǔ)與處理,達(dá)到橫向擴(kuò)容的目的。默認(rèn)情況下,數(shù)據(jù)在分片之間會(huì)自動(dòng)進(jìn)行移轉(zhuǎn),以達(dá)到平衡,此動(dòng)作是靠一個(gè)叫平衡器(balancer)的機(jī)制達(dá)成。
        • replica set(副本集):副本集實(shí)現(xiàn)了數(shù)據(jù)庫高可用,若沒做副本集,則一旦存放數(shù)據(jù)的服務(wù)器節(jié)點(diǎn)掛掉,數(shù)據(jù)就丟失了,相反若配置了副本集,則同樣的數(shù)據(jù)會(huì)保存在副本服務(wù)器中(副本節(jié)點(diǎn)),一般副本集包含了一個(gè)主節(jié)點(diǎn)與多個(gè)副本節(jié)點(diǎn),必要時(shí)還會(huì)配置arbiter(仲裁結(jié)點(diǎn))作為節(jié)點(diǎn)掛掉時(shí)投票用。
        • arbiter(仲裁節(jié)點(diǎn)):仲裁服務(wù)器本身不包含數(shù)據(jù),僅能在主節(jié)點(diǎn)故障時(shí),檢測(cè)所有副本服務(wù)器并選舉出新的主節(jié)點(diǎn),其實(shí)現(xiàn)方式是通過主節(jié)點(diǎn)、副本節(jié)點(diǎn)、仲裁服務(wù)器之間的心跳(Heart beat)實(shí)現(xiàn)。

        2、MongoDB應(yīng)用場(chǎng)景

        • 網(wǎng)站數(shù)據(jù):適合實(shí)時(shí)的插入,更新與查詢,并具備網(wǎng)站實(shí)時(shí)數(shù)據(jù)存儲(chǔ)所需的復(fù)制及高度伸縮性。
        • 緩存:由于性能很高,也適合作為信息基礎(chǔ)設(shè)施的緩存層。在系統(tǒng)重啟之后,搭建的持久化緩存可以避免下層的數(shù)據(jù)源過載。
        • 大尺寸、低價(jià)值的數(shù)據(jù):使用傳統(tǒng)的關(guān)系數(shù)據(jù)庫存儲(chǔ)一些數(shù)據(jù)時(shí)可能會(huì)比較貴,在此之前,很多程序員往往會(huì)選擇傳統(tǒng)的文件進(jìn)行存儲(chǔ)。
        • 高伸縮性的場(chǎng)景:非常適合由數(shù)十或者數(shù)百臺(tái)服務(wù)器組成的數(shù)據(jù)庫。
        • 用于對(duì)象及JSON數(shù)據(jù)的存儲(chǔ):MongoDB的BSON數(shù)據(jù)格式非常適合文檔格式化的存儲(chǔ)及查詢。

        3、選用MongoDB的緣由

        選用MongoDB的數(shù)據(jù)是以BSON的數(shù)據(jù)格式,高度伸縮方便擴(kuò)展,并且數(shù)據(jù)水平擴(kuò)展非常簡(jiǎn)單,支持海量數(shù)據(jù)存儲(chǔ),性能強(qiáng)悍。

        二、集群的監(jiān)測(cè)

        1、監(jiān)測(cè)數(shù)據(jù)庫存儲(chǔ)統(tǒng)計(jì)信息

        docker中進(jìn)入mongos或shard實(shí)例,執(zhí)行以下命令:

        docker exec -it mongos bash;
        mongo --port 20001;
        use admin;
        db.auth("root","XXX");

        說明:通過此命令,可以查詢集群的成員的集合數(shù)量、索引數(shù)量等相關(guān)數(shù)據(jù)。

        db.stats();

        2、查看數(shù)據(jù)庫的統(tǒng)計(jì)信息

        說明:通過此命令,可以查看操作數(shù)量、內(nèi)存使用狀況、網(wǎng)絡(luò)io等

        db.runCommand( { serverStatus: 1 } );

        3、檢查復(fù)制集成員狀態(tài)

        rs.status();

        三、基本的運(yùn)維操作

        1、設(shè)置和查看慢查詢

        # 設(shè)置慢查詢
        db.setProfilingLevel(1,200);
        # 查看慢查詢級(jí)別
        db.getProfilingLevel();
        # 查詢慢查詢?nèi)罩?,此命令是針?duì)于某一庫進(jìn)行設(shè)置
        db.system.profile.find({ ns : 'dbName.collectionName'}).limit(10).sort( { ts : -1 } ).pretty();

        2、查看執(zhí)行操作時(shí)間較長(zhǎng)的動(dòng)作

        db.currentOp({"active" : true,"secs_running" : { "$gt" : 2000 }});

        3、動(dòng)態(tài)調(diào)整日志級(jí)別和設(shè)置緩存大小

        # 設(shè)置日志級(jí)別參數(shù)
        db.adminCommand( { "getParameter": 1, "logLevel":1});
        # 設(shè)置cache大小參數(shù)
        db.adminCommand( { "setParameter": 1, "wiredTigerEngineRuntimeConfig": "cache_size=4G"});

        4、添加和移除復(fù)制集成員

        # 查看復(fù)制集成員
        rs.status().members;
        # 添加成員
        rs.add('127.0.0.1:20001');
        # 移除成員
        rs.remove('127.0.0.1:20001');

        5、設(shè)置數(shù)據(jù)庫和集合分片

        # 在mongos admin庫設(shè)置庫允許分片
        sh.enableSharding("dbName");
        # 在mongos 的admin庫設(shè)置集合分片片鍵
        sh.shardCollection("dbName.collectionName", { filedName: 1} );

        6、添加和移除分片

        # 查看分片狀態(tài)
        sh.status();
        # 在mongos執(zhí)行添加分片(可以為單個(gè)實(shí)例或復(fù)制集)
        db.runCommand( { removeShard: "shardName" } );
        db.runCommand({addshard:"rs1/ip-1:20001,ip-2:20001,ip-3:20001"});
        # 在mongos執(zhí)行移除分片
        db.runCommand( { removeShard: "shard3" } );
        # 在mongos執(zhí)行刷新mongos配置信息
        db.runCommand("flushRouterConfig"));

        說明:移除分片命令至少執(zhí)行兩次才能成功刪除,執(zhí)行到state為completed才真正刪除,否則就是沒用刪除成功,該分片處于{"draining" : true}狀態(tài),該狀態(tài)下不但該分片沒用刪除成功,而且還影響接下來刪除其他分片操作,遇到該狀態(tài)再執(zhí)行一次removeshard即可,最好就是刪除分片時(shí)一直重復(fù)執(zhí)行刪除命令,直到state為completed;   還有一個(gè)需要注意的地方就是:被成功刪除的分片如果想要再加入集群時(shí),必須將data數(shù)據(jù)目錄清理干凈才可以再加入集群,否則即使能加入成功也不會(huì)存儲(chǔ)數(shù)據(jù),集合都不會(huì)被創(chuàng)建   另外:在刪除分片的時(shí)有可能整個(gè)過程出現(xiàn)無限{"draining" : true}狀態(tài),等多久還是這樣,而且分片上面的塊一個(gè)都沒有移動(dòng)到別的分片,解決辦法是:在config的config數(shù)據(jù)庫的shard集合中找到該分片的信息,并將draining字段由True改為False,再繼續(xù)試著刪除操作”   上面這句會(huì)立即返回,實(shí)際在后臺(tái)執(zhí)行。  在數(shù)據(jù)移除的過程當(dāng)中,一定要注意實(shí)例的日志信息,可能出現(xiàn)數(shù)據(jù)塊在遷移的過程中,始終找不到邊界條件,導(dǎo)致一直數(shù)據(jù)遷移不成功,一直重試,解決方案是刪除邊界數(shù)據(jù),重啟實(shí)例;。如果此分片為主分片,需要先遷移主分片。db.runCommand( { movePrimary: "XXX", to: "other" });在完成刪除后,所有mongos上運(yùn)行下面命令,再對(duì)外提供服務(wù),當(dāng)然也可以重新啟動(dòng)所有mongos實(shí)例 。

        7、數(shù)據(jù)的導(dǎo)入導(dǎo)出

        # 導(dǎo)出允許指定導(dǎo)出條件和字段
        mongoexport -h 127.0.0.1 --port 20001 -uxxx -pxxx -d xxx -c mobileIndex -o XXX.txt 
        mongoimport -h 127.0.0.1 --port 20001 -uxxx -pxxx -d xxx -c mobileIndex --file XXX.txt

        四、MongoDB數(shù)據(jù)遷移

        1、遷移復(fù)制集當(dāng)中的成員

        • 關(guān)閉 mongod 實(shí)例,為了確保安全關(guān)閉,使用 shutdown 命令;
        • 將數(shù)據(jù)目錄(即 dbPath )轉(zhuǎn)移到新機(jī)器上;
        • 在新機(jī)器上啟動(dòng) mongod,其中節(jié)點(diǎn)的數(shù)據(jù)目錄為copy的文件目錄 ;
        • 連接到復(fù)制集當(dāng)前的主節(jié)點(diǎn)上;

        如果新節(jié)點(diǎn)的地址發(fā)生變化,使用 rs.reconfig() 更新 復(fù)制集配置文檔 ; 舉例,下面的命令過程將成員中位于第 2 位的地址進(jìn)行更新:

        cfg = rs.conf()
        cfg.members[2].host = "127.0.0.1:27017"
        rs.reconfig(cfg)

        使用 rs.conf() 確認(rèn)使用了新的配置. 等待所有成員恢復(fù)正常,使用 rs.status() 檢測(cè)成員狀態(tài)。

        2、遷移復(fù)制集主節(jié)點(diǎn)

        在遷移主節(jié)點(diǎn)的時(shí)候,需要復(fù)制集選舉出一個(gè)新的主節(jié)點(diǎn),在進(jìn)行選舉的時(shí)候,復(fù)制集將讀寫,通常,這只會(huì)持續(xù)很短的時(shí)間,不過,應(yīng)該盡可能在影響較小的時(shí)間段內(nèi)遷移主節(jié)點(diǎn).

        • 主節(jié)點(diǎn)降級(jí),以使得正常的 failover開始.要將主節(jié)點(diǎn)降級(jí),連接到一個(gè)主節(jié)點(diǎn),使用 replSetStepDown方法或者使用rs.stepDown()方法,下面的例子使用了 rs.stepDown()方法進(jìn)行降級(jí):
        rs.stepDown()
        • 等主節(jié)點(diǎn)降級(jí)為從節(jié)點(diǎn),另一個(gè)成員成為 PRIMARY 之后,可以按照 “遷移復(fù)制集的一個(gè)成員”遷移這個(gè)降級(jí)了的節(jié)點(diǎn).可以使用 rs.status()來確認(rèn)狀態(tài)的改變。

        3、從復(fù)制集其他節(jié)點(diǎn)恢復(fù)數(shù)據(jù)

        MongoDB 通過復(fù)制集能保證高可靠的數(shù)據(jù)存儲(chǔ),通常生產(chǎn)環(huán)境建議使用「3節(jié)點(diǎn)復(fù)制集」,這樣即使其中一個(gè)節(jié)點(diǎn)崩潰了無法啟動(dòng),我們可以直接將其數(shù)據(jù)清掉,重新啟動(dòng)后,以全新的 Secondary 節(jié)點(diǎn)加入復(fù)制集,或者是將其他節(jié)點(diǎn)的數(shù)據(jù)復(fù)制過來,重新啟動(dòng)節(jié)點(diǎn),它會(huì)自動(dòng)的同步數(shù)據(jù),這樣也就達(dá)到了恢復(fù)數(shù)據(jù)的目的。

        • 關(guān)閉需要數(shù)據(jù)同步的節(jié)點(diǎn)
        docker stop node;  # docker環(huán)境中
        db.shutdownServer({timeoutSecs: 60}); # 非docker環(huán)境
        • 拷貝目標(biāo)節(jié)點(diǎn)機(jī)器的數(shù)據(jù)存儲(chǔ)目錄(/dbPath)到當(dāng)前機(jī)器的指定目錄。
        scp 目標(biāo)節(jié)點(diǎn) shard/data -> 當(dāng)前節(jié)點(diǎn) shard/data
        • 當(dāng)前節(jié)點(diǎn)以復(fù)制過來的數(shù)據(jù)文件啟動(dòng)節(jié)點(diǎn)
        • 將新的節(jié)點(diǎn)添加到復(fù)制集
        # 進(jìn)入復(fù)制集的主節(jié)點(diǎn),執(zhí)行添加新的節(jié)點(diǎn)命令
        rs.add("hostNameNew:portNew"); 
        # 等待所有成員恢復(fù)正常,檢測(cè)成員狀態(tài)
        rs.status();
        # 移除原來的節(jié)點(diǎn)
        rs.remove("hostNameOld>:portOld"); 

        五、MongoDB線上問題場(chǎng)景解決

        1、MongoDB 新建索引導(dǎo)致庫被鎖

        問題說明:某線上千萬級(jí)別集合,為優(yōu)化業(yè)務(wù),直接執(zhí)行新建索引命令,導(dǎo)致整個(gè)庫被鎖,應(yīng)用服務(wù)出現(xiàn)不可用。

        解決方案:找出此操作進(jìn)程,并且殺死。改為后臺(tái)新建索引,速度很會(huì)慢,但是不會(huì)影響業(yè)務(wù),該索引只會(huì)在新建完成之后,才會(huì)生效;

        # 查詢運(yùn)行時(shí)間超過200ms操作     
        db.currentOp({"active" : true,"secs_running" : { "$gt" : 2000 }}) ;
        # 殺死執(zhí)行時(shí)間過長(zhǎng)操作操作
        db.killOp(opid)
        # 后臺(tái)新建索引
        db.collectionNmae.ensureIndex({filedName:1}, {background:true});

        2、MongoDB沒有限制內(nèi)存,導(dǎo)致實(shí)例退出

        問題說明:生產(chǎn)環(huán)境某臺(tái)機(jī)器啟動(dòng)多個(gè)mongod實(shí)例,運(yùn)行一段時(shí)間過后,進(jìn)程莫名被殺死;

        解決方案:現(xiàn)在MongoDB使用WiredTiger作為默認(rèn)存儲(chǔ)引擎,MongoDB同時(shí)使用WiredTiger內(nèi)部緩存和文件系統(tǒng)緩存。從3.4開始,WiredTiger內(nèi)部緩存默認(rèn)使用較大的一個(gè):50%(RAM - 1 GB),或256 MB。 例如,在總共4GB RAM的系統(tǒng)上,WiredTiger緩存將使用1.5GB的RAM()。相反,具有總共1.25 GB RAM的系統(tǒng)將為WiredTiger緩存分配256 MB,因?yàn)檫@超過總RAM的一半減去1千兆字節(jié)()。0.5 * (4 GB - 1GB) = 1.5 GB``0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB。如果一臺(tái)機(jī)器存在多個(gè)實(shí)例,在內(nèi)存不足的情景在,操作系統(tǒng)會(huì)殺死部分進(jìn)程;

        # 要調(diào)整WiredTiger內(nèi)部緩存的大小,調(diào)節(jié)cache規(guī)模不需要重啟服務(wù),我們可以動(dòng)態(tài)調(diào)整:
        db.adminCommand( { "setParameter": 1, "wiredTigerEngineRuntimeConfig": "cache_size=xxG"})

        3、MongoDB刪除數(shù)據(jù),不釋放磁盤空間

        問題說明:在刪除大量數(shù)據(jù)(本人操作的數(shù)據(jù)量在2000萬+)的情景下,并且在生產(chǎn)環(huán)境中請(qǐng)求量較大,此時(shí)機(jī)器的cpu負(fù)載會(huì)顯得很高,甚至機(jī)器卡頓無法操作,這樣的操作應(yīng)該謹(jǐn)慎分批量操作;在刪除命令執(zhí)行結(jié)束之后,發(fā)現(xiàn)磁盤的數(shù)據(jù)量大小并沒有改變。

        解決方案:

        • 方案一:我們可以使用MongoDB提供的在線數(shù)據(jù)收縮的功能,通過Compact命令db.collectionName.runCommand("compact")進(jìn)行Collection級(jí)別的數(shù)據(jù)收縮,去除集合所在文件碎片。此命令是以O(shè)nline的方式提供收縮,收縮的同時(shí)會(huì)影響到線上的服務(wù)。為了解決這個(gè)問題,可以先在從節(jié)點(diǎn)執(zhí)行磁盤整理命令,操作結(jié)束后,再切換主節(jié)點(diǎn),將原來的主節(jié)點(diǎn)變?yōu)閺墓?jié)點(diǎn),重新執(zhí)行Compact命令即可。

        • 方案二:使用從節(jié)點(diǎn)重新同步,secondary節(jié)點(diǎn)重同步,刪除secondary節(jié)點(diǎn)中指定數(shù)據(jù),使之與primary重新開始數(shù)據(jù)同步。當(dāng)副本集成員數(shù)據(jù)太過陳舊,也可以使用重新同步。數(shù)據(jù)的重新同步與直接復(fù)制數(shù)據(jù)文件不同,MongoDB會(huì)只同步數(shù)據(jù),因此重同步完成后的數(shù)據(jù)文件是沒有空集合的,以此實(shí)現(xiàn)了磁盤空間的回收。

          針對(duì)一些特殊情況,不能下線secondary節(jié)點(diǎn)的,可以新增一個(gè)節(jié)點(diǎn)到副本集中,然后secondary就自動(dòng)開始數(shù)據(jù)的同步了。總的來說,重同步的方法是比較好的,第一基本不會(huì)阻塞副本集的讀寫,第二消耗的時(shí)間相對(duì)前兩種比較短。

          1. 若是primary節(jié)點(diǎn),先強(qiáng)制將之變?yōu)閟econdary節(jié)點(diǎn),否則跳過此步驟:rs.stepdown(120);
          2. 然后在primary上刪除secondary節(jié)點(diǎn):rs.remove("IP:port");
          3. 刪除secondary節(jié)點(diǎn)dbpath下的所有文件
          4. 將節(jié)點(diǎn)重新加入集群,然后使之自動(dòng)進(jìn)行數(shù)據(jù)的同步:rs.add("IP:port");
          5. 等數(shù)據(jù)同步完成后,循環(huán)1-4的步驟可以將集群中所有節(jié)點(diǎn)的磁盤空間釋放

        4、MongoDB機(jī)器負(fù)載極高

        問題說明:此情景是在客戶請(qǐng)求較大的情景性,由于部署MongoDB的機(jī)器包含一主一從,MongoDB使得IO100%,數(shù)據(jù)庫阻塞,出現(xiàn)大量慢查詢,進(jìn)而導(dǎo)致機(jī)器負(fù)載極高,應(yīng)用服務(wù)完全不可用。

        解決方案:在沒有機(jī)器及時(shí)擴(kuò)容的狀況下,首要任務(wù)便是減小機(jī)器的IO,在一臺(tái)機(jī)器出現(xiàn)一主一從,在大量數(shù)據(jù)寫入的情況下,會(huì)互相搶占IO資源。于是此時(shí)摒棄了MongoDB高可用的特點(diǎn),摘掉了復(fù)制集當(dāng)中的從節(jié)點(diǎn),保證每臺(tái)機(jī)器只有一個(gè)節(jié)點(diǎn)可以占用磁盤資源。之后,機(jī)器負(fù)載立馬下來,服務(wù)變?yōu)檎?捎脿顟B(tài),但是此時(shí)MongoDB無法保證數(shù)據(jù)的完整性,一旦有主節(jié)點(diǎn)掛掉便會(huì)丟失數(shù)據(jù)。此方案只是臨時(shí)方法,根本解決是可以增加機(jī)器的內(nèi)存、使用固態(tài)硬盤,或者采用增加分片集來減少單個(gè)機(jī)器的讀寫壓力。

        # 進(jìn)入主節(jié)點(diǎn),執(zhí)行移除成員的命令
        rs.remove("127.0.0.1:20001");
        # 注意:切勿直接關(guān)停實(shí)例

        5、MongoDB分片鍵選擇不當(dāng)導(dǎo)致熱讀熱寫

        問題說明:生產(chǎn)環(huán)境中,某一集合的片鍵使用了與_id生成方式相似,含有時(shí)間序列的字段作為升序片鍵,導(dǎo)致數(shù)據(jù)寫入時(shí)都在一個(gè)數(shù)據(jù)塊,隨著數(shù)據(jù)量增大,會(huì)造成數(shù)據(jù)遷移到前面的分區(qū),造成系統(tǒng)資源的占用,偶爾出現(xiàn)慢查詢。

        解決方案:臨時(shí)方案設(shè)置數(shù)據(jù)遷移的窗口,放在在正常的時(shí)間區(qū)段,對(duì)業(yè)務(wù)造成影響。根本解決是更換片鍵。

        # 連接mongos實(shí)例,執(zhí)行以下命令
        db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "23:00", stop : "4:00" } } }, true );
        # 查看均衡窗口
        sh.getBalancerWindow();

        六、MongoDB優(yōu)化建議

        1、應(yīng)用層面優(yōu)化

        查詢優(yōu)化:確認(rèn)你的查詢是否充分利用到了索引,用explain命令查看一下查詢執(zhí)行的情況,添加必要的索引,避免掃表操作。

        合理設(shè)計(jì)分片鍵:增量sharding-key:適合于可劃分范圍的字段,比如integer、float、date類型的,查詢時(shí)比較快。隨機(jī)sharding-key: 適用于寫操作頻繁的場(chǎng)景,而這種情況下如果在一個(gè)shard上進(jìn)行會(huì)使得這個(gè)shard負(fù)載比其他高,不夠均衡,故而希望能hash查詢key,將寫分布在多個(gè)shard上進(jìn)行,考慮復(fù)合key作為sharding key, 總的原則是查詢快,盡量減少跨shard查詢,balance均衡次數(shù)少;單一遞增的sharding key,可能會(huì)造成寫數(shù)據(jù)全部在最后一片上,最后一片的寫壓力增大,數(shù)據(jù)量增大,會(huì)造成數(shù)據(jù)遷移到前面的分區(qū)。MongoDB默認(rèn)是單條記錄16M,尤其在使用GFS的時(shí)候,一定要注意shrading-key的設(shè)計(jì)。不合理的sharding-key會(huì)出現(xiàn),多個(gè)文檔,在一個(gè)chunks上,同時(shí),因?yàn)镚FS中存貯的往往是大文件,導(dǎo)致MongoDB在做balance的時(shí)候無法通過sharding-key來把這多個(gè)文檔分開到不同的shard上, 這時(shí)候MongoDB會(huì)不斷報(bào)錯(cuò)最后導(dǎo)致MongoDB倒掉。解決辦法:加大chunks大?。ㄖ螛?biāo)),設(shè)計(jì)合理的sharding-key(治本)。

        通過profile來監(jiān)控?cái)?shù)據(jù):進(jìn)行優(yōu)化查看當(dāng)前是否開啟profile功能 用命令db.getProfilingLevel() 返回level等級(jí),值為0|1|2,分別代表意思:0代表關(guān)閉,1代表記錄慢命令,2代表全部。開啟profile功能命令為 db.setProfilingLevel(level); #level等級(jí),值level為1的時(shí)候,慢命令默認(rèn)值為100ms,更改為db.setProfilingLevel(level,slowms)如db.setProfilingLevel(1,50)這樣就更改為50毫秒通過db.system.profile.find() 查看當(dāng)前的監(jiān)控日志。

        2、硬件層面優(yōu)化

        2.1 確定熱數(shù)據(jù)大?。嚎赡苣愕臄?shù)據(jù)集非常大,但是這并不那么重要,重要的是你的熱數(shù)據(jù)集有多大,你經(jīng)常訪問的數(shù)據(jù)有多大(包括經(jīng)常訪問的數(shù)據(jù)和所有索引數(shù)據(jù))。使用MongoDB,你最好保證你的熱數(shù)據(jù)在你機(jī)器的內(nèi)存大小之下,保證內(nèi)存能容納所有熱數(shù)據(jù); 2.2 選擇正確的文件系統(tǒng):MongoDB的數(shù)據(jù)文件是采用的預(yù)分配模式,并且在Replication里面,Master和Replica Sets的非Arbiter節(jié)點(diǎn)都是會(huì)預(yù)先創(chuàng)建足夠的空文件用以存儲(chǔ)操作日志。這些文件分配操作在一些文件系統(tǒng)上可能會(huì)非常慢,導(dǎo)致進(jìn)程被Block。所以我們應(yīng)該選擇那些空間分配快速的文件系統(tǒng)。這里的結(jié)論是盡量不要用ext3,用ext4或xfs;

        3、架構(gòu)上的優(yōu)化

        盡可能讓主從節(jié)點(diǎn)分?jǐn)傇诓煌臋C(jī)器上,避免IO操作的與MongoDB在同一臺(tái)機(jī)器;

        七、總結(jié)

        MongoDB具有高性能、易擴(kuò)展、易上手等特點(diǎn),在正確使用的情況下,其本身性能還是非常強(qiáng)悍,在一些關(guān)鍵點(diǎn)如片鍵的選擇、內(nèi)存的大小和磁盤IO,往往是限制其性能的最大瓶頸。針對(duì)于片鍵,在業(yè)務(wù)系統(tǒng)初期,可以先不對(duì)集合進(jìn)行數(shù)據(jù)分片,因?yàn)榉制I一旦確定就無法修改,后期可根據(jù)業(yè)務(wù)系統(tǒng)的情況,認(rèn)真篩選字段。一般情況下,不建議使用升序片鍵(是一種隨著時(shí)間穩(wěn)定增長(zhǎng)的字段,自增長(zhǎng)的主鍵是升序鍵 ),因?yàn)檫@個(gè)會(huì)導(dǎo)致局部的熱讀熱寫,不能發(fā)揮分片集群的真正實(shí)力。建議使用hash片鍵或者隨機(jī)分發(fā)的片鍵,這樣可以保證數(shù)據(jù)的均勻分發(fā)在分片節(jié)點(diǎn);針對(duì)于內(nèi)存,建議內(nèi)存的大小能夠包含熱數(shù)據(jù)的大小加索引大小,保證內(nèi)存能容納所有熱數(shù)據(jù) 。針對(duì)于磁盤資源,MongoDB的高速讀寫是以磁盤的IO作為基礎(chǔ),為了保證其性能,建議將主從節(jié)點(diǎn)以及高IO的應(yīng)用分離,以保證IO資源盡可能不存在搶占。

        原文鏈接:https://www.jianshu.com/p/f05f65d3a1dc


        K8S 進(jìn)階訓(xùn)練營(yíng)


         點(diǎn)擊屏末  | 即刻學(xué)習(xí)
        瀏覽 42
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            狠狠艹| 免费在线观看a| 夜夜高潮夜夜爽| 操少妇| 无码av在线观看| 国内操逼视频| 国产精品视频在线观看| 欧美日韩男女淫乱一区二区| 成人无码视频在线| 日韩AV一区二区在线观看| 91香蕉视频在线看| 国产熟女自拍| 男女av免费观看| 天天日,天天干,天天操| 91抽插| 日韩性爱视频在线观看| 韩国高清无码视频| 国产夫妻在线| 一本大道香蕉av久久精东影业| 亚洲三级网站在线观看| 国内自拍青青| 中文字幕第一页亚洲| 91吴梦梦无码一区二区| 青青草伊人大香蕉| 日韩家庭乱伦| 夜夜欢天天干| 正在播放ADN156松下纱荣子 | 五月婷婷色播| 国产在线视频一区二区三区| 色婷婷影院| 黄色毛片,男人天堂| 99热思思| 欧美AAAAAAAAAA特级| 国产黄色视频免费在线观看| 亚洲精品久久久蜜桃| а√最新版天堂中文在线| 国产激情av| 51XX嘿嘿午夜| 1204手机看片| 亚洲先锋影音| 毛片在线观看视频| 五月丁香综合激情| 在线观看无码| 成人影片在线观看18| 日本黄色影院在线| 亚洲午夜在线| 亚洲A片在线观看| 亚洲免费视频在线观看| 亚洲另类av| 翔田千里无码AV在线观看| 久久婷婷网| 九九超碰| 男人AV网| 日本一级婬片A片免费播放一 | 免费啪啪视频| 欧美日韩国产免费观看成人片| 亚洲va视频| 91丝袜一区二区| www.97cao| 亚洲AV无码成人精品区大猫| 伊人亚洲| 91精彩视频| 操操操综合网| 人妻体内射精一区二区| 国产精品视频一区二区三| 无码高清视频在线观看| 亚洲.欧美.丝袜.中文.综合| 波多野结衣在线无码| 手机在线小视频| 少妇性受XXXX黑人XYX性爽 | 韩国深夜福利视频| 91免费观看网站| 一区二区三区色| 亚洲成人影片| 国产精品福利在线播放| 日韩一区二区免费视频| 国产P片内射天涯海角| 亚洲欧美在线视频观看| 狠狠狠狠狠狠狠| 国产黄色在线播放| 欧美一级视频| 狠狠色噜噜狠狠狠888| 国产精品成人免费久久黄AV片 | 国产中文自拍| 午夜av福利| 东方美美高清无码一区| 欧美亚洲操逼视频| 黄色视频网站在线免费观看| A视频在线观看| 中文字幕性| 色色一区二区| 少妇做爱视频| 成人做爰100片免费视频| 成人无码视频在线观看| 极品一区| 欧美五区| www四虎com| 草视频| 大香蕉在线视频75| 亚洲天堂AV2025| 国产亲子乱XXXXimim/| 自拍AV在线| 久操手机在线| 精品人妻一区二区蜜桃视频| 操逼视频高清无码| 亚洲欧美v在线视频| 一个人看的视频www| 久久婷婷五月综合伊人| 国产97在线观看| 欧美成人精品激情在线视频| 天天操天天插| 中文字幕亚洲在线观看| 日韩无码国产精品| 成人黄色免费观看| 精品少妇人妻| 最好看的MV中文字幕国语电影| 国产激情无码| 91羞射短视频在线观看| 91在线无码视频| 亚洲精品黄色电影| 中文字幕五码| 婷色五月天| 小黄片免费在线观看| 免费看一级片| 人人射| 久久久中文字幕| 操逼操逼操逼操逼操逼操逼| 性爱视频99| 欧美日韩在线看| 日韩中文字幕免费| 强辱丰满人妻HD中文字幕| 婷婷六月天| 亚洲一区欧美二区gay| 日韩在线观看视频免费| 中文字幕第27页| 午夜无码三级| 99re这里| 无码福利电影| 草逼com| 三级片日本在线| 99视频免费在线| 国产成人在线视频免费| 十八禁视频在线观看网站.www| 无码av中文字幕| 欧美级毛片一进一出| 一本道不卡色色| 精品蜜桃秘一区二区三区观看| 欧一美一婬一伦一区?| 一级在线播放| 91亚洲精品国产成人| 风流老熟女一区二区三区| 成人片免费| 欧美黄色免费观看| 悠悠色综合| 国产一级黄片| 91白丝在线观看| 天堂网2018| 日韩亚洲在线观看| 色汉综合| 无码人妻丰满熟妇| 国产欧美在线观看| 国产麻豆精品ThePorn| 免费福利视频网站| 九九视频网| 国产精品婷婷午夜在线观看| 一级黄色视频在线观看| 国产高清视频在线| 91在线导航| 91无码人妻| 激情啪啪网站| 国产午夜精品一区二区三区四区 | 亚洲日韩一级| 欧美成人黄色小说| 无码中文字幕网站| 巨乳国产一区| 日日騒av无码| 日本成人电影一区二区三区| 毛片18| 香蕉久久久| 亚洲丁香五月激情| 婷婷丁香五月网| 神马午夜福利影院| 国产精品无码白浆高潮| 无码内射视频| 五月天亚洲无码| 国产精品久久久久久久9999| 天天做天天爽| 国产精品你懂的| 欧美性视频网站| 成人AV一AV二| 国产亚洲欧洲| 91成人免费电影| 在线无码视频| 国产黄色电影在线| 九九精品在线视频| 在线观看无码高清| 一区二区三区久久| 大香蕉啪啪啪啪| 骚逼逼影院| 国产人妻精品| 亚洲性爱在线| 大BBBw大BBBW另类| 久久学生妹| 97人人爽人人爽人人人| av在线观看中文字幕| 色综合久久88色综合天天| 999reav| 激情婷婷六月| 午夜亚洲福利| 久久亚洲国产| 欧美成人视频大全| 成年人免费公开视频| 精品视频在线观看免费| 免费三级网站| 无码秘蜜桃一区二区| 大香蕉综合伊人| 在线亚洲色图| 亚洲香蕉在线观看| 久草资源| 欧美熟妇擦BBBB擦BBBB| av东方在线| 午夜无码AV| 亚洲国产熟妇综合色专区| 精品国产精品三级精品AV网址 | 一级免费黄片| 婬乱欧美一二三区| 免费成人视频在线观看| 乱伦内射| 日韩中文字幕在线| 免费福利视频网站| 五月婷婷五月| 99re视频在线| 国产三级黄色片| 老太婆擦BBBB撩BBBB| 亚洲成人视频免费观看| 2025四虎在线视频观看| 俺去也在线播放| 毛片h| 天天拍天天干| 国产av影音| 欧美性爱天天操| 免费看黄色片| 国产一视频| 一级欧美黑人大战白妞| 黄色免费大片| 操欧美女人| 成年人黄色视频网站| 国产区精品| 天天狠天天干| 成人免费乱码大片a毛片蜜芽| 亚洲无码成人在线| 搞黄免费视频视频| 神马午夜三级| 蜜桃av秘无码一区二区三欧| 美女网站黄| 亚洲精品高清视频| 九色国产在线| 少妇精品无码一区二区免费视频| 三级无码高清| 四lll少妇BBBB槡BBBB| 国产天天操| 少妇人妻一区二区三区| 国产美女av| 日韩无码网站| 狠狠久久| 亚洲一区亚洲二区| www.熟女| 操逼综合网| 在线观看三级| 99久久99九九九99九他书对| 成人黄色视频网站| 青青草视频91| 美女乱伦| 99色色| 黄片网站免费在线观看| 日逼网站免费观看| 国产嫩草久久久一二三久久免费观看 | 日韩在线小视频| 黑人在线播放| 99精品在线观看视频| 久久福利导航| 第四色视频| 精品在线一区| 无码三级在线免费观看| 久草视频在线免费看| 国产精品久久精品| 2025中文在线观看最好看的电影| 人人操超碰在线观看| 一区二区三区高清| 成人免费内射视频| 99re6热在线精品视频| 日韩AV毛片| 一级a爱视频| 日韩AV一二三| 在线无码播放| 亚洲天堂AV在线观看| 欧美一级黃色A片免费看小优视频| 正在播放亚洲| 嫩小槡BBBB槡BBBB槡免费-百度 | 一级少女免费播放电视剧韩剧TV|