1. 程式人生 > 實用技巧 >mongodb分片叢集

mongodb分片叢集

mongodb分片叢集

Sharding cluster是一種可以水平擴充套件的模式,在資料量很大時特給力,實際大規模應用一般會採用這種架構去構建。sharding分片很好的解決了單臺伺服器磁碟空間、記憶體、cpu等硬體資源的限制問題,把資料水平拆分出去,降低單節點的訪問壓力。每個分片都是一個獨立的資料庫,所有的分片組合起來構成一個邏輯上的完整的資料庫。因此,分片機制降低了每個分片的資料操作量及需要儲存的資料量,達到多臺伺服器來應對不斷增加的負載和資料的效果。

1)Sharding分割槽概念

分片 (sharding)是指將資料庫拆分,將其分散在不同的機器上的過程。將資料分散到不同的機器上,不需要功能強大的伺服器就可以儲存更多的資料和處理更大的負載。
分片的基本思想就是: 將集合切成小塊,這些塊分散到若干片裡,每個片只負責總資料的一部分。通過一個名為 mongos 的路由程序進行操作,mongos 知道資料和片的對應 關係(通過配置伺服器)。 大部分使用場景都是解決磁碟空間的問題,對於寫入有可能會變差(+++裡面的說明+++),查 詢則儘量避免跨分片查詢。使用分片的時機: 使用場景: 1)機器的磁碟不夠用了。使用分片解決磁碟空間的問題。 2)單個mongod已經不能滿足寫資料的效能要求。通過分片讓寫壓力分散到各個分片上面,使用分片伺服器自身的資源。 3)想把大量資料放到記憶體裡提高效能。和上面一樣,通過分片使用分片伺服器自身的資源。 要構建一個MongoDB Sharding Cluster(分片叢集),需要三種角色:
1)分片伺服器(Shard Server) mongod 例項,用於儲存實際的資料塊,實際生產環境中一個 shard server 角色可由幾臺機器組個一個 relicaset承擔,防止主機單點故障 這是一個獨立普通的mongod程序,儲存資料資訊。可以是一個副本集也可以是單獨的一臺伺服器。 2)配置伺服器(Config Server) mongod 例項,儲存了整個 Cluster Metadata,其中包括 chunk 資訊。 這是一個獨立的mongod程序,儲存叢集和分片的元資料,即各分片包含了哪些資料的資訊。最先開始建立,啟用日誌功能。像啟動普通的 mongod 一樣啟動 配置伺服器,指定configsvr 選項。不需要太多的空間和資源,配置伺服器的 1KB 空間相當於真是資料的 200MB。儲存的只是資料的分佈表。
3)路由伺服器(Route Server) mongos例項,前端路由,客戶端由此接入,且讓整個叢集看上去像單一資料庫,前端應用 起到一個路由的功能,供程式連線。本身不儲存資料,在啟動時從配置伺服器載入叢集資訊,開啟 mongos 程序需要知道配置伺服器的地址,指定configdb選項。 片鍵的意義 一個好的片鍵對分片至關重要。 片鍵必須是一個索引 ,通 過 sh.shardCollection 加會自動建立索引。一個自增的片鍵對寫入和資料均勻分佈就不是很好, 因為自增 的片鍵總會在一個分片上寫入,後續達到某個閥值可能會寫到別的分片。但是按照片鍵查詢會非常高效。隨機片鍵對資料的均勻分佈效果很好。注意儘量避免在多個分片上進行查詢。 在所有分片上查詢,mongos 會對結果進行歸併排序

水平資料分片

分片叢集主要由三種元件組成:mongos,config server,shard
1) mongos  (路由程序, 應用程式接入 mongos 再查詢到具體分片)
資料庫叢集請求的入口,所有的請求都通過 mongos 進行協調,不需要在應用程式新增一個路由選擇器,mongos 自己就是一個請求分發中心,它負責把對應的資料請求
請求轉發到對應的 shard 伺服器上。在生產環境通常有多個 mongos 作為請求的入口,防止其中一個掛掉所有的 mongodb 請求都沒有辦法操作。
 
2) config server  (路由表服務。 每一臺都具有全部 chunk 的路由資訊)
顧名思義為配置伺服器,儲存所有資料庫元資訊(路由、分片)的配置。mongos 本身沒有物理儲存分片伺服器和資料路由資訊,只是快取在記憶體裡,配置伺服器則實際儲存
這些資料。mongos 第一次啟動或者關掉重啟就會從 config server 載入配置資訊,以後如果配置伺服器資訊變化會通知到所有的 mongos 更新自己的狀態,這樣
mongos 就能繼續準確路由。在生產環境通常有多個 config server 配置伺服器,因為它儲存了分片路由的元資料,這個可不能丟失!就算掛掉其中一臺,只要還有存貨,
mongodb 叢集就不會掛掉。
 
