Mongo分片集羣部署

1           部署結構

1.1   集羣結構

典型的三分片Mongo集羣以下圖所示,包含三類組件:查詢路由、配置服務器、分片。其中查詢路由爲mongos進程,配置服務器和分片都是mongod進程。配置服務器和分片都採起副本集(replica set)來確保可用性和健壯性,每一個副本集最少包含三個節點。查詢路由都是單實例運行,沒有副本集機制,可根據須要增長實例數量,也能夠在外部添加負載均衡。html

 

 

         上圖中每一個方框僅表明功能集合,不表明物理位置。實際部署時,爲了不單點故障,同一個副本集中的成員,應該部署在不一樣主機上。好比分片1的三個mongod進程應該運行在三臺不一樣的主機上。linux

 

1.2   部署方案

 

                    副本集方案1(一主二從)mongodb

 

                副本集方案2(一主一從一仲裁)shell

如上圖所示,三成員的副本集方案有兩種:一主二從、一主一從一仲裁。數據庫

對於方案1來講,每一個成員都是數據節點,應該各自獨佔一臺主機,這樣三分片集羣至少須要9臺服務器(配置服務器和查詢路由能夠複用主機),以後每追加一個分片須要增長3臺主機。具體部署狀況以下圖所示(同顏色的爲一組,查詢路由爲MS,配置服務器爲CS*):centos

        

 

對於方案2來講,有兩個成員是數據節點,兩外一個是投票節點(仲裁者),這樣三分片集羣只須要6臺服務器(配置服務器和查詢路由依舊複用主機,仲裁者與另外一分片的數據節點部署在一臺主機),以後每追加一個分片須要增長2臺主機。具體部署狀況以下圖所示(同顏色的爲一組,*a表示仲裁者,如Aa、Ba):bash

 

 

         能夠看出,分片副本集採起一主一從一仲裁方案,更加節省機器資源。結合Mongo分片集羣一期部署所能使用的服務器數量爲6臺,選擇第二種部署方案。服務器

2           部署步驟

  1. 安裝MongoDB:在全部主機上安裝MongoDB
  2. 搭建分片集羣:肯定各組件節點分佈,搭建分片集羣
  3. 數據庫初始化:建立須要的分片數據庫和分片集合,並添加索引
  4. 數據遷移:將生產環境中的Mongo副本集的數據遷移到分片集羣中
  5. 應用遷移:將相關應用從副本集遷移到分片集羣

上述步驟的具體操做見後續章節網絡

 

 

3           安裝MongoDB

操做系統爲: 64位CentOS 7負載均衡

Mongo版本:linux-x86_64-rhel70-3.4.5

注意:全部主機安裝的MongoDB版本應當一致。

3.1   檢查安裝環境

  1. 肯定NUMA已關閉

執行grep -i numa /var/log/dmesg,若是輸出結果爲:No NUMA configuration found,說明NUMA已禁用,不然經過BIOS將其關閉,或者使用numactl來啓動mongod進程(安裝方法見3.3)。

 

  1. 肯定kernel版本不低於2.6.36

執行uname -r,查看返回的版本號

 

  1. 肯定glibc版本不低於2.13

執行ldd --version(version前面兩個減號),查看返回的版本號

 

  1. 肯定ulimit配置

執行ulimit -a,查看當前設置,官方推薦配置以下:

-f (file size): unlimited

-t (cpu time): unlimited

-v (virtual memory): unlimited

-n (open files): 64000

-m (memory size): unlimited

-u (processes/threads): 64000

         主要須要確認的是最大文件數(-n),最大進程數(-u),調整方法以下:

  1. 將最大文件數(-n)修改成64000

編輯/etc/security/limits.conf,寫入如下兩行

* soft nofile 64000

* hard nofile 64000

b.  將最大進程數(-u)修改成64000

         編輯/etc/security/limits.d/20-nproc.conf,寫入如下兩行

*          soft    nproc     64000

