mongodb之集羣模式

前言javascript

數據量大了或者併發量上來了,單機確定是抗不住的,這個時候要開始考慮使用集羣了。mongodb目前爲止支持三種集羣模式:主從集羣,副本集集羣,分片集羣。java


主從集羣算法

特性mongodb

1. 一主多從
2. 主負責讀寫
3. 從負責讀
4. 從經過異步同步主op日誌同步主數據
5. 主掛沒法自動恢復數據庫

架構圖json

實踐api

規劃緩存

一主兩從
ip端口配置
主節點:127.0.0.1:27021
從節點1:127.0.0.1:27022
從節點2:127.0.0.1:27023安全

啓動主節點
su -s /bin/bash -c "/usr/bin/mongod --master -f /etc/mongodb/27021.conf" mongodbash

啓動從節點
su -s /bin/bash -c "/usr/bin/mongod --slave --source 127.0.0.1:27021 -f /etc/mongodb/27022.conf" mongod
su -s /bin/bash -c "/usr/bin/mongod --slave --source 127.0.0.1:27021 -f /etc/mongodb/27023.conf" mongod

設置從節點可用
use admin
rs.slaveOk()

查看是否主節點
use admin
rs.isMaster()

查看主節點複製狀態信息
use admin
rs.printReplicationInfo()

查看從節點複製狀態信息
use admin
rs.printSlaveReplicationInfo()

 

replica set集羣

特性

1. n個不一樣類型節點組成
2. 每一個節點數據相同
3. 建議至少有一個primary和兩個secondary節點
4. 集羣中只能有一個primary節點
5. 寫請求都經過primary節點
6. 支持自動故障恢復
7. primary節點不可用時,經過投票選舉從secondary節點列表中選出primary節點,所以最好節點數量是奇數
8. secondary節點從primary節點經過oplog異步方式同步數據

節點類型

primary
主節點,負責集羣數據維護,全部數據更新操做都經過主節點

secondary
從節點,從主節點複製數據,提供讀請求響應

arbiter
選舉節點,不保存數據,只參與primary投票選舉

架構圖

節點屬性說明

priority: 0 表示不是候選人,能夠投票
hidden:true 對用戶端不可見,不可見的節點priority必須設置爲0
votes: 1 投票權限 0表示不能投票

實踐

規劃

搭建3個節點的集羣,一個primary,兩個secondary
ip和端口配置
host1: 127.0.0.1:27018
host2: 127.0.0.1:27019
host3: 127.0.0.1:27020
集羣名: replSetTest0

啓動3個事例

單個實例的配置

#系統日誌配置
systemLog:
    destination: file
    path: /var/log/mongodb/mongod_27018.log
    logAppend: true
    #quiet模式運行,建議設置爲false,方便排查錯誤
    quiet: false 

#進程管理
processManagement:
    #進程後臺運行
    fork: true 
    #進程pid文件 
    pidFilePath: /var/log/mongodb/mongod_27018.pid 

#網絡配置
net:
    #監聽端口
    port: 27018 
    #監聽網卡 多個使用英文逗號隔開
    bindIp: 127.0.0.1 
    #最大併發鏈接數 默認65535
    maxIncomingConnections: 65535
    #驗證客戶端傳過來的數據,文檔嵌套多時,對性能會有些影響
    wireObjectCheck: true 
    #是否啓用ipv6,默認不啓用
    ipv6: false 
    unixDomainSocket:
        #是否啓用socket監聽 默認true
        enabled: true 
        #socket保存目錄,默認/tmp
        pathPrefix: /var/log/mongodb
        #socket文件權限,默認0700
        filePermissions: 0700 
    http:
        #是否啓用http服務,默認false,安全考慮線上環境要關閉
        enabled: false 
        #是否啓用http jsonp,默認false,即便http.enabled爲false,只要此項爲true,同樣能夠訪問,安全考慮線上環境要關閉
        JSONPEnabled: false 
        #是否啓用rest api接口,默認false,安全考慮線上環境要關閉
        RESTInterfaceEnabled: false 
    compression:
        #是否啓用數據壓縮
        compressors: snappy

#安全配置
security:
    #type:string
    #密鑰路徑,副本集和分片集羣節點間受權時使用的密鑰
    keyFile: /var/log/mongodb/.replSetTest0Key

    #type:string 
    #集羣受權模式,默認keyFile,值列表:keyFile,sendKeyFile,sendX509,x509
    clusterAuthMode: keyFile 

    #type:string
    #是否開啓數據庫訪問RBAC權限控制,默認:disabled,僅對mongod命令有效
    authorization: enabled 

    #type:boolean
    #是否開啓服端js執行,默認true,若是未開啓$where,group,mapreduce都不能使用
    javascriptEnabled: true 

