【超详细】手把手教你搭建MongoDB集群搭建

打印 上一主题 下一主题

主题 895|帖子 895|积分 2685


MongoDB集群搭建

MongoDB集群简介

mongodb 集群搭建的方式有三种:

  • 主从备份(Master - Slave)模式,或者叫主从复制模式。
  • 副本集(Replica Set)模式
  • 分片(Sharding)模式
其中,第一种方式基本没什么意义,官方也不推荐这种方式搭建。另外两种分别就是副本集和分片的方式。
Mongo分片高可用集群搭建

概述

​                为解决mongodb在replica set每个从节点上面的数据库均是对数据库的全量拷贝,从节点压力在高并发大数据量的场景下存在很大挑战,同时考虑到后期mongodb集群的在数据压力巨大时的扩展性,应对海量数据引出了分片机制。
什么是分片

​                分片是将数据库进行拆分,将其分散在不同的机器上的过程,无需功能强大的服务器就可以存储更多的数据,处理更大的负载,在总数据中,将集合切成小块,将这些块分散到若干片中,每个片只负载总数据的一部分,通过一个知道数据与分片对应关系的组件mongos的路由进程进行操作。
基础组件

其利用到了四个组件:mongos,config server,shard,replica set
mongos

​                数据库集群请求的入口,所有请求需要经过mongos进行协调,无需在应用层面利用程序来进行路由选择,mongos其自身是一个请求分发中心,负责将外部的请求分发到对应的shard服务器上,mongos作为统一的请求入口,为防止mongos单节点故障,一般需要对其做HA(高可用,Highly Available缩写)。
config server

​                配置服务器,存储所有数据库元数据(分片,路由)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存中来读取数据,mongos在第一次启动或后期重启时候,就会从config server中加载配置信息,如果配置服务器信息发生更新会通知所有的mongos来更新自己的状态,从而保证准确的请求路由,生产环境中通常也需要多个config server,防止配置文件存在单节点丢失问题。
shard

​                在传统意义上来讲,如果存在海量数据,单台服务器存储1T压力非常大,考虑到数据库的硬盘,网络IO,还有CPU,内存的瓶颈,如果多台进行分摊1T的数据,到每台上就是可估量的较小数据,在mongodb集群只要设置好分片规则,通过mongos操作数据库,就可以自动把对应的操作请求转发到对应的后端分片服务器上。
replica set

​                在总体mongodb集群架构中,对应的分片节点,如果单台机器下线,对应整个集群的数据就会出现部分缺失,这是不能发生的,因此对于shard节点需要replica set来保证数据的可靠性,生产环境通常为2个副本+1个仲裁。
整体架构

整体架构涉及到15个节点,我们这里使用Docker容器进行部署
那么我们先来总结一下我们搭建一个高可用集群需要多少个Mongo


  • mongos: 3台
  • configserver : 3台
  • shard : 3片; 每个分片由三个节点构成
容器部署情况

角色端口暴漏端口描述角色config-server127017--配置节点1--config-server227017--配置节点2--config-server327017--配置节点3--mongos-server12701730001路由节点1--mongos-server22701730002路由节点2--mongos-server32701730003路由节点3--shard1-server127017--分片1节点1Primaryshard1-server227017--分片1节点2Secondryshard1-server327017--分片1节点3Arbitershard2-server127017--分片2节点1Primaryshard2-server227017--分片2节点2Secondryshard2-server327017--分片2节点3Arbitershard3-server127017--分片3节点1Primaryshard3-server227017--分片3节点2Secondryshard3-server327017--分片3节点3Arbiter整体架构预览


基础环境准备

安装Docker

本次使用Docker环境进行搭建,需要提前准备好Docker环境
创建Docker网络

因为需要使用Docker搭建MongoDB集群,所以先创建Docker网络
  1. docker network create mongo-cluster
  2. docker network ls
复制代码

搭建ConfigServer副本集

我们先来搭建ConfigServer的副本集,这里面涉及到三个节点,我们需要创建配置文件以及启动容器
创建挂载目录

我们需要创建对应的挂载目录来存储配置文件以及日志文件
  1. # 创建配置文件目录
  2. mkdir -p /tmp/mongo-cluster/config-server/conf
  3. # 创建数据文件目录
  4. mkdir -p /tmp/mongo-cluster/config-server/data/{1..3}
  5. # 创建日志文件目录
  6. mkdir -p /tmp/mongo-cluster/config-server/logs/{1..3}
复制代码

创建密钥文件

因为我们知道搭建的话一定要高可用,而且一定要权限,这里mongo之间通信采用秘钥文件,所以我们先进行生成密钥文件
  1. # 创建密钥文件
  2. openssl rand -base64 756 > /tmp/mongo-cluster/config-server/conf/mongo.key
  3. # 设置
  4. chmod 600  /tmp/mongo-cluster/config-server/conf/mongo.key
复制代码

创建配置文件

