centOS7 + MongoDB 3.6.22 叢集搭建 - 切片+副本集 - 個人學習
因為我是學習這個,所以是安裝成功之後自己再記錄一下過程,mongodb是重新安裝的,參考部落格:MongoDB 3.6.9 叢集搭建 - 切片+副本集
1. 服務結構介紹
結構圖:
結構圖解:
1. Shard伺服器:使用Replica Sets確保每個資料節點都具有備份、自動容錯轉移、自動恢復的能力。
- 配置伺服器:使用3個配置伺服器確保元資料完整性。
- 路由程序:使用3個路由程序實現平衡,提高客戶端接入效能
- 副本集1:Shard11,Shard12,Shard13組成一個副本集,提供Sharding中shard1的功能;
- 副本集2:Shard21,Shard22,Shard23組成一個副本集,提供Sharding中shard2的功能;
- 副本集3:Shard31,Shard32,Shard33組成一個副本集,提供Sharding中shard3的功能;
- 3個配置伺服器程序和3個路由器程序。
- Arbiter仲裁者,是副本集中的一個MongoDB例項, 它並不儲存資料。仲裁節點使用最小的資源並且不要求硬體裝置。為了確保複製集中有奇數的投票成員(包括primary),需要新增仲裁節點作為投票,否則primary不能執行時不會自動切換primary。
構建一個mongoDB Sharding Cluster需要三種角色:shard伺服器(ShardServer)、配置伺服器(config Server)、路由程序(Route Process)
2. Shard 伺服器
Shard伺服器即儲存實際資料的分片,每個shard可以是一個mongod例項,也可以是一組mongod例項構成的Replica Sets。為了實現每個Shard內部的故障自動轉換,MongoDB官方建議每個shard為一組Replica Sets。
3. 配置伺服器
為了將一個特定的collection儲存在多個shard中,需要為該collection指定一個shard key,決定該條記錄屬於哪個chunk,配置伺服器可以儲存以下資訊,每個shard節點的配置資訊,每個chunk的shard key範圍,chunk在各shard的分佈情況,叢集中所有DB和collection的sharding配置資訊。
4. 路由程序
它是一個前段路由,客戶端由此接入,首先詢問配置伺服器需要到哪個shard上查詢或儲存記錄,然後連線相應的shard執行操作,最後將結果返回給客戶端,客戶端只需要將原本發給mongod的查詢或更新請求原封不動地發給路由程序,而不必關心所操作的記錄儲存在哪個shard上。
按照架構圖,理論上是需要15臺機器的,由於資源有限,我們只用三臺伺服器,用目錄來替代物理機,下面給出配置表格(伺服器IP/埠可根實際自行設定,保證伺服器之間網路互通即可):
10.88.88.6 | 10.88.88.60 | 10.88.88.61 |
---|---|---|
Shard11:10011 主節點 | Shard12:10012 副節點 | Shard13:10013 仲裁點 |
Shard21:10021 仲裁點 | Shard22:10022 主節點 | Shard32:10023 副節點 |
Shard31:10031 副節點 | Shard32:10032 仲裁點 | Shard33:10033 主節點 |
ConfigSvr:10041 | ConfigSvr:10042 | ConfigSvr:10043 |
Mongos:10051 | Mongos:10052 | Mongos:10053 |
5. 官方文件
https://www.mongodb.com/docs/v3.6/replication/
2. 環境準備
我們有三臺伺服器,可以先配置一臺然後複製檔案到另外兩臺,再改配置即可
2.1 mongodb安裝以及搭建目錄結構
下載mongodb 3.6.22安裝包(可以自己選擇安裝的版本),以及搭建目錄結構
# 下載
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.22.tgz
# 解壓
tar -zxvf mongodb-linux-x86_64-3.6.22.tgz
# 複製檔案到指定安裝目錄,並改名為mongodb,我安裝在 /usr/local/mongodb
mv mongodb-linux-x86_64-3.6.22 /usr/local/mongodb
# 在該臺機器上mongodbCluster369目錄中建立conf(配置檔案)、mongos(路由)、config(配置)、shard1、shard2、shard3(三個切片)六個目錄,因為mongos不儲存資料,只需要建立日誌檔案即可。
mkdir -p /usr/local/mongodbCluster3622
mkdir -p /usr/local/mongodbCluster3622/conf
mkdir -p /usr/local/mongodbCluster3622/mongos/log
mkdir -p /usr/local/mongodbCluster3622/mongos/pid
mkdir -p /usr/local/mongodbCluster3622/config/data
mkdir -p /usr/local/mongodbCluster3622/config/log
mkdir -p /usr/local/mongodbCluster3622/config/pid
mkdir -p /usr/local/mongodbCluster3622/shard1/data
mkdir -p /usr/local/mongodbCluster3622/shard1/log
mkdir -p /usr/local/mongodbCluster3622/shard1/pid
mkdir -p /usr/local/mongodbCluster3622/shard2/data
mkdir -p /usr/local/mongodbCluster3622/shard2/log
mkdir -p /usr/local/mongodbCluster3622/shard2/pid
mkdir -p /usr/local/mongodbCluster3622/shard3/data
mkdir -p /usr/local/mongodbCluster3622/shard3/log
mkdir -p /usr/local/mongodbCluster3622/shard3/pid
接下來是設定系統環境變數
環境變數:
vi /etc/profile
內容底部增加:
# mongodb setting
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:MONGODB_HOME/bin
使立即生效:
source /etc/profile
這裡要注意一點,/etc/profile設定的是系統環境變數,要注意不能隨意改動內容,還有不能寫錯了,否則應用之後會導致所有命令全部失效(我就寫錯了變數踩坑了),如果出現了跟我一樣的問題,解決方案:
利用以下命令 ,臨時使用命令,去把配置改回來,或者排錯修改
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
2.2. 配置分片副本集
設定第1個分片副本集,配置檔案(注意路徑、ip、埠):
vi /usr/local/mongodbCluster3622/conf/shard1.conf
配置內容:
systemLog:
destination: file
path: /usr/local/mongodbCluster3622/shard1/log/shard1.log
logAppend: true
processManagement:
fork: true
pidFilePath: /usr/local/mongodbCluster3622/shard1/pid/shard1.pid
net:
bindIp: 10.88.88.6
port: 10011
maxIncomingConnections: 20000
storage:
dbPath: /usr/local/mongodbCluster3622/shard1/data
journal:
enabled: true
commitIntervalMs: 500
directoryPerDB: true
syncPeriodSecs: 300
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 103
statisticsLogDelaySecs: 0
journalCompressor: snappy
directoryForIndexes: false
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
replication:
oplogSizeMB: 10000
replSetName: shard1
sharding:
clusterRole: shardsvr
設定第2個分片副本集,配置檔案(注意路徑、ip、埠):
vi /usr/local/mongodbCluster3622/conf/shard2.conf
配置內容:
systemLog:
destination: file
path: /usr/local/mongodbCluster3622/shard2/log/shard2.log
logAppend: true
processManagement:
fork: true
pidFilePath: /usr/local/mongodbCluster3622/shard2/pid/shard2.pid
net:
bindIp: 10.88.88.6
port: 10021
maxIncomingConnections: 20000
storage:
dbPath: /usr/local/mongodbCluster3622/shard2/data
journal:
enabled: true
commitIntervalMs: 500
directoryPerDB: true
syncPeriodSecs: 300
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 103
statisticsLogDelaySecs: 0
journalCompressor: snappy
directoryForIndexes: false
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
replication:
oplogSizeMB: 10000
replSetName: shard2
sharding:
clusterRole: shardsvr
設定第3個分片副本集,配置檔案(注意路徑、ip、埠):
vi /usr/local/mongodbCluster3622/conf/shard3.conf
配置內容:
systemLog:
destination: file
path: /usr/local/mongodbCluster3622/shard3/log/shard3.log
logAppend: true
processManagement:
fork: true
pidFilePath: /usr/local/mongodbCluster3622/shard3/pid/shard3.pid
net:
bindIp: 10.88.88.6
port: 10031
maxIncomingConnections: 20000
storage:
dbPath: /usr/local/mongodbCluster3622/shard3/data
journal:
enabled: true
commitIntervalMs: 500
directoryPerDB: true
syncPeriodSecs: 300
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 103
statisticsLogDelaySecs: 0
journalCompressor: snappy
directoryForIndexes: false
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
replication:
oplogSizeMB: 10000
replSetName: shard3
sharding:
clusterRole: shardsvr
2.3. config server配置伺服器
設定config server,配置檔案(注意路徑、ip、埠):
vi /usr/local/mongodbCluster3622/conf/config.conf
配置內容:
systemLog:
destination: file
path: /usr/local/mongodbCluster3622/config/log/config.log
logAppend: true
processManagement:
fork: true
pidFilePath: /usr/local/mongodbCluster3622/config/pid/config.pid
net:
bindIp: 10.88.88.6
port: 10041
maxIncomingConnections: 20000
storage:
dbPath: /usr/local/mongodbCluster3622/config/data
journal:
enabled: true
commitIntervalMs: 500
directoryPerDB: true
syncPeriodSecs: 300
engine: wiredTiger
replication:
oplogSizeMB: 10000
replSetName: configs
sharding:
clusterRole: configsvr
2.3. 配置路由伺服器mongos
設定config server,配置檔案(注意路徑、ip、埠):
vi /usr/local/mongodbCluster3622/conf/mongos.conf
配置內容:
systemLog:
destination: file
path: /usr/local/mongodbCluster3622/mongos/log/mongos.log
logAppend: true
processManagement:
fork: true
pidFilePath: /usr/local/mongodbCluster3622/mongos/pid/mongos.pid
net:
bindIp: 10.88.88.6
port: 10051
maxIncomingConnections: 20000
sharding:
configDB: configs/10.88.88.6:10041,10.88.88.60:10042,10.88.88.61:10043
2.4. 引數說明:
dbpath:資料存放目錄
logpath:日誌存放路徑
pidfilepath:程序檔案,方便停止mongodb
logappend:以追加的方式記錄日誌
directoryperdb:為每一個數據庫按照資料庫名建立資料夾
replSet:replica set的名字
bindIp:mongodb所繫結的ip地址
port:mongodb程序所使用的埠號,預設為27017
fork:以後臺方式執行程序
oplogSize:mongodb操作日誌檔案的最大大小。單位為Mb,預設為硬碟剩餘空間的5%
shardsvr:分片節點
configsvr:配置服務節點
configdb:配置config節點到route節點
journal:寫日誌
smallfiles:當提示空間不夠時新增此引數
noprealloc:預分配方式,使用預分配方式來保證寫入效能的穩定,預分配在後臺執行,並且每個預分配的檔案都用0進行填充。這會讓MongoDB始終保持額外的空間和空餘的資料檔案,從而避免了資料增長過快而帶來的分配磁碟空間引起的阻塞。設定noprealloc=true來禁用預分配的資料檔案,會縮短啟動時間,但在正常操作過程中,可能會導致效能顯著下降。
2.5. 配置另外兩臺伺服器:
分別把/usr/local/mongodb安裝包和/usr/local/mongodbCluster369配置叢集資訊複製到其他兩臺機器上
# mongodb
scp -r /usr/local/mongodb [email protected]:/usr/local
scp -r /usr/local/mongodb [email protected]:/usr/local
# config
scp -r /usr/local/mongodbCluster3622 [email protected]:/usr/local複製mongodbCluster369
scp -r /usr/local/mongodbCluster3622 [email protected]:/usr/local複製mongodbCluster369
兩臺機器修改 mongodb安裝的環境變數
vi /etc/profile
內容底部增加:
# mongodb setting
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:MONGODB_HOME/bin
使立即生效:
source /etc/profile
兩臺機器修改複製過去的配置資訊,按照上面配置表格進行修改:
例如:
-->
五個配置檔案都要修改
vi /usr/local/mongodbCluster3622/conf/shard1.conf
vi /usr/local/mongodbCluster3622/conf/shard2.conf
vi /usr/local/mongodbCluster3622/conf/shard3.conf
vi /usr/local/mongodbCluster3622/conf/config.conf
vi /usr/local/mongodbCluster3622/conf/mongos.conf
2.6.啟動mongodb叢集
先啟動配置伺服器和分片伺服器,後啟動路由例項(三臺伺服器)。
2.6.1 啟動配置服務
啟動三臺伺服器的config server
/usr/local/mongodb/bin/mongod -f /usr/local/mongodbCluster3622/conf/config.conf
登入任意一臺伺服器,初始化配置副本集
登入連線命令:/usr/local/mongodb/bin/mongod 10.88.88.6:10041/admin
config = {
_id : "configs",
members : [
{_id : 0, host : "10.88.88.6:10041"},
{_id : 1, host : "10.88.88.60:10042"},
{_id : 2, host : "10.88.88.61:10043"}
]}
// 初始化
rs.initiate(config)
2.6.2 啟動分片伺服器
啟動三臺伺服器的shard1 server
/usr/local/mongodb/bin/mongod -f /usr/local/mongodbCluster3622/conf/shard1.conf
登入10.88.88.6伺服器(10.88.88.61設定為仲裁節點,不能使用該節點登入),初始化分片副本集
登入連線命令:
/usr/local/mongodb/bin/mongo 10.88.88.6:10011/admin
config = {
_id : "shard1",
members : [
{_id : 0, host : "10.88.88.6:10011",priority:2},
{_id : 1, host : "10.88.88.60:10012",priority:1},
{_id : 2, host : "10.88.88.61:10013", arbiterOnly : true}
]}
初始化副本集
rs.initiate(config)
第三個個節點的“arbiterOnly”:true代表其為仲裁節點。
使用exit命令退出mongo的shell操作介面
啟動三臺伺服器的shard2 server
/usr/local/mongodb/bin/mongod -f /usr/local/mongodbCluster3622/conf/shard2.conf
登入10.88.88.60一臺伺服器(因為10.88.88.6設定為仲裁節點,不能使用該節點登入),初始化分片副本集
登入連線命令:
/usr/local/mongodb/bin/mongo 10.88.88.60:10022/admin
config = {
_id : "shard2",
members : [
{_id : 0, host : "10.88.88.6:10021", arbiterOnly : true },
{_id : 1, host : "10.88.88.60:10022",priority:2},
{_id : 2, host : "10.88.88.61:10023",priority:1}
]}
初始化副本集
rs.initiate(config)
第一個節點的“arbiterOnly”:true代表其為仲裁節點。
使用exit命令退出mongo的shell操作介面
啟動三臺伺服器的shard3 server
/usr/local/mongodb/bin/mongod -f /usr/local/mongodbCluster3622/conf/shard3.conf
登入10.88.88.60一臺伺服器(因為10.88.88.6設定為仲裁節點,不能使用該節點登入),初始化分片副本集
登入連線命令:
/usr/local/mongodb/bin/mongo 10.88.88.60:10022/admin
config = {
_id : "shard3",
members : [
{_id : 0, host : "10.88.88.6:10031",priority:1},
{_id : 1, host : "10.88.88.60:10032", arbiterOnly : true },
{_id : 2, host : "10.88.88.61:10033",priority:2}
]}
初始化副本集
rs.initiate(config)
第一個節點的“arbiterOnly”:true代表其為仲裁節點。
使用exit命令退出mongo的shell操作介面
2.6.3. 啟動路由例項
啟動三臺伺服器的mongos server
/usr/local/mongodb/bin/mongos -f /usr/local/mongodbCluster3622/conf/mongos.conf
2.7 啟用分片
登入任意一臺mongos,這裡以10.88.88.6:10051為例:
/usr/local/mongodb/bin/mongo 10.88.88.6:10051/admin
配置如下內容,串聯路由伺服器與切片副本集:
sh.addShard("shard1/10.88.88.6:10011,10.88.88.60:10012,10.88.88.61:10013")
sh.addShard("shard2/10.88.88.6:10021,10.88.88.60:10022,10.88.88.61:10023")
sh.addShard("shard3/10.88.88.6:10031,10.88.88.60:10032,10.88.88.61:10033")
檢視叢集狀態:
sh.status()
2.8 指定資料庫與集合分片生效
目前配置服務、路由服務、分片服務、副本集服務都已經串聯起來了,但是我們的目的是希望插入資料、資料能夠自動分片。連線在mongos上,準備讓指定的資料庫、指定的集合分片生效。
接著上面2.7的步驟,不用退出mongos的操作介面
指定資料庫"testdb"分片生效:
db.runCommand({enablesharding : "testdb"})
指定資料庫裡需要分片的集合collection和片鍵,一般是_id:
db.runCommand({shardcollection : "testdb.table1", key : {id : "hashed"}})
2.8 測試分片配置結果
登入任意一臺mongos,這裡以10.88.88.6:10051為例:
登入連線命令:/usr/local/mongodb/bin/mongo 10.88.88.6:10051/admin
切換資料庫:use testdb
輸入如下命令:
for (var i = 1; i <= 5000; i++){ db.table1.insert({id:i,text:"hello world"}) }
檢視分配狀態:
db.table1.stats()
如下圖所示:
shard1總數:1664條
Shard2總數:1684條
Shard3總數:1652條
可以看到資料分到3個分片。已經成功了。
3. 後期運維
mongodbd的啟動順序是,先啟動配置伺服器,再啟動分片,最後啟動mongos。
mongod -f /usr/local/mongodbCluster3622/conf/config.conf
mongod -f /usr/local/mongodbCluster3622/conf/shard1.conf
mongod -f /usr/local/mongodbCluster3622/conf/shard2.conf
mongod -f /usr/local/mongodbCluster3622/conf/shard3.conf
mongos -f /usr/local/mongodbCluster3622/conf/mongos.conf
關閉時,直接killall殺掉所有程序
killall mongod
killall mongos