replica Set mongo docker-compose

前端 未结 4 1885
长情又很酷
长情又很酷 2020-12-25 13:44

I\'m trying to configure a mongodb replicaSet using docker-compose, but when I stop the master container it seems that it doesn\'t pass to the secondary.

red         


        
4条回答
  •  自闭症患者
    2020-12-25 14:20

    I had similar problem in setting replica set up in a standalone mongodb service with authentication and here are what I ended up with.

    docker-compose.yml:

    version: '3.7'
    
    services:
      
      ...
    
      db:
        image: mongo
        restart: always
        expose:
          - 27017
        environment:
          MONGO_INITDB_DATABASE: ${DATABASE_NAME}
          MONGO_INITDB_ROOT_USERNAME: ${DATABASE_USER}
          MONGO_INITDB_ROOT_PASSWORD: ${DATABASE_PASSWORD}
          MONGO_REPLICA_SET_NAME: ${MONGO_REPLICA_SET_NAME}
        command: ["--replSet", "${MONGO_REPLICA_SET_NAME}", "--bind_ip_all"]
        healthcheck:
          test: test $$(echo "rs.status().ok" | mongo -u $${MONGO_INITDB_ROOT_USERNAME} -p $${MONGO_INITDB_ROOT_PASSWORD} --quiet) -eq 1
          interval: 10s
          start_period: 30s
        volumes:
          - ./db:/data/db
          - ./scripts/set-credentials.sh:/docker-entrypoint-initdb.d/set-credentials.sh
    
      replica-setup:
        image: mongo
        restart: on-failure
        networks:
          default:
        volumes:
          - ./scripts/setup-replica.sh:/scripts/setup-replica.sh
        entrypoint: [ "bash", "/scripts/setup-replica.sh" ]
        depends_on:
          - db
        environment:
          MONGO_INITDB_ROOT_USERNAME: ${DATABASE_USER}
          MONGO_INITDB_ROOT_PASSWORD: ${DATABASE_PASSWORD}
    

    ./scripts/setup-replica.sh:

    #!/bin/bash
    
    MONGODB1=db
    
    echo "Waiting for MongoDB startup..."
    until curl http://${MONGODB1}:27017/serverStatus\?text\=1 2>&1 | grep uptime | head -1; do
      printf '.'
      sleep 1
    done
    
    # check if replica set is already initiated
    RS_STATUS=$( mongo --quiet --host ${MONGODB1}:27017 -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD --eval "rs.status().ok" )
    if [[ $RS_STATUS != 1 ]]
    then
      echo "[INFO] Replication set config invalid. Reconfiguring now."
      RS_CONFIG_STATUS=$( mongo --quiet --host ${MONGODB1}:27017 -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD --eval "rs.status().codeName" )
      if [[ $RS_CONFIG_STATUS == 'InvalidReplicaSetConfig' ]]
      then
        mongo --quiet --host ${MONGODB1}:27017 -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD < /dev/null
      fi
    else
      echo "[INFO] Replication set already initiated."
    fi
    

    ./scripts/set-credentials.sh:

    #!/bin/bash
    set -e
    
    mongo -- "$MONGO_INITDB_DATABASE" <

    What I achieved through is:

    • Setup a mongodb service with username/password authentication for a default collection
    • Initialize replica set when it's first time running services
    • Reconfigure replica set member when there's a previous db data
    • Health check the mongodb service by checking replica set status

提交回复
热议问题