因为由多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可
  1. echo "
  2. # 日志文件
  3. storage:
  4.   # mongod 进程存储数据目录,此配置仅对 mongod 进程有效
  5.   dbPath: /data/db
  6. systemLog:
  7.   destination: file
  8.   logAppend: true
  9.   path: /data/logs/mongo.log
  10. #  网络设置
  11. net:
  12.   port: 27017  #端口号
  13. #  bindIp: 127.0.0.1    #绑定ip
  14. replication:
  15.   replSetName: configsvr #副本集名称
  16. sharding:
  17.   clusterRole: configsvr # 集群角色,这里配置的角色是配置节点
  18. security:
  19.   authorization: enabled #是否开启认证
  20.   keyFile: /data/configdb/conf/mongo.key #keyFile路径
  21. "  > /tmp/mongo-cluster/config-server/conf/mongo.conf
复制代码

启动容器

启动config-server1
  1. docker run --name config-server1 -d \
  2. --net=mongo-cluster \
  3. --privileged=true \
  4. -v /tmp/mongo-cluster/config-server:/data/configdb \
  5. -v /tmp/mongo-cluster/config-server/data/1:/data/db \
  6. -v /tmp/mongo-cluster/config-server/logs/1:/data/logs \
  7. mongo --config /data/configdb/conf/mongo.conf
复制代码

启动config-server2
  1. docker run --name config-server2 -d \
  2. --net=mongo-cluster \
  3. --privileged=true \
  4. -v /tmp/mongo-cluster/config-server:/data/configdb \
  5. -v /tmp/mongo-cluster/config-server/data/2:/data/db \
  6. -v /tmp/mongo-cluster/config-server/logs/2:/data/logs \
  7. mongo --config /data/configdb/conf/mongo.conf
复制代码

启动config-server3
  1. docker run --name config-server3 -d \
  2. --net=mongo-cluster \
  3. --privileged=true \
  4. -v /tmp/mongo-cluster/config-server:/data/configdb \
  5. -v /tmp/mongo-cluster/config-server/data/3:/data/db \
  6. -v /tmp/mongo-cluster/config-server/logs/3:/data/logs \
  7. mongo --config /data/configdb/conf/mongo.conf
复制代码

初始化config-server

登录容器

进入第一台容器
  1. docker exec -it config-server1 bash
  2. mongo -port 27017
复制代码

执行命令

执行以下命令进行MongoDB容器的初始化
  1. rs.initiate(
  2.   {
  3.     _id: "configsvr",
  4.     members: [
  5.       { _id : 1, host : "config-server1:27017" },
  6.       { _id : 2, host : "config-server2:27017" },
  7.       { _id : 3, host : "config-server3:27017" }
  8.     ]
  9.   }
  10. )
复制代码
如果出现OK表示MongoDB配置服务器已经初始化成功

创建用户

因为我们需要对用户进行权限管理,我们需要创建用户,这里为了演示,我们创建超级用户 权限是root
  1. use admin
  2. db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
复制代码
这样就在MongoDB的admin数据库添加了一个用户名为root 密码是root的用户

搭建Shard分片组

由于mongos是客户端,所以我们先搭建好config以及shard之后再搭建mongos。
创建挂载目录

我们先创建挂载目录
  1. # 创建配置文件目录
  2. mkdir -p /tmp/mongo-cluster/shard{1..3}-server/conf
  3. # 创建数据文件目录
  4. mkdir -p /tmp/mongo-cluster/shard{1..3}-server/data/{1..3}
  5. # 创建日志文件目录
  6. mkdir -p /tmp/mongo-cluster/shard{1..3}-server/logs/{1..3}
复制代码

搭建shard1分片组

在同一台服务器上初始化一组分片
创建密钥文件

因为集群只需要一个密钥文件,我们可以将config-server中的密钥文件复制过来
  1. cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard1-server/conf/
复制代码

配置配置文件

因为有多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可
  1. echo "
  2. # 日志文件
  3. storage:
  4.   # mongod 进程存储数据目录,此配置仅对 mongod 进程有效
  5.   dbPath: /data/db
  6. systemLog:
  7.   destination: file
  8.   logAppend: true
  9.   path: /data/logs/mongo.log
  10. #  网络设置
  11. net:
  12.   port: 27017  #端口号
  13. #  bindIp: 127.0.0.1    #绑定ip
  14. replication:
  15.   replSetName: shard1 #复制集名称是 shardsvr
  16. sharding:
  17.   clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
  18. security:
  19.   authorization: enabled #是否开启认证
  20.   keyFile: /data/configdb/conf/mongo.key #keyFile路径
  21. "  > /tmp/mongo-cluster/shard1-server/conf/mongo.conf
复制代码

启动shard1-server1
  1. docker run --name shard1-server1 -d \
  2. --net=mongo-cluster \
  3. --privileged=true \
  4. -v /tmp/mongo-cluster/shard1-server:/data/configdb \
  5. -v /tmp/mongo-cluster/shard1-server/data/1:/data/db \
  6. -v /tmp/mongo-cluster/shard1-server/logs/1:/data/logs \
  7. mongo --config /data/configdb/conf/mongo.conf
