Docker安装MongoDB4.1群集

docker安装mongodb4.1群集

官网:https://www.mongodb.com

镜像:https://hub.docker.com/_/mongo/

github: Dockerfile

相关概念

sharded-cluster-production-architecture.bakedsvg.svg

路由,分片、副本集、配置服务器

四个组件:mongosconfig servershardreplica 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 # mongos1
mkdir -p /home/toor/Documents/mongodb/mongodbtest/mongos2 # mongos2
mkdir -p /home/toor/Documents/mongodb/mongodbtest/cs/rs1 /home/toor/Documents/mongodb/mongodbtest/cs/rs2 /home/toor/Documents/mongodb/mongodbtest/cs/rs3 # config server replset
mkdir -p /home/toor/Documents/mongodb/mongodbtest/sh1/rs1 /home/toor/Documents/mongodb/mongodbtest/sh1/rs2 /home/toor/Documents/mongodb/mongodbtest/sh1/rs3 # sharding
mkdir -p /home/toor/Documents/mongodb/mongodbtest/sh2/rs1 /home/toor/Documents/mongodb/mongodbtest/sh2/rs2 /home/toor/Documents/mongodb/mongodbtest/sh2/rs3 # sharding

创建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 进行身份认证

# 不加会有一个28017的端口监听,可以通过网页管理mongodb,不需要请去掉
--nohttpinterface

# 这两个参数的作用就是改变启动端口
--shardsvr
--configsvr

# 副本集设置
--replSet

# 这一项是用来指定chunk的大小的,单位是MB,默认大小为200MB
--chunkSize

# 可以限制访问的ip
--bind_ip

# 可以重新制定端口,默认为27017
--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() //查看状态

QQ截图20180824094655.png

启用分片

设置分片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")

# 为表创建的索引,以”id“为索引
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分片副本集群