首先我们计划启动了三个mongo服务:master,salve,arbiter

1.准备工作

新建文件夹如图(每个文件夹下面有db和configdb文件夹):

生成认证文件并修改权限

openssl rand -base64 100 > /root/docker/mongo/keyfile0 --文件内容采base64编码,一共100个字符
chmod 600 /root/docker/mongo/keyfile0
手动拷贝keyfile0到configdb目录, 然后验证权限:

chmod 600 /root/docker/mongo/master/configdb/keyfile0
chmod 600 /root/docker/mongo/salve/configdb/keyfile0
chmod 600 /root/docker/mongo/arbiter/configdb/keyfile0
2.启动3个mongodb:

docker run -d --name mongo-m -v /root/docker/mongo/master/db/:/data/db -v /root/docker/mongo/master/configdb/:/data/configdb --restart=always -p 27017:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --oplogSize 128 --auth --keyFile=/data/configdb/keyfile0
docker run -d --name mongo-s -v /root/docker/mongo/salve/db/:/data/db -v /root/docker/mongo/salve/configdb/:/data/configdb --restart=always -p 27018:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --oplogSize 128 --auth --keyFile=/data/configdb/keyfile0
docker run -d --name mongo-a -v /root/docker/mongo/arbiter/db/:/data/db -v /root/docker/mongo/arbiter/configdb/:/data/configdb --restart=always -p 27019:27017 mongo:latest mongod --dbpath /data/db --replSet mongoreplset --oplogSize 128 --smallfiles --auth --keyFile=/data/configdb/keyfile0
启动后如图:

3.集群配置

docker exec -it mongo-m mongo
config = {_id:"mongoreplset", version:1, members:[{_id:0, host:"192.168.100.3:27017", priority:5}, {_id:1, host:"192.168.100.3:27018", priority:2}, {_id:2, host:"192.168.100.3:27019", priority:3}]}
rs.initiate(config)
效果如图:

4.添加用户

use admin
db.createUser( { user: "root",pwd: "root",roles: [ "clusterAdmin","userAdminAnyDatabase","dbAdminAnyDatabase","readWriteAnyDatabase" ] } )
效果如图:

在主数据库插入数据

查看从库

分片:
创建配置服务复制集
docker run --name mongoc1 -d mongo:latest --configsvr --replSet "rs_configsvr" --bind_ip_all
docker run --name mongoc2 -d mongo:latest --configsvr --replSet "rs_configsvr" --bind_ip_all
通过 docker inspect 找到三个配置服务实例的 IP。比如 docker inspect mongoc1 | grep IPAddress,又由于--configsvr 的默认端口为 27019。所以配置服务的地址为
mongoc1:172.17.0.9
mongoc2:172.17.0.10

初始化

docker exec -it mongoc1 mongo --host 172.17.0.9 --port
use admin
rs.initiate(
{
_id: "rs_configsvr",
configsvr: true,
members: [
{ _id : , host : "172.17.0.9:27019" },
{ _id : , host : "172.17.0.10:27019" }
]
}
)

连接字符串为

mongodb://172.17.0.9:27019,172.17.0.10:27019/test?replicaSet=rs_configsvr

创建分片复制集
与上面同理,不再赘述,直接上命令行。

docker run --name mongors00 -d mongo:latest --shardsvr --replSet "rs_shardsvr0" --bind_ip_all
docker run --name mongors01 -d mongo:latest --shardsvr --replSet "rs_shardsvr0" --bind_ip_all
docker run --name mongors02 -d mongo:latest --shardsvr --replSet "rs_shardsvr0" --bind_ip_all
docker run --name mongors10 -d mongo:latest --shardsvr --replSet "rs_shardsvr1" --bind_ip_all
docker run --name mongors11 -d mongo:latest --shardsvr --replSet "rs_shardsvr1" --bind_ip_all
docker run --name mongors12 -d mongo:latest --shardsvr --replSet "rs_shardsvr1" --bind_ip_all
mongors00:172.17.0.8
mongors01:172.17.0.11
mongors02:172.17.0.12
mongors10:172.17.0.13
mongors11:172.17.0.14
mongors12:172.17.0.15

docker exec -it mongoc1 mongo --host 172.17.0.8 --port
use admin
rs.initiate(
{
_id : "rs_shardsvr0",
members: [
{ _id : , host : "172.17.0.8:27018" },
{ _id : , host : "172.17.0.11:27018" },
{ _id : , host : "172.17.0.12:27018" }
]
}
)
docker exec -it mongoc1 mongo --host 172.17.0.13 --port
use admin
rs.initiate(
{
_id : "rs_shardsvr1",
members: [
{ _id : , host : "172.17.0.13:27018" },
{ _id : , host : "172.17.0.14:27018" },
{ _id : , host : "172.17.0.15:27018" }
]
}
)

连接字符串为

mongodb://172.17.0.8:27018,172.17.0.11:27018,172.17.0.12:27018/test?replicaSet=rs_shardsvr0

mongodb://172.17.0.13:27018172.17.0.14:27018,172.17.0.15:27018/test?replicaSet=rs_shardsvr1

连接 mongos 到分片集群
由于镜像的默认入口是 mongod,所以要通过 --entrypoint "mongos" 将其改为 mongos:

docker run --name mongos0 -d --entrypoint "mongos" mongo:latest --configdb rs_configsvr/172.17.0.9:27019,172.17.0.10:27019 --bind_ip_all
地址为 172.17.0.16:27017

增加分片到集群&数据库启用分片

docker exec -it mongoc1 mongo --host 172.17.0.16 --port
use admin
sh.addShard("rs_shardsvr0/172.17.0.8:27018,172.17.0.11:27018,172.17.0.12:27018")
sh.addShard("rs_shardsvr1/172.17.0.13:27018,172.17.0.14:27018,172.17.0.15:27018")
sh.enableSharding("test")

