mongodb 分片集群部署
背景
因云厂商私有云环境无法提供mongodb云组件,需要利用ecs云服务器自行搭建mongodb集群 ,本次采用分片集群部署方式。
分片组件介绍
集群主要组件有mongos、config server、shard、replica set
mongos 路由服务器:
集群请求入口,本质上是个请求分发中心,将对应请求转发到对应shard分片服务器上。常规会配置多个 mongos 路由服务器,确保高可用。
config server 配置服务器:
用于存储数据元信息(路由,分片)的配置。
mongos 路由服务器本身没有物理存储分片服务器和数据路由信息,只缓存在内存中。
而配置服务器则实际存储这部分信息,数据。
在 mongos 路由服务器启动时,就从 config server 配置服务器中加载该配置。
而 config server 配置服务器中任何配置信息发生变化,都会通知 mongos 更新状态。
(ps:个人认为这是分片集群核心)
shard 分片:
将库拆分,根据片键将数据拆分存储。
其基本思想:将集合分块,分散到若干片中,每个片只负责总数据的一部分,最终通过均衡器保证各分片数据量均衡。
replica set 副本集/复制集:
数据的冗余备份机制,配置子节点作为从服务器,用于存储数据副本,提高高可用。
部署架构
本次部署利用3台ecs,mongodb001-003。(需先初始化swarm集群)
mongodb001: shard1 (分片1,用于存储数据)
mongodb002: shard2 (分片2,用于存储数据)
mongodb003: config|mongos (config 配置中心;mongos 路由中心)
部署方式
本次在docker-swarm集群内部署, 采用docker-compose.yaml 脚本运行容器。
环境准备
- 初始化swarm集群,本文不概述,可自行查询。
- 对应主机创建挂载目录。(下文脚本内有注释)
- 可提前拉取脚本所需对应版本镜像
docker pull mongo:4.4.5 - 在leader节点创建部署脚本中所需容器网络:
docker network create rosetta_network
部署脚本 mongos.yaml
使用如下命令启动mongos集群
docker stack deploy -c mongos.yaml mongos
version: '3.3'
services:
shard1-server1:
hostname: shard1-server1
image: mongo:4.4.5
command: mongod --shardsvr --directoryperdb --replSet shard1
networks:
- rosetta_network
volumes:
- /etc/localtime:/etc/localtime #挂载主机时间,保持mongos集群内部时间一致
- /data/mongodb/shard1:/data/db #需提前在对应主机创建挂载目录/data/mongodb/shard1
deploy:
placement:
constraints: #绑定部署主机
- node.id == 6qoq868gcnym6evpl60d5haqm
shard2-server2:
hostname: shard2-server2
image: mongo:4.4.5
command: mongod --shardsvr --directoryperdb --replSet shard2
networks:
- rosetta_network
volumes:
- /etc/localtime:/etc/localtime
- /data/mongodb/shard2:/data/db #需提前在对应主机创建挂载目录/data/mongodb/shard1
deploy:
placement:
constraints:
- node.id == 31lkqh47qa7rmbnehasmeyyih
config:
image: mongo:4.4.5
command: mongod --configsvr --directoryperdb --replSet fates-mongo-config
networks:
- rosetta_network
volumes:
- /etc/localtime:/etc/localtime
- /data/mongodb/config:/data/configdb #需提前在对应主机创建挂载目录/data/mongodb/shard1
deploy:
placement:
constraints:
- node.id == xl6kdbz1hehqs1j422hltnaet
mongos:
image: mongo:4.4.5
command: mongos --configdb fates-mongo-config/config:27019 --bind_ip 0.0.0.0 --port 27017
networks:
- rosetta_network
ports:
- 27017:27017
volumes:
- /etc/localtime:/etc/localtime
depends_on: #启动顺序依赖
- config
deploy:
placement:
constraints:
- node.id == xl6kdbz1hehqs1j422hltnaet
mode: global
networks:
rosetta_network: #创建mongos集群网络
external: true
集群初始化配置
# 添加配置服务器|连接config容器
docker exec -it $(docker ps | grep "config" | awk '{ print $1 }') bash -c "echo 'rs.initiate({_id: \"fates-mongo-config\",configsvr: true, members: [{ _id : 0, host : \"config:27019\" }]})' | mongo --port 27019"
# 添加分片服务器|连接shard容器
docker exec -it $(docker ps | grep "shard1" | awk '{ print $1 }') bash -c "echo 'rs.initiate({_id : \"shard1\", members: [{ _id : 0, host : \"shard1-server1:27018\" }]})' | mongo --port 27018"
docker exec -it $(docker ps | grep "shard2" | awk '{ print $1 }') bash -c "echo 'rs.initiate({_id : \"shard2\", members: [{ _id : 0, host : \"shard2-server2:27018\" }]})' | mongo --port 27018"
# 添加分片集群到mongos中|连接mongos容器
docker exec -it $(docker ps | grep "mongos" | awk '{ print $1 }') bash -c "echo 'sh.addShard(\"shard1/shard1-server1:27018\")' | mongo "]
docker exec -it $(docker ps | grep "mongos" | awk '{ print $1 }') bash -c "echo 'sh.addShard(\"shard2/shard2-server2:27018\")' | mongo "
创建账号及业务所需数据集
# 使用以下命令尝试连接mongo容器,并添加用户和设置密码。
$ docker exec -it mongo mongo admin
1. 创建一个名为 admin,密码为 123456 的用户。
db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
# 尝试使用上面创建的用户信息进行连接。
> db.auth('admin', '123456')
2. 为mongo 添加集合
> db.getCollection("DataSet").drop(); db.createCollection("DataSet"); db.getCollection("TaskInfo").drop(); db.createCollection("TaskInfo");
spring配置mongos连接
spring:
data:
mongodb:
uri: mongodb://admin:123456@192.168.1.181:8017/admin
附
修改config容器mongod.conf配置文件
在使用mongo:4.4.5版本镜像进行部署时,配置文件mongod.conf的默认路径是/etc/mongod.conf。你可以在容器中的该路径下找到和编辑MongoDB的配置文件。
以下是`mongod.conf`配置文件的详细解释:
- `systemLog.path`:指定MongoDB的日志文件路径。默认值为`/var/log/mongodb/mongod.log`。你可以通过修改该字段来指定MongoDB的日志文件路径。
- `storage.dbPath`:指定MongoDB存储数据的路径。默认值为`/data/db`。你可以通过修改该字段来指定MongoDB存储数据的路径。
- `net.port`:指定MongoDB监听的端口号。默认值为`27017`。你可以通过修改该字段来指定MongoDB监听的端口号。
- `sharding.clusterRole`:指定该节点在分片集群中的角色,可以是configsvr或者shardsvr。默认值为`null`,表示该节点不是分片集群中的任何一种角色。
除了上述字段外,还有一些其他常用的配置项,例如:
- `security.authorization`:启用或禁用MongoDB的访问控制功能。
- `replication.replSetName`:指定MongoDB副本集的名称。
- `processManagement.fork`:启用或禁用MongoDB在后台运行。
你可以在MongoDB官方文档中找到完整的配置项列表和详细说明。