1. 程式人生 > >windows下mongodb分片設定與叢集搭建

windows下mongodb分片設定與叢集搭建

   這裡簡單介紹一下windows下mongodb的分片設定和叢集搭建,希望能夠為迷茫的新手起到一點點作用。其實windows下與linux下思路是一致的,只是繫結時的ip,與埠號不同,linux下可以開三臺虛擬機器分別設定ip,然後通過埠號設定分片,叢集;windows下是通過黑視窗來執行的,當然只有一個本機ip:127.0.0.1,然後通過埠號的不同進行繫結。
   分片涉及到相關內容:首先要知道的是幾個名稱,路由伺服器:分配管理資料,應答客戶或者稱為mongos;分片伺服器:用於儲存資料;配置伺服器:用於儲存路由伺服器的資訊;分片伺服器與配置伺服器的資訊均儲存在記憶體中。
   實現描述:首先是要明確是先設定複製集還是分片,根據本人實驗結果是先搭建複製集然後將複製集作為分片的分片伺服器新增進去,再進行分片的設定。這樣就既可以快速讀取資料,又可以防止資料丟失。在黑視窗執行時,要保證所要求的不同磁碟下的資料夾存在。

一 複製集
1.片一:副本集 複製集 replcopy1 規劃:
叢集的IP分別為:127.0.0.1、127.0.0.1、127.0.0.1
叢集名字分別為:replcopy1

伺服器1111檔案地址:d:\mongo\shard1-1\data 埠號為:1111
伺服器1112檔案地址:d:\mongo\shard1-2\data 埠號為:1112
伺服器1113檔案地址:d:\mongo\shard1-3\data 埠號為:1113

2.分別啟動伺服器(黑視窗下執行)

mongod --dbpath d:\mongo\shard1-1\data --port 1111--bind_ip=127
.0.0.1 --replSet=replcopy1 mongod --dbpath d:\mongo\shard1-2\data --port 1112 --bind_ip=127.0.0.1 --replSet=replcopy1 mongod --dbpath d:\mongo\shard1-3\data --port 1113 --bind_ip=127.0.0.1 --replSet=replcopy1

3.初始化
mongo 127.0.0.1:1111(任意選擇客戶端進入)

config = {
      _id:"replcopy1",
       members:[{
        _id:1
, host:"127.0.0.1:1111" },{ _id:2, host:"127.0.0.1:1112" },{ _id:3, host:"127.0.0.1:1113" }] }

rs.initiate(config) #初始化
rs.conf() #檢視配置
rs.status() #檢視狀態

4.片二:副本集 複製集 replcopy2 規劃:
叢集的IP分別為:127.0.0.1、127.0.0.1、127.0.0.1
叢集名字分別為:replcopy
伺服器1111檔案地址:e:\mongo\shard2-1\data 埠號為:2222
伺服器1112檔案地址:e:\mongo\shard2-2\data 埠號為:2223
伺服器1113檔案地址:e:\mongo\shard2-3\data 埠號為:2224

5.分別啟動伺服器

mongod --dbpath e:\mongo\shard2-1\data --port 2222 --bind_ip=127.0.0.1 --replSet=replcopy2
mongod --dbpath e:\mongo\shard2-2\data --port 2223 --bind_ip=127.0.0.1 --replSet=replcopy2
mongod --dbpath e:\mongo\shard2-3\data --port 2224 --bind_ip=127.0.0.1 --replSet=replcopy2

6.初始化

mongo 127.0.0.1:2222

config = {
      _id:"replcopy2",
       members:[{
        _id:1,
host:"127.0.0.1:2222"
    },{
_id:2,
host:"127.0.0.1:2223"
    },{
_id:3,
host:"127.0.0.1:2224"
    }]
    }

rs.initiate(config) #初始化
rs.conf() #檢視配置
rs.status() #檢視狀態
rs.isMaster() #檢視是否是主節點

7.測試
在主庫中插入測試資料

