docker-swarm mongodb 分片集群搭建

764 阅读5分钟

mongodb 分片集群部署

背景

因云厂商私有云环境无法提供mongodb云组件,需要利用ecs云服务器自行搭建mongodb集群 ,本次采用分片集群部署方式。

分片组件介绍

集群主要组件有mongosconfig servershardreplica 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 脚本运行容器。

环境准备

  1. 初始化swarm集群,本文不概述,可自行查询。
  2. 对应主机创建挂载目录。(下文脚本内有注释)
  3. 可提前拉取脚本所需对应版本镜像 docker pull mongo:4.4.5
  4. 在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官方文档中找到完整的配置项列表和详细说明。