*          hard    nproc     64000

         配置完成後,從新打開終端確認是否生效。

 

  1. 文件系統採起XFS

執行df -iT,確認主要分區爲xfs。

 

 

 

  1. 禁用Transparent Huge Pages

執行如下命令查看狀態:

cat /sys/kernel/mm/transparent_hugepage/enabled

cat /sys/kernel/mm/transparent_hugepage/defrag

輸出信息中方括號選中的爲當前狀態,若是爲never表示禁用

 

 

 

若是不是never,經過執行如下命令禁用:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

echo never > /sys/kernel/mm/transparent_hugepage/defrag

         上面的操做在系統重啓後失效,能夠經過設置開機禁用,執行crontab -e添加如下內容:

@reboot echo never > /sys/kernel/mm/transparent_hugepage/enabled

@reboot echo never > /sys/kernel/mm/transparent_hugepage/defrag

 

  1. 數據庫文件目錄所在存儲卷關閉atime

執行cat /etc/fstab,查看內容,一般以下所示:

 

 

         注意每行的第三個配置,默認爲defaults,修改準備存放庫文件目錄的卷,在defaults後面添加「,noatime,nodiratime」,例如放在/home目錄下:

 

 

 

  1. 禁用SELinux

執行sestatus查看狀態,若是爲disabled,或者permissive模式說明已禁用:

 

 

         若是未禁用,能夠執行setenforce 0來臨時禁用。

         想要永久禁用,須要修改/etc/selinux/config,將SELINUX修改成disabled或者permissive,須要重啓系統生效。

         若是不想關閉SELinux,能夠用如下命令放行Mongo(運行在默認端口27017上):

semanage port -a -t mongod_port_t -p tcp 27017

 

  1. 關閉防火牆

執行service firewall status查看防火牆狀態,若是爲inactive說明已關閉:

 

         若是未關閉,執行service firewalld stop。

3.2   安裝Mongo

  1. 下載安裝包

訪問官網https://www.mongodb.com/download-center,下載對應版本安裝包(.tgz)

 

  1. 將安裝包拷貝服務器上,例如/tmp目錄下

 

  1. 打開終端進入安裝包所在目錄(/tmp),將其解壓,會在目錄下生成mongodb-***的目錄

tar zxf mongodb-linux-x86_64-rhel70-3.4.5.tgz

 

  1. 將解壓後的目錄拷貝到安裝路徑(例如/opt/mongodb),執行命令:

mv mongodb-linux-x86_64-rhel70-3.4.5 /opt/mongodb

 

  1. 在環境變量PATH中添加二進制文件路徑

MongoDB的二進制文件在Mongo安裝路徑的bin/目錄下。能夠經過修改PATH變量。

編輯shell的rc文件:

vi ~/.bashrc

在最後添加下面這行:

export PATH=/opt/mongodb/bin:$PATH

         注意:此環境變量與僅對當前用戶有效。

 

  1. 驗證安裝成功

從新打開中斷,輸入命令:

mongo --version

         若是顯示如下信息,說明安裝成功。

 

 

3.3   安裝numactl

對於啓用了NUMA的主機,若是沒法經過BIOS關閉,能夠安裝numactl工具。

  1. 下載rpm安裝包

https://centos.pkgs.org/7/centos-x86_64/numactl-2.0.9-6.el7_2.x86_64.rpm.html

  1. 將安裝包拷貝到須要運行Mongo的主機上,而後執行命令

rpm -ivh numactl-2.0.9-6.el7_2.x86_64.rpm

         顯示如下信息說明安裝成功。

 

 

3.4   安裝bwm-ng

bwm-ng是監控網絡帶寬和磁盤IO的工具。它的官網是:http://www.gropp.org/,當前最新下載地址爲:https://www.gropp.org/bwm-ng/bwm-ng-0.6.1.tar.gz,安裝步驟以下:

  1. 下載安裝包
  2. 將安裝包拷貝到主機上(例如拷貝到/tmp/目錄下)
  3. 將安裝包解壓:

tar zxvf bwm-ng-0.6.tar.gz

  1. 進入解壓後的目錄並編譯安裝:

cd bwm-ng-0.6.1

./configure && make && make install

  1. 檢查是否安裝成功,執行:

bwm-ng

         正常會顯示相似以下信息:

 

 

經常使用監控命令:

  1. 監控網絡帶寬

bwm-ng -u bits -d

bwm-ng -u bytes -d

 

  1. 監控磁盤IO

bwm-ng -u bytes -i disk

 

4           搭建分片集羣

注意:分片集羣中全部實例的Mongo版本應當一致。

4.1   分片集羣規劃

4.1.1  節點分配

以三分片集羣爲例,它包含15個進程節點,3個路由(mongos)、1個配置服務器副本集(3個mongod組成)、3個分片副本集(每一個由3個mongod組成)。由於實際環境有6臺主機(140-145),因此每一個主機上須要運行不止一個進程。

對資源消耗比較大的是分片中的數據節點(主節點或從節點),每臺主機上最好只運行一個數據節點,這樣就只能有6個數據節點,平攤到每一個分片有2個數據節點,因此每一個分片採起1主(primary)1從(secondary)1仲裁(arbiter)的結構。

14二、14三、144服務器依次部署分片一、分片二、分片3的主節點;14五、140、141服務器依次部署分片一、分片二、分片3的從節點。除了這六個節點,剩餘3個路由節點、3個配置服務器節點和分片1-3的仲裁節點。

考慮到路由須要和配置服務器通訊,因此路由和配置服務器兩兩部署在一塊兒;另外路由與分片主節點通訊也較多,因此就在每一個分片主節點所在服務器上部署1個路由節點和1個配置服務器節點。這樣142服務器上有分片1的主節點、1個路由節點、1個配置服務器節點;143服務器上有分片2的主節點、1個路由節點、1個配置服務器節點;144服務器上有分片三、1個路由節點、1個配置服務器節點。

至此還剩分片1-3的仲裁節點沒有分配。考慮主機資源的均衡,將它們部署到從節點服務器上。同時爲了不單點故障(一個分片裏同時掛掉兩個節點),每一個仲裁節點不放在相同分片的從節點主機上。這樣145服務器上有分片1的從節點、分片3的仲裁節點;140服務器上有分片2的從節點、分片1個仲裁節點;142服務器上有分片3的從節點、分片2的仲裁節點。

這樣三分片集羣節點在6臺服務器上的分配狀況以下:

序號

主機

組件

1

10.20.50.142

配置服務器-primary

分片1-primary

路由

2

10.20.50.143

配置服務器-secondary

分片2-primary

路由

3

10.20.50.144

配置服務器-secondary

分片3-primary

路由

4

10.20.50.145

分片1-secondary

分片3- arbiter

5

10.20.50.140

分片2-secondary

分片1- arbiter

6

10.20.50.141

分片3-secondary

分片2- arbiter

 

4.1.2  端口、路徑和磁盤規劃

  1. 端口規劃

根據上一節的節點分配,每臺服務器上運行不止一個節點,而每一個節點都須要佔用端口,因此須要對端口進行規劃。

由於MongoDB的默認端口是27017,每臺主機能夠有一個實例使用該端口,考慮到集羣搭建過程當中的便利性(不須要指定端口),因此將27017端口分配給每臺主機上的數據節點(分片的主節點或從節點)。14五、140、141主機上還有的仲裁節點,分配相同的28017端口。14二、14三、144主機上還有配置服務器節點和路由節點,也考慮根據類型分別分配相同端口,配置服務器分配28018端口,路由分配29017端口。

         至此端口分配完成

序號

主機

組件

1

10.20.50.142

分片1-primary(27017)

配置服務器-primary(28017)

路由(29017)

2

10.20.50.143

分片2-primary(27017)

配置服務器-secondary(28017)

路由(29017)

3

10.20.50.144

分片3-primary(27017)

配置服務器-secondary(28017)

路由(29017)

4

10.20.50.145