复制代码

启动shard1-server2
  1. docker run --name shard1-server2 -d \
  2. --net=mongo-cluster \
  3. --privileged=true \
  4. -v /tmp/mongo-cluster/shard1-server:/data/configdb \
  5. -v /tmp/mongo-cluster/shard1-server/data/2:/data/db \
  6. -v /tmp/mongo-cluster/shard1-server/logs/2:/data/logs \
  7. mongo --config /data/configdb/conf/mongo.conf
复制代码

启动shard1-server3
  1. docker run --name shard1-server3 -d \
  2. --net=mongo-cluster \
  3. --privileged=true \
  4. -v /tmp/mongo-cluster/shard1-server:/data/configdb \
  5. -v /tmp/mongo-cluster/shard1-server/data/3:/data/db \
  6. -v /tmp/mongo-cluster/shard1-server/logs/3:/data/logs \
  7. mongo --config /data/configdb/conf/mongo.conf
复制代码

初始化shard1分片组

并且制定第三个副本集为仲裁节点
  1. docker exec  -it shard1-server1 bin/bash
  2. mongo -port 27017
复制代码

登录后进行初始化节点,这里面arbiterOnly:true是设置为仲裁节点
  1. #进行副本集配置
  2. rs.initiate(
  3.      {
  4.          _id : "shard1",
  5.          members: [
  6.              { _id : 0, host : "shard1-server1:27017" },
  7.              { _id : 1, host : "shard1-server2:27017" },
  8.              { _id : 2, host : "shard1-server3:27017",arbiterOnly:true }
  9.         ]
  10.     }
  11. );
复制代码
显示OK即副本集创建成功

创建用户

因为我们需要对用户进行权限管理,我们需要创建用户,这里为了演示,我们创建超级用户 权限是root
  1. use admin
  2. db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
复制代码

查看节点信息
  1. rs.isMaster()
复制代码

搭建shard2分片组

创建密钥文件

因为集群只需要一个密钥文件,我们可以将config-server中的密钥文件复制过来
  1. cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard2-server/conf/
复制代码

配置配置文件

因为有多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可
  1. echo "
  2. # 日志文件
  3. storage:
  4.   # mongod 进程存储数据目录,此配置仅对 mongod 进程有效
  5.   dbPath: /data/db
  6. systemLog:
  7.   destination: file
  8.   logAppend: true
  9.   path: /data/logs/mongo.log
  10. #  网络设置
  11. net:
  12.   port: 27017  #端口号
  13. #  bindIp: 127.0.0.1    #绑定ip
  14. replication:
  15.   replSetName: shard2 #复制集名称是 shard2
  16. sharding:
  17.   clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
  18. security:
  19.   authorization: enabled #是否开启认证
  20.   keyFile: /data/configdb/conf/mongo.key #keyFile路径
  21. "  > /tmp/mongo-cluster/shard2-server/conf/mongo.conf
复制代码

启动shard2-server1
  1. docker run --name shard2-server1 -d \
  2. --net=mongo-cluster \
  3. --privileged=true \
  4. -v /tmp/mongo-cluster/shard2-server:/data/configdb \
  5. -v /tmp/mongo-cluster/shard2-server/data/1:/data/db \
  6. -v /tmp/mongo-cluster/shard2-server/logs/1:/data/logs \
  7. mongo --config /data/configdb/conf/mongo.conf
复制代码

启动shard2-server2
  1. docker run --name shard2-server2 -d \
  2. --net=mongo-cluster \
  3. --privileged=true \
  4. -v /tmp/mongo-cluster/shard2-server:/data/configdb \
  5. -v /tmp/mongo-cluster/shard2-server/data/2:/data/db \
  6. -v /tmp/mongo-cluster/shard2-server/logs/2:/data/logs \
  7. mongo --config /data/configdb/conf/mongo.conf
复制代码

启动shard2-server3
  1. docker run --name shard2-server3 -d \
  2. --net=mongo-cluster \
  3. --privileged=true \
  4. -v /tmp/mongo-cluster/shard2-server:/data/configdb \
  5. -v /tmp/mongo-cluster/shard2-server/data/3:/data/db \
  6. -v /tmp/mongo-cluster/shard2-server/logs/3:/data/logs \
  7. mongo --config /data/configdb/conf/mongo.conf
复制代码

初始化shard2分片组

登录节点后进行初始化分片2
  1. docker exec -it shard2-server1 bin/bash
  2. mongo -port 27017
复制代码

执行下面的命令进行初始化分片2,arbiterOnly:true参数是设置为仲裁节点
  1. #进行副本集配置
  2. rs.initiate(
  3.      {
  4.          _id : "shard2",
  5.          members: [
  6.              { _id : 0, host : "shard2-server1:27017" },
  7.              { _id : 1, host : "shard2-server2:27017" },
  8.              { _id : 2, host : "shard2-server3:27017",arbiterOnly:true }
  9.         ]
  10.     }
  11. );