#存儲配置
storage:
    #type:string
    #數據庫數據存儲目錄,默認/data/db
    dbPath: /data/mongodb/27018

    #type:boolean
    #啓動時是否嘗試重建索引,默認true
    indexBuildRetry: true 

    #journal日誌
    journal: 
        #type:boolean
        #Enable or disable the durability journal to ensure data files remain valid and recoverable. 
        enabled: true 

        #type:int
        #日誌同步間隔,Values can range from 1 to 500 milliseconds.
        commitIntervalMs: 100 

    #type:boolean
    #是否開啓一數據庫一目錄,默認是false
    directoryPerDB: false 

    #type:int
    #數據落地時間間隔,默認爲60秒,不能設置爲0,通常使用默認值便可
    syncPeriodSecs: 60 

    #type:string
    ##存儲引擎,默認wiredTiger,可選值 mmapv1,wiredTiger,inMemory
    engine: wiredTiger

    wiredTiger:
        engineConfig:
            #type:float
            #單個實例可用的數據緩存內存大小,version >= 3.4默認:50% of RAM minus 1 GB, or 256 MB. 
            cacheSizeGB: 0.25

            #type:string
            #WiredTiger journal數據壓縮格式,默認snappy,可用的壓縮類型: none, snappy, zlib
            journalCompressor: snappy 

            #type:boolean
            #索引文件分目錄存儲,默認false,version >= 3.0後版本可用
            directoryForIndexes: false 
        collectionConfig:
            #type:string
            #塊數據壓縮格式,默認snappy,可用的壓縮類型:none, snappy, zlib
            blockCompressor: snappy
        indexConfig:
            #type:boolean
            #是否開啓索引prefix compression,默認true
            prefixCompression: true #是否開啓索引prefix compression,默認true

#operationProfiling操做性能分析
operationProfiling:
    #type:int
    #慢查詢時間單位毫秒,默認100,若是開啓了profile,日誌會保存到system.profile集合中
    slowOpThresholdMs: 100 

    #type:string
    #性能分析模式,開啓會影響性能,謹慎操做。默認off.
    #可選值1:off: Off. No profiling.
    #可選值2: slowOp:On. Only includes slow operations.
    #可選值3: all:On. Includes all operations.
    mode: slowOp

#replication複製配置
replication:
    #type:int
    #數字類型(單位M) replication op log 大小,64位系統默認爲可用磁盤的5%
    oplogSizeMB: 512

    #type:string
    #所屬replica set集羣名稱
    replSetName: replSetTest0

#setParameter配置
setParameter:
    enableLocalhostAuthBypass: false 

  

啓動

su -s /bin/bash -c "/usr/bin/mongod -f /etc/mongodb/27018.conf" mongod
su -s /bin/bash -c "/usr/bin/mongod -f /etc/mongodb/27019.conf" mongod
su -s /bin/bash -c "/usr/bin/mongod -f /etc/mongodb/27020.conf" mongod

mongod -f /etc/mongodb/27018.conf --shutdown

集羣初始化

mongo --port 27018
rs.initiate(
   {
      _id: "replSetTest0",
      version: 1,
      members: [
         { _id: 0, host : "127.0.0.1:27018" },
         { _id: 1, host : "127.0.0.1:27019" },
         { _id: 2, host : "127.0.0.1:27020" }
      ]
   }
)

  

設置從節點可用
mongo --port 27018(填寫實際的從節點地址)
rs.slaveOk()

查看集羣狀態
mongo --port 27018
rs.status()

查看是否primary節點
mongo --port 27018
rs.isMaster()

查看集羣配置
mongo --port 27018
rs.conf()

添加節點
mongo 主節點地址
rs.add({} | host地址)

刪除節點
mongo 主節點地址
刪除前,建議先中止這個節點的服務
rs.remove(hostname)

更改集羣配置
mongo 主節點地址
rs.reconfig({},{})

 

分片集羣

選定一個或多個key,按照選定的key進行數據分割,分割後的數據分別保存在不一樣的mongodb副本集中,這個是分片的基本思路。
分片思路能夠水平擴展機器,根據業務須要擴展任意多的機器。讀寫壓力分散到集羣不一樣的機器中。

架構圖

組件

配置server

副本集集羣,分片信息,用戶受權信息,配置信息等都保存在這裏

分片server

單個獨立的mongod實例或者副本集集羣,存放真實的數據

路由server

處理客戶端鏈接請求,路由到存放數據的分片server,合併分片server的數據,返回給客戶端

分片策略

支持類型

哈希分片

對分片key使用某種哈希算法,根據哈希值肯定數據插入哪一個分片server中

特色

數據離散性好,能均勻分佈在不一樣的分片server中
不適合根據範圍查詢的狀況


範圍分片

對分片key的值經過範圍肯定存儲的分片server

特色

