標籤:dbn www. first 地址 following 重啟 記錄檔 instance stat
在MongoDB(版本 3.2.9)中,分區是指將collection分散儲存到不同的Server中,每個Server只儲存collection的一部分,服務分區的所有伺服器組成分區叢集。分區叢集(Sharded Clustered)的伺服器分為三中類型:Router(mongos),Config Server 和 Shard(Replica Set 或 Standalone mongod)。使用分區叢集,不需要使用強大的電腦,就能儲存更多的資料,處理更大的負載。分散式資料庫系統的設計目的是:水平分區,將負載分配到多台Server,減少單機查詢的負載。
一,設定管理員
config server 儲存分區的中繼資料,中繼資料套件括每個分區的塊(chunk)列表和每個chunk包含資料的範圍。路由服務區(Router)從config server上擷取分區的中繼資料,使用中繼資料將讀寫操作路由到正確的分區上。
The metadata includes the list of chunks on every shard and the ranges that define the chunks. The mongos instances cache this data and use it to route read and write operations to the correct shards.
config server的讀寫操作是非常少的,config server將分區的中繼資料存放區在config 資料庫中,只有當分區的中繼資料變化時,比如 chunk migration,chunk split,才會修改config server中的資料。只有在mongos 第一次啟動或重啟時,或者分區的中繼資料變化時,mongos才會讀取config server中的資料。mongos在讀取分區的中繼資料之後,會緩衝在本地。
Config servers store the cluster’s metadata in the config database. The mongos instances cache this data and use it to route reads and writes to shards. MongoDB only writes data to the config servers when the metadata changes, such as
- after a chunk migration, or
- after a chunk split.
MongoDB reads data from the config server in the following cases:
- A new mongos starts for the first time, or an existing mongos restarts.
- After change in the cluster metadata, such as after a chunk migration.
實際上,config server是mongod,只不過設定 --configsvr 選項。
--configsvr 指定mongod作為一個config server
二,mongos 路由伺服器
mongos 為MongoDB提供路由服務,處理從application layer發送的查詢請求,定位元據所在的分區,對分區上的查詢結果進行combine,以完成分布式資料查詢。從Application來看,mongos擔當的角色是一個MongoDB Instance,隱藏了從分區上query和combine資料的複雜過程。
mongos 的重要參數
--config <filename>, -f <filename> 指定mongos 啟動並執行參數
--configdb 指定config server列表,格式是:config-svr:port,config-svr:port
--chunkSize 指定data block的大小,單位是MB,預設值是64
--port 指定mongos 監聽的TCP的連接埠號碼,預設值是27017
--logpath 指定mongos 記錄日誌的路徑,預設情況下,MongoDB將現存的記錄檔重新命名,而不是重寫。By default, MongoDB will move any existing log file rather than overwrite it. To instead append to the log file, set the --logappend option.
三,搭建分區叢集
1,Shard
分區(Shard)用於儲存資料,可以是Replica Set,也可以是Standalone,由於每個Shard都儲存collection的一部分資料,如果shard 出現故障,那麼collection就會變得不完整。在產品環境中,每一個shard都是一個replica set。
2,config server
config server 儲存著每個分區和資料之間的映射,即資料存放區在哪個分區上,或者說,每個分區上儲存哪些資料,一個doc只能儲存在一個分區上。分區的中繼資料極端重要,必須為config server 啟用日誌功能,確保中繼資料儲存到disk中。最好使用3台config server,每台config server都應該位於單獨的物理機上,最好是分布在不同地理位置的機器。
建立三台config server:cfg-srv1,cfg-svr2,cfg-svr3,其設定檔分別位於:
- cfg-svr1,C:\data\config\cfgsvr_1.conf
- cfg-svr2,C:\data\config\cfgsvr_2.conf
- cfg-svr3,C:\data\config\cfgsvr_3.conf
--config server 1dbpath=C:\data\configlogpath=C:\data\config\cfgsvr_1.logjournal=trueport=50001configsvr=true--config server 2dbpath=C:\data\configlogpath=C:\data\config\cfgsvr_2.logjournal=trueport=50002configsvr=true--config server 3dbpath=C:\data\configlogpath=C:\data\config\cfgsvr_3.logjournal=trueport=50003configsvr=true
啟動 config server,啟動設定管理員時,不要使用--replset參數,config server不是replica set;--configsvr 參數指定mongod為config server。
--config server 1mongod -f C:\data\config\cfgsvr_1.conf
--config server 2mongod -f C:\data\config\cfgsvr_2.conf
--config server 3mongod -f C:\data\config\cfgsvr_3.conf
3,Router
mongos是路由伺服器(Router),mongos需要config server的地址清單,通過--configdb 指定 router 能夠訪問的 config server列表。mongos 不儲存資料,不需要指定dbpath參數,mongos在啟動時從config server載入叢集資料,可以啟動任意數量的mongos,每個mongos使用相同的config server 列表。
在router-svr1 上建立mongos,將配置文檔儲存在C:\data\mongos\cfg_mongos.conf,使用--port 參數指定mongos 進程監聽的連接埠。
--mongos 1
logpath=C:\data\mongos\mongos_log.logport=60001configdb=cfg-svr1:50001,cfg-svr2:50002,cfg-svr2:50003
啟動mongos
mongos -f C:\data\mongos\cfg_mongos.conf
四,增加Shard
1,串連到mongos
mongo --host router-svr1 --port 60001
查看分區的狀態,分區叢集中並沒有任何一個shard
sh.status()
2,增加Shard
每一個shard 用於儲存資料的一個分區,儲存資料的Server可以是Replica Set,也可以是Standalone mongod。
為分區叢集增加一個Replica Set 分區
sh.addShard("replica_set_name/host:port")
為分區叢集增加一個Standalone mongod
sh.addShard("host:port")
3,使資料庫啟用分區儲存
sh.enableSharding("database name")
4,使資料庫中的一個集合啟用分區儲存
在將collection啟用分區儲存之前,必須在collection上建立單鍵或雙鍵index。
db.collection_name.createIndex({field:1})sh.shardCollection("dbname.collection_name",{field:1})
5,向集合中插入,MongoDB將自動管理分區
db.collection_name.insert({....})
Application串連mongos,寫入或讀取資料,由mongos 路由到相應的shard,這個過程是自動完成的。
參考文檔:
Sharded Cluster Administration
Sharding
MongoDB - Sharding
MongoDB 搭建分區叢集