[原创]在Docker上部署mongodb分片副本集群。
一、安装docker。
请参考:http://www.cnblogs.com/hehexiaoxia/p/6150584.html
二、编写dockerfile。
1、在根目录下创建mongod的dockerfile。
$ vi dockerfile
#version 1.0
from ubuntu
#maintainer
maintainer hdx #install
run apt-get clean
run apt-get update
run apt-get install -y vim
run apt-get install -y openssh-server
run mkdir -p /var/run/sshd #open port 22 20001
expose 22
expose 20001
#cmd ["/usr/sbin/sshd","-D"] run apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 run echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.2 main">/etc/apt/sources.list.d/mongodb-org.list
#install mongodb
run apt-get update
run apt-get install -y mongodb-org
#create the mongodb data directory
run mkdir -p /data/db
entrypoint ["usr/bin/mongod"]
2、在根目录下创建mongod的dockerfile_mongos。
$ vi dockerfile_mongos
from ubuntu/mongo:latest
entrypoint ["usr/bin/mongos"]
三、通过dockerfile生成image镜像。
$ sudo docker build -t ubuntu/mongo:latest -</dockerfile
$ sudo docker build -t ubuntu/mongo:latest -</dockerfile_mongos
查看image的生成情况。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu/mongo latest 522eeeae18e5 54 minutes ago
ubuntu/mongos latest 522eeeae18e6 54 minutes ago
发现image已经生成,可以通过image来创建容器了。
四、通过image镜像构建mongo集群。
1、创建2个分片服务(shardsvr),每个shardsvr包含3个副本,其中1个主节点,1个从节点,1个仲裁节点。
-d 表示后台运行
-p 绑定host主机与docker的端口,第一个20001代表host主机端口,第二个代表对应的docker端口,绑定后可以通过调用host主机ip:port来访问docker的mongodb。
注意:一定不能退在最后添加--fork,使mongo服务后台运行,这样docker会任务无事可做而自杀!
$ sudo docker run -d -p 20001:20001 --name rs1_container1 ubuntu/mongo:lastest --shardsvr --port 20001 --replSet rs1
$ sudo docker run -d -p 20002:20001 --name rs1_container2 ubuntu/mongo:lastest --shardsvr --port 20001 --replSet rs1
$ sudo docker run -d -p 20003:20001 --name rs1_container3 ubuntu/mongo:lastest --shardsvr --port 20001 --replSet rs1
$ sudo docker run -d -p 20011:20001 --name rs2_container1 ubuntu/mongo:lastest --shardsvr --port 20001 --replSet rs2
$ sudo docker run -d -p 20012:20001 --name rs2_container2 ubuntu/mongo:lastest --shardsvr --port 20001 --replSet rs2
$ sudo docker run -d -p 20013:20001 --name rs2_container3 ubuntu/mongo:lastest --shardsvr --port 20001 --replSet rs2
2、创建2个配置服务(configsvr)。
$ sudo docker run -d -p 21001:20001 --name config_container1 ubuntu/mongo:lastest --configsvr --dbpath /data/db --replSet crs --port 20001
$ sudo docker run -d -p 21002:20001 --name config_container2 ubuntu/mongo:lastest --configsvr --dbpath /data/db --replSet crs --port 20001
注意: --dbpath /data/db一定要指定,因为--configsvr默认路径是/data/configdb,如果找不到会报错,然后docker直接自杀!
--replSet crs 从mongodb版本3.2以后支持configsvr的副本集。
3、启动2个路由服务(mongos)。
$ sudo docker run -d -p 22001:20001 --name mongos_container1 ubuntu/mongos:lastest --configdb crs/192.168.30.200:21001,192.168.30.200:21002 --port 20001
$ sudo docker run -d -p 22002:20001 --name mongos_container2 ubuntu/mongos:lastest --configdb crs/192.168.30.200:21001,192.168.30.200:21002 --port 20001
注意: crs/192.168.128.30:21001,192.168.128.30:21002 : mongodb版本3.2以后通过这种形式指定configdb,否则报错,ip要写宿主机的实际ip。
4、查看当前docker服务启动情况。
$ sudo docker ps

