天天看點

mongdb叢集3.4 shard 模式

<a href="https://s4.51cto.com/wyfs02/M00/8F/A5/wKioL1jnZWfRa_IfAAELdWNslV0210.png-wh_500x0-wm_3-wmp_4-s_4007957619.png" target="_blank"></a>

從圖中可以看到有四個元件:mongos、config server、shard、replica set。

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

config server:顧名思義為配置伺服器,存儲所有資料庫元資訊(路由、分片)的配置。mongos本身沒有實體存儲分片伺服器和資料路由資訊,隻是緩存在記憶體裡,配置伺服器則實際存儲這些資料。mongos第一次啟動或者關掉重新開機就會從 config server 加載配置資訊,以後如果配置伺服器資訊變化會通知到所有的 mongos 更新自己的狀态,這樣 mongos 就能繼續準确路由。在生産環境通常有多個 config server 配置伺服器,因為它存儲了分片路由的中繼資料,這個可不能丢失!就算挂掉其中一台,隻要還有存貨, mongodb叢集就不會挂掉。

shard:這就是傳說中的分片了。上面提到一個機器就算能力再大也有天花闆,就像軍隊打仗一樣,一個人再厲害喝血瓶也拼不過對方的一個師。俗話說三個臭皮匠頂個諸葛亮,這個時候團隊的力量就凸顯出來了。在網際網路也是這樣,一台普通的機器做不了的多台機器來做。

<a href="https://s4.51cto.com/wyfs02/M01/8F/A7/wKiom1jnaYTwUmUsAAF0vqWbeGE555.png-wh_500x0-wm_3-wmp_4-s_412962463.png" target="_blank"></a>

我們要求是做的 6片的叢集 參考上面3切片圖檔 資料存儲 用的是記憶體存儲盤提高速度(機器配置 32h 260GB記憶體)。

一,3台機器建立準備工作

yum -y install numactl vim  lrzsz

mkdir -p /data/{work,app}

mkdir -p /data/work/mongodb/conf

調整存儲空間大小

umount  /dev/shm/

mount tmpfs /dev/shm -t tmpfs -o size=200G

  [root@localhost work]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda3        78G  1.1G   73G   2% /

/dev/sda1       485M   31M  429M   7% /boot

/dev/sdb2       3.6T   33M  3.6T   1% /data

/dev/sda2       197G  267M  187G   1% /home

tmpfs           200G     0  200G   0% /dev/shm

cd /data/work/mongodb/ 

 mkdir {shard1,shard2,shard3,shard4,shard5,shard6,server,mongos}

 cd /dev/shm/

 mkdir {shard1,shard2,shard3,shard4,shard5,shard6,server}

 二啟動sharding服務

 wget http://10.31.67.32:8099/Download/mongodb/mongodb-linux-x86_64-rhel62-3.4.2.tgz

 tar -zxvf mongodb-linux-x86_64-rhel62-3.4.2.tgz 

 mv  mongodb-linux-x86_64-rhel62-3.4.2 /data/app/mongodb

#####開啟驗證需要 任意伺服器産生kefile檔案:

    openssl rand -base64 741 &gt; keyfile

    chmod 600 keyfile

    注意:要上傳到叢集中每一台伺服器:/data/work/mongodb/mongo-keyfile

 cd /data/work/mongodb/conf

 吧配置檔案上傳

cat /data/work/mongodb/conf/shard1.conf 

storage:

   dbPath: /dev/shm/shard1

   journal:

      enabled: true

   directoryPerDB: true

   #syncPeriodSecs: 60

   engine: wiredTiger

processManagement:

   fork: true

   pidFilePath: /data/work/mongodb/shard1/mongod.pid

net:

   port: 27011

   http:

      enabled: false

systemLog:

   destination: file

   path: /data/work/mongodb/shard1/mongod.log

   logAppend: true   

operationProfiling:

   slowOpThresholdMs: 100

   mode: slowOp

需要使用者認證則開啟

###security:

  ## keyFile: /data/work/mongodb/mongo-keyfile

   #authorization: enabled

replication:

   oplogSizeMB: 20000

   replSetName: rs001

每個配置檔案 日志路徑和存儲路徑 改下即可

3台機器從别啟動

numactl --interleave=all /data/app/mongodb/bin/mongod --shardsvr -f /data/work/mongodb/conf/shard1.conf 

numactl --interleave=all /data/app/mongodb/bin/mongod --shardsvr -f /data/work/mongodb/conf/shard2.conf 

numactl --interleave=all /data/app/mongodb/bin/mongod --shardsvr -f /data/work/mongodb/conf/shard3.conf 

numactl --interleave=all /data/app/mongodb/bin/mongod --shardsvr -f /data/work/mongodb/conf/shard4.conf 

numactl --interleave=all /data/app/mongodb/bin/mongod --shardsvr -f /data/work/mongodb/conf/shard5.conf 

numactl --interleave=all /data/app/mongodb/bin/mongod --shardsvr -f /data/work/mongodb/conf/shard6.conf 

 以上3台機器全部執行

 讓 主從仲裁 分别在每台機器上

host

rs001

rs002

rs003

rs004

rs005

rs006

10.33.100.118

10.33.100.119

登入 端口27011 -27016 

 /data/app/mongodb/bin/mongo  --port 27016 

 cfg={ _id:"rs006", members:[ {_id:0,host:'10.33.100.119:27016',priority:2}, {_id:1,host:'10.33.100.117:27016',priority:1},{_id:2,host:'10.33.100.118:27016',arbiterOnly:true}] };

 rs.initiate(cfg)

rs.status()

三啟動配置服務

[root@localhost ~]# cat  /data/work/mongodb/conf/server.conf  

   dbPath: /dev/shm/server

   pidFilePath: /data/work/mongodb/server/mongod.pid

   port: 27020

   path: /data/work/mongodb/server/mongod.log

   logAppend: true

   replSetName: configReplSet

 /data/app/mongodb/bin/mongod --configsvr  -f /data/work/mongodb/conf/server.conf 

3台分别 配置服務啟動

  /data/app/mongodb/bin/mongo  --port 27020

 rs.initiate( {_id: "configReplSet",configsvr: true,members: [{ _id: 0, host: "10.33.100.117:27020"},{ _id: 1, host: "10.33.100.118:27020"},{ _id: 2, host: "10.33.100.119:27020"}]} )

四:3台分别路由接口

cat /data/work/mongodb/conf/mongos.conf 

   pidFilePath: /data/work/mongodb/mongos/mongos.pid

   port: 27030

   path: /data/work/mongodb/mongos/mongos.log

sharding:

   configDB: configReplSet/10.33.100.117:27020,10.33.100.118:27020,10.33.100.119:27020

#配置服務的端口和位址。

 numactl --interleave=all /data/app/mongodb/bin/mongos -f /data/work/mongodb/conf/mongos.conf 

至此每個機器保證8個mongodb 程序。

  /data/app/mongodb/bin/mongo  --port 27030

依次添加6個分片  

sh.addShard("rs001/10.33.100.117:27011,10.33.100.118:27011,10.33.100.119:27011")

測試分片

sh.enableSharding("test")

sh.shardCollection("test.Log", { id: 1})

use test

for(var i = 1; i &lt;= 100000; i++){

  db.Log.save({id:i,"message":"message"+i});

  }

  rs.status()

  db.Log.stats()

  db.Log.drop()

本文轉自 houzaicunsky 51CTO部落格,原文連結:http://blog.51cto.com/hzcsky/1913947