【Mongodb】Docker安装Mongodb shard集群

MongoDB分片介绍

分片机制提供了如下三种优势

  • 1.对集群进行抽象,让集群“不可见”

MongoDB自带了一个叫做mongos的专有路由进程。mongos就是掌握统一路口的路由器,其会将客户端发来的请求准确无误的路由到集群中的一个或者一组服务器上,同时会把接收到的响应拼装起来发回到客户端。

  • 2.保证集群总是可读写

MongoDB通过多种途径来确保集群的可用性和可靠性。将MongoDB的分片和复制功能结合使用,在确保数据分片到多台服务器的同时,也确保了每分数据都有相应的备份,这样就可以确保有服务器换掉时,其他的从库可以立即接替坏掉的部分继续工作。

  • 3.使集群易于扩展

当系统需要更多的空间和资源的时候,MongoDB使我们可以按需方便的扩充系统容量。

分片集群架构

组件 |说明 |
-|-|-
Config Server |存储集群所有节点、分片数据路由信息。默认需要配置3个Config Server节点 |
Mongos |提供对外应用访问,所有操作均通过mongos执行。一般有多个mongos节点。数据迁移和数据自动平衡 |
Mongod |存储应用数据记录。一般有多个Mongod节点,达到数据分片目的 |

分片集群的构造

(1) mongos :数据路由,和客户端打交道的模块。mongos本身没有任何数据,他也不知道该怎么处理这数据,去找config server

(2) config server:所有存、取数据的方式,所有shard节点的信息,分片功能的一些配置信息。可以理解为真实数据的元数据

(3) shard:真正的数据存储位置,以chunk为单位存数据

Mongos本身并不持久化数据,Sharded cluster所有的元数据都会存储到Config Server,而用户的数据会议分散存储到各个shard。Mongos启动后,会从配置服务器加载元数据,开始提供服务,将用户的请求正确路由到对应的碎片。

Mongos的路由功能

当数据写入时,MongoDB Cluster根据分片键设计写入数据

当外部语句发起数据查询时,MongoDB根据数据分布自动路由至指定节点返回数据

安装shard集群

创建必要的文件夹并且赋权

