wKioL1jnZWfRa_IfAAELdWNslV0210.png-wh_50

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

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

config server:顧名思義為配置服務器,存儲所有數據庫元信息(路由、分片)的配置。mongos本身沒有物理存儲分片服務器和數據路由信息,只是緩存在內存里,配置服務器則實際存儲這些數據。mongos第一次啟動或者關掉重啟就會從 config server 加載配置信息,以后如果配置服務器信息變化會通知到所有的 mongos 更新自己的狀態,這樣 mongos 就能繼續準確路由。在生產環境通常有多個 config server 配置服務器,因為它存儲了分片路由的元數據,這個可不能丟失!就算掛掉其中一臺,只要還有存貨, mongodb集群就不會掛掉。

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

wKiom1jnaYTwUmUsAAF0vqWbeGE555.png-wh_50


我們要求是做的 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 > 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臺機器全部執行

?讓 主從仲裁 分別在每臺機器上

?

hostrs001rs002rs003rs004rs005rs006
10.33.100.118
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 ?

storage:

? ?dbPath: /dev/shm/server

? ?journal:

? ? ? enabled: true

? ?directoryPerDB: true

? ?#syncPeriodSecs: 60

? ?engine: wiredTiger


processManagement:

? ?fork: true

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


net:

? ?port: 27020

? ?http:

? ? ? enabled: false

? ?

systemLog:

? ?destination: file

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

? ?logAppend: true


replication:

? ?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?

processManagement:

? ?fork: true

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


net:

? ?port: 27030

? ?http:

? ? ? enabled: false


systemLog:

? ?destination: file

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

? ?logAppend: true


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 <= 100000; i++){

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

? }

??

? rs.status()

? db.Log.stats()

? db.Log.drop()