MongoDB系列-在複製集(replication)以及分片(Shard)中建立索引

關注我,能夠獲取最新知識、經典面試題以及微服務技術分享面試

  在使用MongoDB時,在建立索引會涉及到在複製集(replication)以及分片(Shard)中建立,爲了最大限度地減小構建索引的影響,在副本和分片中建立索引,使用滾動索引構建過程。若是不使用滾動索引構建過程:shell

  • 主服務器上的前臺索引構建須要數據庫鎖定。它複製爲副本集輔助節點上的前臺索引構建,而且複製工做程序採用全局數據庫鎖定,該鎖定將讀取和寫入排序到索引服務器上的全部數據庫。
  • 主要的後臺索引構建複製爲後臺索引構建在輔助節點上。複製工做程序不會進行全局數據庫鎖定,而且輔助讀取不會受到影響。
  • 對於主服務器上的前臺和後臺索引構建,副本集輔助節點上的索引操做在主節點完成構建索引以後開始。
  • **在輔助節點上構建索引所需的時間必須在oplog的窗口內,以便輔助節點能夠遇上主節點。

那麼該如何建立呢?具體步驟呢?請看接下來的具體過程。**數據庫

1. 在副本集建立索引

準備

  必須在索引構建期間中止對集合的全部寫入,不然可能會在副本集成員中得到不一致的數據。緩存

具體過程

在副本集中以滾動方式構建惟一索引包括如下過程:服務器

  1. 中止一個Secondary節點(從節點)並以單機模式從新啓動,可使用配置文件更新配置以單機模式從新啓動:
  • 註釋掉replication.replSetName選項。
  • 將net.port更改成其餘端口。將原始端口設置註釋掉。
  • 在setParameter部分中將參數disableLogicalSessionCacheRefresh設置爲true。

例如:微服務

//修改配置
    net:
    bindIp: localhost,<hostname(s)|ip address(es)>
    port: 27217
    #port: 27017
    #replication:
    #replSetName: myRepl
    setParameter:
    disableLogicalSessionCacheRefresh: true
    //從新啓動
    mongod --config <path/To/ConfigFile>
  1. 建立索引:在單機模式下進行索引建立
  2. 從新開啓Replica Set 模式:索引構建完成後,關閉mongod實例。撤消做爲獨立啓動時所作的配置更改,以返回其原始配置並做爲副本集的成員從新啓動。學習

    //回退原來的配置:net:
    bindIp: localhost,<hostname(s)|ip address(es)>
    port: 27017
    replication:
    replSetName: myRepl
    //從新啓動:
    mongod --config <path/To/ConfigFile>
  3. 在其餘從節點中重複一、二、3步驟的過程操做。
  4. 主節點建立索引,當全部從節點都有新索引時,下降主節點,使用上述過程做爲單機模式從新啓動它,並在原主節點上構建索引:spa

    • 使用mongo shell中的rs.stepDown()方法來下降主節點爲從節點,
    • 成功降級後,當前主節點成爲從節點,副本集成員選擇新主節點,並進行從節點建立方式進行建立索引。

2. 分片集羣建立惟一索引

準備

  建立惟一索引,必須在索引構建期間中止對集合的全部寫入。 不然,您可能會在副本集成員中得到不一致的數據。若是沒法中止對集合的全部寫入,請不要使用如下過程來建立惟一索引。.net

具體過程

1.中止Balancer:將mongo shell鏈接到分片羣集中的mongos實例,而後運行sh.stopBalancer()以禁用Balancer。若是正在進行遷移,系統將在中止平衡器以前完成正在進行的遷移。code

2.肯定Collection的分佈:刷新該mongos的緩存路由表,以免返回該Collection舊的分發信息。刷新後,對要構建索引的集合運行db.collection.getShardDistribution()。

例如:在test數據庫中的records字段中建立上升排序的索引

db.adminCommand( { flushRouterConfig: "test.records" } );
    db.records.getShardDistribution();