发现分片、配置服务、和路由服务都启动起来了。
五、mongo基本操作。
服务启动起来了,但是服务都是互相独立的,所以,接下来我们将这些服务器串联起来。
1、初始化分片rs1副本集。
# 任意选择rs1分片的一个副本
root@ubuntu:/# mongo --port 20001
# 切换数据库
use admin
# 写配置文件
config = {_id:"rs1",members:[ {_id:0,host:"192.168.30.200:20001"}, {_id:1,host:"192.168.30.200:20002"}, {_id:2,host:"192.168.30.200:20003",arbiterOnly:true} ] }
# 初始化副本集
rs.initiate(config)# 查看副本集状态
rs.status()
结果:
rs1:RECOVERING> rs.status()
{
"set" : "rs1",
"date" : ISODate("2016-12-20T09:01:16.108Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.30.200:20001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 7799,
"optime" : {
"ts" : Timestamp(1482224415, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-12-20T09:00:15Z"),
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1482224414, 1),
"electionDate" : ISODate("2016-12-20T09:00:14Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.30.200:20002",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 71,
"optime" : {
"ts" : Timestamp(1482224415, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-12-20T09:00:15Z"),
"lastHeartbeat" : ISODate("2016-12-20T09:01:15.016Z"),
"lastHeartbeatRecv" : ISODate("2016-12-20T09:01:15.376Z"),
"pingMs" : NumberLong(1),
"syncingTo" : "192.168.30.200:20001",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.30.200:20003",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 71,
"lastHeartbeat" : ISODate("2016-12-20T09:01:15.016Z"),
"lastHeartbeatRecv" : ISODate("2016-12-20T09:01:11.334Z"),
"pingMs" : NumberLong(0),
"configVersion" : 1
}
],
"ok" : 1
}
2、初始化分片rs2副本集。
# 任意选择rs1分片的一个副本
root@ubuntu:/# mongo --port 20011
# 切换数据库
use admin
# 写配置文件
config = {_id:"rs2",members:[ {_id:0,host:"192.168.30.200:20011"}, {_id:1,host:"192.168.30.200:20012"}, {_id:2,host:"192.168.30.200:20013",arbiterOnly:true} ] }
# 初始化副本集
rs.initiate(config)
# 查看副本集状态
rs.status()
3、初始化配置服务副本集。
# 任意选择crs分片的一个副本
root@ubuntu:/# mongo --port 21001
# 切换数据库
use admin
# 写配置文件
config = {_id:"crs", configsvr:true, members:[ {_id:0,host:"192.168.30.200:21001"}, {_id:1,host:"192.168.30.200:21002"} ] }
# 初始化副本集
rs.initiate(config)
# 查看副本集状态
rs.status()
4、通过mongos添加分片关系到configsvr。
root@ubuntu:/# mongo --port 22001
use admin
db.runCommand({addshard:"rs1/192.168.30.200:20001,192.168.30.200:20002,192.168.30.200:20003"})
db.runCommand({addshard:"rs2/192.168.30.200:20011,192.168.30.200:20012,192.168.30.200:20013"})
查询结果如下:仲裁节点没有显示。
mongos> db.runCommand({listshards:1})
{
"shards" : [
{
"_id" : "rs1",
"host" : "rs1/192.168.30.200:20001,192.168.30.200:20002"
},
{
"_id" : "rs2",
"host" : "rs2/192.168.30.200:20011,192.168.30.200:20012"
}
],
"ok" : 1
}
5、设置数据库、集合分片。
db.runCommand({enablesharding:"mydb"})
db.runCommand({shardcollection:"mydb.person", key:{id:1, company:1}})
设置数据库mydb、mydb中person表(集合)应用分片,片键为person集合的id、company字段。
说明:并不是数据库中所有集合都分片,只有设置了shardcollection才分片,因为不是所有的集合都需要分片。
6、测试分片结果。
use mydb
for (i =0; i<10000;i++){
db.person.save({id:i, company:"baidu"})}
测试结果如下:发现已经成功分片,rs1和rs2分片不均匀,这和块的大小和片键有关系,有兴趣的小伙伴也可以详细的查阅如何选择片键的文章。
db.person.stats()
{
"sharded" : true,
"capped" : false,
"ns" : "mydb.person",
"count" : 10000,
"size" : 530000,
"storageSize" : 192512,
"totalIndexSize" : 311296,
"nchunks" : 3,
"shards" : {
"rs1" : {
"ns" : "mydb.person",
"count" : 9999,
"size" : 529947,
"avgObjSize" : 53,
"totalIndexSize" : 278528,
"ok" : 1
},
"rs2" : {
"ns" : "mydb.person",
"count" : 1,
"size" : 53,
"avgObjSize" : 53,
"storageSize" : 16384,
"ok" : 1
}
},
"ok" : 1
}
至此。
[原创]在Docker上部署mongodb分片副本集群。的更多相关文章
- 使用Docker方式部署Mongodb多副本集(replSet)
linux主机ip:192.168.0.253 1. 创建网络与容器 docker pull mongo docker network create mongo-rs docker run --nam ...
- MongoDB在单机上搭建分片副本集群(windows)
------------------------------1.安装MongoDB...... ------------------------------2.准备好文件夹 --config:配置文件 ...
- Mongodb分片副本集集群搭建
一.环境准备 1.1.主机信息(机器配置要求见硬件及开发标准规范文档V1.0) 序号 主机名 IP 1 DB_01 10.202.105.52 2 DB_02 10.202.105.53 3 DB_0 ...
- (转)MongoDB分片实战 集群搭建
环境准备 Linux环境 主机 OS 备注 192.168.32.13 CentOS6.3 64位 普通PC 192.168.71.43 CentOS6.2 64位 服务器,NUMA CPU架构 Mo ...
- mongodb之 3.4.0 mongodb sharing 副本集群搭建
系统系统 centos6.5三台服务器:10.100.25.42/43/44安装包: mongodb-linux-x86_64-rhel62-3.4.0.tgz 服务器规划:mongos mongos ...
- MongoDB在单机上搭建分片副本集群(windows),版本二
配置可以参考前面一篇 https://www.cnblogs.com/a-horse-mosaic/p/9284010.html 副本集是一组服务器,其中有一个主服务器(primary),用于处理客户 ...
- MongoDB 分片副本集集群搭建
配置准备 三台机器: A(193.168.10.101) B(193.168.10.102) C(193.168.10.103) MongoDB 安装目录:/usr/local/mongodb Mon ...
- 在CentOS上部署kubernetes1.9.0集群
原文链接: https://jimmysong.io/kubernetes-handbook/cloud-native/play-with-kubernetes.html (在CentOS上部署kub ...
- Docker Compose部署 nginx代理Tomcat集群
一.简介 使用Docker镜像部署Nginx代理的多个Tomcat集群: 使用Dockerfile构建nginx镜像 使用Dockerfile构建tomcat镜像 mysql镜像使用docker hu ...
随机推荐
- No row with the given identifier exists:错误另解
这是一个hibernate常见的问题.搜索出来最多的答案都是如下面这篇文章所述: http://blog.csdn.net/eyejava/article/details/1896492 但我觉得我问 ...
- 一个苹果证书如何多次使用——导出p12文件
一个苹果证书怎么多次使用--导出p12文件 为什么要导出.p12文件 当我们用大于三个mac设备开发应用时,想要申请新的证书,如果在我们的证书里,包含了3个发布证书,2个开发证书,可以发现再也申请不了 ...
- Ural-1146Maximum Sum-最大子矩阵
Time limit: 0.5 second Memory limit: 64 MB Given a 2-dimensional array of positive and negative inte ...
- Uva 11354 LCA 倍增祖先
题目链接:https://vjudge.net/contest/144221#problem/B 题意:找一条从 s 到 t 的路,使得瓶颈路最小. 点的数目是10^4,如果向之前的方案求 maxc ...
- 24章 创建TPL自定义模板(1)
鼓励分离 促进分工 smarty强大的模板引擎 自己开发可以深入了解模板引擎原理,并且简化(安全性,兼容性和功能不如开源的模板引擎) 流程图
- 什么是hasLayout?
想更好的理解CSS,尤其是IE下对CSS的渲染,hasLayout是一个非常有必要彻底弄清楚的概念,大多数IE下的显示错误,就是源于hasLayout.hasLayout是一种只读属性,有两种状态tr ...
- C#中浮点数依IEEE-754标准转二进制串 (MODBUS 浮点数转换)
因工作需要,把再串口通信中浮点数与字节流的数据转换函数放在这,转发的,谢谢原作者. 今天花了一天的时间搜罗资料,为了解决一个串口编程的进制转化问题.因为串口传送的浮点数据格式与IEEE-754标准(3 ...
- 第二,C语言示例
#include<stdio.h> int main (void) /*WTF*/ { int num; num=1; printf(" I am ...
- 关于 OJ1574的参考题解(较麻烦)
#include <stdio.h>int main(){ long a,b,c,d,e; scanf("%ld",&a); d=a; b=0; while(d ...
- 兼容IE7音乐播放器之jplayer的使用
首先列出为何要写这篇随笔的原因: 1:兼容IE7 2:音乐播放器 3:任意控制播放器 1: 最近做的网站需要兼容IE7,在此之前已经写好了关于音乐播放的插件,火狐,IE8以上,以及谷歌浏览器等都可以随 ...