分片1-secondary(27017)

分片3- arbiter(28017)

5

10.20.50.140

分片2-secondary(27017)

分片1- arbiter(28017)

6

10.20.50.141

分片3-secondary(27017)

分片2- arbiter(28017)

        

  1. 路徑和磁盤規劃

         每一個節點實際是mongod或mongos進程,須要有本身的運行目錄,因此須要對運行目錄的路徑進行規劃。出於方便考慮,將每臺主機的多個節點運行目錄放在同一個根路徑下,而後根路徑下各自佔使用一個子目錄,子目錄以節點用途命名(例如路由的運行目錄爲router、配置服務器的運行目錄爲confsrv、分片1-3的運行目錄爲shard1/shard2/shard3)

至於運行根目錄,考慮到數據節點須要使用大量磁盤資源,因此應該選擇磁盤容量最大的分區。例如,若是全部磁盤劃分在根分區下(/),運行根目錄就選擇/var/mongodb/(var目錄通常用來存儲運行數據,如數據庫文件等),若是磁盤主要劃分在home分區(/home),下就選擇/home/var/mongodb/。

以全部磁盤劃分在根分區爲例,配置服務器的運行目錄爲/var/mongodb/confsrv/,路由的運行目錄爲/var/mongodb/router/,分片的運行目錄爲/var/mongodb/shard1/、/var/mongodb/shard2/、/var/mongodb/shard3/。每一個節點的配置文件、日誌文件、PID文件都輸出到運行目錄中。另外除了路由節點以外,其他節點都須要存儲數據,因此都在運行目錄下建立dbpath文件夾做爲數據目錄。

         至此各個節點的運行路徑就劃分完成,以下表所示:

序號

組件

IP

運行目錄

數據目錄

1

配置服務器

primary

10.20.50.142

/var/mongodb/confsrv/

/var/mongodb/confsrv/dbpath/

2

配置服務器

secondary

10.20.50.143

/var/mongodb/confsrv/

/var/mongodb/confsrv/dbpath/

3

配置服務器

secondary

10.20.50.144

/var/mongodb/confsrv/

/var/mongodb/confsrv/dbpath/

4

分片1

primary

10.20.50.142

/var/mongodb/shard1/

/var/mongodb/shard1/dbpath/

5

分片1

secondary

10.20.50.145

/var/mongodb/shard1/

/var/mongodb/shard1/dbpath/

6

分片1

arbiter

10.20.50.140

/var/mongodb/shard1/

/var/mongodb/shard1/dbpath/

7

分片2

primary

10.20.50.143

/var/mongodb/shard2/

/var/mongodb/shard2/dbpath/

8

分片2

secondary

10.20.50.140

/var/mongodb/shard2/

/var/mongodb/shard2/dbpath/

9

分片2

arbiter

10.20.50.141

/var/mongodb/shard2/

/var/mongodb/shard2/dbpath/

10

分片3

primary

10.20.50.144

/var/mongodb/shard3/

/var/mongodb/shard3/dbpath/

11

分片3

secondary

10.20.50.141

/var/mongodb/shard3/

/var/mongodb/shard3/dbpath/

12

分片3

arbiter

10.20.50.145

/var/mongodb/shard3/

/var/mongodb/shard3/dbpath/

13

路由

10.20.50.142

/var/mongodb/router/

14

路由

10.20.50.143

/var/mongodb/router/

15

路由

10.20.50.144

/var/mongodb/router/

 

 

4.1.3  集羣規劃清單

根據前兩節的分析,對集羣中各組件的最終規劃以下:

序號

組件

IP

Port

副本集名稱

進程

運行目錄

1

配置服務器

primary

10.20.50.142

28017

confsrv

mongod

/var/mongodb/confsrv/

2

配置服務器

secondary

10.20.50.143

28017

confsrv

mongod

/var/mongodb/confsrv/

3

配置服務器

secondary

10.20.50.144

28017

confsrv

mongod

/var/mongodb/confsrv/

4

分片1

primary

10.20.50.142

27017

shard1

mongod

/var/mongodb/shard1/

5

分片1

secondary

10.20.50.145

27017

shard1

mongod

/var/mongodb/shard1/

6

分片1

arbiter

10.20.50.140

28017

shard1

mongod

/var/mongodb/shard1/

7

分片2

primary

10.20.50.143

27017

shard2

mongod

/var/mongodb/shard2/

8

分片2

secondary

10.20.50.140

27017

shard2

mongod

/var/mongodb/shard2/

9

分片2

arbiter

10.20.50.141

28017

shard2

mongod

/var/mongodb/shard2/

10

分片3

primary

10.20.50.144

27017

shard3

mongod

/var/mongodb/shard3/

11

分片3

secondary

10.20.50.141

27017

shard3

mongod

/var/mongodb/shard3/

12

分片3

arbiter

10.20.50.145

28017

shard3

mongod

/var/mongodb/shard3/

13

路由

10.20.50.142

29017

mongos

/var/mongodb/router/

14

路由

10.20.50.143

29017

mongos

/var/mongodb/router/

15

路由

10.20.50.144

29017

mongos

/var/mongodb/router/

 

         各臺主機上部署的組件清單以下:

序號

主機

組件

1

10.20.50.142

配置服務器-primary(28017)

分片1-primary(27017)

路由(29017)

2

10.20.50.143

配置服務器-secondary(28017)

分片2-primary(27017)

路由(29017)

3

10.20.50.144

配置服務器-secondary(28017)

分片3-primary(27017)

路由(29017)

4

10.20.50.145

分片1-secondary(27017)

分片3- arbiter(28017)

5

10.20.50.140

分片2-secondary(27017)

分片1- arbiter(28017)

6

10.20.50.141

分片3-secondary(27017)

分片2- arbiter(28017)

         組件規劃肯定後,下面就進入搭建集羣的實操階段。

4.2   建立配置服務器

  1. 建立運行目錄

在14二、14三、144服務器上建立運行目錄(應該放磁盤容量最大的卷中),例如:

mkdir -p /var/mongodb/confsrv/dbpath/

 

  1. 建立配置文件

在運行目錄(/var/mongodb/confsrv/)中建立配置文件mongod-cs.cnf,內容以下:

sharding:

  clusterRole: configsvr

replication:

  replSetName: confsrv

  oplogSizeMB: 10240

systemLog:

   destination: file

   path: /var/mongodb/confsrv/mongod-cs.log

   logAppend: true

net:

   port: 28017

storage:

   dbPath: /var/mongodb/confsrv/dbpath/

   directoryPerDB: true

processManagement:

   fork: true

   pidFilePath: /var/mongodb/confsrv/mongod-cs.pid

         其中依次設置了:集羣角色(configsrv)、副本集名稱(confsrv)、操做日誌大小、日誌設置、端口(28017)、存儲設置、後臺運行(fork)、PID文件路徑。

         更多配置見:https://docs.mongodb.com/manual/reference/configuration-options/

 注意:配置中全部冒號後面必須增長空格

 

  1. 啓動mongod實例

mongod --config /var/mongodb/confsrv/mongod-cs.cnf

         注意:若是運行在啓用了NUMA的主機上,使用numactl來啓動:

numactl --interleave=all mongod --config /var/mongodb/confsrv/mongod-cs.cnf

啓動以後,根據配置,日誌文件、pid文件會寫入/var/mongodb/confsrv/,數據會寫入/var/mongodb/confsrv/dbpath/。

 

注意:確保在三個配置服務器節點上(14二、14三、144)均完成上述步驟。

 

  1. 鏈接並初始化

在142上使用mongo shell鏈接mongod實例,執行:

mongo --port 28017

         在mongo shell中初始化副本集(注意_id要與配置文件中的replSetName一致,host中爲主機IP或可解析域名+端口),執行:

rs.initiate(

  {

         _id: "confsrv",

         configsvr: true,

         members: [

           { _id : 0, host : "10.20.50.142:28017" },

           { _id : 1, host : "10.20.50.143:28017" },

           { _id : 2, host : "10.20.50.144:28017" }

          

         ]

  }

)

         若是操做完成,會返回成功的提示信息({"ok" : 1.0}),不然會給出錯誤信息。

這樣一主二從的配置服務器副本集就搭建完成。

 

查看副本集配置,執行:

rs.conf()

         查看副本集狀態,執行:

rs.status()

 

  1. 添加副本集成員(可選)

若是還要追加副本集成員,經過mongo shell鏈接配置服務器副本集主節點實例,而後執行:

rs.add("<host>:<port>")

         其中<host>、<port>替換爲相應節點的主機名(ip或域名)和端口

         詳細操做能夠參考:https://docs.mongodb.com/manual/tutorial/expand-replica-set/

 

注:配置完成後優先確認網絡通暢,防火牆關閉或端口不被屏蔽,若是中間有操做錯誤,可使用以下命令進行從新配置:

conf = {

         _id: "confsrv",

         configsvr: true,

         members: [

           { _id : 0, host : "10.20.50.140:28017" },

           { _id : 1, host : "10.20.50.141:28017" },

           { _id : 2, host : "10.20.50.142:28017" }

          

         ]

  }

回車

rs.initiate(conf,{force:true})  //已經運行的系統此命令不建議使用

 

 

4.3   建立分片

  1. 建立運行目錄

以分片1爲例,在142服務器上建立運行目錄(應該放在磁盤容量最大的卷中),例如:

mkdir -p /var/mongodb/shard1/dbpath/

 

  1. 建立配置文件

在運行目錄(/var/mongodb/shard1/)中建立配置文件mongod- sh.cnf,內容以下:

sharding:

  clusterRole: shardsvr

replication:

  replSetName: shard1

  oplogSizeMB: 10240

systemLog:

   destination: file

   path: /var/mongodb/shard1/mongod-sh.log

   logAppend: true

net:

   port: 27017

storage:

   dbPath: /var/mongodb/shard1/dbpath/

   directoryPerDB: true

processManagement:

   fork: true

   pidFilePath: /var/mongodb/shard1/mongod-sh.pid

         其中依次設置了:集羣角色(shardsvr)、副本集名稱(shard1)、操做日誌大小、日誌設置、端口(27017)、存儲設置、後臺運行(fork)、PID文件路徑。

         更多配置見:https://docs.mongodb.com/manual/reference/configuration-options/

 

  1. 啓動mongod實例

mongod --config /var/mongodb/shard1/mongod-sh.cnf

注意:若是運行在啓用了NUMA的主機上,使用numactl來啓動:

numactl --interleave=all mongod --config /var/mongodb/shard1/mongod-sh.cnf

         啓動以後,根據配置,日誌文件、pid文件會寫入/var/mongodb/shard1/,數據會寫入/var/mongodb/shard1/dbpath/。

 

在145服務器上完成以上步驟,在140服務器也完成以上步驟(注意:根據規劃,須要將配置文件中的端口改成28017)

 

  1. 鏈接並初始化

在142上使用mongo shell鏈接mongod實例,執行:

mongo --port 27017 或者 mongo

         在mongo shell中初始化副本集(注意:_id要與配置文件中的replSetName一致,host中爲主機IP或可解析域名+端口),執行:

rs.initiate(

  {

         _id: "shard1",

         members: [

           { _id : 0, host : "10.20.50.142", priority: 10 },

           { _id : 1, host : "10.20.50.145", priority:5 }

          

         ]

  }

)

         primary節點和secondary節點就加入分片副本集了,還須要添加arbiter節點,執行:

rs.addArb("10.20.50.140:28017")

         這樣一主一從一仲裁的分片集羣就搭建完成。

 

查看副本集配置,執行:

rs.conf()

         查看副本集狀態,執行:

rs.status()

 

  1. 添加副本集成員(可選)