复制代码
返回ok就表示

创建用户

因为我们需要对用户进行权限管理,我们需要创建用户,这里为了演示,我们创建超级用户 权限是root
  1. use admin
  2. db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
复制代码

搭建shard3分片组

创建密钥文件

因为集群只需要一个密钥文件,我们可以将config-server中的密钥文件复制过来
  1. cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard3-server/conf/
复制代码

配置配置文件

因为有多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可
  1. echo "
  2. # 日志文件
  3. storage:
  4.   # mongod 进程存储数据目录,此配置仅对 mongod 进程有效
  5.   dbPath: /data/db
  6. systemLog:
  7.   destination: file
  8.   logAppend: true
  9.   path: /data/logs/mongo.log
  10. #  网络设置
  11. net:
  12.   port: 27017  #端口号
  13. #  bindIp: 127.0.0.1    #绑定ip
  14. replication:
  15.   replSetName: shard3 #复制集名称是 shard3
  16. sharding:
  17.   clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
  18. security:
  19.   authorization: enabled #是否开启认证
  20.   keyFile: /data/configdb/conf/mongo.key #keyFile路径
  21. "  > /tmp/mongo-cluster/shard3-server/conf/mongo.conf
复制代码

启动shard3-server1
  1. docker run --name shard3-server1 -d \
  2. --net=mongo-cluster \
  3. --privileged=true \
  4. -v /tmp/mongo-cluster/shard3-server:/data/configdb \
  5. -v /tmp/mongo-cluster/shard3-server/data/1:/data/db \
  6. -v /tmp/mongo-cluster/shard3-server/logs/1:/data/logs \
  7. mongo --config /data/configdb/conf/mongo.conf
复制代码

启动shard3-server2
  1. docker run --name shard3-server2 -d \
  2. --net=mongo-cluster \
  3. --privileged=true \
  4. -v /tmp/mongo-cluster/shard3-server:/data/configdb \
  5. -v /tmp/mongo-cluster/shard3-server/data/2:/data/db \
  6. -v /tmp/mongo-cluster/shard3-server/logs/2:/data/logs \
  7. mongo --config /data/configdb/conf/mongo.conf
复制代码

启动shard3-server3
  1. docker run --name shard3-server3 -d \
  2. --net=mongo-cluster \
  3. --privileged=true \
  4. -v /tmp/mongo-cluster/shard3-server:/data/configdb \
  5. -v /tmp/mongo-cluster/shard3-server/data/3:/data/db \
  6. -v /tmp/mongo-cluster/shard3-server/logs/3:/data/logs \
  7. mongo --config /data/configdb/conf/mongo.conf
复制代码

初始化shard3分片组

登录节点后进行初始化分片2
  1. docker exec -it shard3-server1 bin/bash
  2. mongo -port 27017
复制代码

执行下面的命令进行初始化分片3,arbiterOnly:true参数是设置为仲裁节点
  1. #进行副本集配置
  2. rs.initiate(
  3.      {
  4.          _id : "shard3",
  5.          members: [
  6.              { _id : 0, host : "shard3-server1:27017" },
  7.              { _id : 1, host : "shard3-server2:27017" },
  8.              { _id : 2, host : "shard3-server3:27017",arbiterOnly:true }
  9.         ]
  10.     }
  11. );
复制代码

创建用户

因为我们需要对用户进行权限管理,我们需要创建用户,这里为了演示,我们创建超级用户 权限是root
  1. use admin
  2. db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
复制代码

搭建Mongos

mongos负责查询与数据写入的路由,是实例访问的统一入口,是一个无状态的节点,每一个节点都可以从config-server节点获取到配置信息
创建挂载目录

我们需要创建对应的挂载目录来存储配置文件以及日志文件
  1. # 创建配置文件目录
  2. mkdir -p /tmp/mongo-cluster/mongos-server/conf
  3. # 创建数据文件目录
  4. mkdir -p /tmp/mongo-cluster/mongos-server/data/{1..3}
  5. # 创建日志文件目录
  6. mkdir -p /tmp/mongo-cluster/mongos-server/logs/{1..3}
复制代码

创建密钥文件

因为集群只需要一个密钥文件,我们可以将config-server中的密钥文件复制过来
  1. cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/mongos-server/conf/
复制代码

创建配置文件

因为有多个容器,配置文件是一样的,我们只需要创建一个配置文件,其他的容器统一读取该配置文件即可,因为Mongos只负责路由,就不需要数据文件了,并且mongos服务是不负责认证的,需要将authorization配置项删除
  1. echo "
  2. # 日志文件
  3. systemLog:
  4.   destination: file
  5.   logAppend: true
  6.   path: /data/logs/mongo.log
  7. #  网络设置
  8. net:
  9.   port: 27017  #端口号
  10. #  bindIp: 127.0.0.1    #绑定ip
  11. # 配置分片,这里面配置的是需要读取的配置节点的信息
  12. sharding:
  13.   configDB: configsvr/config-server1:27017,config-server2:27017,config-server3:27017
  14. security:
  15.   keyFile: /data/configdb/conf/mongo.key #keyFile路径
  16. "  > /tmp/mongo-cluster/mongos-server/conf/mongo.conf
