MongoDB Sharding Cluster介紹與搭建

MongoDB分片介紹

分片(sharding)是MongoDB用來將大型集合分割到不一樣服務器(或者說一個集羣)上所採用的方法。儘管分片起源於關係型數據庫分區,但MongoDB分片徹底又是另外一回事。
和MySQL分區方案相比,MongoDB的最大區別在於它幾乎能自動完成全部事情,只要告訴MongoDB要分配數據,它就能自動維護數據在不一樣服務器之間的均衡。html

分片的目的

高數據量和吞吐量的數據庫應用會對單機的性能形成較大壓力,大的查詢量會將單機的CPU耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的內存而將壓力轉移到磁盤IO上。
爲了解決這些問題,有兩個基本的方法: 垂直擴展和水平擴展。mongodb

  • 垂直擴展:增長更多的CPU和存儲資源來擴展容量。
  • 水平擴展:將數據集分佈在多個服務器上。水平擴展即分片。

MongoDB幾個基本概念

各類概念由小到大;數據庫

  • 片鍵shard key:文檔中的一個字段
  • 文檔doc:包含shard key的一行數據
  • 塊chunk:包含n個文檔
  • 分片shard:包含n個chunk
  • 集羣cluster:包含n個分片

重點說一下Chunk,在一個shard server內部,MongoDB仍是會把數據分爲chunks,每一個chunk表明這個shard server內部一部分數據。chunk的產生,會有如下兩個用途:服務器

  • Splitting:當一個chunk的大小超過配置中的chunk size時,MongoDB的後臺進程會把這個chunk切分紅更小的chunk,從而避免chunk過大的狀況
  • Balancing:在MongoDB中,balancer是一個後臺進程,負責chunk的遷移,從而均衡各個shard server的負載,系統初始1個chunk,chunk size默認值64M,生產庫上選擇適合業務的chunk size是最好的。MongoDB會自動拆分和遷移chunks。

分片集羣架構

組件 說明
Config Server 存儲集羣全部節點、分片數據路由信息。默認須要配置3個Config Server節點。
Mongos 提供對外應用訪問,全部操做均經過mongos執行。通常有多個mongos節點。數據遷移和數據自動平衡。
Mongod 存儲應用數據記錄。通常有多個Mongod節點,達到數據分片目的。

官方架構圖以下:
MongoDB Sharding Cluster介紹與搭建架構

配置過程

規劃:

10個實例,端口號:38017-38026ide

  1. configserver:
    3臺構成的複製集(1主兩從,不支持arbiter)38018-38020(複製集名字configsvr)
  2. shard節點:
    sh1:38021-23 (1主兩從,其中一個節點爲arbiter,複製集名字sh1)
    sh2:38024-26 (1主兩從,其中一個節點爲arbiter,複製集名字sh2)
  3. router(mongos)節點
    一個router節點:38017 性能

    shard複製集配置:

  4. 目錄建立
    mkdir -p /mongodb/38021/conf  /mongodb/38021/log  /mongodb/38021/data
    mkdir -p /mongodb/38022/conf  /mongodb/38022/log  /mongodb/38022/data
    mkdir -p /mongodb/38023/conf  /mongodb/38023/log  /mongodb/38023/data
    mkdir -p /mongodb/38024/conf  /mongodb/38024/log  /mongodb/38024/data
    mkdir -p /mongodb/38025/conf  /mongodb/38025/log  /mongodb/38025/data
    mkdir -p /mongodb/38026/conf  /mongodb/38026/log  /mongodb/38026/data
  5. 修改配置文件
    sh1: 測試

    cat > /mongodb/38021/conf/mongodb.conf<<EOF 
    systemLog:
    destination: file
    path: /mongodb/38021/log/mongodb.log   
    logAppend: true
    storage:
    journal:
        enabled: true
    dbPath: /mongodb/38021/data
    directoryPerDB: true
    #engine: wiredTiger
    wiredTiger:
        engineConfig:
        cacheSizeGB: 1
        directoryForIndexes: true
        collectionConfig:
        blockCompressor: zlib
        indexConfig:
        prefixCompression: true
    net:
    bindIp: 11.111.24.4,127.0.0.1
    port: 38021
    replication:
    oplogSizeMB: 2048
    replSetName: sh1  #replica set名稱
    sharding:
    clusterRole: shardsvr  #固定寫法
    processManagement: 
    fork: true
    EOF
    
    cp  /mongodb/38021/conf/mongodb.conf  /mongodb/38022/conf/
    cp  /mongodb/38021/conf/mongodb.conf  /mongodb/38023/conf/
    sed 's#38021#38022#g' /mongodb/38022/conf/mongodb.conf -i
    sed 's#38021#38023#g' /mongodb/38023/conf/mongodb.conf -i

    sh2:code

    cat > /mongodb/38024/conf/mongodb.conf<<EOF 
    systemLog:
    destination: file
    path: /mongodb/38024/log/mongodb.log   
    logAppend: true
    storage:
    journal:
        enabled: true
    dbPath: /mongodb/38024/data
    directoryPerDB: true
    wiredTiger:
        engineConfig:
        cacheSizeGB: 1
        directoryForIndexes: true
        collectionConfig:
        blockCompressor: zlib
        indexConfig:
        prefixCompression: true
    net:
    bindIp: 11.111.24.4,127.0.0.1
    port: 38024
    replication:
    oplogSizeMB: 2048
    replSetName: sh2
    sharding:
    clusterRole: shardsvr
    processManagement: 
    fork: true
    EOF
    
    cp  /mongodb/38024/conf/mongodb.conf  /mongodb/38025/conf/
    cp  /mongodb/38024/conf/mongodb.conf  /mongodb/38026/conf/
    sed 's#38024#38025#g' /mongodb/38025/conf/mongodb.conf -i
    sed 's#38024#38026#g' /mongodb/38026/conf/mongodb.conf -i
  6. 啓動全部節點,並搭建複製集:router

    #啓動節點
    mongod -f  /mongodb/38021/conf/mongodb.conf 
    mongod -f  /mongodb/38022/conf/mongodb.conf 
    mongod -f  /mongodb/38023/conf/mongodb.conf 
    mongod -f  /mongodb/38024/conf/mongodb.conf 
    mongod -f  /mongodb/38025/conf/mongodb.conf 
    mongod -f  /mongodb/38026/conf/mongodb.conf  
    #配置複製集sh1
    mongo --port 38021 admin
    config = {_id: 'sh1', members: [
                            {_id: 0, host: '11.111.24.4:38021'},
                            {_id: 1, host: '11.111.24.4:38022'},
                            {_id: 2, host: '11.111.24.4:38023',"arbiterOnly":true}]
            }
    
    rs.initiate(config)
    
    #配置複製集sh2
    mongo --port 38024  admin
    config = {_id: 'sh2', members: [
                            {_id: 0, host: '11.111.24.4:38024'},
                            {_id: 1, host: '11.111.24.4:38025'},
                            {_id: 2, host: '11.111.24.4:38026',"arbiterOnly":true}]
            }
    
    rs.initiate(config)

    config節點配置:

  7. 目錄建立
    mkdir -p /mongodb/38018/conf  /mongodb/38018/log  /mongodb/38018/data
    mkdir -p /mongodb/38019/conf  /mongodb/38019/log  /mongodb/38019/data
    mkdir -p /mongodb/38020/conf  /mongodb/38020/log  /mongodb/38020/data
  8. 修改配置文件

    cat > /mongodb/38018/conf/mongodb.conf <<EOF
    systemLog:
    destination: file
    path: /mongodb/38018/log/mongodb.conf
    logAppend: true
    storage:
    journal:
        enabled: true
    dbPath: /mongodb/38018/data
    directoryPerDB: true
    #engine: wiredTiger
    wiredTiger:
        engineConfig:
        cacheSizeGB: 1
        directoryForIndexes: true
        collectionConfig:
        blockCompressor: zlib
        indexConfig:
        prefixCompression: true
    net:
    bindIp: 11.111.24.4,127.0.0.1
    port: 38018
    replication:
    oplogSizeMB: 2048
    replSetName: configReplSet
    sharding:
    clusterRole: configsvr   #固定寫法
    processManagement: 
    fork: true
    EOF
    
    cp /mongodb/38018/conf/mongodb.conf /mongodb/38019/conf/
    cp /mongodb/38018/conf/mongodb.conf /mongodb/38020/conf/
    sed 's#38018#38019#g' /mongodb/38019/conf/mongodb.conf -i
    sed 's#38018#38020#g' /mongodb/38020/conf/mongodb.conf -i
  9. 啓動節點,並配置複製集

    mongod -f /mongodb/38018/conf/mongodb.conf 
    mongod -f /mongodb/38019/conf/mongodb.conf 
    mongod -f /mongodb/38020/conf/mongodb.conf 
    
    mongo --port 38018 admin
    config = {_id: 'configReplSet', members: [
                            {_id: 0, host: '11.111.24.4:38018'},
                            {_id: 1, host: '11.111.24.4:38019'},
                            {_id: 2, host: '11.111.24.4:38020'}]
            }
    rs.initiate(config)

    mongos節點配置

  10. 建立目錄
    mkdir -p /mongodb/38017/conf  /mongodb/38017/log
  11. 配置文件
    cat >/mongodb/38017/conf/mongos.conf<<EOF
    systemLog:
    destination: file
    path: /mongodb/38017/log/mongos.log
    logAppend: true
    net:
    bindIp: 11.111.24.4,127.0.0.1
    port: 38017
    sharding:
    configDB: configReplSet/11.111.24.4:38018,11.111.24.4:38019,11.111.24.4:38020
    processManagement: 
    fork: true
    EOF
  12. 啓動mongos
    mongos -f /mongodb/38017/conf/mongos.conf

    生產上建議使用多個router,防止出現單點問題,全部節點的router配置一致

