摘要:復制一份,命名為,修改文件內(nèi)容如下注意改為我們第一步創(chuàng)建的目錄,端口號改為這個隨意,只要該端口沒被占用即可,表示這是一個配置服務器,另外由于我們的配置服務器要做成備份集,所以要設置。
分片是指將數(shù)據(jù)拆分,拆分后存放在不同的機器上的過程,以此來降低單個服務器的壓力,同時也解決單個服務器硬盤空間不足的問題,讓我們可以用廉價的機器實現(xiàn)高性能的數(shù)據(jù)架構(gòu)。有的小伙伴不理解分片和副本集的差異,一言以蔽之:副本集上每個備份節(jié)點存儲的數(shù)據(jù)都是相同的,分片上存儲的數(shù)據(jù)則是不同的。好了,本文我們就先來看看分片環(huán)境的搭建。
本文是MongoDB系列的第十八篇文章,了解前面的文章有助于更好的理解本文:
1.Linux上安裝MongoDB
2.MongoDB基本操作
3.MongoDB數(shù)據(jù)類型
4.MongoDB文檔更新操作
5.MongoDB文檔查詢操作(一)
6.MongoDB文檔查詢操作(二)
7.MongoDB文檔查詢操作(三)
8.MongoDB查看執(zhí)行計劃
9.初識MongoDB中的索引
10.MongoDB中各種類型的索引
11.MongoDB固定集合
12.MongoDB管道操作符(一)
13.MongoDB管道操作符(二)
14.MongoDB中MapReduce使用
15.MongoDB副本集搭建
16.MongoDB副本集配置
17.MongoDB副本集其他細節(jié)
準備三臺已經(jīng)裝好了MongoDB的服務器,地址分別是:
192.168.248.128 192.168.248.135 192.168.248.136
本文使用的MongoDB版本為3.4.9
規(guī)劃首先我們需要三臺配置服務器,配置服務器相當于集群的大腦,配置服務器中保存著集群和分片的元數(shù)據(jù),即每個分片都包含了哪些數(shù)據(jù)信息,這些數(shù)據(jù)都是保存在配置服務器中的,我這里將開啟三個配置服務器實例,這三個配置服務器將運行在三個MongoDB服務器上,地址分別如下:
192.168.248.128:20000 192.168.248.135:20000 192.168.248.136:20000
接下來需要一個Mongos實例,Mongos對請求進行路由,Mongos扮演的角色有點類似于一個門面,我們以后訪問的時候,直接訪問Mongos即可,再由Mongos將請求路由到不同的分片上去,Mongos在啟動時會去訪問配置服務器,它將從配置服務器中獲取數(shù)據(jù)的存儲信息,Mongos我將啟動在如下服務器上:
192.168.248.128:30000
最后需要三個分片實例,三個分片依然運行在三臺服務器上,如下:
192.168.248.128:27017 192.168.248.135:27017 192.168.248.136:27017搭建配置服務器
配置服務器中不需要太多的空間和資源,因為配置服務器上保存的只是數(shù)據(jù)的分布表,不保存具體的數(shù)據(jù),具體的數(shù)據(jù)都保存在分片上,配置服務器中1KB的空間約為200MB的真實數(shù)據(jù)。注意,從MongoDB3.4開始,配置服務器要做成集群的方式。
由于配置服務器是獨立的mongod進程,所以我們可以像啟動普通的MongoDB服務一樣啟動配置服務器,只是這里的配置不同罷了。
我這里以192.168.248.128服務器為例來講述配置服務器的配置啟動,另外兩臺服務器如法炮制即可:
1.在mongodb解壓目錄下創(chuàng)建db20000文件夾,用來存儲配置服務器中的數(shù)據(jù)。
2.復制一份mongodb.conf,命名為mongodb20000.conf,修改文件內(nèi)容如下:
dbpath=/opt/mongodb/db20000 logpath=/opt/mongodb/logs/mongodb20000.log port=20000 fork=true configsvr=true replSet=rs
注意dbpath改為我們第一步創(chuàng)建的目錄,端口號改為20000(這個隨意,只要該端口沒被占用即可),configsvr表示這是一個配置服務器,另外由于我們的配置服務器要做成備份集,所以要設置replSet。
3.做好前兩步之后,執(zhí)行如下命令啟動配置服務器:
mongod -f /opt/mongodb/bin/mongodb20000.conf
最后,在另外兩臺服務器上重復上面三個步驟。
三臺服務器上都啟動成功之后,參考我們之前的[MongoDB副本集搭建]()一文,將這三臺配置服務器配成一個副本集,副本集的配置我這里就不再贅述。
搭建MongosMongos實例我們可以啟動在任意一臺服務器上,我這里就啟動在192.168.248.128上,Mongos的配置步驟如下:
1.復制一份mongodb.conf,命名為mongos.conf,修改內(nèi)容:
logpath=/opt/mongodb/logs/mongos.log port=30000 fork=true configdb=rs/192.168.248.128:20000,192.168.248.135:20000,192.168.248.136:20000
因為mongos中不需要保存數(shù)據(jù),所以不需要dbpath,端口號改為30000,configdb表示三個配置服務器的地址,注意最前面的rs表示配置服務器副本集的名稱。
2.配置完成后,執(zhí)行如下命令啟動mongos:
mongos -f /opt/mongodb/bin/mongos.conf搭建三個分片
三個分片實際上就是三個普通的MongoDB服務器,給大家看下我的配置文件:
dbpath=/opt/mongodb/db logpath=/opt/mongodb/logs/mongodb.log port=27017 fork=true shardsvr=true
注意多了個shardsvr表示這是一個分片服務器。
然后在三臺服務器上分別執(zhí)行如下命令啟動分片:
mongod -f /opt/mongodb/bin/mongodb.conf添加分片
上面三個步驟完成之后,我們就進入到mongos的shell命令行了,如下:
mongo --port=30000
然后我們可以通過如下命令查看一下分片的當前狀態(tài):
sh.status()
執(zhí)行結(jié)果如下(部分):
--- Sharding Status --- sharding version: { } shards: databases:
shards表示分片服務器,目前還沒有,databases表示分片的庫,目前也還沒有,接下來我們通過如下命令添加分片服務器:
sh.addShard("192.168.248.128:27017") sh.addShard("192.168.248.135:27017") sh.addShard("192.168.248.136:27017")
添加三個分片服務器,然后再執(zhí)行sh.status(),結(jié)果如下(部分):
--- Sharding Status --- sharding version: { } shards: { "_id" : "shard0000", "host" : "192.168.248.128:27017", "state" : 1 } { "_id" : "shard0001", "host" : "192.168.248.135:27017", "state" : 1 } { "_id" : "shard0002", "host" : "192.168.248.136:27017", "state" : 1 } databases: { "_id" : "test", "primary" : "shard0000", "partitioned" : false }設置集合分片
接下來我們來設置集合的分片,首先執(zhí)行如下命令表示給某個數(shù)據(jù)庫分片:
sh.enableSharding("sang")
對集合分片時,需要選擇一個片鍵,片鍵實際上就是集合中的一個鍵,MongoDB將根據(jù)這個片鍵來拆分數(shù)據(jù),我們需要先對片鍵建立索引,如下:
db.c1.ensureIndex({x:1})
然后以x為片鍵,對c1集合進行分片,如下:
sh.shardCollection("sang.c1",{x:1})
做完這些之后,再執(zhí)行sh.status()命令,查看目前狀態(tài),結(jié)果如下(部分):
--- Sharding Status --- sharding version: { } shards: { "_id" : "shard0000", "host" : "192.168.248.128:27017", "state" : 1 } { "_id" : "shard0001", "host" : "192.168.248.135:27017", "state" : 1 } { "_id" : "shard0002", "host" : "192.168.248.136:27017", "state" : 1 } databases: { "_id" : "test", "primary" : "shard0000", "partitioned" : false } { "_id" : "sang", "primary" : "shard0001", "partitioned" : true } sang.c1 shard key: { "x" : 1 } unique: false balancing: true chunks: shard0001 1 { "x" : { "$minKey" : 1 } } -->> { "x" : { "$maxKey" : 1 } } on : shard0001 Timestamp(1, 0)
做完上面這些之后,我們再做兩個操作:
1.設置自動分片:
sh.setBalancerState(true)
2.設置chunksize,chunksize這一項是用來指定chunk的大小的,為了方便測試分片效果,我們把chunksize指定為1MB,即當這個分片中插入的數(shù)據(jù)大于1M時開始進行數(shù)據(jù)分片
db.settings.save({_id:"chunksize",value:1})
OK,做好這些之后,大功告成。
測試測試方式很簡單,我們直接在mongos的命令行向sang的c1集合中插入50000條數(shù)據(jù),然后再查看這些數(shù)據(jù)的分布,就知道分片有沒有成功了:
for(var i=0;i<50000;i++){db.c1.insert({x:Math.random()*1000000,name:"hahah"+i})}
然后執(zhí)行db.c1.stats(),結(jié)果如下:
{ "sharded" : true, "capped" : false, "ns" : "sang.c1", "count" : 50000, "size" : 2688890, "storageSize" : 1781760, "totalIndexSize" : 1978368, "avgObjSize" : 53, "nindexes" : 2, "nchunks" : 5, "shards" : { "shard0000" : { "ns" : "sang.c1", "size" : 926504, "count" : 17229, "avgObjSize" : 53, "storageSize" : 462848, "capped" : false, "nindexes" : 2, "totalIndexSize" : 516096, "indexSizes" : { "_id_" : 184320, "x_1" : 331776 }, "ok" : 1 }, "shard0001" : { "ns" : "sang.c1", "size" : 392593, "count" : 7299, "avgObjSize" : 53, "storageSize" : 667648, "capped" : false, "nindexes" : 2, "totalIndexSize" : 737280, "indexSizes" : { "_id_" : 253952, "x_1" : 483328 }, "ok" : 1 }, "shard0002" : { "ns" : "sang.c1", "size" : 1369793, "count" : 25472, "avgObjSize" : 53, "storageSize" : 651264, "capped" : false, "nindexes" : 2, "totalIndexSize" : 724992, "indexSizes" : { "_id_" : 237568, "x_1" : 487424 }, "ok" : 1 } } }
OK,看到如上結(jié)果,說明我們的數(shù)據(jù)已經(jīng)分布在三個分片服務器中了。
好了,MongoDB中分片環(huán)境的搭建我們就先說到這里,小伙伴們有問題歡迎留言討論。
參考資料:
1.《MongoDB權(quán)威指南第2版》
更多資料請關注公眾號:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/19160.html
摘要:開公眾號差不多兩年了,有不少原創(chuàng)教程,當原創(chuàng)越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權(quán)限問題前后端分離二使用完美處理權(quán)限問題前后端分離三中密碼加鹽與中異常統(tǒng)一處理 開公眾號差不多兩年了,有不少原創(chuàng)教程,當原創(chuàng)越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章! Spring Boo...
摘要:磕磕絆絆,我們的系列教程終于落下帷幕,從月第一篇開始到現(xiàn)在,中間有一段時間開小差,不過還好沒有爛尾。好了,這里我再把本系列的所有文章羅列出來,以供小伙伴們搜索查看。 磕磕絆絆,我們的MongoDB系列教程終于落下帷幕,從11月21第一篇開始到現(xiàn)在,中間有一段時間開小差,不過還好沒有爛尾。好了,這里我再把本系列的所有文章羅列出來,以供小伙伴們搜索查看。 1.Linux上安裝Mongo...
摘要:也可以修改查到的所有數(shù)據(jù),如下羅貫中三國演義刪可以刪除查到的一條數(shù)據(jù),如下羅貫中也可以刪除查到的所有數(shù)據(jù)羅貫中里邊還有其他的查詢條件,都是見名知意,不贅述。 之前我們介紹的MongoDB的操作都是在shell命令中寫的,在項目開發(fā)時我們當然都是用程序去操作MongoDB的,本文我們來看看如何用Java代碼操作MongoDB。 本文是MongoDB系列的第十九篇文章,了解前面的文章有...
閱讀 2043·2021-09-07 10:14
閱讀 1477·2019-08-30 15:53
閱讀 2269·2019-08-30 12:43
閱讀 2860·2019-08-29 16:37
閱讀 754·2019-08-26 13:29
閱讀 1999·2019-08-26 13:28
閱讀 437·2019-08-23 18:33
閱讀 3500·2019-08-23 16:09