iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 22
1
Big Data

30天之你好MongoDB系列 第 22

30-22之MongoDB的副本集 replica set(2)---使用Docker建立MongoDB Cluster

黑色好看版 - 傳送門


上篇文章我們已經說明完,如何在本機上建立mongodb副本集,而本篇文章,我們將要實際的使用docker來建立有三個節點的副本集,也就是所謂cluster

  • 開始前的準備
  • 建立架構圖
  • fight !

~開始前的準備~


首先再開始之前你當然要先將docker裝好,可以參考下面這章,但你的docker compose那邊可以不用做到,因為我還沒研究出,如何用docker compose來建立cluster……QQ。

30-2之使用Docker來建構MongoDB環境

確定執行docker --version有類似下面的資訊出來就ok囉。

Docker version 1.12.3, build 6b644ec

接下來呢咱們需要下載mongodb image,平常我們都是用docker compose直接執行它都會幫我們偷偷下載好,而現在我們就需要自已下載,指令如下。

docker pull mongo

然後咱們就都準備好囉。

~建立架構圖~


我們來看看下圖,首先我們會先建立一個cluster取名為my-mongo-cluster,然後裡面有三個mongodb並且對外連接port設為300013000230003,並且這三個的container都可以互相溝通。

~建立流程~


Fight !

step1 將my-mongo-cluster加入到docker network

我們先執行看看docker network ls然後會出現下圖的列表。

然後我們再執行下面的指令將新增個networkdocker network裡。

docker network create my-mongo-cluster

然後你就可以看到我們將my-mongo-cluster加入至docker network裡。

Step2 建立三個MongoDBContainer,並加入至my-mongo-clusternetwork

首先來看看指令,然後我們來解釋一下每個指令是啥意思。

  • docker run : 就只是執行docker而以。
  • -p 30001:27017 : 將port:27017暴露出來,為了讓其它mongodb可連接到,而30001則為該container的本機port
  • --name mongo1 : 將該container命名為mongo1
  • --net my-mongo-cluster : 將該container加入到my-mongo-clusterdocker network裡面,然它們可以互相通信。
  • mongo mongod --replSet my-mongo-set : 運行mongod時將該mongo加入到名為my-mongo-set的副本集中。
docker run 
-p 30001:27017 
--name mongo1 
--net my-mongo-cluster 
mongo mongod --replSet my-mongo-set

記好上面這些是要縮成一行來執行,如下。

docker run -p 30001:27017 --name mongo1 --net my-mongo-cluster mongo mongod --replSet my-mongo-set

執行完這行指令後,你就建立好了一個container呢,但別忘囉我們要建立三個,所以還要再執行兩次,另外兩個只是修改一下port,對了在執行其它兩個建立時要新開兩個Shell

docker run 
-p 30002:27017 
--name mongo1 
--net my-mongo-cluster 
mongo mongod --replSet my-mongo-set
docker run 
-p 30003:27017 
--name mongo1 
--net my-mongo-cluster 
mongo mongod --replSet my-mongo-set

建立完後你可以執行docker ps指令看首你所建立的container

Step3 設定副本集

建立完後,咱們就可以連到container裡控制mongodb囉。

docker exec -it mongo1 mongo

然後進行後我們想看看它的副本集資訊,我們執行下面的程式碼。

db = (new Mongo('localhost:27017')).getDB('test')
db.isMaster()

然後看到上面的執行結果,會發現它提示我們還沒有可用的副本集設定,所以我們這時要寫一段段代碼,主要就是副本集設定,程式碼如下,其中_id要設定的與所設定的副本集名稱一樣。

config = {
  	"_id" : "my-mongo-set",
  	"members" : [
  		{
  			"_id" : 0,
  			"host" : "mongo1:27017"
  		},
  		{
  			"_id" : 1,
  			"host" : "mongo2:27017"
  		},
  		{
  			"_id" : 2,
  			"host" : "mongo3:27017"
  		}
  	]
  }

rs.initiate(config)

然後我們再執行一次db.isMaster(),你就會看到我們設定完成囉。

Step4 測試是否有備份

首先我們先建立些測試資料,並新增到primarymongodb中。

var objs = [];
for (var i=0;i<10;i++){
	objs.push({"name":"user"+i});
}
db.users.insert(objs);

然後再連線到secondary裡尋找看看。

db2 = (new Mongo('mongo2:27017')).getDB('test')
db2.setSlaveOk()
db2.users.find()

執行結果如下~完成~。

~結語~

副本集方面的事情我就先說明到這,雖然還有不少東西可以講,但那都是管理方面與副本集設計方面的問題,這些我就真的懶講囉……

P.S 今天打流感疫苗,但著麼打完後就要燒起來的感覺……

~參考資料~


上一篇
30-21 之MongoDB的副本集 replica set(1)
下一篇
30-23之分片Sharding(1)---Hello Sharding
系列文
30天之你好MongoDB30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言