首先我们计划启动了三个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. Alpha4

    一.站立式会议照片 二.工作进展 (1) 昨天已完成的工作 a. 实现用户登录时获取用户信息功能 b. 实现个人目标列表,允许用户在个人目标界面浏览已设置的目标 c. 继续实现目标广场列表 (2)今天 ...

  2. 结对项目(JAVA)

    项目成员: 邓镇港 3117004608 陈嘉欣 3117004604 一.Github项目地址: https://github.com/kestrelcjx/operation_expression ...

  3. 设计模式:单例(Sigleton)模式

    题目:设计一个类,我们只能生成该类的一个实例. 只能生成一个实例的类是实现了Singleton(单例)模式的类型. 相关知识: 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象 ...

  4. 用matlab计算线性回归问题

    看机器学习的时候遇到的第一个算法就是线性回归,高数中很详细的说明了线性回归的原理和最小2乘法的计算过程,很显然不适合手动计算,好在各种语言都有现成的函数使用,让我们愉快的做个调包侠吧 简单线性回归 R ...

  5. window配合虚拟机VMware搭建虚拟ubuntu服务器入坑集锦

    1.VMware虚拟机和主机进行网络连接设置 https://jingyan.baidu.com/article/adc81513b86621f723bf7383.html 2.解决linux虚拟机与 ...

  6. Spring Boot 2 整合 Dubbo 框架 ,实现 RPC 服务远程调用

    一.Dubbo框架简介 1.框架依赖   图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代 ...

  7. Linux shell变量详解

    Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个 ...

  8. Linux常用指定

    学前理论 linux主要特征 :一切且文件(目录.硬盘等都是文件):硬件都在/dev 目录,如硬盘.U盘为/dev/sd[a-d]: /dev/sr0(/dev/cdrom)是光驱的设备名(df命令查 ...

  9. vue-router路由高亮效果

    审查代码,查看激活类名 (1)设置激活类名样式 (2)也可以在路由文件里配置激活类名的别名 (3)配置别名后再次审查,如下所示 此时可以直接配置active类名样式即可 此时便可以实现路由高亮效果 .

  10. keil中使用——变参数宏__VA_ARGS__

    本文说的__VA_ARGS__,就是一个可变参数宏,与printf中可变参数的宏定义一个道理,是新C99规范中增加的. __VA_ARGS__详情内容 1.关于__VA_ARGS__ __VA_ARG ...