Поиск…


Вступление

В этой документации описывается, как создать набор реплик с тремя узлами Mongo с использованием Docker Image и автоматически подготовлен с использованием шеф-повара.

Шаг сборки

шаги:

  1. Создайте базовый файл Base 64 для аутентификации узлов Mongo. Поместите этот файл в chef data_bags

  2. Пойдите в супермаркет шеф-повара и загрузите кулинарную книгу докеров. Создайте пользовательскую поваренную книгу (например, custom_mongo) и добавьте в «cookie» метаданные вашей cookbook файл cookie «docker», «~> 2.0»

  3. Создайте атрибуты и рецепт в своей пользовательской кулинарной книге

  4. Инициализация Mongo для создания кластера Rep Set

Шаг 1. Создание файла ключа

создайте data_bag, называемый mongo-keyfile, и элемент, называемый keyfile. Это будет в каталоге data_bags в шеф-поваре. Содержимое элемента будет следующим:

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

содержимое элемента ключа

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

Шаг 2: Загрузите кулинарную книгу докеров с шеф-повара, а затем создайте поваренную книгу custom_mongo

knife cookbook site download docker 
knife cookbook create custom_mongo

в metadat.rb custom_mongo добавить

depends          'docker', '~> 2.0'

Шаг 3: создать атрибут и рецепт

Атрибуты

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'

Рецепт

#
# 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

Создать роль, называемую mongo-role в каталоге ролей

{
  "name": "mongo-role",
  "description": "mongo DB Role",
  "run_list": [
    "recipe[custom_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]'

Шаг 4: Инициализируйте три узла Mongo, чтобы сформировать repset

Я предполагаю, что вышеупомянутая роль уже была применена ко всем трем монго-узлам. Только на узле 01, Начать Mongo с --auth, чтобы включить аутентификацию

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

Получите доступ к интерактивной оболочке работающего контейнера докеров на узле 01 и Create admin user

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

Создание пользователя root

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

Остановить и удалить контейнер Docker, созданный выше на узле 01. Это не повлияет на данные и ключевой файл в DIR хоста. После удаления Монго снова на узел 01, но на этот раз с флагом repset

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"

теперь запустите mongo на узле 02 и 03 с установленным значком 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"

Аутентификация с пользователем root на узле 01 и инициирование набора реплик

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

На узле 01 добавьте узел 2 и 3 в набор реплик, чтобы сформировать кластер repset0

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

тестирование

В основном запуске db.printSlaveReplicationInfo () и наблюдать за SyncedTo и за основным временем. Позже должно быть 0 секунд, как показано ниже

Выход

 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

Я надеюсь, что это помогает кому-то



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow