MongoDB集羣分片安裝部署手冊

1 簡介

1.1 簡介

MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。在高負載的狀況下,添加更多的節點,能夠保證服務器性能。
MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。html

官網: https://www.mongodb.comnode

1.2 參考資料

https://www.jianshu.com/p/e18...
https://www.cnblogs.com/tians...
https://blog.csdn.net/weixin_...
https://blog.csdn.net/eagle89...linux

2 單機部署

2.1 單機部署環境

操做系統:CentOS7 +
三臺服務器:192.168.90.225
安裝包: mongodb-linux-x86_64-4.0.10.tgznginx

2.2 安裝MongoDB單機測試

2.2.1 目錄規劃

mkdir /usr/local/tmp    #臨時目錄,用於上傳壓縮包
mkdir  /topinfo  #mongodb的安裝目錄

2.2.2 上傳MongoDB安裝包

上傳安裝包:mongodb

cd  /usr/local/tmp/   # 跳轉到臨時目錄
rz   #經過rz 上傳mongodb-linux-x86_64-4.0.10.tgz

2.2.3 安裝

一、解壓數據庫

tar -zxvf  mongodb-linux-x86_64-4.0.10.tgz   # 解壓
mv mongodb-linux-x86_64-4.0.10  mongodb  #重命名
mv /usr/local/tmp/mongodb  /topinfo  # 將解壓包拷貝到指定目錄

二、MongoDB 的可執行文件位於 bin 目錄下,因此能夠將其添加到 PATH 路徑中:vim

vim /etc/profile
#加入如下內容
export MONGODB_HOME=/topinfo/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
#保持退出後,執行如下命令,當即生效
source /etc/profile

三、環境變量驗證
使用命令mongod -v輸出信息版本信息驗證環境變量是否配置成功數組

mongod -v

2.2.4 建立數據庫目錄

一、建立數據庫的目錄
MongoDB的默認數據存儲在跟目錄data/db目錄下,可是這個目錄在安裝過程不會自動建立,因此你須要手動建立data目錄,並在data目錄。
注意: data/db 是 MongoDB 默認的啓動的數據庫路徑。若是你的數據庫目錄不是/data/db,能夠經過 --dbpath 來指定。(mongod --dbpath /usr/local/mongo/data)服務器

若是是否是分片,則能夠暫時不須要建立數據庫的目錄。後續在分配中建立。數據結構

mkdir  -p  /topinfo/mongodb/data  # 建立數據庫數據目錄

mkdir  -p  /topinfo/mongodb/logs  # 建立數據庫日誌目錄

2.2.5 啓動

先測試一下 MongoDB 是否安裝成功:

which   mongod

顯示 MongoDB 的bin/mongod 路徑則表示安裝成功。

啓動mongodb:
你能夠再命令行中執行mongo安裝目錄中的bin目錄執行mongod命令來啓動mongdb服務。
MongoDB後臺運行,啓動時只需添加 --fork函數便可。能夠在日誌路徑後面添加--logappend,防止日誌被刪除。

mongod --fork --dbpath= /topinfo/mongodb/data --logpath= /topinfo/mongodb/logs/mongodb2.log --logappend

查看進程:

ps -ef | grep mongo

中止MongoDB

mongod -shutdown --dbpath= /topinfo/mongodb /data --logpath= /topinfo/mongodb /logs/mongodb2.log --logappend

2.2.6 遠程鏈接

MongoDB數據庫啓動後,默認只能在本地使用,若是遠程訪問,須要進行一下設置。
一、關閉防火牆,或開放對應的端口

systemctl  stop  firewalld

二、啓動命令中添加 。--bind_ip=0.0.0.0

mongod --fork --dbpath= /topinfo/mongodb /data --logpath= /topinfo/mongodb /logs/mongodb2.log --logappend  --bind_ip=0.0.0.0

在用客戶端鏈接如圖:

clipboard.png

3 分片部署

3.1 分片部署環境

操做系統:CentOS7 +
三臺服務器:192.168.90.225/226/227
安裝包: mongodb-linux-x86_64-4.0.10.tgz

