這個系列大致想跟大家分享以下篇章:
2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片
3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全
4、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 bear@192.168.209.155:/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 bear@192.168.209.155:/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" }
]
}
)
_id:必須匹配傳遞給mongod 的--replSet參數。
members:是一個數組,每個副本集成員都需要一個文檔。
configsvr:必須設置true。
3.3、創建分片
(1) mongo_shard1 (在192.168.209.155上操作)
1) 復制密鑰文件到指定目錄/mongo_shard1
# sudo cp /etc/mongo_keyfile /mongo_shard1/
2) 為mongo_shard1創建配置文件
# 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
如下圖:
3) 啟動mongod實例
# mongod --fork --config /mongo_shard1/mongo_shard1_secure.conf
(2) mongo_shard2(在192.168.209.156上操作)
1) 復制密鑰文件到指定目錄/mongo_shard2
# sudo cp /etc/mongo_keyfile /mongo_shard2/
2) 為mongo_shard2創建配置文件
# 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: 6101
sharding:
clusterRole: shardsvr
security:
keyFile: /mongo_shard2/mongo_keyfile
如下圖:
3) 啟動mongod實例
# mongod --fork --config /mongo_shard2/mongo_shard2_secure.conf
3.3、創建路由
(1) mongo_router1(在192.168.209.155上操作)
1) 為mongo_router1創建配置文件
# 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 --config /etc/mongo_router1_secure.conf
(2) mongo_router2(在192.168.209.156上操作)
1) 為mongo_router2創建配置文件
# 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 --config /etc/mongo_router2_secure.conf
-----------以上是內部認證,以下是用戶訪問控制----------
內部認證:是指要加入集群的組件要有指定密鑰文件才能加入集群;組件包括mongos路由,配置服務器,分片
用戶訪問控制:是指應用程序連接集群,要驗證的用戶和密碼
3.4、添加分片到集群
(1) 連接任意一個mongos,這里連接mongo_router1(在192.168.209.155上操作)
# mongo --port 6666
(2) 添加分片
1) 添加第一個分片mongo_shard1
sh.addShard(“192.168.209.155:6100”);
2) 添加第二個分片mongo_shard2
sh.addShard(“192.168.209.156:6100”);
3.5前添加、創建用戶
(1) 集群管理員用戶
mongos和配置服務器的集群管理員用戶是可以通用的,但是分片要創建自己的本地管理員用戶。
1) 創建集群管理員用戶(直接在3.4的窗口中運行即可)
輸入以下命令:(這里只是為了方便理解,其實命令行打成一行即可)
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既是集群的最高管理員用戶,又是所有數據庫的最高管理員用戶
exit;
退出當前的進程
2) 創建第一個分片mongo_shard1管理員用戶(在192.168.209.155上操作)
連接到第一個分片mongo_shard1
# mongo --port 6100
輸入以下命令:(這里只是為了方便理解,其實命令行打成一行即可)
use admin;
db.createUser(
{
user: "adminShard1",
pwd: "adminbear",
roles: [
{ role: "clusterAdmin", db: "admin" },
{ role: "userAdmin", db: "admin" }
]
}
);
其中,user用戶名和pwd密碼,可按需更改。
exit;
退出當前的進程
3) 創建第二個分片mongo_shard2管理員用戶(在192.168.209.155上操作)
連接到第二個分片mongo_shard2
# mongo --host 192.168.209.156 --port 6100
輸入以下命令:(這里只是為了方便理解,其實命令行打成一行即可)
use admin;
db.createUser(
{
user: "adminShard2",
pwd: "adminbear",
roles: [
{ role: "clusterAdmin", db: "admin" },
{ role: "userAdmin", db: "admin" }
]
}
);
其中,user用戶名和pwd密碼,可按需更改。
exit;
退出當前的進程
(2) 數據庫用戶(應用程序用戶)(在192.168.209.155上操作)
連接到mongos路由 mongo_router1
# mongo --port 6666 –u admin –p adminbear –authenticationDatabase admin
超級用戶已經在之前創建集群管理員用戶時,同時賦予權限了。這里不再述說。
以下是為數據庫名DatabaseName,創建數據庫用戶。
輸入以下命令:(這里只是為了方便理解,其實命令行打成一行即可)
use DatabaseName;
db.createUser(
{
user: "bear",
pwd: "bear",
roles: [
{ role: "readWrite", db: "DatabaseName" }
]
}
);
其中,user用戶名和pwd密碼,可按需更改。
3.5、為數據庫啟用分片(直接接着以上的窗口中運行即可)
sh.enableSharding(“databaseName”);
其中databaseName,為要分片的數據庫。
3.6、使用哈希分片分片集合(直接在3.5的窗口中運行即可)
這里有兩種情況,一種是空集合,另一種是有數據的集合,但對於這兩種情況都建議用以下方法。
(1) 對於確定作為分片鍵的字段,建立哈希索引
use databaseName;
db.collectionName.createIndex(Name:”hashed”);
其中,databaseName是3.5啟用的分片數據庫名稱;collectionName是要分片的集合;Name是作為分片鍵的字段。
(2) 哈希分片
sh.shardCollection(“databaseName.collectionName”,{Name:”hashed”})
其中,databaseName是3.5啟用的分片數據庫名稱;collectionName是要分片的集合;Name是作為分片鍵的字段。
---------------------------------------第二部分 over ------------------------------------------------------
--------------------------------------- over -----------------------------------------------------------------
以上資料,大部分是參考官網的資料,在此表示感謝。
https://docs.mongodb.com/manual/tutorial/deploy-sharded-cluster-ranged-sharding/