上篇文章我們已經說明完,如何在本機上建立mongodb副本集,而本篇文章,我們將要實際的使用docker來建立有三個節點的副本集,也就是所謂cluster。
首先再開始之前你當然要先將docker裝好,可以參考下面這章,但你的docker compose那邊可以不用做到,因為我還沒研究出,如何用docker compose來建立cluster……QQ。
確定執行docker --version有類似下面的資訊出來就ok囉。
Docker version 1.12.3, build 6b644ec
接下來呢咱們需要下載mongodb image,平常我們都是用docker compose直接執行它都會幫我們偷偷下載好,而現在我們就需要自已下載,指令如下。
docker pull mongo
然後咱們就都準備好囉。
我們來看看下圖,首先我們會先建立一個cluster取名為my-mongo-cluster,然後裡面有三個mongodb並且對外連接port設為30001、30002、30003,並且這三個的container都可以互相溝通。

Fight !
my-mongo-cluster加入到docker network裡我們先執行看看docker network ls然後會出現下圖的列表。

然後我們再執行下面的指令將新增個network到docker network裡。
docker network create my-mongo-cluster
然後你就可以看到我們將my-mongo-cluster加入至docker network裡。

MongoDB的Container,並加入至my-mongo-cluster這network中首先來看看指令,然後我們來解釋一下每個指令是啥意思。
docker run : 就只是執行docker而以。-p 30001:27017 : 將port:27017暴露出來,為了讓其它mongodb可連接到,而30001則為該container的本機port。--name mongo1 : 將該container命名為mongo1。--net my-mongo-cluster : 將該container加入到my-mongo-cluster這docker 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。

建立完後,咱們就可以連到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(),你就會看到我們設定完成囉。

首先我們先建立些測試資料,並新增到primary的mongodb中。
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 今天打流感疫苗,但著麼打完後就要燒起來的感覺……