MongodDB部署企业版(4.4.9),开启静态加密
基础概要:
Architecture Reference Chart:
根据规划将部署成两分片,三成员副本集(master+slaver+arbiter)的配置
安装启动顺序:config–>shard–>mongos
系统版本:centos7 64位
ip | module |
1.1.1.85 | shard1(sec); config |
1.1.1.86 | shard2(sec); config;mongos |
1.1.1.87 | shard1; config;mongos |
1.1.1.67 | shard2 shard1-arbiter- shard2-arbiter |
一、安装MongoDB企业版(Enterprise Edition)
注:如果
/etc/yum.repos.d/mongodb-enterprise.repo
此目录中有以前安装的 MongoDB 的文件,则应将其删除。使用mongodb-enterprise-4.4.repo
上面的文件安装 MongoDB 4.4。
1、配置存储库。
创建一个/etc/yum.repos.d/mongodb-enterprise-4.4.repo
文件,以便您可以使用以下命令直接安装 MongoDB 企业yum
:
sudo bash -c "cat > /etc/yum.repos.d/mongodb-enterprise-4.4.repo" << EOF
[mongodb-enterprise-4.4]
name=MongoDB Enterprise Repository
baseurl=https://repo.mongodb.com/yum/redhat/\$releasever/mongodb-enterprise/4.4/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
EOF
2、安装 MongoDB 企业版4.4.9 。
2.1、要安装特定版本,您必须单独指定每个组件包以及版本号,如下例所示:
sudo yum install -y mongodb-enterprise-4.4.9 mongodb-enterprise-server-4.4.9 mongodb-enterprise-shell-4.4.9 mongodb-enterprise-mongos-4.4.9 mongodb-enterprise-tools-4.4.9
2.2、固定特定版本的 MongoDB Enterprise。
尽管您可以指定任何可用的 MongoDB Enterprise 版本,yum
但在更新版本可用时升级包。为防止意外升级,请通过将以下exclude
指令添加到 /etc/yum.conf
文件来固定包:
sudo bash -c "echo 'exclude=mongodb-enterprise,mongodb-enterprise-server,mongodb-enterprise-shell,mongodb-enterprise-mongos,mongodb-enterprise-tools'>>/etc/yum.conf"
二、运行MongoDB企业版
先决条件
每个部署都可能有独特的要求和设置;但是,以下阈值和设置对于mongod and mongos部署尤为重要:
# 推荐设置的值为
-f(文件大小):unlimited
-t(CPU时间):unlimited
-v(虚拟内存):unlimited
-l(锁定内存大小):unlimited
-n(打开文件):64000
-m(内存大小):unlimited
-u(进程/线程):64000
始终记得在更改设置后重新启动您的mongod实例 mongos,ulimit以确保更改生效。
要为这些版本配置nproc
值,请创建一个名为 /etc/security/limits.d/99-mongodb-nproc.conf
newsoft nproc
和 hard nproc
values 的文件以增加进程限制
#修改系统文件打开数,直接生效
sudo bash -c "ulimit -n 1000000"
#永久生效
sudo bash -c "cat >> /etc/security/limits.conf" << Leo
* soft nofile 1000000
* hard nofile 1000000
* soft nproc 1000000
* hard nproc 1000000
Leo
# 修改mongo最大文件打开数
sudo bash -c "cat > /etc/security/limits.d/99-mongodb.conf" << LEO
#Default limit for number of user’s processes to prevent
# accidental fork bombs.
# # See rhbz #432903 for reasoning.
# #
# # * soft nproc 4096
# # root soft nproc unlimited
* soft nofile 1000000
* hard nofile 1000000
* soft fsize unlimited
* hard fsize unlimited
* soft cpu unlimited
* hard cpu unlimited
* soft nproc 500000
* hard nproc 500000
LEO
禁用SELinux
# 直接生效
setenforce 0
# 永久生效
vim /etc/sysconfig/selinux
SELINUX=disabled
1、创建所需的文件夹
sudo mkdir -p /var/opt/DB/mongodbEE/config
sudo mkdir -p /var/opt/DB/mongodbEE/config/metadata/
sudo mkdir -p /var/opt/DB/mongodbEE/config/log/
sudo mkdir -p /var/opt/DB/mongodbEE/shard
sudo mkdir -p /var/opt/DB/mongodbEE/shard/data
sudo mkdir -p /var/opt/DB/mongodbEE/shard/log
sudo mkdir -p /var/opt/DB/mongodbEE/mongos
sudo mkdir -p /var/opt/DB/mongodbEE/mongos/log
sudo mkdir -p /var/opt/DB/mongodbEE/arbiter
sudo mkdir -p /var/opt/DB/mongodbEE/slaver/log
sudo chown -R mongod:mongod /var/opt/DB/mongodbEE
2、创建config服务器,配置mongoconfig.conf,并启动
- 选择85、86、87服务器配置
2.1、mongo-config配置文件 /var/opt/DB/mongodbEE/config/mongo.conf
processManagement:
fork: true
net:
bindIp: 0.0.0.0
##should be changed after clusters stable
port: 27000
storage:
dbPath: /var/opt/DB/mongodbEE/config/metadata/
replication:
replSetName: cfgReplSet
sharding:
clusterRole: configsvr
systemLog:
verbosity: 0
#traceAllExceptions: true
destination: file
path: "/var/opt/DB/mongodbEE/config/log/config.log"
logAppend: true
logRotate: reopen
timeStampFormat: iso8601-local
#security:
#authorization: enabled
#transitionToAuth: true
#clusterAuthMode: keyFile
# keyFile: /var/opt/DB/mongodbEE/mongodb-keyfile
2.2、首次启动
sudo mongod -f /var/opt/DB/mongodbEE/config/mongo.conf
2.3、初始化配置config集群,找一台config配置即可
mongo --port 27000
use admin
rs.initiate(
{
_id: "cfgReplSet",
configsvr: true,
members: [
{ _id : 0, host : "1.1.1.85:27000" },
{ _id : 1, host : "1.1.1.86:27000" },
{ _id : 2, host : "1.1.1.87:27000" }
]
}
)
3、配置shard服务器
不同的shard集修改replSetName: shard1
即可
- 85、87配置
replSetName: shard1
- 86、67配置
replSetName: shard2
3.1、配置文件/var/opt/DB/mongodbEE/shard/shard.conf
processManagement:
fork: true
pidFilePath: /var/opt/DB/mongodbEE/shard/log/slaver1.pid
net:
bindIp: 0.0.0.0
##should be changed after clusters stable
port: 27001
#maxIncomingConnections
serviceExecutor: adaptive
##split net io and disk io, reuse network io and connection to reduce locks
storage:
#indexBuildRetry set to false if mongod restart fail when there is rebuild index error
dbPath: /var/opt/DB/mongodbEE/shard/data
#directoryPerDB: true
#directoryPerDB should be set when initial mongodb, can't use on existing db
journal:
enabled: true
commitIntervalMs: 200
#wiredTiger:
# collectionConfig:
# blockCompressor: zlib
# indexConfig:
# prefixCompression: true
#none with highest query speed but snappy and zlib with lower IO, zlib will take more cpu and less IO than snappy
# engineConfig:
# directoryForIndexes: true
#directoryForIndexes should be set when initial mongodb, can't use on existing db
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
systemLog:
verbosity: 0
#traceAllExceptions: true
destination: file
path: "/var/opt/DB/mongodbEE/shard/log/slaver1.log"
logAppend: true
logRotate: reopen
timeStampFormat: iso8601-local
# component:
# sharding:
# verbosity: 0
# write:
# verbosity: 0
#security:
#authorization: enabled
#transitionToAuth: true
#clusterAuthMode: keyFile
# keyFile: /var/opt/DB/mongodbEE/mongodb-keyfile
#clusterIpSourceWhitelist: for whitelist of clients
#ldap configuration might be used when ITSAC and mongodb should be enterprise version
3.2、首次启动
sudo mongod -f /var/opt/DB/mongodbEE/shard/shard.conf
3.3、选择shard1 && shard2 其中一台服务器配置副本集
mongo --port 27001
use admin
# run on shard1 server
rs.initiate(
{
_id: "shard1",
members: [
{ _id : 0, host : "1.1.1.87:27001" },
{ _id : 1, host : "1.1.1.85:27001" }
]
}
)
# ------------------------------------------------------------------------
mongo --port 27001
use admin
# run on shard2 server
rs.initiate(
{
_id: "shard2",
members: [
{ _id : 0, host : "1.1.1.67:27001" },
{ _id : 1, host : "1.1.1.86:27001" }
]
}
)
4、添加arbiter到(shard1 && shard2)
- 选择一台服务器配置即可,本文选择67服务器
4.1、创建所需的文件夹
sudo mkdir -p /var/opt/DB/mongodbEE/arbiter/shard1/log
sudo mkdir -p /var/opt/DB/mongodbEE/arbiter/shard1/data
sudo mkdir -p /var/opt/DB/mongodbEE/arbiter/shard2/log
sudo mkdir -p /var/opt/DB/mongodbEE/arbiter/shard2/data
4.2、配置shard1所需的arbiter /var/opt/DB/mongodbEE/arbiter/shard1/shard1.conf
processManagement:
fork: true
pidFilePath: /var/opt/DB/mongodbEE/arbiter/shard1/log/arbiter.pid
net:
bindIp: 0.0.0.0
port: 27026
serviceExecutor: adaptive
storage:
dbPath: /var/opt/DB/mongodbEE/arbiter/shard1/data
journal:
enabled: true
commitIntervalMs: 200
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
systemLog:
verbosity: 0
destination: file
path: "/var/opt/DB/mongodbEE/arbiter/shard1/log/arbiter.log"
logAppend: true
logRotate: reopen
timeStampFormat: iso8601-local
#security:
# authorization: enabled
#transitionToAuth: true
# keyFile: /var/opt/mongodbEE/mongodb-keyfile
4.3、配置shard2所需的arbiter /var/opt/DB/mongodbEE/arbiter/shard2/shard2.conf
processManagement:
fork: true
pidFilePath: /var/opt/DB/mongodbEE/arbiter/shard2/log/arbiter.pid
net:
bindIp: 0.0.0.0
port: 27027
serviceExecutor: adaptive
storage:
dbPath: /var/opt/DB/mongodbEE/arbiter/shard2/data
journal:
enabled: true
commitIntervalMs: 200
replication:
replSetName: shard2
sharding:
clusterRole: shardsvr
systemLog:
verbosity: 0
destination: file
path: "/var/opt/DB/mongodbEE/arbiter/shard2/log/arbiter.log"
logAppend: true
logRotate: reopen
timeStampFormat: iso8601-local
#security:
# authorization: enabled
#transitionToAuth: true
# keyFile: /var/opt/mongodbEE/mongodb-keyfile
4.4、首次启动
sudo mongod -f /var/opt/DB/mongodbEE/arbiter/shard1/shard1.conf
sudo mongod -f /var/opt/DB/mongodbEE/arbiter/shard2/shard2.conf
4.5、配置arbiter到对应的shard集中
mongo --port 27001
# shard1 上配置
rs.addArb("1.1.1.67:27026")
# shard2 上配置
rs.addArb("1.1.1.67:27027")
5、创建mongos客户端指定配置服务器,配置mongos.conf
- mongos只是客户端,本文选择86、87服务进行的配置
5.1、mongos的启动配置文件 /var/opt/DB/mongodbEE/mongos/mongos.conf
processManagement:
fork: true
pidFilePath: /var/opt/DB/mongodbEE/mongos/log/mongos.pid
net:
bindIp: 0.0.0.0
##should be changed after clusters stable
port: 20000
serviceExecutor: adaptive
sharding:
configDB: cfgReplSet/1.1.1.85:27000,1.1.1.86:27000,1.1.1.87:27000
systemLog:
verbosity: 0
#traceAllExceptions: true
destination: file
path: "/var/opt/DB/mongodbEE/mongos/log/mongos.log"
logAppend: true
logRotate: reopen
timeStampFormat: iso8601-local
#security:
#authorization: enabled
#transitionToAuth: true
#clusterAuthMode: keyFile
# keyFile: /var/opt/DB/mongodbEE/mongodb-keyfile
5.2、首次启动
sudo mongos -f /var/opt/DB/mongodbEE/mongos/mongos.conf
5.3、配置mongos集群
随便选择一台mongos服务器运行即可
mongo --port 20000
use admin
sh.addShard( "shard1/1.1.1.87:27001,1.1.1.85:27001,1.1.1.67:27026")
sh.addShard( "shard2/1.1.1.67:27001,1.1.1.86:27001,1.1.1.67:27027")
db.createUser(
{
user: "root",
pwd: "root123",
roles: [ { role: "root", db: "admin" } ]
}
)
三、数据库添加内部安全认证
使用密钥文件身份验证,分片集群中的每个 mongod或实例使用密钥文件的内容作为共享密码来验证部署中的其他成员。mongos只有 具有正确密钥文件mongod的mongos实例才能加入分片集群。
客户端只能使用配置的客户端认证机制连接到分片集群。
注:加安全认证后使用用户登录才有增删改权限,否则只有查询权限
1、创建密钥文件
openssl
生成复杂的伪随机 1024 字符串以用于密钥文件。然后它chmod
用于更改文件权限以仅为文件所有者提供读取权限:
sudo bash -c "openssl rand -base64 756 > /var/opt/DB/mongodbEE/mongodb-keyfile"
sudo chmod 600 /var/opt/DB/mongodbEE/mongodb-keyfile
2、把生成的mongodb-keyfile文件拷贝到每个需要keyfile的服务器上,开启配置文件的注释
修改所有的配置文件,开启认证
security:
#authorization: enabled
keyFile: /var/opt/DB/mongodbEE/mongodb-keyfile
3、重启集群并生效:
关闭集群
# 停止mongos路由器
mongo --port 20000
db.getSiblingDB("admin").shutdownServer()
# shard关闭顺序 1、arbiter;2、secondary;3、master
mongo --port 27026
db.getSiblingDB("admin").shutdownServer()
mongo --port 27027
db.getSiblingDB("admin").shutdownServer()
mongo --port 27001
db.getSiblingDB("admin").shutdownServer()
# config关闭顺序 1、secondary;2、master
mongo --port 27000
db.getSiblingDB("admin").shutdownServer()
4、启动集群one by one
# 85->86->87
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/config/mongo.conf
# 87->67->85->86
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/shard/shard.conf
# ->67 && 67
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/arbiter/shard1/shard1.conf
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/arbiter/shard2/shard2.conf
# 86 && 87
sudo numactl --interleave=all /usr/bin/mongos -f /var/opt/DB/mongodbEE/mongos/mongos.conf
mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
sh.startBalancer()
sh.getBalancerState()
5、登录
mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
mongo --port 27000 --authenticationDatabase "admin" -u "root" -p "root123"
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"
(Complete)
验证版本:
方法一、
db.serverBuildInfo().modules
方法二、
mongod -version
四、静态加密
简介:
企业功能
仅在 MongoDB Enterprise 中可用。
数据加密过程包括:
- 生成主密钥。
- 为每个数据库生成密钥。
- 使用数据库密钥加密数据。
- 使用主密钥加密数据库密钥
加密透明地发生在存储层;即从文件系统的角度来看,所有的数据文件都是完全加密的,数据只在内存中和传输过程中以未加密的状态存在。
1、MongoDB 的加密存储引擎支持主密钥的两种密钥管理选项:
- 通过密钥管理互操作性协议 (KMIP) 与第三方密钥管理设备集成。推荐的
- 通过密钥文件使用本地密钥管理。(本文使用)
MongoDB 无法加密现有数据。当您使用新密钥启用加密时,MongoDB 实例不能有任何预先存在的数据。如果您的 MongoDB 安装已经有现有数据,请参阅 Encrypt Existing Data at Rest了解更多步骤。
2、本地密钥管理
要使用密钥文件进行加密,您必须拥有一个包含单个 16 或 32 个字符的字符串的 base64 编码密钥文件。密钥文件只能由mongod进程的所有者访问。
2.1、 使用 16 或 32 个字符串创建 base64 编码的密钥文件。您可以使用您喜欢的任何方法生成编码的密钥文件。例如,
openssl rand -base64 32 > /var/opt/DB/mongodbEE/local-key/mongodb-keyfile
2.2、更新文件权限。
chmod 600 /var/opt/DB/mongodbEE/local-key/mongodb-keyfile
拷贝文件到所有需要的服务器上
2.3、要使用密钥文件,请从mongod以下选项开始:
-
--enableEncryption
, -
--encryptionKeyFile <path to keyfile>
,
# 手动生效(本文并未使用,跳过)
mongod --enableEncryption --encryptionKeyFile mongodb-keyfile
所有mongod启动的配置文件添加如下内容(本文使用方式)
security:
enableEncryption: true
encryptionKeyFile: /var/opt/DB/mongodbEE/local-key/mongodb-keyfile
3、启动集群生效
注:3.1和3.2两个操作方式选择一个皆可。
3.1、只有初始化集群时才可以生效
启动集群,使用如下命令进行初始化mongo集群。或是参考(二)皆可。
========================================(1、config)==========================================
# 85->86->87
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/config/mongo.conf
mongo --port 27000 --authenticationDatabase "admin"
use admin
rs.initiate(
{
_id: "cfgReplSet",
configsvr: true,
members: [
{ _id : 0, host : "1.1.1.85:27000" },
{ _id : 1, host : "1.1.1.86:27000" },
{ _id : 2, host : "1.1.1.87:27000" }
]
}
)
=========================================(2、shard)===========================================
# 87->67->85->86
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/shard/shard.conf
# ->67 && 67
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/arbiter/shard1/shard1.conf
sudo numactl --interleave=all /usr/bin/mongod -f /var/opt/DB/mongodbEE/arbiter/shard2/shard2.conf
mongo --port 27001
use admin
# run on shard1 server
rs.initiate(
{
_id: "shard1",
members: [
{ _id : 0, host : "1.1.1.87:27001" },
{ _id : 1, host : "1.1.1.85:27001" }
]
}
)
db.createUser(
{
user: "root",
pwd: "root123",
roles: [ { role: "root", db: "admin" } ]
}
)
# ------------------------------------------------------------------------
mongo --port 27001
use admin
# run on shard2 server
rs.initiate(
{
_id: "shard2",
members: [
{ _id : 0, host : "1.1.1.67:27001" },
{ _id : 1, host : "1.1.1.86:27001" }
]
}
)
db.createUser(
{
user: "root",
pwd: "root123",
roles: [ { role: "root", db: "admin" } ]
}
)
# 再次重新登录shard进行配置
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"
# shard1 上配置
rs.addArb("1.1.1.67:27026")
# shard2 上配置
rs.addArb("1.1.1.67:27027")
=========================================(3、mongos)==========================================
# 86 && 87
sudo numactl --interleave=all /usr/bin/mongos -f /var/opt/DB/mongodbEE/mongos/mongos.conf
mongo --port 20000 --authenticationDatabase "admin"
use admin
sh.addShard( "shard1/1.1.1.87:27001,1.1.1.85:27001,1.1.1.67:27026")
sh.addShard( "shard2/1.1.1.67:27001,1.1.1.86:27001,1.1.1.67:27027")
db.createUser(
{
user: "root",
pwd: "root123",
roles: [ { role: "root", db: "admin" } ]
}
)
mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
sh.startBalancer()
sh.getBalancerState()
3.2、加密现有的静态数据
4、验证加密密钥管理器是否使用密钥文件成功初始化。如果操作成功,该过程将记录以下消息:
查看对应的shard && config log日志即可
[initandlisten] Encryption key manager initialized with key file: <path to keyfile>