例如,考慮一個帶有3個分片shardA,shardB和shardC的分片集羣,db.collection.getShardDistribution()返回如下內容

Shard shardA at shardA/s1-mongo1.example.net:27018,s1-mongo2.example.net:27018,s1-mongo3.example.net:27018 
   data : 1KiB docs : 50 chunks : 1
   estimated data per chunk : 1KiB 
   estimated docs per chunk : 50 Shard shardC at shardC/s3-mongo1.example.net:27018,s3-mongo2.example.net:27018,s3-mongo3.example.net:27018 
   data : 1KiB docs : 50 chunks : 1 
   estimated data per chunk : 1KiB 
   estimated docs per chunk : 50 
   Totals data : 3KiB docs : 100 chunks : 2 
   Shard shardA contains 50% data, 50% docs in cluster, avg obj size on shard : 40B 
   Shard shardC contains 50% data, 50% docs in cluster, avg obj size on shard : 40B
  從輸出中,您只在shardA和shardC上爲test.records構建索引。

3.在包含集合Chunks的分片建立索引

  • C1.中止從節點,並以單機模式從新啓動:對於受影響的分片,中止從節點與其中一個分區相關聯的mongod進程,進行配置文件/命令模式更新後從新啓動。

    配置文件:

    • 將net.port更改成其餘端口。 註釋到原始端口設置。
    • 註釋掉replication.replSetName選項。
    • 註釋掉sharding.clusterRole選項。
    • 在setParameter部分中將參數skipShardingConfigurationChecks設置爲true。
    • 在setParameter部分中將參數disableLogicalSessionCacheRefresh設置爲true。

      net:
          bindIp: localhost,<hostname(s)|ip address(es)>
          port: 27218
          #   port: 27018
          #replication:
          #   replSetName: shardA
          #sharding:
          #   clusterRole: shardsvr
          setParameter:
          skipShardingConfigurationChecks: true
          disableLogicalSessionCacheRefresh: true
          //重啓:
          mongod --config <path/To/ConfigFile>
  • C2.建立索引:直接鏈接到在新端口上做爲獨立運行的mongod實例,併爲此實例建立新索引。

    //例如:在record Collection的username建立索引
           db.records.createIndex( { username: 1 } )
  • C3.恢復C1的配置,並做爲 Replica Set成員啓動:索引構建完成後,關閉mongod實例。 撤消做爲單機模式時所作的配置更改,以返回其原始配置並從新啓動。

    配置文件模式:

    • 恢復爲原始端口號。
    • 取消註釋replication.replSetName。
    • 取消註釋sharding.clusterRole。
    • 刪除setParameter部分中的參數skipShardingConfigurationChecks。
    • 在setParameter部分中刪除參數disableLogicalSessionCacheRefresh。

      net:
             bindIp: localhost,<hostname(s)|ip address(es)>
             port: 27018
          replication:
             replSetName: shardA
          sharding:
             clusterRole: shardsvr
          重啓:mongod --config <path/To/ConfigFile>
  • C4.其餘從節點分片重複C一、C二、C3過程建立索引。
  • C5.主節點建立索引:當全部從節點都有新索引時,下降主節點,使用上述過程做爲單機模式從新啓動它,並在原主節點上構建索引使用mongo shell中的rs.stepDown()方法來下降主節點爲從節點,成功降級後,當前主節點成爲從節點,副本集成員選擇新主節點,並進行從節點建立方式進行建立索引。

4.在其餘受影響的分片重複C步驟;

5.重啓Balancer,一旦所有分片建立完索引,重啓Balancer:sh.startBalancer()。

總結

  後續還有關於實踐中複製集以及分片的搭建過程,複製集成員節點增長刪除等一系列實戰操做。

最後可關注公衆號,一塊兒學習,天天會分享乾貨,還有學習視頻領取!

相關文章
相關標籤/搜索