3.2 部署設計

3.2.1 機器規劃

爲了更好的均衡機器的壓力,把每一個機器既能夠做爲主節點、副本節點、仲裁節點,這樣壓力就會均衡不少了。

clipboard.png

3.2.2 端口規劃

因爲一個機器須要同時部署 mongos、config server 、shard一、shard二、shard3,因此須要用端口進行區分。
端口分配:
config:21000
shard1:27001
shard2:27002
shard3:27003
mongos:20000

3.2.3 目錄規劃

一、 建立安裝和臨時目標

mkdir  /usr/local/tmp    #臨時目錄,用於上傳壓縮包
mkdir  /topinfo   #mongodb的安裝目錄

二、目錄規劃

mkdir -p /topinfo/mongodb/conf  # 存放全部服務器的配置文件
mkdir -p /topinfo/mongodb/mongos/logs # 存放路由服務器的日誌信息
mkdir -p /topinfo/mongodb/config/data # 存放配置服務器的數據
mkdir -p /topinfo/mongodb/config/logs # 存放配置服務器的日誌
mkdir -p /topinfo/mongodb/shard1/data # 存放分片服務器上的數據
mkdir -p /topinfo/mongodb/shard1/logs # 存放分片服務器上的日誌
mkdir -p /topinfo/mongodb/shard2/data # 存放分片服務器上的數據
mkdir -p /topinfo/mongodb/shard2/logs # 存放分片服務器上的日誌
mkdir -p /topinfo/mongodb/shard3/data # 存放分片服務器上的數據
mkdir -p /topinfo/mongodb/shard3/logs # 存放分片服務器上的日誌

根據服務器規劃:
一、mongo服務經過配置文件啓動,存放配置文件目錄/topinfo/mongodb/conf
二、在每臺服務器建立該節點所含shard的數據存放目錄/topinfo/mongodb/shard1-3
三、在每臺服務器(也能夠在其中兩臺)建立存放config server數據的數據目錄/topinfo/mongodb/config,本次配置是在三臺機器上都配置。

故:分別在每臺機器創建conf、mongos、config、shard一、shard二、shard3六個目錄,由於mongos不存儲數據,只須要創建日誌文件目錄便可。

如圖:

clipboard.png

3.3 安裝

3.3.1 上傳MongoDB安裝包

上傳安裝包:

cd  /usr/local/tmp/   # 跳轉到臨時目錄
rz   #經過rz 上傳mongodb-linux-x86_64-4.0.10.tgz

3.3.2 安裝

一、解壓

tar -zxvf  mongodb-linux-x86_64-4.0.10.tgz   # 解壓
mv mongodb-linux-x86_64-4.0.10  mongodb  #重命名
mv /usr/local/tmp/mongodb  /topinfo  # 將解壓包拷貝到指定目錄

二、MongoDB 的可執行文件位於 bin 目錄下,因此能夠將其添加到 PATH 路徑中:

vim /etc/profile
#加入如下內容
export MONGODB_HOME=/topinfo/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
#保持退出後,執行如下命令,當即生效
source /etc/profile

如圖:

三、環境變量驗證
使用命令mongod -v輸出信息版本信息驗證環境變量是否配置成功

mongod -v

如圖:

clipboard.png

3.4 config server集羣配置

3.4.1 config server服務器(副本集)

根據服務器規劃,咱們在三臺機器上部署config server副本集,在該三臺服務器上分別添加如下配置文件:
進入配置文件目錄 /topinfo/mongodb/conf/config.conf

vi  /topinfo/mongodb/conf/config.conf

添加配置文件信息:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /topinfo/mongodb/config/logs/config.log
 
 # Where and how to store data.
storage:
  dbPath: /topinfo/mongodb/config/data/
  journal:
    enabled: true

 # how the process runs 
processManagement:
  fork: true
  pidFilePath: /topinfo/mongodb/config/logs/configsrv.pid
 
 # network interfaces
net:
  port: 21000
  bindIp: 0.0.0.0
 
 # 集羣名稱
