這里簡單介紹一下windows下mongodb的分片設置和集群搭建,希望能夠為迷茫的新手起到一點點作用。其實windows下與linux下思路是一致的,只是綁定時的ip,與端口號不同,linux下可以開三台虛擬機分別設置ip,然后通過端口號設置分片,集群;windows下是通過黑窗口來運行的,當然只有一個本機ip:127.0.0.1,然后通過端口號的不同進行綁定。
分片涉及到相關內容:首先要知道的是幾個名稱,路由服務器:分配管理數據,應答客戶或者稱為mongos;分片服務器:用於存儲數據;配置服務器:用於存儲路由服務器的信息;分片服務器與配置服務器的信息均存儲在內存中。
實現描述:首先是要明確是先設置復制集還是分片,根據本人實驗結果是先搭建復制集然后將復制集作為分片的分片服務器添加進去,再進行分片的設置。這樣就既可以快速讀取數據,又可以防止數據丟失。在黑窗口運行時,要保證所要求的不同磁盤下的文件夾存在。
復制集:
Mongodb復制集由一組Mongod實例(進程)組成,包含一個Primary節點和多個Secondary節點,Mongodb Driver(客戶端)的所有數據都寫入Primary,Secondary從Primary同步寫入的數據,以保持復制集內所有成員存儲相同的數據集,提供數據的高可用。
分片:
分片集群(sharded cluster)是一種水平擴展數據庫系統性能的方法,能夠將數據集分布式存儲在不同的分片(shard)上,每個分片只保存數據集的一部分,MongoDB保證各個分片之間不會有重復的數據,所有分片保存的數據之和就是完整的數據集。分片集群將數據集分布式存儲,能夠將負載分攤到多個分片上,每個分片只負責讀寫一部分數據,充分利用了各個shard的系統資源,提高數據庫系統的吞吐量。
集群的三種方式:
①Replica Set(副本集/復制集)
集群中包含多份數據,當主節點故障,備用節點能繼續提供服務。
- 高可用(主要目標):當一個結點故障時自動切換到其他結點;
- 數據冗余(主要目標):數據復制到n個結點上,增加數據安全性,同時為高可用提供基礎;
- 功能隔離(次要目標):使用不同的結點隔離某些有特殊需求的功能,比如使用一個結點進行OLAP運算(大規模資源占用),使用一個結點在遠程做災備(性能要求不如本地高),讀寫分離等等;
副本集有三種角色,分別為主節點、副本節點和仲裁節點(可選)。
主節點具有完全的讀寫操作,並且只有主節點可以進行寫操作。
副本節點同步主節點的oplog,保持數據一致。
仲裁節點不保存數據副本,只在選舉主節點的投票中有投票權。
②Sharded Cluster(分片集):
分片集主要優勢在於:
- 水平擴展:當一台服務器滿足不了需求的時候,我們可以選擇垂直擴展(增加服務器硬件),它雖然簡單,但很容易達到極限,並且面臨成本高等明顯缺點。成本更低的方式是使用n台服務器組成集群來滿足系統需求。這就是分片集的主要設計目標;
- 縮短響應時間:因為可以把數據分散到多台服務器上,自然每台服務器的處理壓力減小,處理時間就會縮短;
這里會出現一個問題:假設每台服務器出故障的機率是x%
,那么n
台服務器有一台出現故障的機率就是x% * n
,如果不做高可用設計,集群出現故障的概率就會隨機器數量成正比增長,這在工程上是不能接受的。幸運的是我們已經有了解決高可用的方案,也就是復制集。所以MongoDB的分片集群要求每一個片都是復制集(當然測試環境也可以使用單結點,生產環境不推薦)。
分片群集由三部分構成:
1.shard,存儲了分片數據,可部署成一個副本集。
2.mongos,路由器,連接客戶端和分片群集,使分片操作對客戶端透明。可部署成一個副本集。
3.config server,配置服務器,存儲元數據和配置數據。3.4以后必須部署成副本集。
③Master-Slaver(官方不推薦):
主備節點方式,只能從Master復制數據到Slave,並不提供高可用,一旦Master結點出故障就比較難處理。
教程:
https://blog.csdn.net/bfdnmy/article/details/51842217
集群環境測試,因服務器有限,使用一台服務器進行分片集群(每一個片都是復制集);
Mongdb 安裝這里不在贅述。直接開始布置集群環境。
首先,建立服務器文件地址:
這里我們分為2片,復制集三個節點。
IP地址:192.168.168.185(片及復制集均可分服務器存放,最多存在6個ip,測試時采用一台服務器進行環境搭建)
片1:
集群(復制集)名稱:replcopy1
集群IP:192.168.168.185(服務器1-1)、192.168.168.185(服務器1-2)、192.168.168.185(服務器1-3)
服務器1-1數據存放地址:C:\WindaTest\mongodb-3.6.4\mongodb\shared1-1\data 端口號:1111
服務器1-2數據存放地址:C:\WindaTest\mongodb-3.6.4\mongodb\shared1-2\data 端口號:1112
服務器1-3數據存放地址:C:\WindaTest\mongodb-3.6.4\mongodb\shared1-3\data 端口號:1113
片2:
集群(復制集)名稱:replcopy2
集群IP:192.168.168.185(服務器2-1)、192.168.168.185(服務器2-2)、192.168.168.185(服務器2-3)
服務器2-1數據存放地址:C:\WindaTest\mongodb-3.6.4\mongodb\shared=2-1\data 端口號:2221
服務器2-2數據存放地址:C:\WindaTest\mongodb-3.6.4\mongodb\shared2-2\data 端口號:2222
服務器2-3數據存放地址:C:\WindaTest\mongodb-3.6.4\mongodb\shared2-3\data 端口號:2223
1、分別啟動服務器,以分片1為例:
mongod --port 1111 --bind_ip=192.168.168.185 --shardsvr --dbpath C:\WindaTest\mongodb-3.6.4\mongodb\shared1-1\data --replSet=replcopy1
mongod --port 1112 --bind_ip=192.168.168.185 --shardsvr --dbpath C:\WindaTest\mongodb-3.6.4\mongodb\shared1-2\data --replSet=replcopy1
mongod --port 1113 --bind_ip=192.168.168.185 --shardsvr --dbpath C:\WindaTest\mongodb-3.6.4\mongodb\shared1-3\data --replSet=replcopy1
開三個cmd窗口分別執行:
2、初始化
任意進入一台復制集
mongo 192.168.168.185:1111
(任意選擇客戶端進入)
設置配置:
config = {
_id:"replcopy1",
members:[{
_id:1,host:"192.168.168.185:1111"
},{
_id:2,
host:"192.168.168.185:1112"
},{
_id:3,
host:"192.168.168.185:1113"
}]
}
rs.initiate(config)
#初始化
rs.conf()
#查看配置
rs.status()
#查看狀態
rs.isMaster()
#查看是否是主節點
同理,將片2一樣啟動:
mongod --port 2221 --bind_ip=192.168.168.185 --shardsvr --dbpath C:\WindaTest\mongodb-3.6.4\mongodb\shared2-1\data --replSet=replcopy2
mongod --port 2222 --bind_ip=192.168.168.185 --shardsvr --dbpath C:\WindaTest\mongodb-3.6.4\mongodb\shared2-2\data --replSet=replcopy2
mongod --port 2223 --bind_ip=192.168.168.185 --shardsvr --dbpath C:\WindaTest\mongodb-3.6.4\mongodb\shared2-3\data --replSet=replcopy2
mongo 192.168.168.185:2221
config = {
_id:"replcopy2",
members:[{
_id:1,
host:"192.168.168.185:2221"
},{
_id:2,
host:"192.168.168.185:2222"
},{
_id:3,
host:"192.168.168.185:2223"
}]
}
rs.initiate(config)
#初始化
rs.conf()
#查看配置
rs.status()
#查看狀態
rs.isMaster()
#查看是否是主節點
以片2為例:
在主節點2221端口服務器,插入數據:
show dbs
show collections
db.student.insert({name:"zhangsan"})
show collections
設置從節點讀寫分離:
登錄某從節點,設置該節點為從節點。
rs.slaveOk()
db.getMongo().setSlaveOk()
不設置的話,無法查詢主節點上的數據。這里以端口號為2222的服務器為例:
當未進行設置時,無權對數據進行操作
設置完之后:
注意:從節點只有讀的權限。
查看當前服務器狀態:
用下面命令查看
rs.status()
#查看狀態
rs.isMaster()
#查看是否是主節點
rs.conf()
#查看配置
可以看到當前節點不是主節點。
故障轉移測試:
依舊以片2服務器復制集為例,我們斷掉主節點,ctr+c停止端口為2221的mongo運行(注意不是關閉cmd窗口)
關掉之后我們再來查看端口為2222的服務器狀態:
看到主節點變成2223了,故障轉移是成功的,數據保存在了2223中。
片集建立好之后,開始建立分片系統;
1、服務器信息
配置服務器:
端口號:3333
IP:192.168.168.185
路徑:C:\WindaTest\mongodb-3.6.4\config_server
路由服務器:
端口號:4444
IP:192.168.168.185
分片服務器1:
端口號為: 1111
IP:192.168.168.185
分片服務器2:
端口號為: 2222
IP: 192.168.168.185
2、開啟配置服務器(這一步高版本有問題,往后翻;低於3.4版本可正常)
mongod --dbpath C:\WindaTest\mongodb-3.6.4\config_server\data --logpath C:\WindaTest\mongodb-3.6.4\config_server\3333.log --port 3333 --bind_ip=192.168.168.185 –journal
開啟之后頁面無任何變化,可以查看日志,服務器已經開啟成功。
3、開啟路由服務器
mongos --port 4444 --bind_ip=192.168.168.185 --configdb 192.168.168.185:3333
出錯:
此時這里報錯,查到資料
高版本的mongo要求config server必須是集群模式,不能單點,包括配置和訪問都會涉及這點,與舊版不同。
既然如此,重新配置配置服務器,第二步重新配置:
mongod --port 3331 --bind_ip=192.168.168.185 --shardsvr --dbpath C:\WindaTest\mongodb-3.6.4\config_server\share1\data --configsvr --replSet=conf
mongod --port 3332 --bind_ip=192.168.168.185 --shardsvr --dbpath C:\WindaTest\mongodb-3.6.4\config_server\share2\data --configsvr --replSet=conf
mongod --port 3333 --bind_ip=192.168.168.185 --shardsvr --dbpath C:\WindaTest\mongodb-3.6.4\config_server\share3\data --configsvr --replSet=conf
mongo 192.168.168.185:3331
config = {_id:"conf", members:[
{_id:0, host:"192.168.168.185:3331"},
{_id:1, host:"192.168.168.185:3332"},
{_id:2, host:"192.168.168.185:3333"}
]
};
rs.initiate(config);
以上不會操作的話,參照片1配置開啟即可。
現在開始重新開啟路由服務器:
mongos --port 4444 --bind_ip 192.168.168.185 --shardsvr --logpath C:\WindaTest\mongodb-3.6.4\mongos\mongos.log --configdb --replSet/conf/192.168.168.185:3331,192.168.168.185:3332,192.168.168.185:3333
這里需要注意的點就是高版本必須增加參數--configdb --replSet/conf/,即必須指定復制集。
同樣,路由服務器開啟之后仍然沒有任何反應,可通過日志判斷,路由服務開啟成功。
服務器配置,添加分片集,client直接跟mongos打交道,也就說明我們要連接mongos服務器,然后將1111,2222的mongod交給mongos,添加分片也就是addshard()
1、首先保證分片集已經全部啟動。
2、mongo 192.168.168.185:4444/admin
必須是在admin下執行此操作
添加分片集:
db.runCommand({addshard:"replcopy1/192.168.168.185:1111",allowLocal:true})
db.runCommand({addshard:"replcopy2/192.168.168.185:2221",allowLocal:true})
3、查看整個集群分片機制
在路由服務器中執行
show dbs
use config
show collections
db.shards.find()
4、設置片鍵
片已經集群了,但是mongos不知道該如何切分數據,也就是我們先前所說的片鍵,在mongodb中設置片鍵要做兩步
①.開數據分片功能,為數據庫test打開分片功能
use admin
db.runCommand({"enablesharding":"test"})
②對集合進行分片(片鍵即key決定了你的分片服務器的數據分配,一般以_id為片鍵,1表示升序)
db.runCommand({"shardcollection":"test.goods","key":{"_id":1}})
5、測試,觀察效果
mongo 192.168.168.185:4444
use test
①插入50W行數據
for(var i=0;i<500000;i++){
db.goods.insert({id:i,name:"goods"+i})
}
插入數據時,有可能會報錯:
出問題的狀況可能有很多種,檢查一遍之后發現,片2的192.168.168.185:2221不是主節點,將2221端口mongo更改為主節點之后,插入成功(設置主節點沒有找到有效方法,將其他兩個節點關閉再重新開啟,2221會自動變為主節點)
后來發現設置主節點了也沒有用,將所有的分片重新啟動,啟動的時候加上參數-shardsvr即可:
mongod --shardsvr --dbpath C:\WindaTest\mongodb-3.6.4\mongodb\shared1-1\data --port 1111 --bind_ip=192.168.168.185 --replSet=replcopy1
(刪除數據庫:(先切換到要刪除的數據庫 use dbname)
db.dropDatabase()
)
db.goods.find()
②分別在不同的庫中,觀察分片的集合的內容
mongo 192.168.168.185:1111 mongo 192.168.168.185:2222(鏈接主節點) use test db.goods.find().count() db.goods.stats()
③
查看配置庫對於分片服務器的配置存儲
在路由服務器中執行
db.printShardingStatus()
將Mongo封為windows服務啟動:
片集1:
mongod --config C:\WindaTest\mongodb-3.6.4\mongodb\shared1-1\mongo.config --install --serviceName "Shared11"
mongod --config C:\WindaTest\mongodb-3.6.4\mongodb\shared1-2\mongo.config --install --serviceName "Mongo_Shared1_2"
mongod --config C:\WindaTest\mongodb-3.6.4\mongodb\shared1-3\mongo.config --install --serviceName "Mongo_Shared1_3"
片集2:
mongod --config C:\WindaTest\mongodb-3.6.4\mongodb\shared2-1\mongo.config --install --serviceName "Mongo_Shared2_1"
mongod --config C:\WindaTest\mongodb-3.6.4\mongodb\shared2-2\mongo.config --install --serviceName "Mongo_Shared2_2"
mongod --config C:\WindaTest\mongodb-3.6.4\mongodb\shared2-3\mongo.config --install --serviceName "Mongo_Shared2_3"
配置服務器集群:
mongod --config C:\WindaTest\mongodb-3.6.4\config_server\share1\mongo.config --install --serviceName "Mongo_Shared3_1"
mongod --config C:\WindaTest\mongodb-3.6.4\config_server\share2\mongo.config --install --serviceName "Mongo_Shared3_2"
mongod --config C:\WindaTest\mongodb-3.6.4\config_server\share3\mongo.config --install --serviceName "Mongo_Shared3_3"