构建步骤
脚步:
-
为 Mongo 节点身份验证生成 Base 64 密钥文件。将此文件放在 chef data_bags 中
-
去厨师 suppermarket 并下载 docker cookbook。生成自定义菜谱(例如 custom_mongo)并将
docker
,“〜> 2.0”添加到菜谱的 metadata.rb 中 -
在自定义菜谱中创建属性和配方
-
初始化 Mongo 以形成 Rep Set 集群
第 1 步:创建密钥文件
创建名为 mongo-keyfile 的 data_bag 和名为 keyfile 的项。这将在 chef 的 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 中添加
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]"
]
}
将上面的角色添加到三个 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
我假设上面的角色已经应用于所有三个 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 container 的交互式 shell 并创建 admin 用户
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"
现在使用 rep set 标志在节点 02 和 03 上启动 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 上使用 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
我希望这可以帮助别人