利用Docker部署mongodb集群--分片與副本集

jopen 9年前發布 | 29K 次閱讀 Docker MongoDB NoSQL數據庫

編寫DockerFile生成鏡像, 把mongodb集群,包含分片與副本集 部署到Docker容器中

環境 Docker version 1.6.2  mongodb 3.0.4

第一步  編寫Dockerfile并生成鏡像

    主意包含兩個Dockerfile鏡像,一個mongod的,一個mongos(在集群中負責路由)

    編寫Mongod的Dockerfile:

FROM ubuntu:14.04

RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

ENV MONGO_MAJOR 3.0 RUN echo "deb 

 Install MongoDB

RUN apt-get update RUN sudo apt-get install -y mongodb-org=3.0.4 mongodb-org-server=3.0.4 mongodb-org-shell=3.0.4 mongodb-org-mongos=3.0.4 mongodb-org-tools=3.0.4

 Create the MongoDB data directory

RUN mkdir -p /data/db

EXPOSE 27017 ENTRYPOINT ["usr/bin/mongod"]</pre>

    構建上面的Dockerfile 生成鏡像:

sudo docker build -t robin/mongod:master .

    -t 指定要放的 倉庫地址,冒號后面master代表tag,  后面那個點 代表當前目錄(含有剛剛編寫好的Dockerfile的目錄)

編寫Mongos的Dockerfile:

FROM  robin/mongod:master
EXPOSE 27017
ENTRYPOINT ["usr/bin/mongos"]

 構建鏡像:

sudo docker build -t robin/mongos:master .


第二步  啟動mongodb集群所需的Docker容器:

  創建副本集1 

docker run --name rs1_srv1 -p 21117:27017 -d robin/mongod:master --noprealloc --smallfiles --replSet rs1

docker run --name rs1_srv2 -p 21217:27017 -d robin/mongod:master --noprealloc --smallfiles --replSet rs1

docker run --name rs1_srv3 -p 21317:27017 -d robin/mongod:master --noprealloc --smallfiles --replSet rs1</pre>

      -p 映射宿主機器和容器內部的端口。-d 表示deamon模式運行。

      --smallfile 減小初始化數據文件的大小,并限制數據文件最大為512M (reduces the initial size for data files and limits the maximum size to 512 megabytes).

      --noprealloc主要是為了節省硬盤,禁掉預先分配硬盤。生產環境不要用該選項,會導致性能下降,產生磁盤碎片。

  創建副本集2

docker run --name rs2_srv1 -p 22117:27017 -d robin/mongod:master --noprealloc --smallfiles --replSet rs2

docker run --name rs2_srv2 -p 22217:27017 -d robin/mongod:master --noprealloc --smallfiles --replSet rs2

docker run --name rs2_srv3 -p 22317:27017 -d robin/mongod:master --noprealloc --smallfiles --replSet rs2</pre>


  創建配置容器

docker run --name cfg1 -p 20117:27017 -d robin/mongod:master --noprealloc --smallfiles --configsvr  --dbpath /data/db --port 27017

docker run --name cfg2 -p 20217:27017 -d robin/mongod:master --noprealloc --smallfiles --configsvr  --dbpath /data/db --port 27017

docker run --name cfg3 -p 20317:27017 -d robin/mongod:master --noprealloc --smallfiles --configsvr  --dbpath /data/db --port 27017</pre>

  

 創建mongo router

  找到配置容器對應的ip 和port

  使用mac boot2docker +VirtualBox 一定要注意宿主機的ip是VirtualBox 而不是本機的

  運行下邊的命令得到容器宿主機器ip

boot2docker ip

docker run --name mongos_router -p 27017:27017 -d robin/mongos:master --configdb <宿主ip>:20117,<宿主ip>:20217,<宿主ip>:20317 --port 27017

這里只創建一臺路由服務,這樣會存在單點故障問題,可以創建三臺來解決問題。


第三步配置副本集與分片

   配置副本集1

//連接到rs1_svr1
mongo <宿主ip>:21117
//配置副本集
rs.initiate();
rs.add("<宿主ip>:21217");
rs.add("<宿主ip>:21317");
rs.status();
Fix hostname of primary.
cfg = rs.conf();
cfg.members[0].host = "<宿主ip>:21117";
rs.reconfig(cfg);
rs.status();
//以上命令一個一個執行

   配置副本集2

//連接到rs2_svr1
mongo <宿主ip>:22117
//配置副本集
rs.initiate();
rs.add("<宿主ip>:22217");
rs.add("<宿主ip>:22317");
rs.status();
Fix hostname of primary.
cfg = rs.conf();
cfg.members[0].host = "<宿主ip>:22117";
rs.reconfig(cfg);
rs.status();
//以上命令一個一個執行

    配置分片

//連接到路由服務器
mongo <宿主ip>:27017

sh.addShard("rs1/<宿主ip>:27017"); sh.addShard("rs2/<宿主ip>:27017"); sh.status();</pre>

然后測試OK

如果用mac VirtualBox搭建docker 可能會遇到mongo分配文件空間不足的問題,調下磁盤大小就OK了

轉發標注來源:http://my.oschina.net/robinyao/blog/469431

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!