這個系列大致想跟大家分享以下篇章(我會持續更新的↖(^ω^)↗): 1、mongo 3.4分片集群系列之一:淺談分片集群 2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全 4、mongo 3.4分片集群系列之 ...
這個系列大致想跟大家分享以下篇章(我會持續更新的↖(^ω^)↗):
2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片
3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全
4、mongo 3.4分片集群系列之四:搭建分片集群 -- 哈希分片 + 安全 + 區域
5、mongo 3.4分片集群系列之五:詳解平衡器
6、mongo 3.4分片集群系列之六:詳解配置資料庫
7、mongo 3.4分片集群系列之七:配置資料庫管理
8、mongo 3.4分片集群系列之八:分片管理
這一篇也是實踐篇。
主要要講兩大部分:
一是在現有的,已經搭建好的哈希分片集群上,加上內部認證和用戶訪問控制(也就是繼“mongo 3.4分片集群系列之二:搭建分片集群--哈希分片”搭建的分片集群,增加安全機制)。
二是在搭建的時候,搭建分片集群和安全一起做,也就是從無集群到有集群的過程。
這裡說的安全機制,只是簡單的通過密鑰文件做內部認證,和用戶訪問控制。
一、 在現有的分片集群上,添加安全機制。
1、 創建和分發密鑰文件
# cd /etc/
# sudo openssl rand –base64 755 > mongo_keyfile
# sudo chmod 400 mongo_keyfile
mongo_keyfile是我指定的密鑰文件名,可以按需更改;
修改許可權,一定要做,否則之後會出現很多不知名的錯誤。
這裡要先將192.168.209.155上的mongo_keyfile文件拿到192.168.209.156上
#sudo rsync –arvz –P [email protected]:/etc/mongo_keyfile /etc/
拷貝過來後,註意檢查許可權是不是400,如圖
2、 配置分片集群管理用戶和資料庫用戶(在192.168.209.155上操作)
(1) 分片集群管理用戶
mongos和配置伺服器的集群管理員用戶是可以通用的,但是分片要創建自己的本地管理員用戶。
連接到mongos
# mongo --port 6666
輸入以下命令:(這裡只是為了方便理解,其實命令行打成一行即可)
use admin;
db.createUser(
{
user: "admin",
pwd: "adminbear",
roles: [
{ role: "root", db: "admin" },
{ role: "clusterAdmin", db: "admin" },
{ role: "userAdmin", db: "admin" }
]
}
);
其中,user用戶名和pwd密碼,可按需更改。由於角色分配的時候,分配root最高許可權給了admin,所以admin既是集群的最高管理員用戶,又是所有資料庫的最高管理員用戶
(2) 資料庫用戶
以下是為資料庫名DatabaseName,創建資料庫用戶。
輸入以下命令:(這裡只是為了方便理解,其實命令行打成一行即可)
use DatabaseName;
db.createUser(
{
user: "bear",
pwd: "bear",
roles: [
{ role: "readWrite", db: "DatabaseName" }
]
}
);
其中,user用戶名和pwd密碼,可按需更改。
exit;
退出當前的進程
3、 過渡每一個mongos實例來強制驗證(不停機)
(1) 第一個Mongos路由 mongo_router1(在192.168.209.155上操作)
1) 新建一個配置文件
# sudo vim /etc/mongo_router1_tmp.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
net:
port: 6666
sharding:
configDB: mongo_config/192.168.209.155:6000,192.168.209.155:6001,192.168.209.155:6002
security:
transitionToAuth: true
keyFile: /etc/mongo_keyfile
如下圖:
2) 關閉mongos實例
連接到mongos
# mongo --port 6666 –u admin –p adminbear --authenticationDatabase admin
use admin;
db.shutdownServer();
exit;
3) 用新的配置文件重新mongos實例
# mongos --config /etc/mongo_router1_tmp.conf &
(2) 第二個Mongos路由 mongo_router2(在192.168.209.156上操作)
1) 新建一個配置文件
# sudo vim /etc/mongo_router2_tmp.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
net:
port: 6666
sharding:
configDB: mongo_config/192.168.209.155:6000,192.168.209.155:6001,192.168.209.155:6002
security:
transitionToAuth: true
keyFile: /etc/mongo_keyfile
如下圖:
2) 關閉mongos實例
連接到mongos
# mongo --port 6666 –u admin –p adminbear --authenticationDatabase admin
use admin;
db.shutdownServer();
exit;
3) 用新的配置文件重新mongos實例
# mongos --config /etc/mongo_router2_tmp.conf &
4、 過渡每一個配置伺服器的副本集成員實例來強制驗證(不停機)(在192.168.209.155上操作)
這裡配置伺服器的主節點是mongo_config1
(1) 第二個配置伺服器 mongo_config2
1) 複製密鑰文件到指定目錄/mongo_config2/
# sudo cp /etc/mongo_keyfile /mongo_config2/
2) 新建一個配置文件
# sudo vim /mongo_config2/mongo_config2_tmp.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
storage:
dbPath: “/mongo_config2/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_config2/log/mongo_config2.log
net:
port: 6001
sharding:
clusterRole: configsvr
replication:
replSetName: mongo_config
security:
transitionToAuth: true
keyFile: /mongo_config2/mongo_keyfile
如下圖:
3) 關閉mongod實例
連接到mongod
# mongo --port 6001 –u admin –p adminbear --authenticationDatabase admin
use admin;
db.shutdownServer();
exit;
4) 用新的配置文件重新mongod實例
# mongod --fork --config /mongo_config2/mongo_config2_tmp.conf
(2) 第三個配置伺服器 mongo_config3
1) 複製密鑰文件到指定目錄/mongo_config3/
# sudo cp /etc/mongo_keyfile /mongo_config3/
2) 新建一個配置文件
# sudo vim /mongo_config3/mongo_config3_tmp.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
storage:
dbPath: “/mongo_config3/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_config3/log/mongo_config3.log
net:
port: 6002
sharding:
clusterRole: configsvr
replication:
replSetName: mongo_config
security:
transitionToAuth: true
keyFile: /mongo_config3/mongo_keyfile
如下圖:
3) 關閉mongod實例
連接到mongod
# mongo --port 6002 –u admin –p adminbear --authenticationDatabase admin
use admin;
db.shutdownServer();
exit;
4) 用新的配置文件重新mongod實例
# mongod --fork --config /mongo_config3/mongo_config3_tmp.conf
(3) 第一個配置伺服器 mongo_config1
1) 複製密鑰文件到指定目錄/mongo_config1/
# sudo cp /etc/mongo_keyfile /mongo_config1/
2) 新建一個配置文件
# sudo vim /mongo_config1/mongo_config1_tmp.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
storage:
dbPath: “/mongo_config1/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_config1/log/mongo_config1.log
net:
port: 6000
sharding:
clusterRole: configsvr
replication:
replSetName: mongo_config
security:
transitionToAuth: true
keyFile: /mongo_config1/mongo_keyfile
如下圖:
3) 降級主節點
連接到mongod
# mongo --port 6000 –u admin –p adminbear --authenticationDatabase admin
rs.stepDown();
4) 關閉mongod實例
use admin;
db.shutdownServer();
exit;
5) 用新的配置文件重新mongod實例
# mongod --fork --config /mongo_config1/mongo_config1_tmp.conf
5、 過渡每一個分片實例來強制驗證(停機)
(1) 第一個分片 mongo_shard1(在192.168.209.155上操作)
1) 創建分片本地管理員
連接到mongod
# mongo --port 6100
輸入以下命令:(這裡只是為了方便理解,其實命令行打成一行即可)
use admin;
db.createUser(
{
user: "adminShard1",
pwd: "adminbear",
roles: [
{ role: "clusterAdmin", db: "admin" },
{ role: "userAdmin", db: "admin" }
]
}
);
其中,user用戶名和pwd密碼,可按需更改。
2) 複製密鑰文件到指定目錄/mongo_shard1/
# sudo cp /etc/mongo_keyfile /mongo_shard1/
3) 新建一個配置文件
# sudo vim /mongo_shard1/mongo_shard1_tmp.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
storage:
dbPath: “/mongo_shard1/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_shard1/log/mongo_shard1.log
net:
port: 6100
sharding:
clusterRole: shardsvr
security:
transitionToAuth: true
keyFile: /mongo_shard1/mongo_keyfile
如下圖:
4) 關閉mongod實例
連接到mongod
# mongo --port 6100 –u adminShard1 –p adminbear --authenticationDatabase admin
use admin;
db.shutdownServer();
exit;
5) 用新的配置文件重新mongod實例
# mongod --fork --config /mongo_shard1/mongo_shard1_tmp.conf
(2) 第二個分片 mongo_shard2(在192.168.209.156上操作)
1) 創建分片本地管理員
連接到mongod
# mongo --port 6100
輸入以下命令:(這裡只是為了方便理解,其實命令行打成一行即可)
use admin;
db.createUser(
{
user: "adminShard2",
pwd: "adminbear",
roles: [
{ role: "clusterAdmin", db: "admin" },
{ role: "userAdmin", db: "admin" }
]
}
);
其中,user用戶名和pwd密碼,可按需更改。
2) 複製密鑰文件到指定目錄/mongo_shard2/
# sudo cp /etc/mongo_keyfile /mongo_shard2/
3) 新建一個配置文件
# sudo vim /mongo_shard2/mongo_shard2_tmp.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
storage:
dbPath: “/mongo_shard2/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_shard2/log/mongo_shard2.log
net:
port: 6100
sharding:
clusterRole: shardsvr
security:
transitionToAuth: true
keyFile: /mongo_shard2/mongo_keyfile
如下圖:
4) 關閉mongod實例
連接到mongod
# mongo --port 6100 –u adminShard2 –p adminbear --authenticationDatabase admin
use admin;
db.shutdownServer();
exit;
5) 用新的配置文件重新mongod實例
# mongod --fork --config /mongo_shard2/mongo_shard2_tmp.conf
6、 強制每一個mongos實例來強制驗證(不停機)
(1) 第一個Mongos路由 mongo_router1(在192.168.209.155上操作)
1) 新建一個配置文件
# sudo vim /etc/mongo_router1_secure.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
net:
port: 6666
sharding:
configDB: mongo_config/192.168.209.155:6000,192.168.209.155:6001,192.168.209.155:6002
security:
keyFile: /etc/mongo_keyfile
如下圖:
2) 關閉mongos實例
連接到mongos
# mongo --port 6666 –u admin –p adminbear --authenticationDatabase admin
use admin;
db.shutdownServer();
exit;
3) 用新的配置文件重新mongos實例
# mongos --config /etc/mongo_router1_secure.conf &
(2) 第二個Mongos路由 mongo_router2(在192.168.209.156上操作)
1) 新建一個配置文件
# sudo vim /etc/mongo_router2_secure.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
net:
port: 6666
sharding:
configDB: mongo_config/192.168.209.155:6000,192.168.209.155:6001,192.168.209.155:6002
security:
keyFile: /etc/mongo_keyfile
如下圖:
2) 關閉mongos實例
連接到mongos
# mongo --port 6666 –u admin –p adminbear --authenticationDatabase admin
use admin;
db.shutdownServer();
exit;
3) 用新的配置文件重新mongos實例
# mongos --config /etc/mongo_router2_secure.conf &
7、 強制每一個配置伺服器的副本集成員實例來強制驗證(不停機)(在192.168.209.155上操作)
這裡配置伺服器的主節點是mongo_config1
(1) 第二個配置伺服器 mongo_config2
1) 新建一個配置文件
# sudo vim /mongo_config2/mongo_config2_secure.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
storage:
dbPath: “/mongo_config2/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_config2/log/mongo_config2.log
net:
port: 6001
sharding:
clusterRole: configsvr
replication:
replSetName: mongo_config
security:
keyFile: /etc/mongo_keyfile
如下圖:
2) 關閉mongod實例
連接到mongod
# mongo --port 6001 –u admin –p adminbear --authenticationDatabase admin
use admin;
db.shutdownServer();
exit;
3) 用新的配置文件重新mongod實例
# mongod --fork --config /mongo_config2/mongo_config2_secure.conf
(2) 第三個配置伺服器 mongo_config3
1) 新建一個配置文件
# sudo vim /mongo_config3/mongo_config3_secure.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
storage:
dbPath: “/mongo_config3/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_config3/log/mongo_config3.log
net:
port: 6002
sharding:
clusterRole: configsvr
replication:
replSetName: mongo_config
security:
keyFile: /etc/mongo_keyfile
如下圖:
2) 關閉mongod實例
連接到mongod
# mongo --port 6002 –u admin –p adminbear --authenticationDatabase admin
use admin;
db.shutdownServer();
exit;
3) 用新的配置文件重新mongod實例
# mongod --fork --config /mongo_config3/mongo_config3_secure.conf
(3) 第一個配置伺服器 mongo_config1
1) 新建一個配置文件
# sudo vim /mongo_config1/mongo_config1_secure.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
storage:
dbPath: “/mongo_config1/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_config1/log/mongo_config1.log
net:
port: 6000
sharding:
clusterRole: configsvr
replication:
replSetName: mongo_config
security:
keyFile: /etc/mongo_keyfile
如下圖:
2) 降級主節點
連接到mongod
# mongo --port 6000 –u admin –p adminbear --authenticationDatabase admin
rs.stepDown();
3) 關閉mongod實例
use admin;
db.shutdownServer();
exit;
4) 用新的配置文件重新mongod實例
# mongod --fork --config /mongo_config1/mongo_config1_secure.conf
8、 強制每一個分片實例來強制驗證(停機)
(1) 第一個分片 mongo_shard1(在192.168.209.155上操作)
1) 新建一個配置文件
# sudo vim /mongo_shard1/mongo_shard1_secure.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
storage:
dbPath: “/mongo_shard1/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_shard1/log/mongo_shard1.log
net:
port: 6100
sharding:
clusterRole: shardsvr
security:
keyFile: /mongo_shard1/mongo_keyfile
如下圖:
2) 關閉mongod實例
連接到mongod
# mongo --port 6100 –u adminShard1 –p adminbear --authenticationDatabase admin
use admin;
db.shutdownServer();
exit;
3) 用新的配置文件重新mongod實例
# mongod --fork --config /mongo_shard1/mongo_shard1_secure.conf
(2) 第二個分片 mongo_shard2(在192.168.209.156上操作)
1) 新建一個配置文件
# sudo vim /mongo_shard2/mongo_shard2_secure.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
storage:
dbPath: “/mongo_shard2/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_shard2/log/mongo_shard2.log
net:
port: 6100
sharding:
clusterRole: shardsvr
security:
keyFile: /mongo_shard2/mongo_keyfile
如下圖:
2) 關閉mongod實例
連接到mongod
# mongo --port 6100 –u adminShard2 –p adminbear --authenticationDatabase admin
use admin;
db.shutdownServer();
exit;
3) 用新的配置文件重新mongod實例
# mongod --fork --config /mongo_shard2/mongo_shard2_secure.conf
---------------------------------------第一部分 over ------------------------------------------------------
二、 搭建分片集群和安全機制
(大致的流程與“mongo 3.4分片集群系列之二:搭建分片集群--哈希分片”差不多,有區別的我會用紅色字體標註)
1、說說分片集群的架構
這裡要搭建的分片集群架構如下:
2個mongos,1個三個成員的副本集配置伺服器,2個單實例的分片。圖示如下:
簡單介紹一下MongoDB分片集群由以下組件組成:
2、分片前註意事項
關於分片集群的一些註意點,請參閱:mongo 3.4分片集群系列之一:淺談分片集群 ,其中第4點,分片前考慮事項。
好啦。慎重考慮完分片前考慮事項的話,接下來就進入實踐吧~~~
3、搭建哈希分片集群
下麵是參照官網的 https://docs.mongodb.com/manual/tutorial/deploy-sharded-cluster-ranged-sharding/
3.1、搭建前準備:
物理環境:
我這邊是用兩個虛擬機模仿兩台伺服器的(真實伺服器也按照這個方法實踐,可以行得通)。
IP分別為192.168.209.155和192.168.209.156。其中,這兩個IP之間必須互通。即192.168.209.155可以ping通192.168.209.156,192.168.209.156也可以ping通192.168.209.155。
配置大致如下:(此操作是建立在mongo3.4版本)
名稱 |
主機 |
埠 |
副本集 |
Data路徑 |
Log路徑 |
Router1 |
192.168.209.155 |
6666 |
|
|
|
Router2 |
192.168.209.156 |
6666 |
|
|
|
Config1 |
192.168.209.155 |
6000 |
mongo_config |
/mongo_config1/data |
/mongo_config1/log |
Config2 |
6001 |
/mongo_config2/data |
/mongo_config2/log |
||
Config3 |
6002 |
/mongo_config3/data |
/mongo_config3/log |
||
Shard1 |
192.168.209.155 |
6100 |
|
/mongo_shard1/data |
/mongo_shard1/log |
Shard2 |
192.168.209.156 |
6100 |
|
/mongo_shard2/data |
/mongo_shard2/log |
接下來就來搭建哈希分片集群咯~~~
3.2前添加、創建密鑰文件,以及修改許可權
# cd /etc/
# sudo openssl rand –base64 755 > mongo_keyfile
# sudo chmod 400 mongo_keyfile
mongo_keyfile是我指定的密鑰文件名,可以按需更改;
修改許可權,一定要做,否則之後會出現很多不知名的錯誤。
這裡要先將192.168.209.155上的mongo_keyfile文件拿到192.168.209.156上
#sudo rsync –arvz –P [email protected]:/etc/mongo_keyfile /etc/
拷貝過來後,註意檢查許可權是不是400,如圖
3.2、創建配置伺服器副本集
部署具有三個成員的配置伺服器副本集。
(1) mongo_config1 (在192.168.209.155上操作)
1) 創建數據路徑文件夾和日誌路徑文件夾
# sudo mkdir –p /mongo_config1/data
# sudo mkdir –p /mongo_config1/log
2) 複製密鑰文件到指定目錄/mongo_config1
# sudo cp /etc/mongo_keyfile /mongo_config1/
3) 創建配置文件
# sudo vim /mongo_config1/mongo_config1_secure.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
storage:
dbPath: “/mongo_config1/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_config1/log/mongo_config1.log
net:
port: 6000
sharding:
clusterRole: configsvr
replication:
replSetName: mongo_config
security:
keyFile: /mongo_config1/mongo_keyfile
如下圖:
4) 啟動mongod實例
# mongod --fork --config /mongo_config1/mongo_config1_secure.conf
--fork 是以線程方式啟動mongod服務
--config 指定配置文件路徑
(2) mongo_config2(在192.168.209.155上操作)
1) 創建數據路徑文件夾和日誌路徑文件夾
# sudo mkdir –p /mongo_config2/data
# sudo mkdir –p /mongo_config2/log
2) 複製密鑰文件到指定目錄/mongo_config2
# sudo cp /etc/mongo_keyfile /mongo_config2/
3) 創建配置文件
# sudo vim /mongo_config2/mongo_config2_secure.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
storage:
dbPath: “/mongo_config2/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_config2/log/mongo_config2.log
net:
port: 6001
sharding:
clusterRole: configsvr
replication:
replSetName: mongo_config
security:
keyFile: /mongo_config2/mongo_keyfile
如下圖:
4) 啟動mongod實例
# mongod --fork --config /mongo_config2/mongo_config2_secure.conf
--fork 是以線程方式啟動mongod服務
--config 指定配置文件路徑
(3) mongo_config3 (在192.168.209.155上操作)
1) 創建數據路徑文件夾和日誌路徑文件夾
# sudo mkdir –p /mongo_config3/data
# sudo mkdir –p /mongo_config3/log
2) 複製密鑰文件到指定目錄/mongo_config3
# sudo cp /etc/mongo_keyfile /mongo_config3/
3) 創建配置文件
# sudo vim /mongo_config3/mongo_config3_secure.conf
文件中的配置如下:(所有空位都是空格,不是TAB鍵哦,大小寫是嚴格區分的)
storage:
dbPath: “/mongo_config3/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_config3/log/mongo_config3.log
net:
port: 6002
sharding:
clusterRole: configsvr
replication:
replSetName: mongo_config
security:
keyFile: /mongo_config3/mongo_keyfile
如下圖:
4) 啟動mongod實例
# mongod --fork --config /mongo_config3/mongo_config3_secure.conf
--fork 是以線程方式啟動mongod服務
--config 指定配置文件路徑
(4) 初始化副本集mongo_config(在192.168.209.155上操作)
1) 連接任意一個mongod實例
# sudo mongod --port 6000
2) 初始化副本集
輸入以下命令:(這裡只是為了方便理解,其實命令行打成一行即可)
rs.initiate(
{
_id: "mongo_config",
configsvr: true,
members: [
{ _id : 0, host : "192.168.209.155:6000" },
{ _id : 1, host : "192.168.209.155:6001" },
{ _id : 2, host : "192.168.209.155:6002" }
]