复制代码

启动mongos集群

启动mongos1
  1. docker run --name mongos-server1 -d \
  2. -p 30001:27017 \
  3. --net=mongo-cluster \
  4. --privileged=true \
  5. --entrypoint "mongos" \
  6. -v /tmp/mongo-cluster/mongos-server:/data/configdb \
  7. -v /tmp/mongo-cluster/mongos-server/logs/1:/data/logs \
  8. mongo --config /data/configdb/conf/mongo.conf
复制代码

启动mongos2
  1. docker run --name mongos-server2 -d \
  2. -p 30002:27017 \
  3. --net=mongo-cluster \
  4. --privileged=true \
  5. --entrypoint "mongos" \
  6. -v /tmp/mongo-cluster/mongos-server:/data/configdb \
  7. -v /tmp/mongo-cluster/mongos-server/logs/2:/data/logs \
  8. mongo --config /data/configdb/conf/mongo.conf
复制代码

启动mongos3
  1. docker run --name mongos-server3 -d \
  2. -p 30003:27017 \
  3. --net=mongo-cluster \
  4. --privileged=true \
  5. --entrypoint "mongos" \
  6. -v /tmp/mongo-cluster/mongos-server:/data/configdb \
  7. -v /tmp/mongo-cluster/mongos-server/logs/3:/data/logs \
  8. mongo --config /data/configdb/conf/mongo.conf
复制代码

配置mongos-server1

因为mongos是无中心的配置,所有需要每一台都需要进行分片配置
进入容器
  1. docker exec -it mongos-server1 /bin/bash
  2. mongo -port 27017
复制代码

登录Mongos

使用前面设置的root用户密码
  1. use admin;
  2. db.auth("root","root");
复制代码

配置分片

进行配置分片信息
  1. sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
  2. sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
  3. sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")
复制代码

配置mongos-server2

因为mongos是无中心的配置,所有需要每一台都需要进行分片配置
进入容器
  1. docker exec -it mongos-server2 /bin/bash
  2. mongo -port 27017
复制代码

登录Mongos

使用前面设置的root用户密码
  1. use admin;
  2. db.auth("root","root");
复制代码

配置分片

进行配置分片信息
  1. sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
  2. sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
  3. sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")
复制代码

配置mongos-server3

因为mongos是无中心的配置,所有需要每一台都需要进行分片配置
进入容器
  1. docker exec -it mongos-server3 /bin/bash
  2. mongo -port 27017
复制代码

登录Mongos

使用前面设置的root用户密码
  1. use admin;
  2. db.auth("root","root");
复制代码

配置分片

进行配置分片信息
  1. sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
  2. sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
  3. sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")
复制代码

Docker-compose方式搭建

环境准备

初始化目录脚本
  1. # 创建config-server 目录# 创建配置文件目录
  2. mkdir -p /tmp/mongo-cluster/config-server/conf
  3. # 创建数据文件目录
  4. mkdir -p /tmp/mongo-cluster/config-server/data/{1..3}
  5. # 创建日志文件目录
  6. mkdir -p /tmp/mongo-cluster/config-server/logs/{1..3}# 创建shard-server 目录# 创建配置文件目录
  7. mkdir -p /tmp/mongo-cluster/shard{1..3}-server/conf
  8. # 创建数据文件目录
  9. mkdir -p /tmp/mongo-cluster/shard{1..3}-server/data/{1..3}
  10. # 创建日志文件目录
  11. mkdir -p /tmp/mongo-cluster/shard{1..3}-server/logs/{1..3}# 创建mongos-server 目录# 创建配置文件目录
  12. mkdir -p /tmp/mongo-cluster/mongos-server/conf
  13. # 创建数据文件目录
  14. mkdir -p /tmp/mongo-cluster/mongos-server/data/{1..3}
  15. # 创建日志文件目录
  16. mkdir -p /tmp/mongo-cluster/mongos-server/logs/{1..3}
复制代码

生成密钥文件
  1. # 创建密钥文件
  2. openssl rand -base64 756 > /tmp/mongo-cluster/config-server/conf/mongo.key
  3. # 设置
  4. chmod 600  /tmp/mongo-cluster/config-server/conf/mongo.keycp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard1-server/conf/cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard2-server/conf/cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard3-server/conf/cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/mongos-server/conf/
复制代码

