Docker
Procédure de configuration d'un réplica Mongo à trois nœuds à l'aide de l'image Docker et de Provisioned à l'aide de Chef
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:
Générez un fichier de clés Base 64 pour l'authentification du noeud Mongo. Placez ce fichier dans chef data_bags
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
Créer un attribut et une recette dans votre livre de recettes personnalisé
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