WisPlanner的環(huán)境搭建 二 MongoDB復(fù)制集

1. MongoDB的鏡像

docker pull mongo

查看已經(jīng)拉取的image

docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mongo               latest              fddee5bccba3        33 hours ago        388MB

我們可以看到mongo 的 image已經(jīng)拉取,接下來(lái)我們測(cè)試一下能否啟動(dòng)mongodb并連接

docker run -p 27017:27017 -d mongo

運(yùn)行成功,下面顯示了mongodb的運(yùn)行輸出

b822a7fb8525c402e94d291248418e13441365b153c6023c9415007ef2805436

我們連接到MongoDB看一下,主機(jī)IP為172.17.0.1:

docker run -it mongo mongo --host 172.17.0.1

進(jìn)入MongoDB Shell

MongoDB shell version v4.2.5
connecting to: mongodb://172.17.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("043c7840-c2f0-46c8-a267-453566c8a5fa") }
MongoDB server version: 4.2.5
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
    http://docs.mongodb.org/
Questions? Try the support group
    http://groups.google.com/group/mongodb-user
2020-04-19T02:28:03.740+0000 I  STORAGE  [main] In File::open(), ::open for '/home/mongodb/.mongorc.js' failed with No such file or directory
Server has startup warnings: 
2020-04-19T02:23:34.709+0000 I  STORAGE  [initandlisten] 
2020-04-19T02:23:34.709+0000 I  STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2020-04-19T02:23:34.709+0000 I  STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2020-04-19T02:23:35.271+0000 I  CONTROL  [initandlisten] 
2020-04-19T02:23:35.271+0000 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-04-19T02:23:35.271+0000 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2020-04-19T02:23:35.271+0000 I  CONTROL  [initandlisten] 
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

運(yùn)行show dbs

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> 

2.啟動(dòng)MongoDB集群

如果我們前面的mongodb沒(méi)有停止,先停

docker stop <容器id>

分別啟動(dòng)3個(gè)MongoDB的容器

root@wis:~# docker run --name mongo0 -d mongo --replSet "rs0" --bind_ip_all
root@wis:~# docker run --name mongo1 -d mongo --replSet "rs0" --bind_ip_all
root@wis:~# docker run --name mongo2 -d mongo --replSet "rs0" --bind_ip_all

查看容器

root@wis:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
512bcd5037ca        mongo               "docker-entrypoint.s…"   7 seconds ago       Up 4 seconds        27017/tcp           mongo2
d4c5ced430b2        mongo               "docker-entrypoint.s…"   14 seconds ago      Up 12 seconds       27017/tcp           mongo1
5307f8ddaeb4        mongo               "docker-entrypoint.s…"   21 seconds ago      Up 19 seconds       27017/tcp           mongo0

查看各容器的ip地址
使用命令

docker inspect mongo0 | grep IPAddress

結(jié)果如下:

root@wis:~# docker inspect mongo0 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
root@wis:~# docker inspect mongo1 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",
root@wis:~# docker inspect mongo2 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.4",
                    "IPAddress": "172.17.0.4",

登陸 172.17.0.2的MongoDB, 設(shè)置復(fù)制集

docker run -it mongo mongo --host 172.17.0.2

在Mongo Shell中運(yùn)行

rs.initiate( {
   _id : "rs0",
   members: [
      { _id: 0, host: "172.17.0.2:27017" },
      { _id: 1, host: "172.17.0.3:27017" },
      { _id: 2, host: "172.17.0.4:27017" }
   ]
})

有關(guān)MongoDB的復(fù)制集,參見(jiàn)https://docs.mongodb.com/manual/replication/

3. 設(shè)置集群的IP地址

目前,三個(gè)mongo容器的IP地址是docker分配的。很顯然,這種方式并不適合集群的配置,我們接下來(lái)開(kāi)始為每個(gè)容器指定固定的IP地址。首先,我們需要了解Docker的4種網(wǎng)絡(luò)模式:

  • host模式–net=host 容器和宿主機(jī)共用IP地址,容器沒(méi)有網(wǎng)卡,使用不同端口與外部通訊。
  • container模式 –net=container:NAME_or_ID 容器和另外一個(gè)容器共享網(wǎng)絡(luò)。
  • none模式 –net=none 沒(méi)有對(duì)容器進(jìn)行任何網(wǎng)絡(luò)設(shè)置,如分配veth pair 和網(wǎng)橋連接,配置IP等。
  • bridge模式 –net=bridge (默認(rèn)為該模式),主機(jī)有一塊橋接網(wǎng)卡,172.17.0.1,容器的ip地址為:172.17.0.2, 172.17.0.3...
    如果我們需要Ngnix提供外部服務(wù),那么,我們通常直接使用host模式,現(xiàn)在,在本例中,我們的集群只要同屬一個(gè)網(wǎng)絡(luò)就可以了,我們使用bridge模式,但是,需要為這個(gè)集群指定ip。
    先查看一下本機(jī)的網(wǎng)絡(luò)