创建配置文件
  1. echo "
  2. # 日志文件
  3. storage:
  4.   # mongod 进程存储数据目录,此配置仅对 mongod 进程有效
  5.   dbPath: /data/db
  6. systemLog:
  7.   destination: file
  8.   logAppend: true
  9.   path: /data/logs/mongo.log
  10. #  网络设置
  11. net:
  12.   port: 27017  #端口号
  13. #  bindIp: 127.0.0.1    #绑定ip
  14. replication:
  15.   replSetName: configsvr #副本集名称
  16. sharding:
  17.   clusterRole: configsvr # 集群角色,这里配置的角色是配置节点
  18. security:
  19.   authorization: enabled #是否开启认证
  20.   keyFile: /data/configdb/conf/mongo.key #keyFile路径
  21. "  > /tmp/mongo-cluster/config-server/conf/mongo.confecho "
  22. # 日志文件
  23. storage:
  24.   # mongod 进程存储数据目录,此配置仅对 mongod 进程有效
  25.   dbPath: /data/db
  26. systemLog:
  27.   destination: file
  28.   logAppend: true
  29.   path: /data/logs/mongo.log
  30. #  网络设置
  31. net:
  32.   port: 27017  #端口号
  33. #  bindIp: 127.0.0.1    #绑定ip
  34. replication:
  35.   replSetName: shard1 #复制集名称是 shardsvr
  36. sharding:
  37.   clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
  38. security:
  39.   authorization: enabled #是否开启认证
  40.   keyFile: /data/configdb/conf/mongo.key #keyFile路径
  41. "  > /tmp/mongo-cluster/shard1-server/conf/mongo.confecho "
  42. # 日志文件
  43. storage:
  44.   # mongod 进程存储数据目录,此配置仅对 mongod 进程有效
  45.   dbPath: /data/db
  46. systemLog:
  47.   destination: file
  48.   logAppend: true
  49.   path: /data/logs/mongo.log
  50. #  网络设置
  51. net:
  52.   port: 27017  #端口号
  53. #  bindIp: 127.0.0.1    #绑定ip
  54. replication:
  55.   replSetName: shard2 #复制集名称是 shard2
  56. sharding:
  57.   clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
  58. security:
  59.   authorization: enabled #是否开启认证
  60.   keyFile: /data/configdb/conf/mongo.key #keyFile路径
  61. "  > /tmp/mongo-cluster/shard2-server/conf/mongo.confecho "
  62. # 日志文件
  63. storage:
  64.   # mongod 进程存储数据目录,此配置仅对 mongod 进程有效
  65.   dbPath: /data/db
  66. systemLog:
  67.   destination: file
  68.   logAppend: true
  69.   path: /data/logs/mongo.log
  70. #  网络设置
  71. net:
  72.   port: 27017  #端口号
  73. #  bindIp: 127.0.0.1    #绑定ip
  74. replication:
  75.   replSetName: shard3 #复制集名称是 shard3
  76. sharding:
  77.   clusterRole: shardsvr # 集群角色,这里配置的角色是分片节点
  78. security:
  79.   authorization: enabled #是否开启认证
  80.   keyFile: /data/configdb/conf/mongo.key #keyFile路径
  81. "  > /tmp/mongo-cluster/shard3-server/conf/mongo.confecho "# 日志文件systemLog:  destination: file  logAppend: true  path: /data/logs/mongo.log#  网络设置net:  port: 27017  #端口号  bindIp: 0.0.0.0    #绑定ip# 配置分片,这里面配置的是需要读取的配置节点的信息sharding:  configDB: configsvr/config-server1:27017,config-server2:27017,config-server3:27017security:  keyFile: /data/configdb/conf/mongo.key #keyFile路径"  > /tmp/mongo-cluster/mongos-server/conf/mongo.conf
复制代码
启动服务

docker-compos配置文件

