当前位置:   article > 正文

Docker部署Mongo集群 一主两从_docker mongodb集群 1主2从

docker mongodb集群 1主2从

环境:

1、准备一个linux服务器(我这边是centos系统)
2、确保有docker和docker-compose环境


搭建流程

第一步(主要是配置mongo容器挂载的位置,生成一个认证文件,三个mongo共用)

// 1 登录进自己的服务器 切到根目录
cd /

// 2 创建docker 文件夹
mkdir docker

// 3 进入docker文件夹
cd docker

// 4 再创建一个momgo文件夹
mkdir momgo

// 5 进入mongo文件夹
cd mongo

// 6 在mongo文件夹下面分别创建三个文件夹 master,salve,arbiter
mkdir master
mkdir salve
mkdir arbiter

// 7 分别进入master,salve,arbiter文件夹,在每个文件夹下面都创建db和configdb文件夹
cd master
mkdir db
mkdir configdb
cd ..

cd salve
mkdir db
mkdir configdb
cd ..

cd arbiter
mkdir db
mkdir configdb
cd ..

// 8 生成认证文件并修改权限 注意这个路径/root/docker/mongo,会生成一个keyfile0 文件
openssl rand -base64 100 > /root/docker/mongo/keyfile0 

// 9 授权一下
chmod 600 /root/docker/mongo/keyfile0

// 10 拷贝keyfile0到master,salve,arbiter三个文件夹下的configdb目录
// 不熟悉命令的推荐一个图形界面管理工具 WinSCP免费的,可以像windows一样复制粘贴文件
cp keyfile0 ./master/configdb
cp keyfile0 ./salve/configdb
cp keyfile0 ./arbiter/configdb

// 11验证权限 分别执行以下操作
chmod 600 /root/docker/mongo/master/configdb/keyfile0 
chmod 600 /root/docker/mongo/salve/configdb/keyfile0 
chmod 600 /root/docker/mongo/arbiter/configdb/keyfile0 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

第二步

1、安装portainer,成功后访问服务器IP+9000端口会看到一个图形界面
2、熟悉docker命令的就不需要了用找个了,直接把我下面stack文件里的内容,分三个命令执行就行了,记得固定容器内部IP(portainer中的stack就是我们所说的docker-compose.yaml----个人理解)

// 这边在百度随便搜一下都有
 docker run -d -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /mnt/docker/portainer:/data portainer/portainer
  • 1
  • 2

在这里插入图片描述

第三步

1、我这边创建了一个stack,name随便取,内容如下就不详细介绍了,有问题可以私信讨论
在这里插入图片描述

version: '2'
services:

  master:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root
    container_name: mongo-m
    ports:
      - 27017:27017
    volumes:
      - /root/docker/mongo/master/db/:/data/db
      - /root/docker/mongo/master/configdb/:/data/configdb
    restart: always
    command: --replSet mongoreplset --oplogSize 128 --auth --keyFile=/data/configdb/keyfile0
    networks:
      mongo-network:
        ipv4_address: 172.24.0.3
    
  salve:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root  
    container_name: mongo-s
    ports:
      - 27018:27017
    volumes:
      - /root/docker/mongo/salve/db/:/data/db
      - /root/docker/mongo/salve/configdb/:/data/configdb
    restart: always
    command: --replSet mongoreplset --oplogSize 128 --auth --keyFile=/data/configdb/keyfile0
    networks:
      mongo-network:
        ipv4_address: 172.24.0.4
    
  arbiter:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root  
    container_name: mongo-a
    ports:
      - 27019:27017
    volumes:
      - /root/docker/mongo/arbiter/db/:/data/db
      - /root/docker/mongo/arbiter/configdb/:/data/configdb
    restart: always
    command: --replSet mongoreplset --oplogSize 128 --auth --keyFile=/data/configdb/keyfile0
    networks:
      mongo-network:
        ipv4_address: 172.24.0.5
    
networks:
  mongo-network:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.24.0.0/16
          gateway: 172.24.0.1    
    

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

2、点一下 update the stack 按钮 就可以了
在这里插入图片描述


3、docker ps 查看容器是否能正常启动
在这里插入图片描述


4、进入主mongo容器

docker exec -it mongo-m mongo
  • 1

在这里插入图片描述


5、配置集群信息

// 四步分别执行
use admin

db.auth('root','root')

config = {_id:"mongoreplset", version:1, members:[{_id:0, host:"172.24.0.3:27017", priority:6},
 {_id:1, host:"172.24.0.4:27017", priority:3}, 
 {_id:2, host:"172.24.0.5:27017", priority:2}]}
 
rs.initiate(config)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

// 看到下图圈红的地方 “ok”:1 才算成功了
在这里插入图片描述


第四步 测试配置结果

1、向主mongo插入一条数据并查看

// 这边相当于数据库的名称叫test
ues test
// 保存一条数据
db.users.insert({"usernmae": "测试", "age": 26}
// 查看结果
db.users.find()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述


2、我们在随便进入一台从mongo查看数据是否存在,一定要用admin先认证一下,因为我们启动容器的时候设置了密码

docker exec -it mongo-s mongo
use admin
db.auth('root','root')
  • 1
  • 2
  • 3

在这里插入图片描述


3、进入从mongo,进行数据查看的时候,会报以下错误,因为mongo集群默认是只有主mongo有读写权限的

db.users.find()
  • 1

错误如下:
在这里插入图片描述


4、解决办法:

// 执行以下方法,再查询,不过这边的方法在下个版本好像是要被弃用了
rs.slaveOk();
  • 1
  • 2

5、成功在从机查看到数据
在这里插入图片描述


我在搭建过程中遇到的问题

1、配置config集群的时候,网上的文章都是用的宿主机IP,所以我刚开始也是这么做的,但是这边会报错,大概是连接超时或者ping不通之类的,所以我在docker-compose.yaml中是固定了三个容器的内部IP的


2、我在启动容器的时候就给mongo配置了用户名,密码(root,root),遇到报错关于authentication的,先执行以下两步,再执行自己想做的操作

use admin
db.auth('root','root')
  • 1
  • 2

3、在从机中想查询主机插入的数据是否存在遇到的问题,上述已经讲过了,也给了解决方案


参考文献:

https://blog.csdn.net/ma_jiang/article/details/95735300?utm_source=app

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/407841
推荐阅读
相关标签
  

闽ICP备14008679号