replication:
  replSetName: configs       

 # 聲明這是一個集羣的配置數據服務
sharding:
  clusterRole: configsvr

退出保存:

wq!

啓動三臺服務器的 config server

mongod -f /topinfo/mongodb/conf/config.conf

登陸任意一臺配置服務器(注意是配置端口),初始化配置副本集(執行命令的時候,不要複製註釋,只複製命令去一步步執行)。

mongo --port  21000

定義副本集配置(鍵「_id」對應的值必須與配置文件中的replicaction.replSetName一致)

config = {
      _id : "configs",
        members : [
            {_id : 0, host : "192.168.90.225:21000" },
            {_id : 1, host : "192.168.90.226:21000" },
            {_id : 2, host : "192.168.90.227:21000" }
        ]
    }

初始化副本集

rs.initiate(config)

查看分區狀態

rs.status();

此時會發現終端上的輸出已經有了變化。

rs.initiate(config) 初始化。不成功的話,路由服務器與配置服務器鏈接不上。
其中,」_id」 : 「configs」應與配置文件中配置的 replicaction.replSetName 一致,」members」 中的 「host」 爲三個節點的 ip 和 配置port。

3.5 shard server分片服務器集羣配置

3.5.1 配置第一個分片副本集

根據服務器規劃:
192.168.90.225: 27001 - 主節點
192.168.90.226: 27001 - 副節點
192.168.90.227: 27001 - 仲裁節點

三臺服務器上分別添加如下配置文件:
進入配置文件:

vi  /topinfo/mongodb/conf/shard1.conf  #分片配置文件

配置文件內容:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /topinfo/mongodb/shard1/logs/shard1.log
 
 # Where and how to store data.
storage:
  dbPath: /topinfo/mongodb/shard1/data
  journal:
    enabled: true

 # how the process runs
processManagement:
  fork: true
  pidFilePath: /topinfo/mongodb/shard1/logs/shard1.pid
 
 # network interfaces
net:
  port: 27001
  bindIp: 0.0.0.0
 
 # 副本集名稱
replication:
  replSetName: shard1

 # 聲明這是一個集羣的分片服務;
sharding:
  clusterRole: shardsvr

啓動三臺服務器的shard1 server

mongod -f /topinfo/mongodb/conf/shard1.conf

登錄任意一臺服務器(注意是分片端口),初始化副本集(執行命令的時候,不要複製註釋,只複製命令去一步步執行)

mongo --port  27001
#定義副本集配置(鍵「_id」對應的值必須與配置文件中的replicaction.replSetName一致,priority表明權重[1,100],大的被分配爲主服務器,0永久不會變爲主服務器)
config = {
       _id : "shard1",
        members : [
            {_id : 0, host : "192.168.90.225:27001", priority : 2 },
            {_id : 1, host : "192.168.90.226:27001", arbiterOnly :true },
            {_id : 2, host : "192.168.90.227:27001", priority : 1 }
        ]
    }

 #初始化副本集
rs.initiate(config)

 #查看分區狀態
rs.status();

3.5.2 設置第二個分片副本集

其餘副本集都按照以上方式進行配置:
注意事項:
一、複製集的名稱不要重複
二、ip和端口根據分配進行配置
三、合理分配仲裁服務器的位置(由於仲裁不存放數據,很輕,合理的分配,能夠分擔其餘服務器的壓力)

3.6 mongos server路由服務器集羣配置

3.6.1 配置mongos

注意:啓動mongodb時,先啓動配置服務器,再啓動分片服務器,最後啓動路由服務器。

根據服務器規劃,咱們在每臺服務器都配置了mongos:
192.168.90.225: 20000 - mongos
192.168.90.226: 20000 - mongos
192.168.90.227: 20000 - mongos
三臺服務器上分別添加如下配置文件:
進入配置文件:

vi /topinfo/mongodb/conf/mongos.conf
配置文件內容
 # where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /topinfo/mongodb/mongos/logs/mongos.log

 # how the process runs
processManagement:
  fork: true
 #  pidFilePath: /var/log/nginx/mongos.pid
 
 # network interfaces
