Recherche…


Introduction

Cette documentation explique comment créer un jeu de répliques Mongo à trois nœuds à l'aide de Docker Image et approvisionnement automatique à l'aide de Chef.

Étape de construction

Pas:

  1. Générez un fichier de clés Base 64 pour l'authentification du noeud Mongo. Placez ce fichier dans chef data_bags

  2. Accédez au chef de supermarché et téléchargez le livre de recettes docker. Générez un livre de recettes personnalisé (par exemple, custom_mongo) et ajoutez depend 'docker', '~> 2.0' au metadata.rb de votre livre de recettes

  3. Créer un attribut et une recette dans votre livre de recettes personnalisé

  4. Initialise Mongo pour former le cluster Rep Set

Étape 1: Créer un fichier de clé

créer data_bag appelé mongo-keyfile et élément appelé keyfile. Ce sera dans le répertoire data_bags en chef. Le contenu de l'article sera comme ci-dessous

openssl rand -base64 756 > <path-to-keyfile>

contenu de l'élément de fichier clé

{
  "id": "keyfile",
  "comment": "Mongo Repset keyfile",
  "key-file": "generated base 64 key above"
}

Étape 2: Téléchargez le livre de recettes de docker sur le marché du chef et créez un livre de recettes personnalisé_mongo

knife cookbook site download docker 
knife cookbook create custom_mongo

dans metadat.rb de custom_mongo add

depends          'docker', '~> 2.0'

Étape 3: créer un attribut et une recette

Les attributs

default['custom_mongo']['mongo_keyfile'] = '/data/keyfile' 
default['custom_mongo']['mongo_datadir'] = '/data/db'
default['custom_mongo']['mongo_datapath'] = '/data'
default['custom_mongo']['keyfilename'] = 'mongodb-keyfile'

Recette

#
# Cookbook Name:: custom_mongo
# Recipe:: default
#
# Copyright 2017, Innocent Anigbo
#
# All rights reserved - Do Not Redistribute
#

data_path = "#{node['custom_mongo']['mongo_datapath']}"
data_dir = "#{node['custom_mongo']['mongo_datadir']}"
key_dir = "#{node['custom_mongo']['mongo_keyfile']}"
keyfile_content = data_bag_item('mongo-keyfile', 'keyfile')
keyfile_name = "#{node['custom_mongo']['keyfilename']}"

#chown of keyfile to docker user
execute 'assign-user' do
 command "chown 999 #{key_dir}/#{keyfile_name}"
 action :nothing
end

#Declaration to create Mongo data DIR and Keyfile DIR
%W[ #{data_path} #{data_dir} #{key_dir} ].each do |path|
directory path do
  mode '0755'
  end
end

#declaration to copy keyfile from data_bag to keyfile DIR on your mongo server
file "#{key_dir}/#{keyfile_name}" do
  content keyfile_content['key-file']
  group 'root'
  mode '0400'
  notifies :run, 'execute[assign-user]', :immediately
end

#Install docker
docker_service 'default' do
  action [:create, :start]
end

#Install mongo 3.4.2
docker_image 'mongo' do
  tag '3.4.2'
  action :pull
end

Créer un rôle appelé mongo-role dans le répertoire des rôles

{
  "name": "mongo-role",
  "description": "mongo DB Role",
  "run_list": [
    "recipe[custom_mongo]"
  ]
}

Ajouter le rôle ci-dessus à la liste d'exécution des trois nœuds mongo

knife node run_list add FQDN_of_node_01 'role[mongo-role]'
knife node run_list add FQDN_of_node_02 'role[mongo-role]'
knife node run_list add FQDN_of_node_03 'role[mongo-role]'

Étape 4: Initialiser le Mongo à trois nœuds pour former un repset

Je suppose que le rôle ci-dessus a déjà été appliqué aux trois nœuds Mongo. Sur le noeud 01 uniquement, démarrez Mongo avec --auth pour activer l'authentification

docker run --name mongo -v /data/db:/data/db -v /data/keyfile:/opt/keyfile --hostname="mongo-01.example.com" -p 27017:27017 -d mongo:3.4.2 --keyFile /opt/keyfile/mongodb-keyfile --auth

Accéder au shell interactif du conteneur docker en cours d'exécution sur le noeud 01 et Créer un utilisateur admin

docker exec -it mongo /bin/sh
    mongo
    use admin
    db.createUser( {
         user: "admin-user",
         pwd: "password",
         roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
       });

Créer un utilisateur root

db.createUser( {
         user: "RootAdmin",
         pwd: "password",
         roles: [ { role: "root", db: "admin" } ]
       });

Arrêtez et supprimez le conteneur Docker créé ci-dessus sur le noeud 01. Cela n'affectera pas les données et le fichier de clés dans le DIR de l'hôte. Après avoir supprimé Mongo, redémarrez le nœud 01, mais cette fois avec repset flag

docker rm -fv mongo
docker run --name mongo-uat -v /data/db:/data/db -v /data/keyfile:/opt/keyfile --hostname="mongo-01.example.com" -p 27017:27017 -d mongo:3.4.2 --keyFile /opt/keyfile/mongodb-keyfile --replSet "rs0"

lancez maintenant mongo sur les nœuds 02 et 03 avec le drapeau rep set

docker run --name mongo -v /data/db:/data/db -v /data/keyfile:/opt/keyfile --hostname="mongo-02.example.com" -p 27017:27017 -d mongo:3.4.2 --keyFile /opt/keyfile/mongodb-keyfile --replSet "rs0"
docker run --name mongo -v /data/db:/data/db -v /data/keyfile:/opt/keyfile --hostname="mongo-03.example.com" -p 27017:27017 -d mongo:3.4.2 --keyFile /opt/keyfile/mongodb-keyfile --replSet "rs0"

Authentifiez-vous avec l'utilisateur root sur le nœud 01 et lancez le jeu de réplicas

use admin
db.auth("RootAdmin", "password");
rs.initiate()

Sur le noeud 01, ajoutez les noeuds 2 et 3 au jeu de réplicas pour former le cluster repset0

rs.add("mongo-02.example.com")
rs.add("mongo-03.example.com")

Essai

Sur le primaire, exécutez db.printSlaveReplicationInfo () et observez SyncedTo et Behind the main time. Le plus tard devrait être 0 sec comme ci-dessous

Sortie

 rs0:PRIMARY> db.printSlaveReplicationInfo()
    source: mongo-02.example.com:27017
            syncedTo: Mon Mar 27 2017 15:01:04 GMT+0000 (UTC)
            0 secs (0 hrs) behind the primary
    source: mongo-03.example.com:27017
            syncedTo: Mon Mar 27 2017 15:01:04 GMT+0000 (UTC)
            0 secs (0 hrs) behind the primary

J'espère que ça aidera quelqu'un



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow