基於分片和複製集的三節點mongodb叢集
阿新 • • 發佈:2019-01-05
使用mongo的自動分片和複製集的功能搭建mongodb三節點叢集,每個節點都執行三個分片伺服器程序,一個路由伺服器和配置伺服器,該架構叢集可以實現容錯性,正常情況下客戶端連線路由伺服器,路由伺服器沒有主次之分,連線哪一臺伺服器的路由伺服器都可以,路由伺服器根據配置伺服器找到相應分片伺服器組成的複製集的主節點,如果是查詢操作主節點就把任務發放給從庫,如果是寫操作就會把資料寫在主節點的主庫,並及時更新從庫的內容從而達到資料的一致性。如果出現主節點宕機或者主節點不可達,mongodb複製集的自動故障轉移在這時就發揮了作用,仲裁者選舉從節點為主節點,這一過程對客戶端來說是透明的,客戶端依舊可以獲得想要的資料。使用jsp技術搭建web系統連線資料庫實現查詢的功能。
(a)配置環境
centos5.7.i586
mongodb-linux-i686-3.0.12.tgz
(b)配置指令碼
#分別在每臺機器建立mongos 、config 、 shard1 、shard2、shard3 五個目錄。
因為mongos不儲存資料,只需要建立日誌檔案目錄即可。
劃5個元件對應的埠號,由於一個機器需要同時部署 mongos、config server 、shard1、shard2、shard3,所以需要用埠進行區分。
這個埠可以自由定義,在本文 mongos為 20000, config server 為 21000, shard1為 22001 , shard2為22002, shard3為22003.
#建立目錄
mkdir shard1data
mkdir configdata
mkdir shard1data
mkdir shard2data
mkdir shard3data
#在每一臺伺服器分別啟動配置伺服器
mongod --configsvr --dbpath configdata --port 21000 --logpath ./log/config.log --logappend --fork
在每一臺伺服器分別啟動mongos伺服器。
mongos --configdb 192.168.169.100:21000,192.168.169.101:21000,192.168.169.102:21000 --port 27020 --logpath ./log/mongos.log --logappend --fork
配置各個分片的副本集。
#在每個機器裡分別設定分片1伺服器及副本集shard1
mongod --shardsvr --replSet shard1 --port 22001 --dbpath shard1data --logpath ./log/shard1.log --logappend --fork
#在每個機器裡分別設定分片2伺服器及副本集shard2
mongod --shardsvr --replSet shard2 --port 22002 --dbpath shard2data --logpath log/shard2.log --logappend --fork
#在每個機器裡分別設定分片3伺服器及副本集shard3
mongod --shardsvr --replSet shard3 --port 22003 --dbpath shard3data --logpath log/shard3.log --logappend --fork
任意登陸一個機器,比如登陸192.168.0.136,連線mongodb
#設定第一個分片副本集
mongo 127.0.0.1:22001
#使用admin資料庫
use admin
#定義副本集配置
config = { _id:"shard1", members:[
{_id:0,host:"192.168.169.100:22001"},
{_id:1,host:"192.168.169.101:22001"},
{_id:2,host:"192.168.169.102:22001",arbiterOnly:true}
]
}
#初始化副本集配置
rs.initiate(config);
#設定第二個分片副本集
mongo 127.0.0.1:22002
#使用admin資料庫
use admin
#定義副本集配置
config = { _id:"shard2", members:[
{_id:0,host:"192.168.169.100:22002"},
{_id:1,host:"192.168.169.101:22002"},
{_id:2,host:"192.168.169.102:22002",arbiterOnly:true}
]
}
#初始化副本集配置
rs.initiate(config);
#設定第三個分片副本集
mongo 127.0.0.1:22003
#使用admin資料庫
use admin
#定義副本集配置
config = { _id:"shard3", members:[
{_id:0,host:"192.168.169.100:22003"},
{_id:1,host:"192.168.169.101:22003"},
{_id:2,host:"192.168.169.102:22003",arbiterOnly:true}
]
}
始化副本集配置
rs.initiate(config);
目前搭建了mongodb配置伺服器、路由伺服器,各個分片伺服器,不過應用程式連線到 mongos 路由伺服器並不能使用分片機制,還需要在程式裡設定分片配置,讓分片生效。
#連線到mongos
mongo 127.0.0.1:20000
#使用admin資料庫
user admin
#串聯路由伺服器與分配副本集1
db.runCommand( { addshard : "shard1/192.168.169.100:22001,192.168.169.101:22001,192.168.169.102:22001"});
#串聯路由伺服器與分配副本集2
db.runCommand( { addshard : "shard2/192.168.169.100:22002,192.168.169.101:22002,192.168.169.102:22002"});
#串聯路由伺服器與分配副本集3
db.runCommand( { addshard : "shard3/192.168.169.100:22003,192.168.169.101:22003,192.168.169.102:22003"});
#檢視分片伺服器的配置
db.runCommand( { listshards : 1 } );
目前配置服務、路由服務、分片服務、副本集服務都已經串聯起來了,但我們的目的是希望插入資料,資料能夠自動分片,就差那麼一點點,一點點。。。
連線在mongos上,準備讓指定的資料庫、指定的集合分片生效。
#指定nyist分片生效
sh.enableSharding("nyist")
#指定資料庫裡需要分片的集合和片鍵
sh.shardCollection("nyist.weather",{nian:1})
我們設定testdb的 table1 表需要分片,根據 id 自動分片到 shard1 ,shard2,shard3 上面去。要這樣設定是因為不是所有mongodb 的資料庫和表 都需要分片!
db.weather.stats();