net:
  port: 20000
  bindIp: 0.0.0.0
  
 #監聽的配置服務器,只能有1個或者3個,configs爲配置服務器的副本集名字,ip:configs配置服務器的端口
sharding:
  configDB: configs/192.168.90.225:21000,192.168.90.226:21000,192.168.90.227:21000

啓動三臺服務器的mongos server

mongos -f /topinfo/mongodb/conf/mongos.conf

目前已經搭建好配置服務器、數據分片服務器、路由服務器,下面進行分片啓用,使得app鏈接到路由服務器時可使用分片機制

3.6.2 串聯路由服務器與分配副本集

登陸任意一臺mongos:

mongo --port  20000

使用admin數據庫

use  admin

串聯路由服務器與分片副本集:

#串聯路由服務器與分片副本集
sh.addShard("shard1/192.168.90.225:27001,192.168.90.226:27001,192.168.90.227:27001")
 #sh.addShard("shard2/192.168.90.225:27001,192.168.90.226:27001,192.168.90.227:27001")

查看集羣狀態:

sh.status()

如圖:

3.6.3 啓動分片

目前配置服務、路由服務、分片服務、副本集服務都已經串聯起來了,但咱們的目的是但願插入數據,數據可以自動分片。鏈接在mongos上,準備讓指定的數據庫、指定的集合分片生效。
指定testdb分片生效

use  admin   # enableSharding只能針對admin數據庫運行,適宜選用admin
db.runCommand( { enablesharding :"testdb"});

指定數據庫裏須要分片的集合和片鍵:
咱們設置testdb的 testcoll 表須要分片,根據 id 自動分片到 shard1 ,shard2,.. 上面去。

db.runCommand( { shardcollection : "testdb.testcoll",key : {id: "hashed"} } )

要這樣設置是由於不是全部mongodb 的數據庫和表 都須要分片!!

查看分片狀態

db.testcoll.stats()

3.7 分片測試

3.7.1 測試

鏈接 MongoDB 路由服務:

clipboard.png

執行測試語句:

for(i=1;i<=10000;i++){db.testcoll.insert({"id":i,"name":"yangp"})};

查看分片結果:

db.testcoll.stats();

如圖:

clipboard.png

clipboard.png

說明分片成功!

4 注意事項

4.1 分片配置異常

4.1.1 執行命令

分片配置副本集的執行如下:

#定義副本集配置(鍵「_id」對應的值必須與配置文件中的replicaction.replSetName一致,priority表明權重[1,100],大的被分配爲主服務器,0永久不會變爲主服務器)
config = {
       _id : "shard1",
        members : [
            {_id : 0, host : "192.168.90.225:27001", priority : 2 },
            {_id : 1, host : "192.168.90.226:27001", priority : 1 },
            {_id : 2, host : "192.168.90.227:27001", arbiterOnly :true }
        ]
    }

 #初始化副本集
rs.initiate(config)

4.1.2 異常日誌

This node, 192.168.90.227:27001, with _id 2 is not electable under the new configuration version 1 for replica set shard1",

4.1.3 異常處理

192.168.90.227這臺服務器不能初始化,換一臺機器作仲裁,順利經過。

#定義副本集配置(鍵「_id」對應的值必須與配置文件中的replicaction.replSetName一致,priority表明權重[1,100],大的被分配爲主服務器,0永久不會變爲主服務器)
config = {
       _id : "shard1",
        members : [
            {_id : 0, host : "192.168.90.225:27001", priority : 2 },
            {_id : 1, host : "192.168.90.226:27001", arbiterOnly :true },
            {_id : 2, host : "192.168.90.227:27001", priority : 1 }
        ]
    }

 #初始化副本集
rs.initiate(config)

 #查看分區狀態
rs.status();

4.2 MongoDB 經常使用命令

4.2.1 啓動命令

4.2.2 中止命令

mongod  -shutdown  -dbpath=/usr/local/mongodb/data

use admin
db.shutdownServer()
相關文章
相關標籤/搜索