docker安装mongodb4.1群集
官网:https://www.mongodb.com
镜像:https://hub.docker.com/_/mongo/
github: Dockerfile
相关概念
路由,分片、副本集、配置服务器
四个组件:mongos
、config server
、shard
、replica set
。
mongos
,数据库集群请求的入口,所有的请求都通过 mongos
进行协调,不需要在应用程序添加一个路由选择器,mongos
自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的 shard
服务器上。在生产环境通常有多 mongos
作为请求的入口,防止其中一个挂掉所有的 mongodb
请求都没有办法操作。
config server
,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos
本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos
第一次启动或者关掉重启就会从 config server
加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos
更新自己的状态,这样 mongos
就能继续准确路由。在生产环境通常有多个 config server
配置服务器,因为它存储了分片路由的元数据,防止数据丢失!
shard
,分片(sharding
)是指将数据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。
replica set
,中文翻译 副本集
,其实就是 shard
的备份,防止 shard
挂掉之后数据丢失。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
仲裁者(Arbiter)
,是复制集中的一个 MongoDB
实例,它并不保存数据。仲裁节点使用最小的资源并且不要求硬件设备,不能将 Arbiter
部署在同一个数据集节点中,可以部署在其他应用服务器或者监视服务器中,也可部署在单独的虚拟机中。为了确保复制集中有奇数的投票成员(包括 primary
),需要添加仲裁节点做为投票,否则 primary
不能运行时不会自动切换 primary
。
注:mongodb3.4
以后要求配置服务器也创建副本集,不然集群搭建不成功。
部署
目录结构:
1 2 3
| mongodb |--docker-compose.yml |- mongodbtest
|
创建2个路由服务(mongos
) 命令:configdb
创建3个配置服务(configsvr
)
创建2个分片服务(shardsvr
),每个 shardsvr
包含3个副本,其中1个主节点,1个从节点,1个仲裁节点。
创建目录
在 mongodb
目录运行以下命令生成目录:
1 2 3 4 5
| mkdir -p /home/toor/Documents/mongodb/mongodbtest/mongos1 mkdir -p /home/toor/Documents/mongodb/mongodbtest/mongos2 mkdir -p /home/toor/Documents/mongodb/mongodbtest/cs/rs1 /home/toor/Documents/mongodb/mongodbtest/cs/rs2 /home/toor/Documents/mongodb/mongodbtest/cs/rs3 mkdir -p /home/toor/Documents/mongodb/mongodbtest/sh1/rs1 /home/toor/Documents/mongodb/mongodbtest/sh1/rs2 /home/toor/Documents/mongodb/mongodbtest/sh1/rs3 mkdir -p /home/toor/Documents/mongodb/mongodbtest/sh2/rs1 /home/toor/Documents/mongodb/mongodbtest/sh2/rs2 /home/toor/Documents/mongodb/mongodbtest/sh2/rs3
|
创建docker-compose
1 2
| touch docker-compose.yml vim docker-compose.yml
|
docker-compose.yml内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| version: '3' services: csrs1: image: mongo:latest volumes: - $PWD/mongodbtest/cs/rs1:/data/db command: mongod --noauth --configsvr --replSet csrs --dbpath /data/db csrs2: image: mongo:latest volumes: - $PWD/mongodbtest/cs/rs2:/data/db command: mongod --noauth --configsvr --replSet csrs --dbpath /data/db csrs3: image: mongo:latest volumes: - $PWD/mongodbtest/cs/rs3:/data/db command: mongod --noauth --configsvr --replSet csrs --dbpath /data/db mongos1: image: mongo:latest volumes: - $PWD/mongodbtest/mongos1:/data/db command: mongos --noauth --configdb csrs/csrs1:27019,csrs2:27019,csrs3:27019 mongos2: image: mongo:latest volumes: - $PWD/mongodbtest/mongos2:/data/db command: mongos --noauth --configdb csrs/csrs1:27019,csrs2:27019,csrs3:27019 sh1rs1: image: mongo:latest volumes: - $PWD/mongodbtest/sh1/rs1:/data/db command: mongod --noauth --dbpath /data/db --shardsvr --replSet shrs1 sh1rs2: image: mongo:latest volumes: - $PWD/mongodbtest/sh1/rs2:/data/db command: mongod --noauth --dbpath /data/db --shardsvr --replSet shrs1 sh1rs3: image: mongo:latest volumes: - $PWD/mongodbtest/sh1/rs3:/data/db command: mongod --noauth --dbpath /data/db --shardsvr --replSet shrs1 sh2rs1: image: mongo:latest volumes: - $PWD/mongodbtest/sh2/rs1:/data/db command: mongod --noauth --dbpath /data/db --shardsvr --replSet shrs2 sh2rs2: image: mongo:latest volumes: - $PWD/mongodbtest/sh2/rs2:/data/db command: mongod --noauth --dbpath /data/db --shardsvr --replSet shrs2 sh2rs3: image: mongo:latest volumes: - $PWD/mongodbtest/sh2/rs3:/data/db command: mongod --noauth --dbpath /data/db --shardsvr --replSet shrs2
|
注:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| --noauth 不进行身份认证 --auth 进行身份认证
--nohttpinterface
--shardsvr --configsvr
--replSet
--chunkSize
--bind_ip
--port
|
初始化[配置服务]副本集(Config Server)
1 2 3 4 5 6
| docker-compose exec csrs1 mongo --port 27019 rs.initiate() rs.add('csrs2:27019') rs.add('csrs3:27019') rs.status() //查看状态 quit() // 退出 或 exit
|
注:config server
默认端口为 27019
初始化分片
注:shard server
默认端口号为 27018
shrs1副本集
1 2 3 4 5 6 7 8
| docker-compose exec sh1rs1 mongo --port 27018 rs.initiate() var cfg = rs.conf() cfg.members[0].host = 'sh1rs1:27018' rs.reconfig(cfg) rs.add('sh1rs2:27018') rs.add({host:"sh1rs3:27018", arbiterOnly:true}) // 仲裁 quit()
|
shrs2副本集
1 2 3 4 5 6 7 8
| docker-compose exec sh2rs1 mongo --port 27018 rs.initiate() var cfg = rs.conf() cfg.members[0].host = 'sh2rs1:27018' rs.reconfig(cfg) rs.add('sh2rs2:27018') rs.add({host:"sh2rs3:27018", arbiterOnly:true}) quit()
|
通过mongos添加分片关系到configsvr
mongos1:
1 2 3 4
| docker-compose exec mongos1 mongo sh.addShard('shrs1/sh1rs1:27018,sh1rs2:27018,sh1rs3:27018') sh.addShard('shrs2/sh2rs1:27018,sh2rs2:27018,sh2rs3:27018') sh.status() //查看状态
|
mongos2:
1 2 3 4
| docker-compose exec mongos2 mongo sh.addShard('shrs1/sh1rs1:27018,sh1rs2:27018,sh1rs3:27018') sh.addShard('shrs2/sh2rs1:27018,sh2rs2:27018,sh2rs3:27018') sh.status() //查看状态
|
启用分片
设置分片chunk大小
1 2
| use config db.settings.save({"_id":"chunksize","value":1}) // //设置块大小为1M是方便实验,不然就需要插入海量数据
|
启用数据库分片
1 2 3 4 5 6 7 8 9
| sh.enableSharding("python")
db.user.createIndex({"id":1})
sh.shardCollection("python.user",{"id":1}) sh.status()
|
模拟写入数据
1 2 3 4 5 6
| use python for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})} sh.status() db.user.stats() db.user.count() show dbs
|
后期运维
mongodb 的启动顺序是,先启动配置服务器,在启动分片,最后启动 mongos.
关闭时,直接 killall
杀掉所有进程
例:
1 2
| killall mongod killall mongos
|
参考:
mongodb 3.4 集群搭建:分片+副本集
MongoDB(4.0)分片——大数据的处理之道
mongodb 3.4 集群搭建升级版 五台集群
docker 搭建 mongo 集群
[原创]在Docker上部署mongodb分片副本集群