數據離散性可能很差,可能會形成熱點數據在某個分片server中
適合範圍查詢的狀況

限制

分片key肯定後不能更改
分片key必須設置索引,若是不是,設置分片key時,mongod會自動建立

原則

1. 選擇值多樣性的key,儘量分散,避免數據文檔集中到某些分片server中
2. 考慮之後是否會數據分組,數據分組時分組key須要是分片key或者分片組合key的前綴
3. 選擇合適的分片類型,不一樣的分片類型適用的場景不同
4. 當必須選擇值重複頻率高的key時,能夠考慮選擇組合key

實踐

規劃

考慮到只是實踐使用,配置server副本集只用一臺,分片server副本集也只用一臺
1臺配置server: 127.0.0.1:27024(副本集集羣,集羣名:shardClusterCfgServerReplSet0)
1臺路由server: 127.0.0.1:27025
2臺分片server:127.0.0.1:27026(副本集集羣,集羣名:shardClusterShardServerReplSet0),127.0.0.1:27027(副本集集羣,集羣名:shardClusterShardServerReplSet1)

啓動配置server

sharding:
    clusterRole: configsvr
replication:
    replSetName: shardClusterCfgServerReplSet0

su -s /bin/bash -c "/usr/bin/mongod -f /etc/mongodb/27024.conf" mongod

rs.initiate(
  {
    _id: "shardClusterCfgServerReplSet0",
    configsvr: true,
    members: [
      { _id : 0, host : "127.0.0.1:27024" }
    ]
  }
)

  

啓動分片server

sharding:
    clusterRole: shardsvr
replication:
    replSetName: shardClusterShardServerReplSet0

su -s /bin/bash -c "/usr/bin/mongod -f /etc/mongodb/27026.conf" mongod
su -s /bin/bash -c "/usr/bin/mongod -f /etc/mongodb/27027.conf" mongod

rs.initiate(
  {
    _id: "shardClusterShardServerReplSet1",
    members: [
      { _id : 0, host : "127.0.0.1:27027" }
    ]
  }
)

  

啓動路由server

su -s /bin/bash -c "/usr/bin/mongos -f /etc/mongodb/27025.conf" mongod

增長或者移除分片最好停服操做,減小數據不一致的可能性
使用配置server用戶登陸mongos進行操做

#系統日誌配置
systemLog:
    destination: file
    path: /var/log/mongodb/mongod_27025.log
    logAppend: true
    #quiet模式運行,建議設置爲false,方便排查錯誤
    quiet: false 

#進程管理
processManagement:
    #進程後臺運行
    fork: true 
    #進程pid文件 
    pidFilePath: /var/log/mongodb/mongod_27025.pid 

#網絡配置
net:
    #監聽端口
    port: 27025 
    #監聽網卡 多個使用英文逗號隔開
    bindIp: 127.0.0.1 
    #最大併發鏈接數 默認65535
    maxIncomingConnections: 65535
    #驗證客戶端傳過來的數據,文檔嵌套多時,對性能會有些影響
    wireObjectCheck: true 
    #是否啓用ipv6,默認不啓用
    ipv6: false 
    unixDomainSocket:
        #是否啓用socket監聽 默認true
        enabled: true 
        #socket保存目錄,默認/tmp
        pathPrefix: /var/log/mongodb
        #socket文件權限,默認0700
        filePermissions: 0700 
    http:
        #是否啓用http服務,默認false,安全考慮線上環境要關閉
        enabled: false 
    compression:
        #是否啓用數據壓縮
        compressors: snappy

#安全配置
security:
    #type:string
    #密鑰路徑,副本集和分片集羣節點間受權時使用的密鑰
    keyFile: /var/log/mongodb/.replSetTest0Key

    #type:string 
    #集羣受權模式,默認keyFile,值列表:keyFile,sendKeyFile,sendX509,x509
    clusterAuthMode: keyFile 

#setParameter配置
setParameter:
    enableLocalhostAuthBypass: false 

#分片配置
sharding:
    #type:string
    #配置server,多個使用英文逗號分開
    configDB: shardClusterCfgServerReplSet0/127.0.0.1:27024

  

添加分片server

添加分片操做會觸發數據遷移,遷移過程當中對數據庫性能會有些影響
sh.addShard("shardClusterShardServerReplSet0/127.0.0.1:27026")
sh.addShard("shardClusterShardServerReplSet1/127.0.0.1:27027")

開啓數據庫分片

sh.enableSharding("test")

設置集合分片key

sh.shardCollection("test.people",{_id:1})

移除分片server

移除分片server前須要先遷移分區數據到其它分片,爲了保證整個集羣性能,遷移過程當中會佔用比較小的資源,網絡帶寬和數據量大小會影響遷移時間,
可能須要幾分鐘到幾天不等