3) shard  (為資料儲存分片。 每一片都可以是複製集(replica set))
這就是傳說中的分片了。如圖所示,一臺機器的一個數據表 Collection1 儲存了 1T 資料,壓力太大了!在分給 4 個機器後, 每個機器都是 256G,則分攤了集中在一臺
機器的壓力。事實上,上圖4個分片如果沒有副本集(replica set)是個不完整架構,假設其中的一個分片掛掉那四 分之一的資料就丟失了,所以在高可用性的分片架構還
需要對於每一個分片構建 replica set 副本集保 證分片的可靠性。生產環境通常是 2 個副本 + 1 個仲裁。

2)Sharding分割槽的原理

分片,是指將資料拆分,將其分散到不同的機器上。這樣的好處就是,不需要功能強大的大型計算機也可以儲存更多的資料,處理更大的負載。mongoDB 的分片,是將collection 的資料進行分割,然後將不同的部分分別儲存到不同的機器上。當 collection 所佔空間過大時,我們需要增加一臺新的機器,分片會自動將 collection 的資料分發到新的機器上。

mongos: 首先我們要了解”片鍵“的概念,也就是說拆分集合的依據是什麼?按照什麼鍵值進行拆分集合。mongos就是一個路由伺服器,它會根據管理員設定的"片鍵" 將資料分攤到自己管理的mongod叢集,資料和片的對應關係以及相應的配置資訊儲存在"config伺服器"上。 客戶端只需要對 mongos 進行操作就行了,至於如何進行分片,不需要 客戶端參與,由 mongos 和 config 來完成。 mongod: 一個普通的資料庫例項或者副本集,如果不分片的話,我們會直接連上mongod。 分片是指將資料拆分,將其分散存在不同機器上的過程.有時也叫分割槽.將資料分散在不同的機器上MongoDB支援自動分片,可以擺脫手動分片的管理.叢集自動切分資料,做負載均衡

分片叢集由以下3個服務組成:
Shards Server: 每個shard由一個或多個mongod程序組成,用於儲存資料
Config Server: 用於儲存叢集的Metadata資訊,包括每個Shard的資訊和chunks資訊
Route Server: 用於提供路由服務,由Client連線,使整個Cluster看起來像單個DB伺服器

部署分片叢集:

分別在3臺機器執行一個mongod例項(稱為mongod shard11,mongod shard12,mongod shard13)組織replica set1,作為cluster的shard1
分別在3臺機器執行一個mongod例項(稱為mongod shard21,mongod shard22,mongod shard23)組織replica set2,作為cluster的shard2
每臺機器執行一個mongod例項,作為3個config server
每臺機器執行一個mongos程序,用於客戶端連線

1)安裝mongodb (3臺機器都要操作)   下載壓縮包, 安裝可以參考前邊的安裝
# tar -zxvf mongodb-linux-x86_64-enterprise-rhel70-4.4.0.tgz

[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# mv /root/mongodb-linux-x86_64-enterprise-rhel70-4.4.0 ./

[root@localhost src]# mv mongodb-linux-x86_64-enterprise-rhel70-4.4.0 mongodb

# yum install net-snmp -y

2)建立sharding資料目錄