分片集羣操做

鏈接到其中一個mongos(11.111.24.4),作如下配置
(1)鏈接到mongs的admin數據庫

# su - mongod
$ mongo 11.111.24.4:38017/admin

(2)添加分片

db.runCommand( { addshard : "sh1/11.111.24.4:38021,11.111.24.4:38022,11.111.24.4:38023",name:"shard1"} )
db.runCommand( { addshard : "sh2/11.111.24.4:38024,11.111.24.4:38025,11.111.24.4:38026",name:"shard2"} )

(3)列出分片

mongos> db.runCommand( { listshards : 1 } )

(4)總體狀態查看

mongos> sh.status();

到此MongoDB Sharding Cluster配置完成

使用分片集羣

RANGE分片配置及測試

test庫下的vast大表進行手工分片

一、激活數據庫分片功能

mongo --port 38017 admin
admin>  ( { enablesharding : "數據庫名稱" } )

eg:
admin> db.runCommand( { enablesharding : "test" } )

二、指定分片建對集合分片

eg:範圍片鍵
--建立索引
use test
> db.vast.ensureIndex( { id: 1 } )
--開啓分片
use admin
> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )

三、集合分片驗證

admin> use test
test> for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
test> db.vast.stats()

四、分片結果測試

shard1:
mongo --port 38021
db.vast.count();

shard2:
mongo --port 38024
db.vast.count();

Hash分片例子:

對test2庫下的vast大表進行hash
建立哈希索引
(1)對於test2開啓分片功能

mongo --port 38017 admin
use admin
admin> db.runCommand( { enablesharding : "test2" } )

(2)對於test2庫下的vast表創建hash索引

use test2
test2> db.vast.ensureIndex( { id: "hashed" } )

(3)開啓分片

use admin
admin > sh.shardCollection( "test2.vast", { id: "hashed" } )

(4)錄入10w行數據測試

use test2
for(i=1;i<100000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }

(5)hash分片結果測試

mongo --port 38021
use test2
db.vast.count();

mongo --port 38024
use test2
db.vast.count();

分片操做

  1. 判斷是否Shard集羣
    admin> db.runCommand({ isdbgrid : 1})

  2. 列出全部分片信息
    admin> db.runCommand({ listshards : 1})

  3. 列出開啓分片的數據庫
    admin> use config
    config> db.databases.find( { "partitioned": true } )
    或者:
    config> db.databases.find() //列出全部數據庫分片狀況

  4. 查看分片的片鍵
    config> db.collections.find().pretty()
    {
    "_id" : "test.vast",
    "lastmodEpoch" : ObjectId("58a599f19c898bbfb818b63c"),
    "lastmod" : ISODate("1970-02-19T17:02:47.296Z"),
    "dropped" : false,
    "key" : {
    "id" : 1
    },
    "unique" : false
    }

  5. 查看分片的詳細信息
    admin> db.printShardingStatus()

    admin> sh.status() *****

  6. 刪除分片節點(謹慎)
    (1)確認blance是否在工做
    sh.getBalancerState()
    (2)刪除shard2節點(謹慎)
    mongos> db.runCommand( { removeShard: "shard2" } )
    注意:刪除操做必定會當即觸發blancer。

引用:http://www.javashuo.com/article/p-xihlajaa-mb.html
官方文檔:https://docs.mongodb.com/manual/sharding/

相關文章
相關標籤/搜索