使用docker-compos方式启动Docker容器
  1. version: '2'
  2. services:
  3.   config-server1:
  4.     image: mongo
  5.     container_name: config-server1
  6.     privileged: true
  7.     networks:
  8.       - mongo-cluster-network
  9.     command: --config /data/configdb/conf/mongo.conf
  10.     volumes:
  11.       - /etc/localtime:/etc/localtime
  12.       - /tmp/mongo-cluster/config-server:/data/configdb
  13.       - /tmp/mongo-cluster/config-server/data/1:/data/db
  14.       - /tmp/mongo-cluster/config-server/logs/1:/data/logs
  15.   config-server2:
  16.     image: mongo
  17.     container_name: config-server2
  18.     privileged: true
  19.     networks:
  20.       - mongo-cluster-network
  21.     command: --config /data/configdb/conf/mongo.conf
  22.     volumes:
  23.       - /etc/localtime:/etc/localtime
  24.       - /tmp/mongo-cluster/config-server:/data/configdb
  25.       - /tmp/mongo-cluster/config-server/data/2:/data/db
  26.       - /tmp/mongo-cluster/config-server/logs/2:/data/logs
  27.   config-server3:
  28.     image: mongo
  29.     container_name: config-server3
  30.     privileged: true
  31.     networks:
  32.       - mongo-cluster-network
  33.     command: --config /data/configdb/conf/mongo.conf
  34.     volumes:
  35.       - /etc/localtime:/etc/localtime
  36.       - /tmp/mongo-cluster/config-server:/data/configdb
  37.       - /tmp/mongo-cluster/config-server/data/3:/data/db
  38.       - /tmp/mongo-cluster/config-server/logs/3:/data/logs
  39.   shard1-server1:
  40.     image: mongo
  41.     container_name: shard1-server1
  42.     privileged: true
  43.     networks:
  44.       - mongo-cluster-network
  45.     command: --config /data/configdb/conf/mongo.conf
  46.     volumes:
  47.       - /etc/localtime:/etc/localtime
  48.       - /tmp/mongo-cluster/shard1-server:/data/configdb
  49.       - /tmp/mongo-cluster/shard1-server/data/1:/data/db
  50.       - /tmp/mongo-cluster/shard1-server/logs/1:/data/logs
  51.   shard1-server2:
  52.     image: mongo
  53.     container_name: shard1-server2
  54.     privileged: true
  55.     networks:
  56.       - mongo-cluster-network
  57.     command: --config /data/configdb/conf/mongo.conf
  58.     volumes:
  59.       - /etc/localtime:/etc/localtime
  60.       - /tmp/mongo-cluster/shard1-server:/data/configdb
  61.       - /tmp/mongo-cluster/shard1-server/data/2:/data/db
  62.       - /tmp/mongo-cluster/shard1-server/logs/2:/data/logs
  63.   shard1-server3:
  64.     image: mongo
  65.     container_name: shard1-server3
  66.     privileged: true
  67.     networks:
  68.       - mongo-cluster-network
  69.     command: --config /data/configdb/conf/mongo.conf
  70.     volumes:
  71.       - /etc/localtime:/etc/localtime
  72.       - /tmp/mongo-cluster/shard1-server:/data/configdb
  73.       - /tmp/mongo-cluster/shard1-server/data/3:/data/db
  74.       - /tmp/mongo-cluster/shard1-server/logs/3:/data/logs
  75.   shard2-server1:
  76.     image: mongo
  77.     container_name: shard2-server1
  78.     privileged: true
  79.     networks:
  80.       - mongo-cluster-network
  81.     command: --config /data/configdb/conf/mongo.conf
  82.     volumes:
  83.       - /etc/localtime:/etc/localtime
  84.       - /tmp/mongo-cluster/shard2-server:/data/configdb
  85.       - /tmp/mongo-cluster/shard2-server/data/1:/data/db
  86.       - /tmp/mongo-cluster/shard2-server/logs/1:/data/logs
  87.   shard2-server2:
  88.     image: mongo
  89.     container_name: shard2-server2
  90.     privileged: true
  91.     networks:
  92.       - mongo-cluster-network
  93.     command: --config /data/configdb/conf/mongo.conf
  94.     volumes:
  95.       - /etc/localtime:/etc/localtime
  96.       - /tmp/mongo-cluster/shard2-server:/data/configdb
  97.       - /tmp/mongo-cluster/shard2-server/data/2:/data/db
  98.       - /tmp/mongo-cluster/shard2-server/logs/2:/data/logs
  99.   shard2-server3:
  100.     image: mongo
  101.     container_name: shard2-server3
  102.     privileged: true
  103.     networks:
  104.       - mongo-cluster-network
  105.     command: --config /data/configdb/conf/mongo.conf
  106.     volumes:
  107.       - /etc/localtime:/etc/localtime
  108.       - /tmp/mongo-cluster/shard2-server:/data/configdb
  109.       - /tmp/mongo-cluster/shard2-server/data/3:/data/db
  110.       - /tmp/mongo-cluster/shard2-server/logs/3:/data/logs
  111.   shard3-server1:
  112.     image: mongo
  113.     container_name: shard3-server1
  114.     privileged: true
  115.     networks:
  116.       - mongo-cluster-network
  117.     command: --config /data/configdb/conf/mongo.conf
  118.     volumes:
  119.       - /etc/localtime:/etc/localtime
  120.       - /tmp/mongo-cluster/shard3-server:/data/configdb
  121.       - /tmp/mongo-cluster/shard3-server/data/1:/data/db
  122.       - /tmp/mongo-cluster/shard3-server/logs/1:/data/logs
  123.   shard3-server2:
  124.     image: mongo
  125.     container_name: shard3-server2
  126.     privileged: true
  127.     networks:
  128.       - mongo-cluster-network
  129.     command: --config /data/configdb/conf/mongo.conf
  130.     volumes:
  131.       - /etc/localtime:/etc/localtime
  132.       - /tmp/mongo-cluster/shard3-server:/data/configdb
  133.       - /tmp/mongo-cluster/shard3-server/data/2:/data/db
  134.       - /tmp/mongo-cluster/shard3-server/logs/2:/data/logs
  135.   shard3-server3:
  136.     image: mongo
  137.     container_name: shard3-server3
  138.     privileged: true
  139.     networks:
  140.       - mongo-cluster-network
  141.     command: --config /data/configdb/conf/mongo.conf
  142.     volumes:
  143.       - /etc/localtime:/etc/localtime
  144.       - /tmp/mongo-cluster/shard3-server:/data/configdb
  145.       - /tmp/mongo-cluster/shard3-server/data/3:/data/db
  146.       - /tmp/mongo-cluster/shard3-server/logs/3:/data/logs
  147.   mongos-server1:
  148.     image: mongo
  149.     container_name: mongos-server1
  150.     privileged: true
  151.     entrypoint: "mongos"
  152.     networks:
  153.       - mongo-cluster-network
  154.     command: --config /data/configdb/conf/mongo.conf
  155.     ports:
  156.       - "30001:27017"
  157.     volumes:
  158.       - /etc/localtime:/etc/localtime
  159.       - /tmp/mongo-cluster/mongos-server:/data/configdb
  160.       - /tmp/mongo-cluster/mongos-server/logs/1:/data/logs
  161.     command: --config /data/configdb/conf/mongo.conf
  162.   mongos-server2:
  163.     image: mongo
  164.     container_name: mongos-server2
  165.     privileged: true
  166.     entrypoint: "mongos"
  167.     networks:
  168.       - mongo-cluster-network
  169.     ports:
  170.       - "30002:27017"
  171.     volumes:
  172.       - /etc/localtime:/etc/localtime
  173.       - /tmp/mongo-cluster/mongos-server:/data/configdb
  174.       - /tmp/mongo-cluster/mongos-server/logs/2:/data/logs
  175.     command: --config /data/configdb/conf/mongo.conf
  176.   mongos-server3:
  177.     image: mongo
  178.     container_name: mongos-server3
  179.     privileged: true
  180.     entrypoint: "mongos"
  181.     networks:
  182.       - mongo-cluster-network
  183.     ports:
  184.       - "30003:27017"
  185.     volumes:
  186.       - /etc/localtime:/etc/localtime
  187.       - /tmp/mongo-cluster/mongos-server:/data/configdb
  188.       - /tmp/mongo-cluster/mongos-server/logs/3:/data/logs
  189.     command: --config /data/configdb/conf/mongo.conf
  190. networks:
  191.   mongo-cluster-network:
  192.     driver: bridge
复制代码
启动服务
  1. docker-compose up -d
复制代码

初始化文件

执行下面脚本进行容器初始化
  1. docker exec -it config-server1 bash
  2. mongo -port 27017rs.initiate(
  3.   {
  4.     _id: "configsvr",
  5.     members: [
  6.       { _id : 1, host : "config-server1:27017" },
  7.       { _id : 2, host : "config-server2:27017" },
  8.       { _id : 3, host : "config-server3:27017" }
  9.     ]
  10.   }
  11. )use admin
  12. db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})db.auth("root","root")db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})docker exec  -it shard1-server1 bin/bashmongo -port 27017#进行副本集配置
  13. rs.initiate(
  14.      {
  15.          _id : "shard1",
  16.          members: [
  17.              { _id : 0, host : "shard1-server1:27017" },
  18.              { _id : 1, host : "shard1-server2:27017" },
  19.              { _id : 2, host : "shard1-server3:27017",arbiterOnly:true }
  20.         ]
  21.     }
  22. );use admin
  23. db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})db.auth("root","root")db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})docker exec  -it shard2-server1 bin/bashmongo -port 27017#进行副本集配置
  24. rs.initiate(
  25.      {
  26.          _id : "shard2",
  27.          members: [
  28.              { _id : 0, host : "shard2-server1:27017" },
  29.              { _id : 1, host : "shard2-server2:27017" },
  30.              { _id : 2, host : "shard2-server3:27017",arbiterOnly:true }
  31.         ]
  32.     }
  33. );use admin
  34. db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})db.auth("root","root")db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})docker exec  -it shard3-server1 bin/bashmongo -port 27017#进行副本集配置
  35. rs.initiate(
  36.      {
  37.          _id : "shard3",
  38.          members: [
  39.              { _id : 0, host : "shard3-server1:27017" },
  40.              { _id : 1, host : "shard3-server2:27017" },
  41.              { _id : 2, host : "shard3-server3:27017",arbiterOnly:true }
  42.         ]
  43.     }
  44. );use admin
  45. db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})db.auth("root","root")db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})
复制代码
初始化分片
  1. docker exec -it mongos-server1 /bin/bash
  2. mongo -port 27017use admin;
  3. db.auth("root","root");sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
  4. sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
  5. sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")docker exec -it mongos-server2 /bin/bash
  6. mongo -port 27017use admin;
  7. db.auth("root","root");sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
  8. sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
  9. sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")docker exec -it mongos-server3 /bin/bash
  10. mongo -port 27017use admin;
  11. db.auth("root","root");sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
  12. sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
  13. sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")
复制代码
本文由传智教育博学谷 - 狂野架构师教研团队发布
如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力
转载请注明出处!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表