mkdir mongodb-shard
cd mongodb-shard
mkdir db1
mkdir db2
mkdir db3
mkdir db4
mkdir db5
mkdir db6
mkdir cdb1
mkdir cdb2
chmod -R 777 ./*

一、创建分片服务 shardsvr

docker run --name rs1_container1 -d -p 20001:20001 -v $PWD/db1:/data/db1 mongo:latest --shardsvr --replSet "rs1" --port 20001 --bind_ip_all --dbpath /data/db1
docker run --name rs1_container2 -d -p 20002:20001 -v $PWD/db2:/data/db2 mongo:latest --shardsvr --replSet "rs1" --port 20001 --bind_ip_all --dbpath /data/db2
docker run --name rs1_container3 -d -p 20003:20001 -v $PWD/db3:/data/db3 mongo:latest --shrdsvr --replSet "rs1" --port 20001 --bind_ip_all --dbpath /data//db3

docker run --name rs2_container1 -d -p 20011:20001 -v $PWD/db4:/data/db4 mongo:latest --shardsvr --replSet "rs2" --port 20001 --bind_ip_all --dbpath /data/db4
docker run --name rs2_container2 -d -p 20012:20001 -v $PWD/db5:/data/db5 mongo:latest --shardsvr --replSet "rs2" --port 20001 --bind_ip_all --dbpath /data/db5
docker run --name rs2_container3 -d -p 20013:20001 -v $PWD/db6:/data/db6 mongo:latest --shardsvr --replSet "rs2" --port 20001 --bind_ip_all --dbpath /data/db6

二、创建配置服务 configsvr

docker run --name config_container1 -d -p 21001:20001 -v $PWD/cdb1:/data/db mongo:latest --configsvr --replSet "crs" --port 20001 --bind_ip_all --dbpath /data/db
docker run --name config_container2 -d -p 21002:20001 -v $PWD/cdb2:/data/db mongo:latest --configsvr --replSet "crs" --port 20001 --bind_ip_all --dbpath /data/db

三、启动路由服务 mongos

192.168.0.15改成机器外网ip或者内网ip

docker run --name mongos_container1 -d -p 22001:20001 --entrypoint "mongos" mongo:latest --configdb crs/192.168.0.15:21001,192.168.0.15:21002 --port 20001 --bind_ip_all
docker run --name mongos_container2 -d -p 22002:20001 --entrypoint "mongos" mongo:latest --configdb crs/192.168.0.15:21001,192.168.0.15:21002 --port 20001 --bind_ip_all

四、初始化分片rs1副本集

192.168.0.15改成机器外网ip或者内网ip

docker exec -it rs1_container1 /bin/bash
# 任意选择rs1分片的一个副本
mongo --port 20001
# 切换数据库
use admin
# 写配置文件
config = {_id:"rs1",members:[ {_id:0,host:"192.168.0.15:20001"}, {_id:1,host:"192.168.0.15:20002"}, {_id:2,host:"192.168.0.15:20003",arbiterOnly:true} ] }
# 初始化副本集
rs.initiate(config)
# 查看副本集状态
rs.status()

五、初始化分片rs2副本集

192.168.0.15改成机器外网ip或者内网ip

docker exec -it rs2_container1 /bin/bash
# 任意选择rs2分片的一个副本
mongo --port 20001
# 切换数据库
use admin
# 写配置文件
config = {_id:"rs2",members:[ {_id:0,host:"192.168.0.15:20011"}, {_id:1,host:"192.168.0.15:20012"}, {_id:2,host:"192.168.0.15:20013",arbiterOnly:true} ] }
# 初始化副本集
rs.initiate(config)
# 查看副本集状态
rs.status()

六、初始化配置服务副本集

192.168.0.15改成机器外网ip或者内网ip

docker exec -it config_container1 /bin/bash
# 任意选择crs分片的一个副本
mongo --port 20001
# 切换数据库
use admin
# 写配置文件
config = {_id:"crs", configsvr:true, members:[ {_id:0,host:"192.168.0.15:21001"}, {_id:1,host:"192.168.0.15:21002"} ] }
# 初始化副本集
rs.initiate(config)
# 查看副本集状态
rs.status()

七、通过mongos添加分片关系到configsvr

192.168.0.15改成机器外网ip或者内网ip

docker exec -it mongos_container1 /bin/bash
mongo --port 20001
use admin
db.runCommand({addshard:"rs1/192.168.0.15:20001,192.168.0.15:20002,192.168.0.15:20003"})
db.runCommand({addshard:"rs2/192.168.0.15:20011,192.168.0.15:20012,192.168.0.15:20013"})
db.runCommand({listshards:1})

八、设置数据库、集合分片

db.runCommand({enablesharding:"mydb"})
db.runCommand({shardcollection:"mydb.person", key:{id:1, company:1}})

九、测试分片结果

use mydb
for (i =0; i<10000;i++){db.person.save({id:i, company:"baidu"})}
db.person.stats()

十、其他

设置一个仲裁者(可忽略)

rs.addArb("192.168.1.122:27017") 

连接测试

提供Navicat Premium和Springboot连接方式

Navicat Premium连接mongodb选择随便一台mongos地址的端口连接就行

SpringBoot

database是刚才上面创建的

spring.data.mongodb.uri=mongodb://192.168.0.15:22001,192.168.0.15:22002/
spring.data.mongodb.database=mydb

demo:https://github.com/ciweigg2/springboot-mongodb


文章作者: Ciwei
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ciwei !
 上一篇
【Mongodb】Docker安装Mongodb replica set集群 【Mongodb】Docker安装Mongodb replica set集群
创建docker-compose文件 vi docker-compose.yml version: '2' services: db0: image: mongo restart: always mem_li
2019-10-16
下一篇 
kind安装测试环境集群(不能用于生产) kind安装测试环境集群(不能用于生产)
Kind(Kubernetes in Docker) 是一个 Kubernetes 孵化项目,Kind 是一套开箱即用的 Kubernetes 环境搭建方案。顾名思义,就是将 Kubernetes 所需要的所有组件,全部部署在一个 Dock
2019-09-20
  目录