1. 程式人生 > >mongodb在副本集的基礎上進行分片儲存·

mongodb在副本集的基礎上進行分片儲存·

1)架構圖:

 

2)四個元件:mongos、config server、shard、replica set

mongos,資料庫叢集請求的入口,所有的請求都通過mongos進行協調,不需要在應用程式新增一個路由選擇器,mongos自己就是一個請求分發中心,它負責把對應的資料請求請求轉發到對應的shard伺服器上。在生產環境通常有多mongos作為請求的入口,防止其中一個掛掉所有的mongodb請求都沒有辦法操作。

config server,顧名思義為配置伺服器,儲存所有資料庫元資訊(路由、分片)的配置。

Shard,和大資料儲存HDFS分片儲存的思想的東西。

Replica set

,副本集伺服器。

3)準備環境:

ip:192.168.30.243
ip:192.168.30.126
ip:192.168.30.9

4)在每臺機器上建立mongos、config、shard1、shard2、shard3五個目錄。

複製程式碼
#建立mongos目錄
mkdir -p /data/mongodbtest/mongos
#建立config server 資料檔案存放目錄
mkdir -p /data/mongodbtest/config/data 
#建立config server 日誌檔案存放目錄
mkdir -p /data/mongodbtest/config/log
#建立config server 日誌檔案存放目錄
mkdir 
-p /data/mongodbtest/mongos/log #建立shard1 資料檔案存放目錄 mkdir -p /data/mongodbtest/shard1/data #建立shard1 日誌檔案存放目錄 mkdir -p /data/mongodbtest/shard1/log #建立shard2 資料檔案存放目錄 mkdir -p /data/mongodbtest/shard2/data #建立shard2 日誌檔案存放目錄 mkdir -p /data/mongodbtest/shard2/log #建立shard3 資料檔案存放目錄 mkdir -p /data/mongodbtest/shard3/data #建立shard3 日誌檔案存放目錄 mkdir
-p /data/mongodbtest/shard3/log cd /data/mongodbtest
複製程式碼

5)安裝mongodb

這裡不多說了,看上個文章,還是在/data/mongodbtest/single裡

6)規劃5個元件對應的埠號,由於一個機器需要同時部署 mongos、config server 、shard1、shard2、shard3,所以需要用埠進行區分。

這個埠可以自由定義,在本文 mongos為 20000, config server 為 21000, shard1為 22001 , shard2為22002, shard3為22003.

引數說明:

dbpath:資料存放目錄
logpath:日誌存放路徑 logappend:以追加的方式記錄日誌
replSet:replica set 的名字
port:mongodb 程序所使用的埠號,預設為 27017 fork:以後臺方式執行程序

journal:寫日誌
smallfiles:當提示空間不夠時新增此引數
其他引數
pidfilepath:程序檔案,方便停止 mongodbdirectoryperdb:為每一個數據庫按照資料庫名建立資料夾存放 bind_ip:mongodb 所繫結的 ip 地址
oplogSize:mongodb 操作日誌檔案的最大大小。單位為 Mb,預設為硬碟剩餘空間的 5%
noprealloc:不預先分配儲存
shardsvr:分片
configsvr:配置服務節點
configdb:配置 config 節點到 route 節點

7)在每臺機器上啟動配置伺服器

 ./mongod --dbpath /data/mongodbtest/config/data/ --configsvr  --port 29000 --logpath /data/mongodbtest/config/log/config4.log --fork
about to fork child process, waiting until server is ready for connections.
forked process: 5693
child process started successfully, parent exiting

8)在每臺伺服器上啟動mongos伺服器

/data/mongodbtest/single/mongodb/bin/mongos --configdb 192.168.30.134:21000,192.168.30.132:21000,192.168.30.131:21000 --port 20000 --logpath /data/mongodbtest/mongos/log/mongos.log –fork

但是在啟動mongos的時候遇到這個問題

FailedToParse: mirrored config server connections are not supported; for config server replica sets be sure to use the replica set connection string
try './mongos --help' for more information

也就是說mongos只能和副本集主節點來進行連線

於是我決定先建立副本集,分別在三臺伺服器上執行以下命令,建立副本集。

9)配置各個分片的副本集

#在每個機器裡分別設定分片1伺服器及副本集shard1

