Docker
ドッカーイメージを使用して3ノードモンゴーレプリカをセットアップし、シェフを使用してプロビジョニングする方法
サーチ…
前書き
このドキュメントでは、Docker Imageを使用して3ノードのMongoレプリカセットを構築し、Chefを使用して自動プロビジョニングする方法について説明します。
ビルドステップ
ステップ:
Mongoノード認証用のBase64キーファイルを生成します。このファイルをシェフのdata_bagsに配置します
シェフsuppermarketに行き、ドッカーの料理本をダウンロードしてください。カスタム料理の本(例えばcustom_mongo)を生成し、追加するには 'docker'、 '〜> 2.0'をあなたの料理のメタデータに加えます.rb
独自の料理本に属性とレシピを作成する
Rep 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:シェフ夕食市場からdocker cookbookをダウンロードし、custom_mongo cookbookを作成する
knife cookbook site download docker
knife cookbook create custom_mongo
custom_mongoのmetadat.rbのadd
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つの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:3ノードのMongoを初期化してrepsetを形成する
私は上記の役割がすでに3つのMongoノードすべてに適用されていると仮定しています。ノード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上の実行中のドッカーコンテナの対話型シェルにアクセスし、管理者を作成する
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" } ]
});
ノード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のmongoを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"
ノード01のrootユーザーで認証し、レプリカセットを開始する
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
これが誰かを助けること