1. 程式人生 > 其它 >centOS7 + MongoDB 3.6.22 叢集搭建 - 切片+副本集 - 個人學習

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