移除步驟

step1 肯定遷移進程開啓
sh.getBalancerState()
返回true表示開啓

step2 肯定須要刪除分片的名字
db.adminCommand( { listShards : 1 } )
_id字段值爲分片名稱

step3 遷移分片數據到其它分片
db.adminCommand({removeShard:"shardClusterShardServerReplSet1"})

{
	"msg" : "draining started successfully",
	"state" : "started",
	"shard" : "shardClusterShardServerReplSet1",
	"note" : "you need to drop or movePrimary these databases",
	"dbsToMove" : [
		"test"
	],
	"ok" : 1
}

  

step4 查看遷移狀態
db.adminCommand({removeShard:"shardClusterShardServerReplSet1"})

{
	"msg" : "draining ongoing",
	"state" : "ongoing",
	"remaining" : {
		"chunks" : NumberLong(0),
		"dbs" : NumberLong(1)
	},
	"note" : "you need to drop or movePrimary these databases",
	"dbsToMove" : [
		"test"
	],
	"ok" : 1
}

  

step5 遷移未分片的數據
分片數據遷移完成後執行
返回的狀態列表字段remaining.chunks爲0時表示遷移完成
若是沒有未分片的數據庫,不須要執行這個步驟
返回的狀態列表有一個字段dbsToMove,這個字段的內容爲須要遷移的未分片的數據庫,不爲空時須要執行遷移操做
use admin
db.runCommand({movePrimary:"test", to:"shardClusterShardServerReplSet0"})
db.runCommand({flushRouterConfig:1})

step6 數據遷移完成確認
前面步驟都執行完成後執行
db.adminCommand({removeShard:"shardClusterShardServerReplSet1"})

{
	"msg" : "removeshard completed successfully",
	"state" : "completed",
	"shard" : "shardClusterShardServerReplSet1",
	"ok" : 1
}

  

集羣相關操做

鏈接mongos
mongo --host mongos_host --port mongos_port

查看狀態
sh.status()

顯示開啓分區的數據庫
use config
db.databases.find({partitioned:true})

顯示分片server列表
db.adminCommand( { listShards : 1 } )

查看數據遷移進程狀態
sh.getBalancerState()

 

備註

1. 第一次初始化時禁用權限判斷,添加好用戶以後再開啓
2. 增刪改只能在主節點操做
3. 集羣使用的密碼不能超過1K且只能是base64編碼字符集
4. keyFile文件權限不能開放給所在組成員和其餘組成員
5. 生成隨機密碼:openssl rand -base64 741


參考資料

【1】Replication
https://docs.mongodb.com/manual/replication/

【2】Read Preference
https://docs.mongodb.com/manual/core/read-preference/

【3】Replica Set Members
https://docs.mongodb.com/manual/core/replica-set-members/

【4】Replica Set Elections
https://docs.mongodb.com/manual/core/replica-set-elections/

【5】Replica Set Data Synchronization
https://docs.mongodb.com/manual/core/replica-set-sync/

【6】Replica Set Oplog
https://docs.mongodb.com/manual/core/replica-set-oplog/

【7】Replica Set Deployment Architectures
https://docs.mongodb.com/manual/core/replica-set-architectures/

【8】Mongo Shell - Replication Methods
https://docs.mongodb.com/manual/reference/method/js-replication/

【9】Deploy a Replica Set
https://docs.mongodb.com/manual/tutorial/deploy-replica-set/

【10】Replica Set Configuration
https://docs.mongodb.com/manual/reference/replica-configuration/

【11】Rollbacks During Replica Set Failover
https://docs.mongodb.com/manual/core/replica-set-rollbacks/

【12】Change the Size of the Oplog
https://docs.mongodb.com/manual/tutorial/change-oplog-size/

【13】Resync a Member of a Replica Set
https://docs.mongodb.com/manual/tutorial/resync-replica-set-member/

【14】Replication Reference
https://docs.mongodb.com/manual/reference/replication/

【15】Write Concern
https://docs.mongodb.com/manual/reference/write-concern/

【16】Read Isolation, Consistency, and Recency
https://docs.mongodb.com/manual/core/read-isolation-consistency-recency/

【17】Master Slave Replication
https://docs.mongodb.com/manual/core/master-slave/

【18】分片集羣
https://docs.mongodb.com/manual/sharding/

【19】分片-區域
https://docs.mongodb.com/manual/core/zone-sharding/

【20】分片-參考
https://docs.mongodb.com/manual/reference/sharding/

【21】分片-管理
https://docs.mongodb.com/manual/administration/sharded-cluster-administration/

【22】分片-均衡
https://docs.mongodb.com/manual/core/sharding-balancer-administration/

【23】分片-組件https://docs.mongodb.com/manual/core/sharded-cluster-components/

相關文章
相關標籤/搜索