수색…


소개

이 문서는 Docker Image를 사용하여 3 노드 Mongo 복제 세트를 만들고 Chef를 사용하여 자동으로 프로비저닝하는 방법을 설명합니다.

빌드 단계

단계 :

  1. Mongo 노드 인증을위한 Base 64 키 파일을 생성하십시오. 이 파일을 주방장 data_bags에 저장하십시오.

  2. 요리사 suppermarket 가서 다운로드 도커 요리 책. 맞춤 요리 책 (예 : custom_mongo)을 생성하고 'docker', '~ 2.0'을 요리 책의 metadata.rb에 추가합니다.

  3. 맞춤 요리 책에 속성 및 요리법 만들기

  4. Repo Set 클러스터를 형성하기 위해 Mongo 초기화

1 단계 : 키 파일 생성

mongo-keyfile이라는 data_bag와 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

custom_mongo의 metadat.rb에 추가하십시오.

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]"
  ]
}

3 개의 몽고 노드 실행 목록에 위의 역할 추가

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 단계 : 3 노드 Mongo를 초기화하여 repset을 형성합니다.

위의 역할이 이미 모든 3 개의 Mongo 노드에 적용되었다고 가정합니다. 노드 01에서만 인증을 사용하려면 --auth를 사용하여 Mongo를 시작하십시오.

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에서 실행중인 고정 컨테이너의 대화 형 셸에 액세스하고 관리 사용자 만들기

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

루트 사용자 생성

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

노드 01에서 위에서 만든 Docker 컨테이너를 중지하고 삭제하십시오. 호스트 DIR의 데이터와 키 파일에는 영향을 미치지 않습니다. 삭제 후 노드 01에서 Mongo를 다시 시작하지만 이번에는 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"

이제 노드 02와 노드 03에서 rep set 플래그로 mongo를 시작하십시오.

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"

노드 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 및 Behind를 관찰합니다. 나중에 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