docker-compose部署單機版本分片mongo

環境介紹

  • os: centos7
  • docker: 18.09.0
  • mongo: 4.0.5

執行步驟

1. 清理舊數據(若是須要)

執行 clean-deploy.shmongodb

  • 刪除以前的容器
  • 刪除數據目錄
DIR=/data/fates
DATA_PATH="${DIR}/mongo"
PWD='kinnylee'
 # 第一次執行沒有舊數據,不須要執行這步
docker-compose -f fates-mongo-compose.yaml down

if [ -d "${DATA_PATH}" ]; then
    echo "delete directory: ${DATA_PATH}"
    echo ${PWD} | sudo -S rm -rf ${DATA_PATH}
fi
複製代碼

2. 建立數據目錄

執行before-deploy.shdocker

  • 建立數據目錄
PWD='kinnylee'

DATA_DIR_LIST=('config1' 'config2' 'config3' 'shard1' 'shard2' 'shard3' 'script')

function check_directory() {
  if [ ! -d "${DATA_PATH}" ]; then
    echo "create directory: ${DATA_PATH}"
    echo ${PWD} | sudo -S mkdir -p ${DATA_PATH}
  else
    echo "directory ${DATA_PATH} already exists."
  fi


  cd "${DATA_PATH}"

  for SUB_DIR in ${DATA_DIR_LIST[@]}
  do
    if [ ! -d "${DATA_PATH}/${SUB_DIR}" ]; then
      echo "create directory: ${DATA_PATH}/${SUB_DIR}"
      echo "${PWD}" | sudo -S mkdir -p "${DATA_PATH}/${SUB_DIR}"
    else
      echo "directory: ${DATA_PATH}/${SUB_DIR} already exists."
    fi
  done

  echo "change directory owner to $USER:$USER"
  echo "${PWD}" | sudo -S chown -R $USER:$USER "${DATA_PATH}"
}

check_directory
複製代碼

3. 部署docker容器

3.1 無受權模式

執行deploy.shshell

docker-compose -f fates-mongo-compose.yaml up -d
複製代碼

yaml文件以下數據庫

version: '3.4'
services:
 shard1:
 image: mongo:4.0.5
    # --shardsvr: 這個參數僅僅只是將默認的27017端口改成27018,若是指定--port參數,可用不須要這個參數
    # --directoryperdb:每一個數據庫使用單獨的文件夾
 command: mongod --shardsvr --directoryperdb --replSet shard1
 volumes:
 - /etc/localtime:/etc/localtime
 - /data/fates/mongo/shard1:/data/db

 shard2:
 image: mongo:4.0.5
 command: mongod --shardsvr --directoryperdb --replSet shard2
 volumes:
 - /etc/localtime:/etc/localtime
 - /data/fates/mongo/shard2:/data/db

 shard3:
 image: mongo:4.0.5
 command: mongod --shardsvr --directoryperdb --replSet shard3
 volumes:
 - /etc/localtime:/etc/localtime
 - /data/fates/mongo/shard3:/data/db

 config1:
 image: mongo:4.0.5
    # --configsvr: 這個參數僅僅是將默認端口由27017改成27019, 若是指定--port可不添加該參數
 command: mongod --configsvr --directoryperdb --replSet fates-mongo-config --smallfiles
 volumes:
 - /etc/localtime:/etc/localtime
 - /data/fates/mongo/config1:/data/configdb

 config2:
 image: mongo:4.0.5
 command: mongod --configsvr --directoryperdb --replSet fates-mongo-config --smallfiles
 volumes:
 - /etc/localtime:/etc/localtime
 - /data/fates/mongo/config2:/data/configdb

 config3:
 image: mongo:4.0.5
 command: mongod --configsvr --directoryperdb --replSet fates-mongo-config --smallfiles
 volumes:
 - /etc/localtime:/etc/localtime
 - /data/fates/mongo/config3:/data/configdb

 mongos:
 image: mongo:4.0.5
    # mongo3.6版默認綁定IP爲127.0.0.1,此處綁定0.0.0.0是容許其餘容器或主機能夠訪問
 command: mongos --configdb fates-mongo-config/config1:27019,config2:27019,config3:27019 --bind_ip 0.0.0.0 --port 27017
 ports:
 - 27017:27017
 volumes:
 - /etc/localtime:/etc/localtime
 depends_on:
 - config1
 - config2
 - config3