若是還要追加副本集成員,經過mongo shell鏈接配置服務器副本集主節點實例,而後執行:

rs.add("<host>:<port>")

         其中<host>、<port>替換爲相應節點的主機名(ip或域名)和端口

         詳細操做能夠參考:https://docs.mongodb.com/manual/tutorial/expand-replica-set/

 

  1. 按照1-5步,分別建立分片2副本集(14三、140、141)和分片3副本集(14四、14一、145)

分片二、分片3的配置以下,僅僅是replSetName和運行目錄不一樣:

sharding:

  clusterRole: shardsvr

replication:

  replSetName: shard2

  oplogSizeMB: 10240

systemLog:

   destination: file

   path: /var/mongodb/shard2/mongod-sh.log

   logAppend: true

net:

   port: 27017

storage:

   dbPath: /var/mongodb/shard2/dbpath/

   directoryPerDB: true

processManagement:

   fork: true

   pidFilePath: /var/mongodb/shard2/mongod-sh.pid

 

sharding:

  clusterRole: shardsvr

replication:

  replSetName: shard3

  oplogSizeMB: 10240

systemLog:

   destination: file

   path: /var/mongodb/shard3/mongod-sh.log

   logAppend: true

net:

   port: 27017

storage:

   dbPath: /var/mongodb/shard3/dbpath/

   directoryPerDB: true

processManagement:

   fork: true

   pidFilePath: /var/mongodb/shard3/mongod-sh.pid

         另外,在執行步驟4進行初始化時,注意對應修改_id和host。

 

4.4   建立查詢路由

  1. 建立運行目錄

在142服務器上建立運行目錄(應該放在磁盤容量最大的卷中),例如:

mkdir -p /var/mongodb/router/

 

  1. 建立配置文件

在運行目錄(/var/mongodb/router/)中建立配置文件mongos.cnf,內容以下:

sharding:

  configDB: confsrv/10.20.50.142:28017,10.20.50.143:28017,10.20.50.144:28017

systemLog:

   destination: file

   path: /var/mongodb/router/mongos.log

   logAppend: true

net:

   port: 29017

processManagement:

   fork: true

   pidFilePath: /var/mongodb/router/mongos.pid

其中依次設置了:配置服務器(configDB)、系統日誌、端口(29017)、後臺運行(fork)、PID文件路徑。

        

  1. 啓動mongos實例(注意:這裏是mongos,而上面都是mongod)

mongos --config /var/mongodb/router/mongos.cnf

         啓動以後,根據配置,日誌文件、pid文件會寫入/var/mongodb/router/

 

  1. 在14三、144上重複上述步驟

 

注意:當路由(mongos)成爲性能瓶頸時,能夠多配置幾個。

 

4.5   添加分片

在142上(14三、144也行)使用mongo shell鏈接mongos實例,執行:

mongo --port 29017

而後將上面建立的三個分片依次添加進來,執行:

sh.addShard( "shard1/10.20.50.142:27017")

sh.addShard( "shard2/10.20.50.143:27017")

sh.addShard( "shard3/10.20.50.144:27017")

         操做完成後,能夠查看分片集羣狀態,執行:

sh.status()

         會發現每一個分片除了添加的主節點外,從節點也自動加入了,後續分片副本集若是發生變化(增刪節點)也會自動識別出來。

shards:

         {  "_id" : "shard1",  "host" : "shard1/10.20.50.142:27017,10.20.50.145:27017",  "state" : 1 }

         {  "_id" : "shard2",  "host" : "shard2/10.20.50.143:27017,10.20.50.140:27017",  "state" : 1 }

         {  "_id" : "shard3",  "host" : "shard3/10.20.50.144:27017,10.20.50.141:27017",  "state" : 1 }

 

4.6   設置開機啓動

經過crontab將分片集羣各組件設置爲開機啓動,以142主機爲例,具體操做以下:

  1. 編輯crontab,執行:

crontab -e

 

  1. 在打開的crontab文件中末尾追加如下內容:

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/confsrv/mongod-cs.cnf

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard1/mongod-sh.cnf

