Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.4k views
in Technique[技术] by (71.8m points)

docker-compose MongoDB replica set data loss after some period of time

Below is the docker-compose.yml I have used.

MongoDB container got created, after some 6 to 8 hours of time the databases inside the mongo are getting cleared of automatically.

Even after the manual restart I could not able to get my data back.

I have followed two approaches, and still could not able to figure out what's the issue.

Should I need to declare volumes at the top of the compose file like in approach 1 or provide user specific directory "./data/mongo-1" like in approach 2

Adding the below will it help?

volumes:
  mongo_data:
   driver: local # not working
   external: true # will it work?

Approach-1: Single node replica set

version: '3.8'

volumes:
  mongo_data:

mongodb:
    hostname: mongodb
    container_name: mongodb
    image: mongo:latest
    environment:
      MONGO_INITDB_DATABASE: moviebooking
      MONGO_REPLICA_SET_NAME: rs0
    volumes:
      - ./mongo-initdb.d:/docker-entrypoint-initdb.d
      - mongo_data:/data/db
    expose:
      - 27017
    ports:
      - "27017:27017"
    restart: unless-stopped
    healthcheck:
      test: test $$(echo "rs.initiate().ok || rs.slaveOk().ok || rs.status().ok" | mongo --quiet) -eq 1
      interval: 10s
      start_period: 30s
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]

Approach-2: Multi node replica set

version: '3.8'

services:

 mongo1:
    image: mongo:4.2
    container_name: mongo1
    command: ["--replSet", "my-replica-set", "--bind_ip_all", "--port", "27017"]
    volumes:
      - ./data/mongo-1:/data/db
    ports:
      - 27017:27017
    healthcheck:
      test: test $$(echo "rs.initiate({_id:'my-replica-set',members:[{_id:0,host:"mongo1:27017"},{_id:1,host:"mongo2:27018"},{_id:2,host:"mongo3:27019"}]}).ok || rs.status().ok" | mongo --port 27017 --quiet) -eq 1
      interval: 10s
      start_period: 30s

  mongo2:
    image: mongo:4.2
    container_name: mongo2
    command: ["--replSet", "my-replica-set", "--bind_ip_all", "--port", "27018"]
    volumes:
      - ./data/mongo-2:/data/db
    ports:
      - 27018:27018

  mongo3:
    image: mongo:4.2
    container_name: mongo3
    command: ["--replSet", "my-replica-set", "--bind_ip_all", "--port", "27019"]
    volumes:
      - ./data/mongo-3:/data/db
    ports:
      - 27019:27019
question from:https://stackoverflow.com/questions/65881000/docker-compose-mongodb-replica-set-data-loss-after-some-period-of-time

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

In my case , db was hacked by some one.

Adding volume mount will work, making it as external in compose will ask you to create a volume externally before running the compose file. Which I feel is a safe way instead of asking compose to decide the volume location.

you are welcome :)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...