複製代碼

3.2 受權模式

1. 執行generate-keyfile.sh
  • 生成keyfile文件
#!/bin/bash

DATA_PATH=/data/fates/mongo
PWD='kinnylee'

function check_directory() {
  if [ ! -d "${DATA_PATH}" ]; then
    echo "directory: ${DATA_PATH} not exists, please run before-depoly.sh."
  fi
}

function generate_keyfile() {
  cd "${DATA_PATH}/script"
  if [ ! -f "${DATA_PATH}/script/mongo-keyfile" ]; then
    echo 'create mongo-keyfile.'
    openssl rand -base64 756 -out mongo-keyfile
    echo "${PWD}" | sudo -S chmod 600 mongo-keyfile
    echo "${PWD}" | sudo -S chown 999 mongo-keyfile
  else
    echo 'mongo-keyfile already exists.'
  fi
}

check_directory
generate_keyfile
複製代碼
2. 執行deploy-key.sh
docker-compose -f fates-mongo-compose-key.yaml up -d
複製代碼

yaml文件以下centos

version: '3.4'
services:
 shard1:
 image: mongo:4.0.5
    # --shardsvr: 這個參數僅僅只是將默認的27017端口改成27018,若是指定--port參數,可用不須要這個參數
    # --directoryperdb:每一個數據庫使用單獨的文件夾
 command: mongod --shardsvr --directoryperdb --replSet shard1 --keyFile /data/mongo-keyfile
 volumes:
 - /etc/localtime:/etc/localtime
 - /data/fates/mongo/shard1:/data/db
 - /data/fates/mongo/script/mongo-keyfile:/data/mongo-keyfile

 shard2:
 image: mongo:4.0.5
 command: mongod --shardsvr --directoryperdb --replSet shard2 --keyFile /data/mongo-keyfile
 volumes:
 - /etc/localtime:/etc/localtime
 - /data/fates/mongo/shard2:/data/db
 - /data/fates/mongo/script/mongo-keyfile:/data/mongo-keyfile

 shard3:
 image: mongo:4.0.5
 command: mongod --shardsvr --directoryperdb --replSet shard3 --keyFile /data/mongo-keyfile
 volumes:
 - /etc/localtime:/etc/localtime
 - /data/fates/mongo/shard3:/data/db
 - /data/fates/mongo/script/mongo-keyfile:/data/mongo-keyfile

 config1:
 image: mongo:4.0.5
    # --configsvr: 這個參數僅僅是將默認端口由27017改成27019, 若是指定--port可不添加該參數
 command: mongod --configsvr --directoryperdb --replSet fates-mongo-config --smallfiles --keyFile /data/mongo-keyfile
 volumes:
 - /etc/localtime:/etc/localtime
 - /data/fates/mongo/config1:/data/configdb
 - /data/fates/mongo/script/mongo-keyfile:/data/mongo-keyfile

 config2:
 image: mongo:4.0.5
 command: mongod --configsvr --directoryperdb --replSet fates-mongo-config --smallfiles --keyFile /data/mongo-keyfile
 volumes:
 - /etc/localtime:/etc/localtime
 - /data/fates/mongo/config2:/data/configdb
 - /data/fates/mongo/script/mongo-keyfile:/data/mongo-keyfile

 config3:
 image: mongo:4.0.5
 command: mongod --configsvr --directoryperdb --replSet fates-mongo-config --smallfiles --keyFile /data/mongo-keyfile
 volumes:
 - /etc/localtime:/etc/localtime
 - /data/fates/mongo/config3:/data/configdb
 - /data/fates/mongo/script/mongo-keyfile:/data/mongo-keyfile

 mongos:
 image: mongo:4.0.5
    # mongo3.6版默認綁定IP爲127.0.0.1,此處綁定0.0.0.0是容許其餘容器或主機能夠訪問
 command: mongos --configdb fates-mongo-config/config1:27019,config2:27019,config3:27019 --bind_ip 0.0.0.0 --port 27017 --keyFile /data/mongo-keyfile
 ports:
 - 27017:27017
 volumes:
 - /etc/localtime:/etc/localtime
 - /data/fates/mongo/script/mongo-keyfile:/data/mongo-keyfile
 depends_on:
 - config1
 - config2
 - config3
複製代碼

4. 配置分片信息

容器啓動須要必定時間,執行這一步時要等上一步把容器都啓動起來,才能執行,執行不成功就多運行幾遍bash

執行shard-config.shlua

docker-compose -f fates-mongo-compose.yaml exec config1 bash -c "echo 'rs.initiate({_id: \"fates-mongo-config\",configsvr: true, members: [{ _id : 0, host : \"config1:27019\" },{ _id : 1, host : \"config2:27019\" }, { _id : 2, host : \"config3:27019\" }]})' | mongo --port 27019"
docker-compose -f fates-mongo-compose.yaml exec shard1 bash -c "echo 'rs.initiate({_id: \"shard1\",members: [{ _id : 0, host : \"shard1:27018\" }]})' | mongo --port 27018"
docker-compose -f fates-mongo-compose.yaml exec shard2 bash -c "echo 'rs.initiate({_id: \"shard2\",members: [{ _id : 0, host : \"shard2:27018\" }]})' | mongo --port 27018"
docker-compose -f fates-mongo-compose.yaml exec shard3 bash -c "echo 'rs.initiate({_id: \"shard3\",members: [{ _id : 0, host : \"shard3:27018\" }]})' | mongo --port 27018"
docker-compose -f fates-mongo-compose.yaml exec mongos bash -c "echo 'sh.addShard(\"shard1/shard1:27018\")' | mongo"
docker-compose -f fates-mongo-compose.yaml exec mongos bash -c "echo 'sh.addShard(\"shard2/shard2:27018\")' | mongo"
docker-compose -f fates-mongo-compose.yaml exec mongos bash -c "echo 'sh.addShard(\"shard3/shard3:27018\")' | mongo"

複製代碼

沒有出現Connection refused等錯誤就表示成功了centos7

5. 建立用戶(受權模式)

執行add-user.shspa

  • 須要添加用戶登陸權限執行這一步,不須要登陸的不用執行這一步
  • 腳本中管理員用戶名和密碼都是root,可自行修改
docker-compose -f fates-mongo-compose.yaml exec mongos bash -c "echo -e 'use admin\n db.createUser({user:\"root\",pwd:\"root\",roles:[{role:\"root\",db:\"admin\"}]})' | mongo"
docker-compose -f fates-mongo-compose.yaml exec mongos bash -c "echo -e 'use admin\n show user' | mongo"
複製代碼

6. 驗證

  • 經過客戶端鏈接驗證是否成功
mongo {ip}
複製代碼

6.1 無受權模式

執行check.shcode

docker-compose -f fates-mongo-compose.yaml exec mongos bash -c "echo -e 'use admin\n show users' | mongo"
複製代碼

6.2 受權模式

執行check-key.sh

docker-compose -f fates-mongo-compose.yaml exec mongos bash -c "echo -e 'use admin\n show users' | mongo -u root -p root"
複製代碼

完整腳本

  • 容器啓動須要必定時間,腳本里設置爲120s,可是常常仍是有節點徹底沒有起來,可單獨執行shard_config執行分片,不然沒法鏈接到mongo
  • 包括後面添加用戶這一步,也是須要等容器徹底起來執行纔不會報錯
  • 這裏爲了方便一鍵執行,把全部步驟放到一塊兒了
DIR=/data/fates
DATA_PATH="${DIR}/mongo"

DATA_DIR_LIST=('config1' 'config2' 'config3' 'shard1' 'shard2' 'shard3' 'script')

BASE_DIR=$(cd "$(dirname "$0")";pwd)

function check_directory() {
  if [ ! -d "${DATA_PATH}" ]; then
    echo "create directory: ${DATA_PATH}"
    sudo mkdir -p ${DATA_PATH}
  else
    echo "directory ${DATA_PATH} already exists."
  fi


  cd "${DATA_PATH}"

  for SUB_DIR in ${DATA_DIR_LIST[@]}
  do
    if [ ! -d "${DATA_PATH}/${SUB_DIR}" ]; then
      echo "create directory: ${DATA_PATH}/${SUB_DIR}"
      sudo mkdir -p "${DATA_PATH}/${SUB_DIR}"
    else
      echo "directory: ${DATA_PATH}/${SUB_DIR} already exists."
    fi
  done

  echo "change directory owner to $USER:$USER"
  sudo chown -R $USER:$USER "${DATA_PATH}"
}

function rm_old_directory() {
  if [ -d "${DATA_PATH}" ]; then
      echo "delete directory: ${DATA_PATH}"
      sudo rm -rf ${DATA_PATH}
  fi
}

function cp_script() {
  cp "${BASE_DIR}"/* "${DATA_PATH}"/script
}

function deploy_no_auth() {
  cd "${DATA_PATH}"/script
  docker-compose -f fates-mongo-compose.yaml up -d
}

function deploy_with_auth() {
  cd "${DATA_PATH}"/script
  docker-compose -f fates-mongo-compose-key.yaml up -d
}

function generate_keyfile() {
  cd "${DATA_PATH}/script"
  if [ ! -f "${DATA_PATH}/script/mongo-keyfile" ]; then
    echo 'create mongo-keyfile.'
    openssl rand -base64 756 -out mongo-keyfile
    sudo chmod 600 mongo-keyfile
    sudo chown 999 mongo-keyfile
  else
    echo 'mongo-keyfile already exists.'
  fi
}

function config_shard() {
  cd "${DATA_PATH}/script"
  docker-compose -f fates-mongo-compose.yaml exec config1 bash -c "echo 'rs.initiate({_id: \"fates-mongo-config\",configsvr: true, members: [{ _id : 0, host : \"config1:27019\" },{ _id : 1, host : \"config2:27019\" }, { _id : 2, host : \"config3:27019\" }]})' | mongo --port 27019"
  docker-compose -f fates-mongo-compose.yaml exec shard1 bash -c "echo 'rs.initiate({_id: \"shard1\",members: [{ _id : 0, host : \"shard1:27018\" }]})' | mongo --port 27018"
  docker-compose -f fates-mongo-compose.yaml exec shard2 bash -c "echo 'rs.initiate({_id: \"shard2\",members: [{ _id : 0, host : \"shard2:27018\" }]})' | mongo --port 27018"
  docker-compose -f fates-mongo-compose.yaml exec shard3 bash -c "echo 'rs.initiate({_id: \"shard3\",members: [{ _id : 0, host : \"shard3:27018\" }]})' | mongo --port 27018"
  docker-compose -f fates-mongo-compose.yaml exec mongos bash -c "echo 'sh.addShard(\"shard1/shard1:27018\")' | mongo"
  docker-compose -f fates-mongo-compose.yaml exec mongos bash -c "echo 'sh.addShard(\"shard2/shard2:27018\")' | mongo"
  docker-compose -f fates-mongo-compose.yaml exec mongos bash -c "echo 'sh.addShard(\"shard3/shard3:27018\")' | mongo"
}

function add_user() {
  cd "${DATA_PATH}/script"
  docker-compose -f fates-mongo-compose.yaml exec mongos bash -c "echo -e 'use admin\n db.createUser({user:\"root\",pwd:\"root\",roles:[{role:\"root\",db:\"admin\"}]})' | mongo"
}

function check() {
  cd "${DATA_PATH}/script"
  docker-compose -f fates-mongo-compose.yaml exec mongos bash -c "echo -e 'use admin\n show users' | mongo -u root -p root"
}

function main() {
  rm_old_directory
  check_directory
  cp_script
  generate_keyfile
  deploy_no_auth
  sleep 120
  config_shard
  add_user
  deploy_with_auth
  sleep 90
  check
}

main
複製代碼

參考

相關文章
相關標籤/搜索