Docker
Cómo configurar la réplica de Mongo de tres nodos con Docker Image y aprovisionado con Chef
Buscar..
Introducción
Esta documentación describe cómo construir un conjunto de réplicas Mongo de tres nodos con Docker Image y el aprovisionamiento automático con Chef.
Paso de compilación
Pasos:
Genere un archivo de claves Base 64 para la autenticación de nodo Mongo. Pon este archivo en chef data_bags
Ve al chef suppermarket y descarga el libro de cocina docker. Genere un libro de cocina personalizado (por ejemplo, custom_mongo) y agregue 'docker', '~> 2.0' a los metadatos.rb de su libro de cocina
Crea una receta y atributos en tu libro de cocina personalizado.
Inicializar Mongo para formar un conjunto de grupos de representantes
Paso 1: Crear archivo de clave
crear una bolsa de datos llamada mongo-keyfile y un elemento llamado keyfile. Esto estará en el directorio data_bags en chef. El contenido del artículo será el siguiente
openssl rand -base64 756 > <path-to-keyfile>
contenido del elemento del archivo clave
{
"id": "keyfile",
"comment": "Mongo Repset keyfile",
"key-file": "generated base 64 key above"
}
Paso 2: descargue el libro de cocina docker del chef supper market y luego cree el libro de cocina custom_mongo
knife cookbook site download docker
knife cookbook create custom_mongo
en metadat.rb de custom_mongo add
depends 'docker', '~> 2.0'
Paso 3: crear atributo y receta
Atributos
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'
Receta
#
# 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
Crear un rol llamado mongo-role en el directorio de roles
{
"name": "mongo-role",
"description": "mongo DB Role",
"run_list": [
"recipe[custom_mongo]"
]
}
Agregue el rol anterior a la lista de ejecución de tres nodos 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]'
Paso 4: Inicializa el Mongo de tres nodos para formar el repset
Supongo que el rol anterior ya se ha aplicado en los tres nodos de Mongo. Solo en el nodo 01, inicie Mongo con --auth para habilitar la autenticación
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
Acceda al shell interactivo de la ejecución del contenedor docker en el nodo 01 y cree un usuario administrador
docker exec -it mongo /bin/sh
mongo
use admin
db.createUser( {
user: "admin-user",
pwd: "password",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
});
Crear usuario root
db.createUser( {
user: "RootAdmin",
pwd: "password",
roles: [ { role: "root", db: "admin" } ]
});
Detenga y elimine el contenedor Docker creado anteriormente en el nodo 01. Esto no afectará los datos y el archivo de claves en el DIR del host. Después de eliminar, inicie Mongo de nuevo en el nodo 01, pero esta vez con el indicador de repetición
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"
ahora inicie mongo en los nodos 02 y 03 con la marca de configuración de rep
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"
Autentíquese con el usuario root en el Nodo 01 e inicie el conjunto de réplicas
use admin
db.auth("RootAdmin", "password");
rs.initiate()
En el nodo 01, agregue los Nodos 2 y 3 al conjunto de réplicas para formar el grupo repset0
rs.add("mongo-02.example.com")
rs.add("mongo-03.example.com")
Pruebas
En la ejecución principal db.printSlaveReplicationInfo () y observe la hora sincronizada y sincronizada. El último debe ser 0 segundos como abajo
Salida
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
Espero que esto ayude a alguien