由於專案需要,要部署乙個副本集的分片集群,有三個伺服器用來部署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流程圖 匯出與匯入 分布式是相對中心化而來,強調的是任務在多個物理隔離的節點上進行。中心化帶來的主要問題是可靠性,若中心節點宕機則整個系統不可用,分布式除了解決...