上篇文章我們已經說明完,如何在本機上建立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
今天打流感疫苗,但著麼打完後就要燒起來的感覺……