如图:

分片 Collection
对 test.order 的 _id 字段进行哈希分片&插入数据:

sh.shardCollection("test.order", {"_id": "hashed" })
use test
for (i = 1; i <= 1000; i=i+1){
  db.order.insert({'price': 1})
}

查看数据分布

mongos> db.order.find().count()
1000

rs_shardsvr0:PRIMARY> db.order.find().count()
527

rs_shardsvr1:PRIMARY> db.order.find().count()
473


参考文章:

https://www.jianshu.com/p/c3811263fd3a

https://www.cnblogs.com/silentjesse/p/4676440.html

https://www.cnblogs.com/hehexiaoxia/p/6192796.html

https://www.cnblogs.com/jay54520/p/8444218.html

ubuntu docker 下mongodb集群和分片的更多相关文章

  1. MongoDB集群搭建-分片

    MongoDB集群搭建-分片 一.场景: 1,机器的磁盘不够用了.使用分片解决磁盘空间的问题. 2,单个mongod已经不能满足写数据的性能要求.通过分片让写压力分散到各个分片上面,使用分片服务器自身 ...

  2. windows下mongodb集群搭建

    本文介绍在windows环境下如何搭建一个高可用性的mongodb集群.系统环境为win7,mongodb版本为3.6.3. 本文采用的是分片+副本集的方式搭建集群,将分别介绍如何使用副本集和分片来提 ...

  3. Mongodb集群与分片 1

    分片集群   Mongodb中数据分片叫做chunk,它是一个Collection中的一个连续的数据记录,但是它有一个大小限制,不可以超过200M,如果超出产生新的分片.   下面是一个简单的分片集群 ...

  4. MongoDB集群之分片技术应用 —— 学习笔记

    课程链接:https://www.imooc.com/learn/501 一.什么是分片? 分片:将数据进行2拆分,将数据水平的分散到不同的服务器上. 二.为什么要分片? 架构上:读写均衡.去中心化 ...

  5. MongoDB集群之分片

    原文:点击打开链接 MongoDB分片 分片(sharding)是将数据拆分,将其分散在不同的机器上的过程.MongoDB支持自动分片 片键(shard key)设置分片时,需要从集合里面选一个键,用 ...

  6. mongodb集群配置分片集群

    测试环境 操作系统:CentOS 7.2 最小化安装 主服务器IP地址:192.168.197.21 mongo01 从服务器IP地址:192.168.197.22 mongo02 从服务器IP地址: ...

  7. Mongodb集群与分片 2

    前面我们介绍了简单的集群配置实例.在简单实例中,虽然MongoDB auto-Sharding解决了海量存储问题,和动态扩容问题,但是离我们在真实环境下面所需要的高可靠性和高可用性还有一定的距离. 下 ...

  8. docker 下 mysql 集群的搭建

    下载程序&&创建docker容器 从mysql官网https://dev.mysql.com/downloads/cluster/上下载mysql集群库mysql-cluster-gp ...

  9. mongodb 集群部署--分片服务器搭建

    部署分片服务器 1.分片 为了突破单点数据库服务器的I/O能力限制,对数据库存储进行水平扩展,严格地说,每一个服务器或者实例或者复制集就是一个分片. 2.优势 提供类似现行增·长架构 提高数据可用性 ...

随机推荐

  1. Web API接口安全了解

    2017版OWASP top 10 将API安全纳入其中,足以说明API被广泛使用且安全问题严重.自己尝试整理一下,但限于本人搬砖经验还不足.水平有限,本文只能算是抛砖引玉,希望大伙不吝赐教. 了解W ...

  2. Android源码分析(十六)----adb shell 命令进行OTA升级

    一: 进入shell命令界面 adb shell 二:创建目录/cache/recovery mkdir /cache/recovery 如果系统中已有此目录,则会提示已存在. 三: 修改文件夹权限 ...

  3. Spark调用Linux命令实现解压和压缩功能

    一.应用场景 在Spark程序中调用Linux命令,实现一些程序难以实现的功能,例如:发送模拟邮件.文件打包或解压等等 二.代码实现 package big.data.analyse.linux im ...

  4. Mysql读写分离操作

    环境:两台centos环境,安装mysql(mariadb) web网站的优化: 缓存技术 数据库缓存 redis 文件缓存 图片 fastdfs 负载均衡 nginx 数据库主从备份,读写分离 图解 ...

  5. nginx $remote_addr 详解

    1. 参考:https://blog.51cto.com/cuidehua/1827244?source=drt

  6. ThinkPHP获取当前页URL添加canonical

    最近ytkah正在开发一个thinkPHP项目,数据量有点大,很多页面都没被索引,需要对模板进行修改,首先需要改的是页面唯一性,因为产品页加入购物车等行为会带有一些参数,如果不加入canonical标 ...

  7. Spring-Data-Redis 入门学习

    Spring-Data-Redis 入门学习 参考文章: https://www.jianshu.com/p/4a9c2fec1079 导入 redis 相关依赖 <dependency> ...

  8. USACO Cow Frisbee Team

    洛谷 P2946 [USACO09MAR]牛飞盘队Cow Frisbee Team 洛谷传送门 JDOJ 2632: USACO 2009 Mar Silver 2.Cow Frisbee Team ...

  9. 2016 ACM/ICPC亚洲区青岛站

    A B C D E F G H I J K L M O O O O     $\varnothing$     $\varnothing$  $\varnothing$  $\varnothing$  ...

  10. 31 树莓派外接Oled屏幕

    http://shumeipai.nxez.com/2017/09/13/solve-the-raspberry-pi-drive-oled-problem.html