根據本例sharding架構圖所示,在各臺sever上建立shard資料檔案目錄 2)建立sharding資料目錄 根據本例sharding架構圖所示,在各臺sever上建立shard資料檔案目錄 slave1 [root@slave1 src]# mkdir /home/services/ [root@slave1 src]# mv mongodb /home/services/ [root@slave1 src]# cd /home/services/mongodb/ [root@slave1 mongodb]# mkdir -p data/shard11 [root@slave1 mongodb]# mkdir -p data/shard21 slave2 [root@slave2 src]# mkdir /home/services/ [root@slave2 src]# mv mongodb /home/services/ [root@slave2 src]# cd /home/services/mongodb/ [root@slave2 mongodb]# mkdir -p data/shard12 [root@slave2 mongodb]# mkdir -p data/shard22 slave3 [root@slave3 src]# mkdir /home/services/ [root@slave3 src]# mv mongodb /home/services/ [root@slave3 src]# cd /home/services/mongodb/ [root@slave3 mongodb]# mkdir -p data/shard13 [root@slave3 mongodb]# mkdir -p data/shard23 3)配置relica sets 3.1)配置shard1所用到的replica sets 1: slave1 [root@slave1 ~]# /home/services/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27018 --dbpath /home/services/mongodb/data/shard11 --oplogSize 100 --logpath /home/services/mongodb/data/shard11.log --logappend --fork --bind_ip 192.168.88.191 slave2 [root@slave2 ~]# /home/services/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27018 --dbpath /home/services/mongodb/data/shard12 --oplogSize 100 --logpath /home/services/mongodb/data/shard12.log --logappend --fork --bind_ip 192.168.88.192 slave3 [root@slave3 ~]# /home/services/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27018 --dbpath /home/services/mongodb/data/shard13 --oplogSize 100 --logpath /home/services/mongodb/data/shard13.log --logappend --fork --bind_ip 192.168.88.194 檢測各個機器上的mongod程序是否正常起來了(ps-ef|grepmongod),27018埠是否正常起來了 3.2)初始化replicaset1 從3臺機器中任意找一臺,連線mongod [root@slave1 ~]# /home/services/mongodb/bin/mongo --port 27018 --host 192.168.88.191 ...... > config = {"_id":"shard1","members": [{"_id": 0,"host":"192.168.88.191:27018"},{"_id": 1,"host":"192.168.88.192:27018"},{"_id": 2,"host":"192.168.88.194:27018"}]} > rs.initiate(config); {"ok": 1 } 3.3)配置shard2所用到的replica sets 2: slave1 [root@slave1 ~]# /home/services/mongodb//bin/mongod --shardsvr --replSet shard2 --port 27019 --dbpath /home/services/mongodb/data/shard21 --oplogSize 100 --logpath /home/services/mongodb/data/shard21.log --logappend --fork --bind_ip 192.168.88.191 slave2 [root@slave2 ~]# /home/services/mongodb//bin/mongod --shardsvr --replSet shard2 --port 27019 --dbpath /home/services/mongodb/data/shard22 --oplogSize 100 --logpath /home/services/mongodb/data/shard22.log --logappend --fork --bind_ip 192.168.88.192 slave3 [root@slave3 ~]# /home/services/mongodb//bin/mongod --shardsvr --replSet shard2 --port 27019 --dbpath /home/services/mongodb/data/shard23 --oplogSize 100 --logpath /home/services/mongodb/data/shard23.log --logappend --fork --bind_ip 192.168.88.194 3.4)初始化replicaset2 從3臺機器中任意找一臺,連線mongod [root@slave1 ~]# /home/services/mongodb/bin/mongo --port 27019 ...... > config = {"_id":"shard2","members": [{"_id": 0,"host":"192.168.88.191:27019"},{"_id": 1,"host":"192.168.88.192:27019"},{"_id": 2,"host":"192.168.88.194:27019"}]} > rs.initiate(config); {"ok": 1 }

4)配置三臺config server

slave1 [root@slave1 ~]# mkdir -p /home/services/mongodb/data/config [root@slave1 ~]# /home/services/mongodb//bin/mongod --configsvr --dbpath /home/services/mongodb/data/config --port 20000 --logpath /home/services/mongodb/data/config.log --logappend --fork --bind_ip 192.168.88.191 slave2 [root@slave2 ~]# mkdir -p /home/services/mongodb/data/config [root@slave2 ~]# /home/services/mongodb//bin/mongod --configsvr --dbpath /home/services/mongodb/data/config --port 20000 --logpath /home/services/mongodb/data/config.log --logappend --fork --bind_ip 192.168.88.192 slave3 [root@slave3 ~]# mkdir -p /home/services/mongodb/data/config [root@slave3 ~]# /home/services/mongodb//bin/mongod --configsvr --dbpath /home/services/mongodb/data/config --port 20000 --logpath /home/services/mongodb/data/config.log --logappend --fork --bind_ip 192.168.88.194

5)配置mongs

在三臺機器上分別執行:
slave1
[root@slave1 ~]# /home/services/mongodb/bin/mongos --configdb 192.168.88.191:20000,192.168.88.192:20000,192.168.88.194:20000 --port 27017 --chunkSize 5 --logpath /home/services/mongodb/data/mongos.log --logappend --fork --bind_ip 192.168.88.191
  
slave2
[root@slave2 ~]# /home/services/mongodb/bin/mongos --configdb 192.168.88.191:20000,192.168.88.192:20000,192.168.88.194:20000 --port 27017 --chunkSize 5 --logpath /home/services/mongodb/data/mongos.log --logappend --fork
--bind_ip 192.168.88.192
slave3 [root@slave3 ~]# /home/services/mongodb/bin/mongos --configdb 192.168.88.191:20000,192.168.88.192:20000,192.168.88.194:20000 --port 27017 --chunkSize 5 --logpath /home/services/mongodb/data/mongos.log --logappend --fork
--bind_ip 192.168.88.194
注意:新版版的mongodb的mongos命令裡就不識別--chunkSize引數了
報錯資訊:

--logpath /home/services/mongodb/data/mongos.log --logappend --fork --bind_ip 192.168.88.192
FailedToParse: mirrored config server connections are not supported; for config server replica sets be sure to use the replica set connection string
try '/home/services/mongodb/bin/mongos --help' for more information

需要先配置副本集

待續