windows下mongodb集群搭建


本文介紹在windows環境下如何搭建一個高可用性的mongodb集群。系統環境為win7,mongodb版本為3.6.3。

本文采用的是分片+副本集的方式搭建集群,將分別介紹如何使用副本集和分片來提高可用性。

一、副本集

mongodb的副本集是維護同一個數據集合的多個mongod進程的集合,提供了數據的冗余,提高了可用性,在某些情況下也可以提高讀容量。

mongodb官網相關文檔:https://docs.mongodb.com/manual/replication/

1.1副本集結構

副本集有三種角色,分別為主節點、副本節點和仲裁節點(可選)。

主節點具有完全的讀寫操作,並且只有主節點可以進行寫操作。

副本節點同步主節點的oplog,保持數據一致。

仲裁節點不保存數據副本,只在選舉主節點的投票中有投票權。

1.2部署副本集

這里介紹如何在測試或開發環境中部署副本集。

如果需要限制ip訪問,可以使用bind_ip或在mongod.cfg文件中配置。

mongod --bind_ip localhost,198.51.100.1

1.2.1創建必要文件夾

首先創建必要的文件夾,比如db文件夾,log文件夾。這里可以通過命令創建,也可以直接通過文件管理來創建。

1.2.2啟動mongod實例

分別對應的副本集節點啟動mongod實例,例如:

mongod --replSet rs0 --port 27017 --dbpath /data/db --logpath /data/log/mongod.log --smallfiles --oplogSize 128

replSet指定了副本集的名字,port指定了實例運行的端口,dbpath指定了數據庫存儲位置,logpath指定了日志存儲位置。

smallfiles和oplogSize的設定可以防止在測試或開發環境中占用太多資源。

1.2.3初始化副本集

通過mongo shell或者驅動程序連接到某一個mongod實例。

運行初始化副本集命令:

var rsconf = {
  _id: "rs0",
  members: [
    {
     _id: 0,
     host: "<hostname>:27017"
    },
    {
     _id: 1,
     host: "<hostname>:27018"
    },
    {
     _id: 2,
     host: "<hostname>:27019"
    }
   ]
}

rs.initiate(rsconf)

可以通過rs.conf(),rs.status()查看副本集狀態。

二、分片

分片將數據進行水平分割,提供了一種處理大數據量數據集合和高吞吐量的方式。

2.1分片群集結構

分片群集由三部分構成:

1.shard,存儲了分片數據,可部署成一個副本集。

2.mongos,路由器,連接客戶端和分片群集,使分片操作對客戶端透明。可部署成一個副本集。

3.config server,配置服務器,存儲元數據和配置數據。3.4以后必須部署成副本集。

2.2部署分片

2.2.1部署配置服務器副本集

和配置普通副本集唯一不同的是,部署配置服務器副本集需要指定角色為configsvr。

mongod --configsvr --port 27017 --replSet myconfig --dbpath /data/config --logpath /data/log/mongod.log --smallfiles --oplogSize 128

2.2.2部署分片服務器副本集

和配置普通副本集唯一不同的是,部署配置服務器副本集需要指定角色為shardsvr。

mongod --shardsvr --port 28017 --replSet myshard  --dbpath \data\db --logpath \data\log\mongod.log --smallfiles --oplogSize 128

2.2.3部署路由副本集

和配置普通副本集不同的是啟動的為mongos實例。

mongos --configdb myconfig/localhost:27017,localhost:27018,localhost:27019 --port 30000 --replSet mymongos --logpath /data/log/mongod.log

2.2.4添加分片

首先通過mongo shell或者驅動連接到mongos實例。

可以修改chunk大小:

use config
db.settings.save( { _id:"chunksize", value: 1 } )

將分片添加到mongos:

sh.addShard( "myshard/localhost:28017,localhost:28018")

2.2.5設置分片

設置數據庫分片:

sh.enableSharding("test")

設置集合分片:

分類分片,根據分片鍵的值范圍進行分片:

sh.shardCollection("test.users", { "username" : 1 } )

哈希分片,根據分片鍵的哈希值進行分片:

sh.shardCollection("test.users", { "username" : "hashed" } )

三、測試

操作mongos插入數據,查看自動分區結果。

var list = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n",
"o","p","q","r","s","t","u","v","w","x","y","z"];
for (var i = 0; i < 100000; i++){
var index = i % 26;
var user = {"username": list[index], "saysomething": "hello"};
db.getCollection("users").insert(user);
}

分片結果:

 

隨着數據插入量的增多,達到塊所能存儲的最大值后,會形成更多的塊:

在數據較少時,各分片之間的數據量差距可能較大。這種差距隨着數據量的增大會逐漸縮小,趨近於平衡。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM