【6.12】服务器安装 Docker Swarm中搭建 MongoDB 集群

副本多分片

https://blog.csdn.net/jianhao2010303/article/details/113541109

创建网络 overly

docker network create -d overlay  mongo_test 

创建 keyfile

mkdir -p /home/data/db/testm/mongos
cd /home/data/db/testm/mongos

openssl rand -base64 741 > key.file
chmod 600 /home/data/db/testm/mongos/key.file
chown 999 /home/data/db/testm/mongos/key.file

创建数据存储路径

rm -Rf  /home/data/db/testm/shard11 /home/data/db/testm/shard12 /home/data/db/testm/shard13
mkdir -p /home/data/db/testm/shard11 /home/data/db/testm/shard12 /home/data/db/testm/shard13

rm -Rf  /home/data/db/testm/shard21 /home/data/db/testm/shard22 /home/data/db/testm/shard23
mkdir -p /home/data/db/testm/shard21 /home/data/db/testm/shard22 /home/data/db/testm/shard23

rm -Rf  /home/data/db/testm/shard31 /home/data/db/testm/shard32 /home/data/db/testm/shard33
mkdir -p /home/data/db/testm/shard31 /home/data/db/testm/shard32 /home/data/db/testm/shard33

rm -Rf  /home/data/db/testm/config1 /home/data/db/testm/config2 /home/data/db/testm/config3
mkdir -p /home/data/db/testm/config1 /home/data/db/testm/config2 /home/data/db/testm/config3

创建配置文件

cd /home/data/db/testm/mongos

以下配置文件注意 security 需要先注释掉方便我们进行配置

mongod.conf

# mongod.conf
storage:
  dbPath: /data/db
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
net:
  port: 27017
  bindIp: 0.0.0.0
processManagement:
  timeZoneInfo: /usr/share/zoneinfo
#security:
#  #KeyFile鉴权文件
#  keyFile: /etc/key.file
#  #开启认证方式运行
#  authorization: enabled
replication:
  replSetName: cfg
sharding:
  clusterRole: configsvr

mongos.conf

# mongos.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
net:
  port: 27020
  bindIp: 0.0.0.0
processManagement:
  fork: true
  timeZoneInfo: /usr/share/zoneinfo
#security:
#  #KeyFile鉴权文件
#  keyFile: /etc/key.file
sharding:
  configDB: cfg/config1:27017,config2:27017,config3:27017

shard{1,2,3}.conf

# shard1.conf
storage:
  dbPath: /data/db
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
net:
  port: 27017
  bindIp: 0.0.0.0
processManagement:
  timeZoneInfo: /usr/share/zoneinfo
#security:
#  #KeyFile鉴权文件
#  keyFile: /etc/key.file
#  #开启认证方式运行
#  authorization: enabled

replication:
  # 名称需要对应修改 我使用的是 rs{1,2,3}
  replSetName: rs1

sharding:
  clusterRole: shardsvr

docker-compose.yml

version: '3.7'
services:
  shard11:
    hostname: shard11
    container_name: shard11
    image: mongo:4.0.3
    restart: always
    networks:
      - mongo_test
    command: mongod -f /data/conf/shard1.conf
    privileged: true
    ports:
      - 19001:27017
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/data/db/testm/shard11:/data/db
      - /home/data/db/testm/mongos/key.file:/etc/key.file
      - /home/data/db/testm/mongos/shard1.conf:/data/conf/shard1.conf
    deploy:
      placement:
        constraints:
          - node.hostname == manager
  shard12:
    hostname: shard12
    container_name: shard12
    image: mongo:4.0.3
    restart: always
    command: mongod -f /data/conf/shard1.conf
    privileged: true
    networks:
      - mongo_test
    ports:
      - 19002:27017
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/data/db/testm/shard12:/data/db
      - /home/data/db/testm/mongos/key.file:/etc/key.file
      - /home/data/db/testm/mongos/shard1.conf:/data/conf/shard1.conf
    deploy:
      placement:
        constraints:
          - node.hostname == manager
  shard13:
    hostname: shard13
    container_name: shard13
    image: mongo:4.0.3
    restart: always
    command: mongod -f /data/conf/shard1.conf
    privileged: true
    networks:
      - mongo_test
    ports:
      - 19003:27017
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/data/db/testm/shard13:/data/db
      - /home/data/db/testm/mongos/key.file:/etc/key.file
      - /home/data/db/testm/mongos/shard1.conf:/data/conf/shard1.conf
    deploy:
      placement:
        constraints:
          - node.hostname == manager
  shard21:
    hostname: shard21
    container_name: shard21
    image: mongo:4.0.3
    restart: always
    networks:
      - mongo_test
    command: mongod -f /data/conf/shard2.conf
    privileged: true
    ports:
      - 19021:27017
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/data/db/testm/shard21:/data/db
      - /home/data/db/testm/mongos/key.file:/etc/key.file
      - /home/data/db/testm/mongos/shard2.conf:/data/conf/shard2.conf
    deploy:
      placement:
        constraints:
          - node.hostname == manager
  shard22:
    hostname: shard22
    container_name: shard22
    image: mongo:4.0.3
    restart: always
    command: mongod -f /data/conf/shard2.conf
    privileged: true
    networks:
      - mongo_test
    ports:
      - 19022:27017
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/data/db/testm/shard22:/data/db
      - /home/data/db/testm/mongos/key.file:/etc/key.file
      - /home/data/db/testm/mongos/shard2.conf:/data/conf/shard2.conf
    deploy:
      placement:
        constraints:
          - node.hostname == manager
  shard23:
    hostname: shard23
    container_name: shard23
    image: mongo:4.0.3
    restart: always
    command: mongod -f /data/conf/shard2.conf
    privileged: true
    networks:
      - mongo_test
    ports:
      - 19023:27017
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/data/db/testm/shard23:/data/db
      - /home/data/db/testm/mongos/key.file:/etc/key.file
      - /home/data/db/testm/mongos/shard2.conf:/data/conf/shard2.conf
    deploy:
      placement:
        constraints:
          - node.hostname == manager

 shard31:
    hostname: shard31
    container_name: shard31
    image: mongo:4.0.3
    restart: always
    networks:
      - mongo_test
    command: mongod -f /data/conf/shard3.conf
    privileged: true
    ports:
      - 19031:27017
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/data/db/testm/shard31:/data/db
      - /home/data/db/testm/mongos/key.file:/etc/key.file
      - /home/data/db/testm/mongos/shard3.conf:/data/conf/shard3.conf
    deploy:
      placement:
        constraints:
          - node.hostname == manager
  shard32:
    hostname: shard32
    container_name: shard32
    image: mongo:4.0.3
    restart: always
    command: mongod -f /data/conf/shard3.conf
    privileged: true
    networks:
      - mongo_test
    ports:
      - 19032:27017
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/data/db/testm/shard32:/data/db
      - /home/data/db/testm/mongos/key.file:/etc/key.file
      - /home/data/db/testm/mongos/shard3.conf:/data/conf/shard3.conf
    deploy:
      placement:
        constraints:
          - node.hostname == manager
  shard33:
    hostname: shard33
    container_name: shard33
    image: mongo:4.0.3
    restart: always
    command: mongod -f /data/conf/shard3.conf
    privileged: true
    networks:
      - mongo_test
    ports:
      - 19033:27017
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/data/db/testm/shard33:/data/db
      - /home/data/db/testm/mongos/key.file:/etc/key.file
      - /home/data/db/testm/mongos/shard3.conf:/data/conf/shard3.conf
    deploy:
      placement:
        constraints:
          - node.hostname == manager

  config1:
    image: mongo:4.0.3
    restart: always
    command:  mongod -f /data/conf/mongod.conf
    networks:
      - mongo_test
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/data/db/testm/config1:/data/db
      - /home/data/db/mongo/mongos/key.file:/etc/key.file
      - /home/data/db/testm/mongos/mongod.conf:/data/conf/mongod.conf
    deploy:
      placement:
        constraints:
          - node.hostname == manager
  config2:
    image: mongo:4.0.3
    restart: always
    command: mongod -f /data/conf/mongod.conf
    networks:
      - mongo_test
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/data/db/testm/config2:/data/db
      - /home/data/db/mongo/mongos/key.file:/etc/key.file
      - /home/data/db/testm/mongos/mongod.conf:/data/conf/mongod.conf
    deploy:
      placement:
        constraints:
          - node.hostname == manager
  config3:
    image: mongo:4.0.3
    restart: always
    command: mongod  -f /data/conf/mongod.conf
    networks:
      - mongo_test
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/data/db/testm/config3:/data/db
      - /home/data/db/mongo/mongos/key.file:/etc/key.file
      - /home/data/db/testm/mongos/mongod.conf:/data/conf/mongod.conf
    deploy:
      placement:
        constraints:
          - node.hostname == manager
  
  # router           
  mongos:
    image: mongo:4.0.3
    restart: always
    # command:  mongos -f /data/conf/mongos.conf
    networks:
      - mongo_test
    ports:
      - 19100:27017
      - 19101:27020
    depends_on:
      - config1
      - config2
      - config3
    volumes:
      - /etc/localtime:/etc/localtime
      - /home/data/db/mongo/mongos/key.file:/etc/key.file
      - /home/data/db/testm/mongos/mongos.conf:/etc/mongodb/mongos.conf      
    deploy:
      placement:
        constraints:
          - node.hostname == manager
          
networks:
  mongo_test:
    external: true                   
image.png
image.png

将docker-compose.yml 中的内容复制到这里 注意修改command中 conf路径,volumes中的路径和deploy的机器名 然后点击 update the stack

image.png
image.png

用portainer 启动好后 开始配置角色信息

首先知道哪里找到容器的id或者容器名


image.png
image.png
# 初始化 分别进入
docker exec -it {容器的id或者容器名} /bin/bash
mongo

#rs1 shard11 上执行
rs.initiate( {_id : "rs1",members: [{ _id: 0, host: "shard11:27017",priority:2 },{ _id: 1, host: "shard12:27017",priority:1 },{ _id: 2, host: "shard13:27017", arbiterOnly:true }]})

# rs2 shard21上
rs.initiate( {_id : "rs2",members: [{ _id: 0, host: "shard21:27017",priority:1 },{ _id: 1, host: "shard22:27017", arbiterOnly:true },{ _id: 2, host: "shard23:27017",priority:2 }]})

# rs3 shard32上 仲裁节点不允许创建
rs.initiate( {_id : "rs3",members: [{ _id: 0, host: "shard31:27017", arbiterOnly:true},{ _id: 1, host: "shard32:27017",priority:2  },{ _id: 2, host: "shard33:27017",priority:1 }]})

# config config1上
rs.initiate( {_id : "cfg",members: [{ _id: 0, host: "config1:27017"},{ _id: 1, host: "config2:27017" },{ _id: 2, host: "config3:27017"}]})

最后找到 mongos的容器

image.png
image.png

进入容器内部,就和远程linux主机一样输入下面的命令完成搭建。


image.png

# 宿主机 
#docker exec -it {mongos} /bin/bash
# 容器中
mongos -f /etc/mongodb/mongos.conf
#可以就在其中一个mongos容器中使用mongo shell连接mongos进程配置分片集群
# 连接mongos,端口号与mongos配置文件中设定一致
mongo -port 27020
# 将分片加入集群
sh.addShard("rs1/shard11:27017,shard12:27017,shard13:27017")
sh.addShard("rs2/shard21:27017,shard22:27017,shard23:27017")
sh.addShard("rs3/shard31:27017,shard32:27017,shard33:27017")

# 对数据库开启分片功能
sh.enableSharding("company")

#切换数据库并建立一张测试表才会真的创建数据库
use company
db.message.insert({"mid":"test"})
#创建一个索引才能开启集合分片
db.message.ensureIndex({uuid: 1}, {unique: true});
use admin
# 对数据库中集合开启分片,并指定片键
sh.shardCollection("company.message",{"uuid":1})
# sh.shardCollection("[dbName.collectionName]",{[keyName]:1})
# 查看分片状态
sh.status()

use company
# 新建角色
db.createRole(
    { 
    role:"companyRole",//角色名称
    privileges: [ // 权限集
     { resource: { cluster: true }, actions: [ "addShard" ] },
     { resource: { //资源 
         db:"company", //创建的companyRole角色具有对company库的操作权限,具体权限建actions
         collection:"" //company库下对应的集合名.如果为""表示所有集合
       },
       actions: [ "find", "insert", "remove","update" ,"createCollection", "dropCollection","convertToCapped"] //角色可进行的操作,注意这里是一个数组
    } ],
    roles: [] // 是否继承其他的角色,如果指定了其他角色那么新创建的角色自动继承对应其他角色的所有权限,该参数必须显示指定
    }
)
# 给角色授权
db.grantPrivilegesToRole(
    "companyRole",
    [{
       resource:{ //权限可操作的资源
            db:"company",  // 授予companyRole角色具有操作company库的权限
            collection:"" // company库下的集合 如果为"" 表示所有集合
        },                                                 
        actions:  // 权限允许的操作
        [ "createCollection", "dropCollection","convertToCapped"] //权限可进行的操作
  }]
)
# 新建用户 
use company
#  指定自定义角色来创建用户
db.createUser({
        user:'wth', // 用户名
        pwd:'wth',    // 密码
        roles:[{
                role:'companyRole',// 通过指定内建角色root 来创建用户
                db:'company'  // 指定角色对应的认证数据库,内建角色通常认证库为admin
            }]
    }
);

# 指定内建角色来创建用户,这里是在admin下创建的用户故认证库也是admin
use admin
db.createUser(
    {  
        user:"admin",// 用户名
        pwd:"admin",   // 密码
        roles:[{
                role:'root',// 通过指定内建角色root 来创建用户
                db:'admin'  // 指定角色对应的认证数据库,内建角色通常认证库为admin
            } ]
    }
)
quit()

修改配置文件 释放掉security 开启 权限 重启容器

下面没有填写密码登录测试ok,但是提示authentication


image.png
image.png

输入密码后登录正常可以查看数据库了


image.png
image.png

tips MongoDB 集群重启需要重新执行mongos 否则连接不到

# 宿主机
docker exec -it mongos /bin/bash
# 容器中
mongos -f /etc/mongodb/mongos.conf

点波关注 系统搭建(docker)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容