mongodb分布式集群部署,集群分片策略

2021-06-16 23:00:26 字數 4924 閱讀 7008

由於專案需要,要部署乙個副本集的分片集群,有三個伺服器用來部署mongodb,我們將資料分為2個副本集分片,並分別部署2個config server和2個mongos, 則具體分配如下:

server 192.168.155.224: 

10001 shard1 

10002 shard2 

20001 config1

server 192.168.155.225: 

10001 shard1 

10002 shard2 

20002 config2

server 192.168.155.226: 

30001 mongos1 

30002 mongos2

1、啟動config server例項

配置資料庫是存放集群元資料的mongod例項。使用--configsvr選項指定乙個mongod為乙個配置伺服器。每個配置伺服器儲存集群乙份全部的元資料。在生產環境下,你必須部署三個配置服務例項,每個執行在不同的伺服器上,以確保良好的執行時間和資料安全。在測試環境下,你能在一台單獨的伺服器上執行三個配置服務。

配置服務例項接收相對較小的流量,並且占用系統資源較少。因此,可以在執行這個例項的系統上同時執行其它例項。

(1)為每個配置服務例項建立乙個資料目錄。預設的情況下,配置服務將資料檔案儲存在/data/config目錄下。

(2)執行三個配置服務例項。使用下面命令:

mongod --configsvr --dbpath --port --logpath

如埠為20001,資料存放目錄為/mongo-data/config1,日誌路徑為/mongo-data/config1/log.log,並建立服務程序,命令如下:

mongod --fork --configsvr --port=20001 --dbpath=/data/config1/ --logpath=/data/config1/log.log

2、啟動mongos例項

mongos例項是輕量級的,並且不需要資料目錄。你能在乙個執行其它集群元件的系統上執行乙個mongos例項,如乙個應用服務或者乙個mongod程序。mongos的預設埠是27017。當你啟動乙個mongos例項時,在配置檔案中或命令列中指定那2個config server的主機名。為了操作靈活,使用配置伺服器的dns名而不是ip位址。如果你沒有使用可解析的主機名,在沒有重啟每個mongos和mongod例項時不能改變配置伺服器名或ip位址。

啟動乙個mongos例項,命令列如下:

mongos --configdb

舉個例子,啟動乙個mongos連線以下配置伺服器:

192.168.155.224 mongodb1.example.net

192.168.155.225 mongodb2.example.net

192.168.155.226 mongodb3.example.net

將執行下面的命令:

mongos --configdb mongodb1.example.net:27019 mongodb2.example.net:27019 mongodb3.example.net:27019 

3、向集群中新增分片

乙個分片可以是乙個單獨的mongod或者是乙個副本集。在生產環境中,每個分片應該是乙個副本集。

(1)從mongo shell連線到mongos例項上。執行下面的命令:

mongo --host --port

舉個例子:

mongo --host mongos1.example.net --port 27017

(2)使用sh.addshard()命令將每個分片新增到集群中,如下面的例子所示。為每個分片單獨的使用sh.addshard()命令。如果分片是乙個副本集,則要指定副本集名並指定組的乙個成員。

下面的例子使用了sh.addshard()命令新增乙個分片:

通過乙個執行在mongodb1.example.net上的27017埠的成員,將乙個名為rs1的副本集分片新增到集群中,命令如下:

sh.addshard(「rs1/mongodb1.example.net:27017」)

版本2.0.3改變的。在這個版本之前,必須指定所有的副本集成員,如:

sh.addshard( "rs1/mongodb1.example.net:27017,mongodb2.example.net:27017,mongodb3.example.net:27017" )

新增乙個執行在mongodb1.example.net伺服器上的27017埠的,命令如下:

sh.addshard("mongodb1.example.net:27017")

4、開啟乙個資料庫的分片功能

在對乙個集合分片之前,你必須開啟這個集合資料庫的分片功能。開啟這個功能並不會重新分配資料,但能使集合能夠分片。

一旦你開啟了乙個資料庫的分片功能,mongodb會分配乙個主片,使mongodb在分片之前將所有的資料儲存在這個資料庫上。

在mongo shell中連線乙個mongos例項,使用以下命令語法:

mongo --host --port

執行sh.enablesharding()方法,指定想要開啟分片功能的資料庫的名字。使用下面的語法:

sh.enablesharding("")

也可以使用enablesharding命令,語法如下:

db.runcommand( )

開啟乙個collection的分片功能:

(1)決定使用什麼作為片鍵。片鍵的選擇會影響分片的效能。

(2)如果乙個collection已經包含資料,則必須在片鍵的字段上使用ensureindex()命令建立乙個索引。如果collection是空的,則mongodb將在sh.shardcollection()階段建立乙個索引。

(3)通過在mongo shell中執行sh.shardcollection()方法開啟乙個collection的分片功能。這個方法的使用語法如下:

db.shardcollection(「.」, shard-key-pattern)

用你的資料庫命名空間,由資料庫名,乙個點和collection的名字組成,替換.字串。shard-key-pattern代表你的片鍵,你可以使用與乙個索引相同的模式。

例子:sh.shardcollection("records.people", ) 

sh.shardcollection("people.addresses", ) 

sh.shardcollection("assets.chairs", ) 

db.alerts.ensureindex( ) 

sh.shardcollection("events.alerts", )

這些分片操作按順序依次表示為:

資料庫records 中的people集合使用了片鍵

這個片鍵通過欄位zipcode的值進行資料分配。如果這個有大量相同的值,則會根據name欄位的值對塊進行**。

資料庫people的addresses集合使用了片鍵

這個片鍵通過欄位state的值進行資料分配。如果這個有大量相同的值,則會根據_id欄位的值對塊進行**。

資料庫assets的chairs集合使用了片鍵

這個片鍵通過欄位type的值進行資料分配。如果這個有大量相同的值,則會根據_id欄位的值對塊進行**。

資料庫events的alerts集合使用了片鍵

在版本2.4中最新出現的。

這個片鍵通過欄位_id的雜湊值進行資料分配。mongodb計算_id欄位的雜湊值作為雜湊索引,它將提供集群中文件的均勻分布。

5、分片部署;

1. 啟動mongod;

server 192.168.155.224:

server 192.168.155.225:

server 192.168.155.223:

server 192.168.155.226:

2. 啟動config server

server 192.168.155.224:

server 192.168.155.225:

server 192.168.155.223:

3. 啟動mongos

這裡為了方便的看到分片過程,將chunksize設定為1,也就是每個塊大小為1mb;

192.168.155.226:

4. 在mongod上配置副本集

先連線到某個副本集的成員上,然後初始化副本集配置:

連線到192.168.155.224:10001上初始化副本集shard1:

>config=,,]}

>rs.initiate(config)

連線到192.168.155.225:10002上初始化副本集shard2:

>config=, ,, ]}

>rs.initiate(config)

連線到192.168.155.223:10002上初始化副本集shard3:

>config=, ,, ]}

>rs.initiate(config)

可以通過rs.status()命令檢視副本集配置結果;

5. 向集群新增副本集分片

先通過mongo shell連線到mongos例項:

> db.runcommand()

> db.runcommand()

> db.runcommand()

通過db.runcommand()檢視分片集群的資訊:

6. 開啟資料庫的分片功能

> sh.enablesharding("page_db")

7. 開啟資料庫中users集合的分片功能,並指定_id的雜湊值組作為片鍵

sh.shardcollection("page_db.users", )

七、 總結

副本集大量應用在生產環節下,可以給mongodb提供冗餘,雖然能夠自動故障切換,但從應用角度上來說還是需要額外的邏輯的。

分片功能在少資料量時沒有必要,只是增加了架構的複雜性。但如果資料量大,訪問量大的情況下,分片還是很有必要的。

Zokeeper分布式集群部署

zokeeper分布式集群部署 一 zookeeper集群幾個配置項,ticktime zookeeper伺服器之間或客戶端與伺服器之間維持心跳的時間間隔,單位是毫秒。datadir zookeeper存放檔案的位置。inltlimit zookeeper接受客戶端初始化鏈結時最長能忍受多少個心跳時...

分布式 集群

效能是乙個多方面綜合的結果,遵循短板理論。系統中任何乙個部分成為效能瓶頸,都會影響整個系統的效能表現 對於web應用,首先第一步是響應http請求,即使後端的效能再好,如果在這裡出現瓶頸,整個系統的效能也會很差,類似於乙個很大的水瓶,但是入水口很小。在這個環節,可以通過dns分流,負載均衡等方式改善...

分布式OR集群

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 分布式是相對中心化而來,強調的是任務在多個物理隔離的節點上進行。中心化帶來的主要問題是可靠性,若中心節點宕機則整個系統不可用,分布式除了解決...