@reboot /opt/mongodb/bin/mongos --config /var/mongodb/router/mongos.cnf

 

對於14三、14四、14五、140、141五臺主機,crontab添加的內容以下(根據組件規劃):

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/confsrv/mongod-cs.cnf

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard2/mongod-sh.cnf

@reboot /opt/mongodb/bin/mongos --config /var/mongodb/router/mongos.cnf

 

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/confsrv/mongod-cs.cnf

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard3/mongod-sh.cnf

@reboot /opt/mongodb/bin/mongos --config /var/mongodb/router/mongos.cnf

 

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard1/mongod-sh.cnf

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard3/mongod-sh.cnf

 

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard2/mongod-sh.cnf

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard1/mongod-sh.cnf

 

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard3/mongod-sh.cnf

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard2/mongod-sh.cnf

 

5           數據庫初始化

根據目前需求,過人過車數據存放在o2m數據庫中。相關集合以下表所示:

序號

集合名稱

所存數據

1

passPerson1

客運站過人

2

passPerson2

火車站過人

3

passPerson3

機場過人

4

passPerson4

檢查站過人

5

passPerson5

酒店過人

6

passPerson7

二手車交易過人

7

passPerson99

社會化過人

8

visitorPerson

訪客機過人

9

vehicle

檢查站過車

         其中客運站過人、火車站過人、機場過人、檢查站過人須要進行分片處理,因此先o2m數據庫啓用分片,而後再將上述四個集合分片。

 

  1. 鏈接到mongos,執行:

mongo --host 10.20.50.142 --port 29017

 

2. 對o2m數據庫啓用分片,執行:

sh.enableSharding("o2m")

 

3. 將相關集合分片(這裏採起stationNo+passTime的組合片鍵),執行:

sh.shardCollection("o2m.passPerson1", { stationNo:1, passTime:1 } )

sh.shardCollection("o2m.passPerson2", { stationNo:1, passTime:1 } )

sh.shardCollection("o2m.passPerson3", { stationNo:1, passTime:1 } )

sh.shardCollection("o2m.passPerson4", { stationNo:1, passTime:1 } )

         注:片鍵後面的方向只能是升序(即1)

 

4. 查詢分片集合的數據分佈狀況(例如passPerson1),執行:

db.passPerson1.stats()

         返回結果的shards節點中包含有各分片狀況:

 

  1. 添加索引

db.passPerson1.createIndex( { passTime:1, stationNo:1, nationCode:1, genderCode:1, cardNoPrefix6:1 } )

db.passPerson1.createIndex( { cardNo:1 } )

 

注:由於o2m數據庫已經啓用分片,其中未分片的集合會存儲在某個單一分片上,以後某個集合須要分片,參考步驟3執行便可。

6           數據遷移

  1. 導出原始數據

例如,從原副本集(運行在27017端口)中導出o2m數據庫,執行:

mongodump --host 10.20.50.135 --db o2m -o /tmp/mongodump/

         數據會導出到/tmp/mongodump/下的o2m目錄中

  1. 導入分片集羣

數據導入須要經過mongos,使用-h參數指定mongos實例的IP和端口,使用-d參數指定數據庫,試用-c參數指定集合,例如導入火車站過人數據,執行:

mongorestore -h 10.20.50.140:29017 -d o2m -c passPerson2 /tmp/mongodump/test/railwayPerson.bson

         導入過程當中,會顯示進度信息。

 

7           應用遷移

分片集羣對於客戶端應用來講是透明的,客戶端應用只需將分片集羣視爲單個mongod實例,全部客戶端請求都鏈接分片集羣中的路由(mongos)。

應用只需將原有Mongo配置指向路由便可(例如10.20.50.140:29017),若是想要使用多個路由,能夠將多個路由地址用逗號鏈接,相似副本集的配置(192.168.30.139:29017,192.168.30.141:29017,192.168.30.145:29017)

相關文章
相關標籤/搜索