/data/mongodbtest/single/mongodb/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath /data/mongodbtest/shard1/data --logpath /data/mongodbtest/shard1/log/shard1.log --fork -nojournal --oplogSize 10

#在每個機器裡分別設定分片2伺服器及副本集shard2

/data/mongodbtest/single/mongodb/bin/mongod --shardsvr --replSet shard2 --port 22002 --dbpath /data/mongodbtest/shard2/data --logpath /data/mongodbtest/shard2/log/shard2.log --fork -nojournal --oplogSize 10

#在每個機器裡分別設定分片3伺服器及副本集shard3

/data/mongodbtest/single/mongodb/bin/mongod --shardsvr --replSet shard3 --port 22003 --dbpath /data/mongodbtest/shard3/data --logpath /data/mongodbtest/shard3/log/shard3.log --fork -nojournal --oplogSize 10

任意登陸一個機器,比如登陸192.168.30.131,連線mongodb

複製程式碼
#設定第一個分片副本集
/data/mongodbtest/single/mongodb/bin/mongo 127.0.0.1:22001
> use admin;
switched to db admin
#定義副本集配置
>config={_id:"shard1",members:[
... {_id:0,host:"192.168.30.131:22001"},
... {_id:1,host:"192.168.30.132:22001"},
... {_id:2,host:"192.168.30.134:22001",arbiterOnly:true}]#指定仲裁節點
... }
{
         "_id" : "shard1",
         "members" : [
                   {
                            "_id" : 0,
                            "host" : "192.168.30.131:22001"
                   },
                   {
                            "_id" : 1,
                            "host" : "192.168.30.132:22001"
                   },
                   {
                            "_id" : 2,
                            "host" : "192.168.30.134:22001",
                            "arbiterOnly" : true
                   }
         ]
}
#初始化副本集配置
>rs.initiate(config); 
#設定第二個分片副本集
/data/mongodbtest/single/mongodb/bin/mongo 127.0.0.1:22002 > use admin; >config={_id:"shard2",members:[ ... {_id:0,host:"192.168.30.131:22002"}, ... {_id:1,host:"192.168.30.132:22002"}, ... {_id:2,host:"192.168.30.134:22002",arbiterOnly:true}] ... } >rs.initiate(config); #設定第三個分片副本集 /data/mongodbtest/single/mongodb/bin/mongo 127.0.0.1:22003 > use admin; >config={_id:"shard3",members:[ ... {_id:0,host:"192.168.30.131:22003"}, ... {_id:1,host:"192.168.30.132:22003"}, ... {_id:2,host:"192.168.30.134:22003",arbiterOnly:true}] ... } >rs.initiate(config);
複製程式碼 下面是我的配置檔案
./mongod --shardsvr --replSet shard1 --port 22001 --dbpath /data/mongodbtest/shard1/data/ --logpath /data/mongodbtest/shard1/log/shard1.log --fork
./mongod --shardsvr --replSet shard2 --port 22002 --dbpath /data/mongodbtest/shard2/data/ --logpath /data/mongodbtest/shard2/log/shard2.log --fork 
./mongod --shardsvr --replSet shard2 --port 22002 --dbpath /data/mongodbtest/shard2/data/ --logpath /data/mongodbtest/shard2/log/shard2.log --fork 
config={_id:"shard1",members:[
... {_id:0,host:"192.168.38.243:22001"},
... {_id:1,host:"192.168.38.126:22001"},
... {_id:2,host:"192.168.38.9:22001",arbiterOnly:true}]}

> rs.initiate(config)
{ "ok" : 1 }


到此為止  第一個副本集搭建成功,接下來搭建第二個副本集

進入22002的伺服器shell

config={_id:"shard2",members:[ {_id:0,host:"192.168.38.243:22002"}, {_id:1,host:"192.168.38.126:22002"},
... {_id:2,host:"192.168.38.9:22002",arbiterOnly:true}]}
rs.initiate(config);


下面搭建第三個副本集
> use admin
switched to db admin
> config={_id:"shard3",members:[
... {_id:0,host:"192.168.38.243:22003"},
... {_id:1,host:"192.168.38.126:22003"},
... {_id:2,host:"192.168.38.9:22003",arbiterOnly:true}]}

> rs.initiate(config)
{ "ok" : 1 }


第三個副本集搭建成功