一、分片
分片是一種跨多臺機器分發(fā)數(shù)據(jù)的方法。MongoDB使用分片來支持具有非常大的數(shù)據(jù)集和高吞吐量操作的部署。
問題:
具有大型數(shù)據(jù)集或高吞吐量應用程序的數(shù)據(jù)庫系統(tǒng)可能會挑戰(zhàn)單個服務器的容量。例如,高查詢率會耗盡服務器的CPU容量。工作集大小大于系統(tǒng)的RAM會強調(diào)磁盤驅(qū)動器的I / O容量。
解決系統(tǒng)增長的方法有兩種:垂直和水平縮放。
垂直擴展涉及增加單個服務器的容量,例如使用更強大的CPU,添加更多RAM或增加存儲空間量??捎眉夹g(shù)的局限性可能會限制單個機器對于給定工作負載而言足夠強大。此外,基于云的提供商基于可用的硬件配置具有硬性上限。結(jié)果,垂直縮放有實際的大值。
水平擴展涉及劃分系統(tǒng)數(shù)據(jù)集并加載多個服務器,添加其他服務器以根據(jù)需要增加容量。雖然單個機器的總體速度或容量可能不高,但每臺機器處理整個工作負載的子集,可能提供比單個高速大容量服務器更高的效率。擴展部署容量只需要根據(jù)需要添加額外的服務器,這可能比單個機器的高端硬件的總體成本更低。權(quán)衡是基礎(chǔ)架構(gòu)和部署維護的復雜性增加。
MongoDB支持通過分片進行水平擴展
二、分片集群概述
MongoDB分片群集包含以下組件:
分片:是一個獨立普通的mongod進程,保存數(shù)據(jù)信息??梢允且粋€副本集也可以是單獨的一臺服務器。
mongos:起到一個路由的功能,供程序連接。本身不保存數(shù)據(jù),在啟動時從配置服務器加載集群信息,開啟mongos進程需要知道配置服務器的地址,指定configdb選項。
配置服務器:是一個獨立的mongod進程,保存集群和分片的元數(shù)據(jù),即各分片包含了哪些數(shù)據(jù)的信息。最先開始建立,啟用日志功能。像啟動普通的mongod一樣啟動配置服務器,指定configsvr選項。不需要太多的空間和資源,配置服務器的1KB空間相當于真是數(shù)據(jù)的200MB。保存的只是數(shù)據(jù)的分布表。當服務不可用,則變成只讀,無法分塊、遷移數(shù)據(jù)。
交互圖如下:
MongoDB在集合級別對數(shù)據(jù)進行分片,將集合數(shù)據(jù)分布在集群中的分片上。
1、鎖片鍵
為了在集合中分發(fā)文檔,MongoDB 使用分片鍵對集合進行分區(qū)。分片鍵 由目標集合中每個文檔中存在的不可變字段組成。
在分片集合時選擇分片鍵。分片后無法更改分片鍵的選擇。分片集合只能有一個分片 鍵。要對非空集合進行分片,集合必須具有 以分片鍵開頭的索引。對于空集合,如果集合尚未具有指定分片鍵的適當索引,MongoDB將創(chuàng)建索引。
分片鍵的選擇會影響分片群集的性能,效率和可伸縮性。具有最佳硬件和基礎(chǔ)結(jié)構(gòu)的群集可能會因選擇分片鍵而受到瓶頸。選擇分片鍵及其支持索引也會影響群集可以使用的分片策略。
2、大塊
MongoDB將分片數(shù)據(jù)劃分為塊。每個塊都具有基于分片鍵的包含較低且獨占的較高范圍 。
3、平衡器和偶數(shù)塊分配
為了在群集中的所有分片上實現(xiàn)塊的均勻分布,平衡器在后臺運行以跨分片遷移塊。
4、Sharding的優(yōu)點
(1)讀寫
MongoDB的分布在整個的讀寫工作量 碎片將在分片集群,使每個碎片來處理群集操作的一個子集。通過添加更多分片,可以在群集中水平擴展讀取和寫入工作負載。
對于包含分片鍵或復合分片鍵前綴mongos的查詢,可以在特定分片或分片集上定位查詢。這些目標操作通常比向群集中的每個分片廣播更有效 。
(2)存儲容量
拆分分配整個數(shù)據(jù)碎片集群中,允許每個碎片以包含總簇數(shù)據(jù)的子集。隨著數(shù)據(jù)集的增長,額外的分片會增加群集的存儲容量。
(3)高可用性
分片簇可以繼續(xù)執(zhí)行,即使一個或多個碎片是不可用的部分讀/寫操作。雖然在停機期間無法訪問不可用分片上的數(shù)據(jù)子集,但是針對可用分片的讀取或?qū)懭肴匀豢梢猿晒Α?/p>
備注:
(1)從MongoDB 3.2開始,您可以將配置服務器部署為副本集。只要大多數(shù)副本集可用,具有配置服務器副本集(CSRS)的分片群集就可以繼續(xù)處理讀取和寫入。
(2)在3.4版本中,MongoDB 刪除了對SCCC配置服務器的支持。
(3)在生產(chǎn)環(huán)境中,應將各個分片部署為 副本集,從而提供更高的冗余和可用性。
5、分片集群注意事項
(1)分片集群基礎(chǔ)架構(gòu)要求和復雜性需要仔細規(guī)劃,執(zhí)行和維護。
(2)選擇分片密鑰時需要認真考慮,以確保集群性能和效率。分片后不能更改分片鍵,也不能取消分片分片。
(3)Sharding具有一定的操作要求和限制。
(4)如果查詢不包括分片鍵或復合分片鍵的前綴 ,則mongos執(zhí)行廣播操作,查詢分 片群集中的所有分片。這些分散/收集查詢可以是長時間運行的操作。
6、分片策略
MongoDB支持兩種分片策略,用于跨分片群集分發(fā)數(shù)據(jù)。
(1)散列分片
散列分片涉及計算分片鍵字段值的散列。然后,基于散列的分片鍵值為每個塊分配一個范圍。
(2)遠程分片
遠程分片涉及基于分片鍵值將數(shù)據(jù)劃分為范圍。然后根據(jù)分片鍵值為每個塊分配一個范圍
7、 MongoDB Sharding Cluster角色
(1) Shard Server
即存儲實際數(shù)據(jù)的分片每個Shard 可以是一個mongod 實例也可以是一組mongod 實例
構(gòu)成的Replica Set。為了實現(xiàn)每個Shard 內(nèi)部的auto-failoverMongoDB 官方建議每個Shard
為一組Replica Set。
(2)Config Server
為了將一個特定的collection 存儲在多個shard 中需要為該collection 指定一個shard key
例如{age: 1} shard key 可以決定該條記錄屬于哪個chunk。Config Servers 就是用來存儲
所有shard 節(jié)點的配置信息、每個chunk 的shard key 范圍、chunk 在各shard 的分布情況、
該集群中所有DB 和collection 的sharding 配置信息。
(3)Route Process
這是一個前端路由客戶端由此接入然后詢問Config Servers 需要到哪個Shard 上查詢或
保存記錄再連接相應的Shard 進行操作最后將結(jié)果返回給客戶端??蛻舳酥恍枰獙⒃?/p>
發(fā)給mongod 的查詢或更新請求原封不動地發(fā)給Routing Process而不必關(guān)心所操作的記錄
存儲在哪個Shard 上。
三、分配集群搭建
1、環(huán)境準備
(1)、數(shù)據(jù)庫環(huán)境
主機名 | 數(shù)據(jù)庫IP地址 | 數(shù)據(jù)庫版本 | 用途 | 系統(tǒng) |
SQL_mongdb | 172.169.18.128 | mongodb4.0.3 | 配置3,路由1,分片2 | cenots7.4 |
node01 | 172.169.18.162 | mongodb4.0.3 | 路由1,分片2 | centos7.4 |
node01 | 172.169.18.180 | mongodb4.0.3 | 分片2 | centos7.4 |
(2)暫時關(guān)閉防火墻和seliunx,測試完畢再開啟安全規(guī)則
(3)yum安裝mongdb4.0版本(省略)
同樣的,在node01和node02上安裝服務
在部署之前先明白片鍵的意義,一個好的片鍵對分片至關(guān)重要。片鍵必須是一個索引,數(shù)據(jù)根據(jù)這個片鍵進行拆分分散。通過sh.shardCollection加會自動創(chuàng)建索引。一個自增的片鍵對寫入和數(shù)據(jù)均勻分布就不是很好,因為自增的片鍵總會在一個分片上寫入,后續(xù)達到某個閥值可能會寫到別的分片。但是按照片鍵查詢會非常高效。隨機片鍵對數(shù)據(jù)的均勻分布效果很好。注意盡量避免在多個分片上進行查詢。在所有分片上查詢,mongos會對結(jié)果進行歸并排序。
(4)
框架圖
2、配置服務器的啟動。(SQL_mongdb上開啟3個,Port:21000、22000、2300)
備注:配置服務器必須開啟1個或則3個,開啟2個則會報錯:
(1)創(chuàng)建目錄
[root@SQL_mongdb /]# mkdir -p /opt/mongodb/date1
[root@SQL_mongdb /]# mkdir -p /opt/mongodb/date2
[root@SQL_mongdb /]# mkdir -p /opt/mongodb/date3
(2)新建配置文件
[root@SQL_mongdb ~]# cat /etc/mongodb_21000.conf
#數(shù)據(jù)目錄
dbpath=/opt/mongodb/date1/
#日志文件
logpath=/opt/mongodb/mongodb_21000.log
#日志追加
logappend=true
#端口
port = 21000
#大連接數(shù)
maxConns = 50
pidfilepath = /opt/mongodb/mongo_21000.pid
#日志,redo log
journal = true
#刷寫提交機制
journalCommitInterval = 200
#守護進程模式
fork = true
#刷寫數(shù)據(jù)到日志的頻率
syncdelay = 60
#storageEngine = wiredTiger
#操作日志,單位M
oplogSize = 1000
#命名空間的文件大小,默認16M,大2G。
nssize = 16
noauth = true
unixSocketPrefix = /tmp
configsvr = true
replSet=jiangjj
bind_ip = 172.169.18.128
[root@SQL_mongdb ~]# cat /etc/mongodb_22000.conf
#數(shù)據(jù)目錄
dbpath= /opt/mongodb/date2/
#日志文件
logpath= /opt/mongodb/mongodb_22000.log
#日志追加
logappend=true
#端口
port = 22000
#大連接數(shù)
maxConns = 50
pidfilepath = /opt/mongodb/mongo_22000.pid
#日志,redo log
journal = true
#刷寫提交機制
journalCommitInterval = 200
#守護進程模式
fork = true
#刷寫數(shù)據(jù)到日志的頻率
syncdelay = 60
#storageEngine = wiredTiger
#操作日志,單位M
oplogSize = 1000
#命名空間的文件大小,默認16M,大2G。
nssize = 16
noauth = true
unixSocketPrefix = /tmp
configsvr = true
replSet=jiangjj
bind_ip = 172.169.18.128
[root@SQL_mongdb ~]# cat /etc/mongodb_23000.conf
#數(shù)據(jù)目錄
dbpath= /opt/mongodb/date3/
#日志文件
logpath= /opt/mongodb/mongodb_23000.log
#日志追加
logappend=true
#端口
port = 23000
#大連接數(shù)
maxConns = 50
pidfilepath = /opt/mongodb/mongo_23000.pid
#日志,redo log
journal = true
#刷寫提交機制
journalCommitInterval = 200
#守護進程模式
fork = true
#刷寫數(shù)據(jù)到日志的頻率
syncdelay = 60
#storageEngine = wiredTiger
#操作日志,單位M
oplogSize = 1000
#命名空間的文件大小,默認16M,大2G。
nssize = 16
noauth = true
unixSocketPrefix = /tmp
configsvr = true
replSet=jiangjj
bind_ip = 172.169.18.128
(3)啟動配置文件(實例進程)
[root@SQL_mongdb ~]# mongod -f /etc/mongodb_21000.conf
[root@SQL_mongdb ~]# mongod -f /etc/mongodb_22000.conf
[root@SQL_mongdb ~]# mongod -f /etc/mongodb_23000.conf
備注:
關(guān)閉進程服務
# mongod -f /etc/mongodb_21000.conf --shutdown
如果非正常訪問,重新啟動會報錯,必須要刪除mongd.lock后才能啟動成功。
(4)將節(jié)點配置組成集群(副本集)
在任意節(jié)點啟動配置,這里使用SQL_jiangjj節(jié)點
登錄數(shù)據(jù)庫
[root@SQL_mongdb ~]# mongo --host 172.169.18.128:21000
> use admin
> cfg={ _id:"jiangjj",members:[{_id:0,host:'172.169.18.128:21000',priority:3},{_id:1,host:'172.169.18.128:22000',priority:2},{_id:2,host:'172.169.18.128:23000',priority:1}] };
#配置生效命令
> rs.initiate(cfg)
3、路由配置(在SQL_mongodb和node01上各開啟1個,port:3000)
路由服務器不保存數(shù)據(jù),把日志記錄一下即可
(1)在SQL_mongodb上新增配置文件
[root@SQL_mongdb ~]# vim /etc/mongodb_30000.conf
#日志文件
logpath = /opt/mongodb/mongodb_route.log
#日志追加
logappend = true
#端口
port = 30000
#大連接數(shù)
maxConns = 20000
#chunkSize=1
#綁定地址
bind_ip = 0.0.0.0
pidfilepath = /opt/mongodb/mongo_30000.pid
#必須是1個或則3個配置
configdb = jiangjj/172.169.18.128:21000,172.169.18.128:22000,172.169.18.128:23000
#configdb=127.0.0.1:20000 #報錯
#守護進程模式
fork = true
(2)開啟mongos
[root@SQL_mongdb ~]# mongos -f /etc/mongodb_30000.conf
(3)配置一個普通分片文件
查看狀態(tài)
按照上面的方法再到node01上開啟分片服務和路由服務(配置文件一樣),以及在node02上開啟分片服務。到此分片的配置服務器、路由服務器、分片服務器都已經(jīng)部署完成。
備注:分片其中一個配置,其他的類似
[root@node01 etc]# vim mongodb_60000.conf
#mongodb
dbpath=/opt/mongodb/date2/
logpath=/opt/mongodb_60000.log
pidfilepath=/opt/mongodb/mongodb_60000.pid
directoryperdb=true
logappend=true
bind_ip=172.169.18.162
port=60000
oplogSize=100
fork=true
noprealloc=true
4、配置分片:下面的操作都是在mongodb的命令行里執(zhí)行
(1)登陸路由服務器mongos 操作:
[root@SQL_mongdb ~]# mongo --port=30000
mongos> use admin
mongos> db.runCommand({addshard:'172.169.18.128:60000'})
mongos> db.runCommand({addshard:'172.169.18.162:60000'})
mongos> db.runCommand({addshard:'172.169.18.180:60000'})
#查看
mongos> sh.status()
(2)開啟分片功能:sh.enableSharding("庫名")、sh.shardCollection("庫名.集合名",{"key":1})
mongos> sh.enableSharding('jiangjj')
mongos> sh.status()
mongos> sh.shardCollection("jiangjj.text",{"name":1})
報錯如下:
Cannot accept sharding commands if not started with --shardsvr
在分片配置文件中加入如下參數(shù):
shardsvr = true
重啟進程后執(zhí)行上面的命令
查看:mongos> sh.status()
查看詳細信息:
mongos> sh.status({"verbose":1})
或則
mongos> db.printShardingStatus("vvvv")
或則
mongos> printShardingStatus(db.getSisterDB("config"),1)
#判斷是否是Sharding
5、測試查看
1、在路由Mongos端添加數(shù)據(jù)庫和數(shù)據(jù),如此
2、添加的數(shù)據(jù)庫分配到不聽的分片節(jié)點上
備注:這里我們做的都是單點的,要是一個分片壞了,則數(shù)據(jù)會丟失,我們可以利用副本集減少災難
四、高可用:Sharding+Replset
1、在三個節(jié)點各自添加一個分片,port:50000,name:user01
其中一個集群分片,根據(jù)實際情況修改調(diào)整
#mongodb
dbpath=/opt/mongodb/date1/
logpath=/opt/mongodb_50000.log
pidfilepath=/opt/mongodb/mongodb_50000.pid
#keyFile=/opt/mongodb/mongodb.key //節(jié)點間用戶驗證文件,內(nèi)容必須一致,權(quán)限600,僅副本集模式有效
directoryperdb=true
logappend=true
replSet=user01
bind_ip=172.169.18.162
port=50000
#auth=true
oplogSize=100
fork=true
noprealloc=true
#maxConns=4000
shardsvr = true
2、將分片設置成副本集
登錄數(shù)據(jù)庫
[root@SQL ~]# mongo --host 172.169.18.128:50000
> use admin
> user01db={ _id:"user01",members:[{_id:0,host:'172.169.18.128:50000',priority:3},{_id:1,host:'172.169.18.162:50000',priority:2},{_id:2,host:'172.169.18.180:50000',priority:1}] };
#配置生效命令
> rs.initiate(user01db)
3、配置路由節(jié)點
[root@SQL_mongdb ~]# mongo --port=30000
切換到admin庫
mongos> use admin
#添加分片節(jié)點
mongos> sh.addShard("user01/172.169.18.128:50000")
備注:
#也可以直接在路由節(jié)點添加副本集
mongos>sh.addShard("user01/172.169.18.128:50000,172.169.18.162:50000,172.169.18.180:50000")
#查看集群信息
mongos> sh.status()
補充說明:均衡器
均衡器:均衡器負責數(shù)據(jù)遷移,周期性的檢查分片是否存在不均衡,如果不存在則會開始塊的遷移,config.locks集合里的state表示均衡器是否找正在運行,0表示非活動狀態(tài),2表示正在均衡。均衡遷移數(shù)據(jù)的過程會增加系統(tǒng)的負載:目標分片必須查詢源分片的所有文檔,將文檔插入目標分片中,再清除源分片的數(shù)據(jù)??梢躁P(guān)閉均衡器(不建議):關(guān)閉會導致各分片數(shù)據(jù)分布不均衡,磁盤空間得不到有效的利用。
查看狀態(tài):mongos> sh.getBalancerState()
關(guān)閉命令:mongos> sh.stopBalancer()
開啟命令:mongos> sh.setBalancerState(true)
4、在Mongos添加兩個數(shù)據(jù)庫user01和user02,添加數(shù)據(jù)測試副本集
分配在不同的分片節(jié)點上,查看的數(shù)據(jù)不同
5、分片數(shù)據(jù)庫遷移,刪除分片
刪除分片時,必須確保該分片上的數(shù)據(jù)被移動到其他分片中,對于以分片的集合,使用均衡器來遷移數(shù)據(jù)塊,對于非分片的集合,必須修改集合的主分片。
1)將shard0001分片上的數(shù)據(jù)庫jiangjj04遷移到user01集合分片上
mongos> use admin
mongos> db.runCommand({moveprimary:"jiangjj04",to:"user01"})
如下:
2、刪除分片:
#需要到admin下面刪除(需要執(zhí)行兩次)
mongos> db.runCommand({"removeshard":"jiangjj01"})
注意:MongoDB的分片不能刪除最后一個,否則報如下錯誤
3、刪除分片上的數(shù)據(jù)庫
mongos> use jsqdb
mongos> db.dropDatabase()
三、集群用戶驗證設置
1、創(chuàng)建驗證秘鑰文件
keyFile文件的作用: 集群之間的安全認證,增加安全認證機制KeyFile(開啟keyfile認證就默認開啟了auth認證了,為了保證后面可以登錄,我已創(chuàng)建了用戶)
# cd /opt/mongodb/
# touch .keyFile
# chmod 600 .keyFile
# openssl rand -base64 102 > .keyFile
102:是文件大小
注意:創(chuàng)建keyFile前,需要先停掉副本集中所有主從節(jié)點的mongod服務,然后再創(chuàng)建,否則有可能出現(xiàn)服務啟動不了的情況。
2、在Mongos節(jié)點添加root賬號
mongos> use admin
mongos> db.createUser({
... user:'root',
... pwd:'123456',
... roles:[{role:'root',db:'admin'}]
... })
3、更新所有配置、分片節(jié)點配置文件,在路由配置文件只配置keyFile參數(shù)即可
keyFile=/home/data/.keyFile
auth=true
4、啟動副本集,測試
登錄驗證
root用戶
現(xiàn)在只有兩個路由節(jié)點端口30000有權(quán)訪問數(shù)據(jù)庫,其他節(jié)點訪問如下圖報錯信息
在mongos節(jié)點給jiangjj01配置用戶
添加一個jiangjj用戶擁有讀寫權(quán)限
登錄Mongos節(jié)點驗證成功。
補充知識點:
權(quán)限伸縮
1)如何增加權(quán)限
db.grantRolesToUser(
<user_name>,
[{role:<role_name>,db:<db_name>}])
注意:此方法接受2個參數(shù),而不是兩個對象, 而且如何權(quán)限重復不會覆蓋,新的會增加
例如:
db.grantRolesToUser('roleTest,[{role:'readWrite',db:'test'}])\
2)如何收縮權(quán)限
db.revokeRolesToUser(
<user_name>,
[{role:<role_name>,db:<db_name>}])
權(quán)限配置詳細請參考官方
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
文章題目:mongodb分片概念和原理-實戰(zhàn)分片集群-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://www.rwnh.cn/article18/poigp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、定制網(wǎng)站、手機網(wǎng)站建設、網(wǎng)站內(nèi)鏈、App開發(fā)、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容