show dbs
show collections
db.student.insert({name:"zhangsan"})
show collections
此時在從庫中查詢報如下錯誤,這是正常的現象,對於SECONDARY節點(從節點)預設是不可讀的。因為SECONDARY是不允許讀和寫的,在寫多讀少的應用中,使用Replica Sets來實現讀寫分離。通過在連線時指定或者在主庫指定slaveOk,由SECONDARY來分擔讀的壓力,PRIMARY(主節點)只承擔些操作。一般預設首先進行初始化操作的節點為選擇的主節點,其餘節點暫時為從節點。

8.讀寫分離的設定
在從結點上設定

rs.slaveOk()
db.getMongo().setSlaveOk()

在主庫上插入,即主節點
db.student.insert({name:"lisi"}) #寫操作

在從庫上查詢,即從節點
db.student.find() #讀操作
但是,在從節點上不能插入資料

9.故障轉移
斷掉主伺服器,用ctrl+c斷掉
用下面命令檢視
rs.status() #檢視狀態
rs.isMaster() #檢視是否是主節點
rs.conf() #檢視配置

記錄主從配置資訊內容:
切換至 use local

show collections
db.system.replset.find()

二 分片系統的實現
啟動路由伺服器
1叢集規劃
叢集的IP分別為:127.0.0.1、127.0.0.1、127.0.0.1、127.0.0.1
配置伺服器埠號:3333 IP:127.0.0.1 路徑:d:\mongo\data
路由伺服器埠號:4444 IP:127.0.0.1

分片伺服器1的埠號為: 1111 IP:127.0.0.1 路徑:e:\mongo\data
分片伺服器2的埠號為: 2222 IP: 127.0.0.1路徑: f:\mongo\data

2.開啟配置伺服器

mongod --dbpath d:\mongo\config\data --logpath d:\mongo\config\3333.log --port 3333 --bind_ip=127.0.0.1 --journal

3.開啟路由伺服器 mongos伺服器

mongos --port 4444 --bind_ip=127.0.0.1 --configdb 127.0.0.1:3333

4.啟動mongod分片伺服器(上面已經啟動過這裡不必再啟動)

mongod --dbpath d:\mongo\shard1-1\data --logpath d:\mongo\shard1-1\shard1-1.log --port 1111 --bind_ip=127.0.0.1
mongod --dbpath e:\mongo\shard2-1\data --logpath e:\mongo\shard2-1\shard2-1.log --port 2222 --bind_ip=127.0.0.1

5伺服器配置
client直接跟mongos打交道,也就說明我們要連線mongos伺服器,然後將1111,2222的mongod交給mongos,新增分片也就是addshard()
mongo 127.0.0.1:4444/admin必須是在admin下執行此操作

db.runCommand({addshard:"replcopy1/127.0.0.1:1111",allowLocal:true})
db.runCommand({addshard:"replcopy2/127.0.0.1:2222",allowLocal:true})

6.檢視整個叢集分片機制
在路由伺服器中執行

show dbs
use config
show collections
db.shards.find()

7.設定片鍵
片已經叢集了,但是mongos不知道該如何切分資料,也就是我們先前所說的片鍵,在mongodb中設定片鍵要做兩步
a.開資料分片功能,為資料庫test開啟分片功能

use admin
db.runCommand({"enablesharding":"test"})

b.對集合進行分片(片鍵即key決定了你的分片伺服器的資料分配,一般以_id為片鍵,1表示升序)

db.runCommand({"shardcollection":"test.goods","key":{"_id":1}})

8.測試,觀察效果

mongo 127.0.0.1:4444
use test

a.插入50W行資料

for(var i=0;i<500000;i++){
    db.goods.insert({id:i,name:"goods"+i})
}
db.goods.find()

b.分別在不同的庫中,觀察分片的集合的內容

mongo 127.0.0.1:1111
mongo 127.0.0.1:2222
use test
db.goods.find().count()
db.goods.stats()

c.檢視配置庫對於分片伺服器的配置儲存
在路由伺服器中執行

db.printShardingStatus()