docker network ls

結(jié)果如下,這個(gè)是安傳docker默認(rèn)裝好的網(wǎng)絡(luò)。

NETWORK ID          NAME                DRIVER              SCOPE
d5c47fb0ab99        bridge              bridge              local
435e846bb246        host                host                local
346d39d401b8        none                null                local

接下來(lái)我們創(chuàng)建一個(gè) 新的Network:

docker network create --driver bridge --subnet=192.168.100.0/16 --gateway=192.168.100.1 mongo

-driver參數(shù)指定了使用 bridge
-subnet參數(shù)指定了子網(wǎng)的ip地址范圍
-gateway指定了網(wǎng)關(guān)的地址
-最后一個(gè)是這個(gè)網(wǎng)絡(luò)的名稱(chēng)
現(xiàn)在可以看到剛才創(chuàng)造的網(wǎng)絡(luò)。

NETWORK ID          NAME                DRIVER              SCOPE
d5c47fb0ab99        bridge              bridge              local
435e846bb246        host                host                local
c30eca38ec22        mongo               bridge              local
346d39d401b8        none                null                local

我們先刪除先前創(chuàng)建的所有容器,本例中到現(xiàn)在為止尚無(wú)有用的容器,先停,后刪。

docker stop $(docker ps -q) & docker rm $(docker ps -aq)

使用指定ip重新創(chuàng)建mongodb的集群:

docker run --name mongo0 --network mongo --ip=192.168.100.2 -d mongo --replSet "rs0" --bind_ip_all
docker run --name mongo1 --network mongo --ip=192.168.100.3 -d mongo --replSet "rs0" --bind_ip_all
docker run --name mongo2 --network mongo --ip=192.168.100.4 -d mongo --replSet "rs0" --bind_ip_all

現(xiàn)在我們可以連接192.168.100.2上的MongoDB進(jìn)行下一步操作
進(jìn)入mongo0

docker exec -it mongo0 /bin/bash

啟動(dòng)mongo shell

mongo

如果,希望用容器來(lái)連接mongo, 應(yīng)該指定網(wǎng)絡(luò)和ip,可使用以下的命令:

docker run --network 192.168.100.10 -it mongo mongo --host 192.168.100.2

兩者的區(qū)別在于,前者是登陸到容器內(nèi)部執(zhí)行mongo shell, 后者是創(chuàng)建了一個(gè)容器來(lái)執(zhí)行mongo shell。接下來(lái)是設(shè)置復(fù)制集。

rs.initiate( {
   _id : "rs0",
   members: [
      { _id: 0, host: "192.168.100.2:27017" },
      { _id: 1, host: "192.168.100.3:27017" },
      { _id: 2, host: "192.168.100.4:27017" }
   ]
})

到目前為止,我們已經(jīng)可以在docker上部署一個(gè)mongodb的集群。但是,還是存在幾個(gè)問(wèn)題,我們并沒(méi)有指定mongodb 數(shù)據(jù)存放的目錄,也就是說(shuō),目前,數(shù)據(jù)都是存放在容器內(nèi)部的,新創(chuàng)建的容器是沒(méi)有這些數(shù)據(jù)的。我們需要將容器內(nèi)部的數(shù)據(jù)目錄綁定到host中的目錄。

4. 掛載host目錄存放數(shù)據(jù)文件

首先,我們?cè)趆ost上建立文件夾,用于掛載到MongoDB容器的數(shù)據(jù)。
我們建立以下的文件夾結(jié)構(gòu),在home下建立一個(gè)data目錄,data目錄下建立三個(gè)子目錄,mongo0, mongo1,mong2
每個(gè)目錄下分別建立db子目錄用于保存數(shù)據(jù)。

docker run --name mongo0 --network mongo --ip=192.168.100.2 \
-v /home/wis/data/mongo0/db:/data/db \
-d mongo --replSet "rs0" --bind_ip_all
docker run --name mongo1 --network mongo --ip=192.168.100.3 \
-v /home/wis/data/mongo1/db:/data/db \
-d mongo --replSet "rs0" --bind_ip_all
docker run --name mongo2 --network mongo --ip=192.168.100.4 \
-v /home/wis/data/mongo2/db:/data/db \
-d mongo --replSet "rs0" --bind_ip_all

我們可以將配置文件夾也掛載到容器中

docker run --name mongo2--network mongo --ip=192.168.100.4 \
-v /home/wis/data/mongo2/db:/data/db \
-v /home/wis/data/mongo2/configdb:/data/configdb \
-d mongo --replSet "rs0" --bind_ip_all

截至目前,我們以及完成了MongoDB復(fù)制集的搭建,隨著我們后續(xù)不斷增加容器,我們很快就會(huì)出現(xiàn)管理這些容器的需求,我們?cè)诤罄m(xù)的章節(jié)繼續(xù)介紹。

下一節(jié),我們先開(kāi)始部署Wisplanner的服務(wù)端。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容