0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文詳解MongoDB分片(Sharding)技術(shù)

馬哥Linux運(yùn)維 ? 來(lái)源:cnblogs ? 2024-04-28 10:35 ? 次閱讀

1.1 MongoDB復(fù)制集簡(jiǎn)介

一組Mongodb復(fù)制集,就是一組mongod進(jìn)程,這些進(jìn)程維護(hù)同一個(gè)數(shù)據(jù)集合。復(fù)制集提供了數(shù)據(jù)冗余和高等級(jí)的可靠性,這是生產(chǎn)部署的基礎(chǔ)。

1.1.1 復(fù)制集的目的

保證數(shù)據(jù)在生產(chǎn)部署時(shí)的冗余和可靠性,通過(guò)在不同的機(jī)器上保存副本來(lái)保證數(shù)據(jù)的不會(huì)因?yàn)閱吸c(diǎn)損壞而丟失。能夠隨時(shí)應(yīng)對(duì)數(shù)據(jù)丟失、機(jī)器損壞帶來(lái)的風(fēng)險(xiǎn)。

換一句話(huà)來(lái)說(shuō),還能提高讀取能力,用戶(hù)的讀取服務(wù)器和寫(xiě)入服務(wù)器在不同的地方,而且,由不同的服務(wù)器為不同的用戶(hù)提供服務(wù),提高整個(gè)系統(tǒng)的負(fù)載。

1.1.2 簡(jiǎn)單介紹

一組復(fù)制集就是一組mongod實(shí)例掌管同一個(gè)數(shù)據(jù)集,實(shí)例可以在不同的機(jī)器上面。實(shí)例中包含一個(gè)主導(dǎo),接受客戶(hù)端所有的寫(xiě)入操作,其他都是副本實(shí)例,從主服務(wù)器上獲得數(shù)據(jù)并保持同步。

主服務(wù)器很重要,包含了所有的改變操作(寫(xiě))的日志。但是副本服務(wù)器集群包含有所有的主服務(wù)器數(shù)據(jù),因此當(dāng)主服務(wù)器掛掉了,就會(huì)在副本服務(wù)器上重新選取一個(gè)成為主服務(wù)器。

每個(gè)復(fù)制集還有一個(gè)仲裁者,仲裁者不存儲(chǔ)數(shù)據(jù),只是負(fù)責(zé)通過(guò)心跳包來(lái)確認(rèn)集群中集合的數(shù)量,并在主服務(wù)器選舉的時(shí)候作為仲裁決定結(jié)果。

1.2 復(fù)制的基本架構(gòu)

基本的架構(gòu)由3臺(tái)服務(wù)器組成,一個(gè)三成員的復(fù)制集,由三個(gè)有數(shù)據(jù),或者兩個(gè)有數(shù)據(jù),一個(gè)作為仲裁者。

1.2.1 三個(gè)存儲(chǔ)數(shù)據(jù)的復(fù)制集

具有三個(gè)存儲(chǔ)數(shù)據(jù)的成員的復(fù)制集有:

一個(gè)主庫(kù);

兩個(gè)從庫(kù)組成,主庫(kù)宕機(jī)時(shí),這兩個(gè)從庫(kù)都可以被選為主庫(kù)。

3db1a4e6-049a-11ef-a297-92fbcf53809c.png

當(dāng)主庫(kù)宕機(jī)后,兩個(gè)從庫(kù)都會(huì)進(jìn)行競(jìng)選,其中一個(gè)變?yōu)橹鲙?kù),當(dāng)原主庫(kù)恢復(fù)后,作為從庫(kù)加入當(dāng)前的復(fù)制集群即可。

3dd6296a-049a-11ef-a297-92fbcf53809c.png

1.2.2 當(dāng)存在arbiter節(jié)點(diǎn)

在三個(gè)成員的復(fù)制集中,有兩個(gè)正常的主從,及一臺(tái)arbiter節(jié)點(diǎn):

一個(gè)主庫(kù)

一個(gè)從庫(kù),可以在選舉中成為主庫(kù)

一個(gè)aribiter節(jié)點(diǎn),在選舉中,只進(jìn)行投票,不能成為主庫(kù)

3dfe8db0-049a-11ef-a297-92fbcf53809c.png

說(shuō)明:

由于arbiter節(jié)點(diǎn)沒(méi)有復(fù)制數(shù)據(jù),因此這個(gè)架構(gòu)中僅提供一個(gè)完整的數(shù)據(jù)副本。arbiter節(jié)點(diǎn)只需要更少的資源,代價(jià)是更有限的冗余和容錯(cuò)。

當(dāng)主庫(kù)宕機(jī)時(shí),將會(huì)選擇從庫(kù)成為主,主庫(kù)修復(fù)后,將其加入到現(xiàn)有的復(fù)制集群中即可。

3e19a758-049a-11ef-a297-92fbcf53809c.png

1.2.3 Primary選舉

復(fù)制集通過(guò)replSetInitiate命令(或mongo shell的rs.initiate())進(jìn)行初始化,初始化后各個(gè)成員間開(kāi)始發(fā)送心跳消息,并發(fā)起Priamry選舉操作,獲得『大多數(shù)』成員投票支持的節(jié)點(diǎn),會(huì)成為Primary,其余節(jié)點(diǎn)成為Secondary。

『大多數(shù)』的定義

假設(shè)復(fù)制集內(nèi)投票成員(后續(xù)介紹)數(shù)量為N,則大多數(shù)為 N/2 + 1,當(dāng)復(fù)制集內(nèi)存活成員數(shù)量不足大多數(shù)時(shí),整個(gè)復(fù)制集將無(wú)法選舉出Primary,復(fù)制集將無(wú)法提供寫(xiě)服務(wù),處于只讀狀態(tài)。

投票成員數(shù) 大多數(shù) 容忍失效數(shù)
1 1 0
2 2 0
3 2 1
4 3 1
5 3 2
6 4 2
7 4 3

通常建議將復(fù)制集成員數(shù)量設(shè)置為奇數(shù),從上表可以看出3個(gè)節(jié)點(diǎn)和4個(gè)節(jié)點(diǎn)的復(fù)制集都只能容忍1個(gè)節(jié)點(diǎn)失效,從『服務(wù)可用性』的角度看,其效果是一樣的。(但無(wú)疑4個(gè)節(jié)點(diǎn)能提供更可靠的數(shù)據(jù)存儲(chǔ))

1.3 復(fù)制集中成員說(shuō)明

1.3.1 所有成員說(shuō)明

成員 說(shuō)明
Secondary 正常情況下,復(fù)制集的Seconary會(huì)參與Primary選舉(自身也可能會(huì)被選為Primary),并從Primary同步最新寫(xiě)入的數(shù)據(jù),以保證與Primary存儲(chǔ)相同的數(shù)據(jù)。
Secondary可以提供讀服務(wù),增加Secondary節(jié)點(diǎn)可以提供復(fù)制集的讀服務(wù)能力,同時(shí)提升復(fù)制集的可用性。另外,Mongodb支持對(duì)復(fù)制集的Secondary節(jié)點(diǎn)進(jìn)行靈活的配置,以適應(yīng)多種場(chǎng)景的需求。
Arbiter Arbiter節(jié)點(diǎn)只參與投票,不能被選為Primary,并且不從Primary同步數(shù)據(jù)。
比如你部署了一個(gè)2個(gè)節(jié)點(diǎn)的復(fù)制集,1個(gè)Primary,1個(gè)Secondary,任意節(jié)點(diǎn)宕機(jī),復(fù)制集將不能提供服務(wù)了(無(wú)法選出Primary),這時(shí)可以給復(fù)制集添加一個(gè)Arbiter節(jié)點(diǎn),即使有節(jié)點(diǎn)宕機(jī),仍能選出Primary。
Arbiter本身不存儲(chǔ)數(shù)據(jù),是非常輕量級(jí)的服務(wù),當(dāng)復(fù)制集成員為偶數(shù)時(shí),最好加入一個(gè)Arbiter節(jié)點(diǎn),以提升復(fù)制集可用性。
Priority0 Priority0節(jié)點(diǎn)的選舉優(yōu)先級(jí)為0,不會(huì)被選舉為Primary
比如你跨機(jī)房A、B部署了一個(gè)復(fù)制集,并且想指定Primary必須在A機(jī)房,這時(shí)可以將B機(jī)房的復(fù)制集成員Priority設(shè)置為0,這樣Primary就一定會(huì)是A機(jī)房的成員。
(注意:如果這樣部署,最好將『大多數(shù)』節(jié)點(diǎn)部署在A機(jī)房,否則網(wǎng)絡(luò)分區(qū)時(shí)可能無(wú)法選出Primary)
Vote0 Mongodb 3.0里,復(fù)制集成員最多50個(gè),參與Primary選舉投票的成員最多7個(gè),其他成員(Vote0)的vote屬性必須設(shè)置為0,即不參與投票。
Hidden Hidden節(jié)點(diǎn)不能被選為主(Priority為0),并且對(duì)Driver不可見(jiàn)。因Hidden節(jié)點(diǎn)不會(huì)接受Driver的請(qǐng)求,可使用Hidden節(jié)點(diǎn)做一些數(shù)據(jù)備份、離線(xiàn)計(jì)算的任務(wù),不會(huì)影響復(fù)制集的服務(wù)。
Delayed Delayed節(jié)點(diǎn)必須是Hidden節(jié)點(diǎn),并且其數(shù)據(jù)落后與Primary一段時(shí)間(可配置,比如1個(gè)小時(shí))。
因Delayed節(jié)點(diǎn)的數(shù)據(jù)比Primary落后一段時(shí)間,當(dāng)錯(cuò)誤或者無(wú)效的數(shù)據(jù)寫(xiě)入Primary時(shí),可通過(guò)Delayed節(jié)點(diǎn)的數(shù)據(jù)來(lái)恢復(fù)到之前的時(shí)間點(diǎn)。

1.3.2 Priority 0節(jié)點(diǎn)

作為一個(gè)輔助可以作為一個(gè)備用。在一些復(fù)制集中,可能無(wú)法在合理的時(shí)間內(nèi)添加新成員的時(shí)候。備用成員保持?jǐn)?shù)據(jù)的當(dāng)前最新數(shù)據(jù)能夠替換不可用的成員。

3e2c6780-049a-11ef-a297-92fbcf53809c.png

1.3.3 Hidden 節(jié)點(diǎn)(隱藏節(jié)點(diǎn))

客戶(hù)端將不會(huì)把讀請(qǐng)求分發(fā)到隱藏節(jié)點(diǎn)上,即使我們?cè)O(shè)定了 復(fù)制集讀選項(xiàng) 。

這些隱藏節(jié)點(diǎn)將不會(huì)收到來(lái)自應(yīng)用程序的請(qǐng)求。我們可以將隱藏節(jié)點(diǎn)專(zhuān)用于報(bào)表節(jié)點(diǎn)或是備份節(jié)點(diǎn)。 延時(shí)節(jié)點(diǎn)也應(yīng)該是一個(gè)隱藏節(jié)點(diǎn)。

3e3e6e6c-049a-11ef-a297-92fbcf53809c.png

1.3.4 Delayed 節(jié)點(diǎn)(延時(shí)節(jié)點(diǎn))

延時(shí)節(jié)點(diǎn)的數(shù)據(jù)集是延時(shí)的,因此它可以幫助我們?cè)谌藶檎`操作或是其他意外情況下恢復(fù)數(shù)據(jù)。

舉個(gè)例子,當(dāng)應(yīng)用升級(jí)失敗,或是誤操作刪除了表和數(shù)據(jù)庫(kù)時(shí),我們可以通過(guò)延時(shí)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)恢復(fù)。

3e4da7d8-049a-11ef-a297-92fbcf53809c.png

1.4 配置MongoDB復(fù)制集

1.4.1 環(huán)境說(shuō)明

系統(tǒng)環(huán)境說(shuō)明:

[root@MongoDB ~]# cat /etc/redhat-release 
CentOS release 6.9 (Final)
[root@MongoDB ~]# uname -r
2.6.32-696.el6.x86_64
[root@MongoDB ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
[root@MongoDB ~]# getenforce 
Disabled
[root@MongoDB ~]# hostname -I
10.0.0.152 172.16.1.152

軟件版本說(shuō)明

本次使用的mongodb版本為:mongodb-linux-x86_64-3.2.8.tgz

1.4.2 前期準(zhǔn)備,在root用戶(hù)下操作

本次復(fù)制集復(fù)制采用Mongodb多實(shí)例進(jìn)行

所有的操作都基于安裝完成的mongodb服務(wù),詳情參照:http://www.cnblogs.com/clsn/p/8214194.html#_label3


#創(chuàng)建mongod用戶(hù)
    useradd -u800 mongod
    echo 123456|passwd --stdin mongod 
# 安裝mongodb
    mkdir -p /mongodb/bin
 cd  /mongodb
 wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.8.tgz
    tar xf  mongodb-linux-x86_64-3.2.8.tgz
    cd mongodb-linux-x86_64-3.2.8/bin/ &&
    cp * /mongodb/bin
    chown -R mongod.mongod /mongodb
# 切換到mongod用戶(hù)進(jìn)行后續(xù)操作
    su - mongod

1.4.3 創(chuàng)建所需目錄


for  i in 28017 28018 28019 28020
    do 
      mkdir -p /mongodb/$i/conf  
      mkdir -p /mongodb/$i/data  
      mkdir -p /mongodb/$i/log
done 

1.4.4 配置多實(shí)例環(huán)境

編輯第一個(gè)實(shí)例配置文件


cat >>/mongodb/28017/conf/mongod.conf<<'EOF'
systemLog:
  destination: file
  path: /mongodb/28017/log/mongodb.log
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /mongodb/28017/data
  directoryPerDB: true
  #engine: wiredTiger
  wiredTiger:
    engineConfig:
      # cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
processManagement:
  fork: true
net:
  port: 28017
replication:
  oplogSizeMB: 2048
  replSetName: my_repl
EOF

復(fù)制配置文件


for i in 28018 28019 28020
  do  
   cp  /mongodb/28017/conf/mongod.conf  /mongodb/$i/conf/
done

修改配置文件


for i in 28018 28019 28020
  do 
    sed  -i  "s#28017#$i#g" /mongodb/$i/conf/mongod.conf
done

啟動(dòng)服務(wù)


for i in 28017 28018 28019 28020
  do  
    mongod -f /mongodb/$i/conf/mongod.conf 
done

# 關(guān)閉服務(wù)的方法


for i in 28017 28018 28019 28020
   do  
     mongod --shutdown  -f /mongodb/$i/conf/mongod.conf 
done

1.4.5 配置復(fù)制集

登陸數(shù)據(jù)庫(kù),配置mongodb復(fù)制

shell> mongo --port 28017


config = {_id: 'my_repl', members: [
                          {_id: 0, host: '10.0.0.152:28017'},
                          {_id: 1, host: '10.0.0.152:28018'},
                          {_id: 2, host: '10.0.0.152:28019'}]
          }

初始化這個(gè)配置


> rs.initiate(config)
 到此復(fù)制集配置完成

1.4.6 測(cè)試主從復(fù)制

在主節(jié)點(diǎn)插入數(shù)據(jù)

my_repl:PRIMARY> db.movies.insert([ { "title" : "Jaws", "year" : 1975, "imdb_rating" : 8.1 },
   { "title" : "Batman", "year" : 1989, "imdb_rating" : 7.6 },
  ] );

在主節(jié)點(diǎn)查看數(shù)據(jù)

my_repl:PRIMARY> db.movies.find().pretty()
{
    "_id" : ObjectId("5a4d9ec184b9b2076686b0ac"),
    "title" : "Jaws",
    "year" : 1975,
    "imdb_rating" : 8.1
}
{
    "_id" : ObjectId("5a4d9ec184b9b2076686b0ad"),
    "title" : "Batman",
    "year" : 1989,
    "imdb_rating" : 7.6
}

注:在mongodb復(fù)制集當(dāng)中,默認(rèn)從庫(kù)不允許讀寫(xiě)。

在從庫(kù)打開(kāi)配置(危險(xiǎn))

注意:嚴(yán)禁在從庫(kù)做任何修改操作

my_repl:SECONDARY> rs.slaveOk()
my_repl:SECONDARY> show tables;
movies
my_repl:SECONDARY> db.movies.find().pretty()
{
    "_id" : ObjectId("5a4d9ec184b9b2076686b0ac"),
    "title" : "Jaws",
    "year" : 1975,
    "imdb_rating" : 8.1
}
{
    "_id" : ObjectId("5a4d9ec184b9b2076686b0ad"),
    "title" : "Batman",
    "year" : 1989,
    "imdb_rating" : 7.6
}

在從庫(kù)查看完成在登陸到主庫(kù)

1.4.7 復(fù)制集管理操作

(1)查看復(fù)制集狀態(tài):

rs.status();     # 查看整體復(fù)制集狀態(tài)
rs.isMaster();   #  查看當(dāng)前是否是主節(jié)點(diǎn)

(2)添加刪除節(jié)點(diǎn)

rs.add("ip:port");     #  新增從節(jié)點(diǎn)
rs.addArb("ip:port"); #  新增仲裁節(jié)點(diǎn)
rs.remove("ip:port"); #  刪除一個(gè)節(jié)點(diǎn)

注:

添加特殊節(jié)點(diǎn)時(shí),

1>可以在搭建過(guò)程中設(shè)置特殊節(jié)點(diǎn)

2>可以通過(guò)修改配置的方式將普通從節(jié)點(diǎn)設(shè)置為特殊節(jié)點(diǎn)

/*找到需要改為延遲性同步的數(shù)組號(hào)*/;

(3)配置延時(shí)節(jié)點(diǎn)(一般延時(shí)節(jié)點(diǎn)也配置成hidden

cfg=rs.conf() 
cfg.members[2].priority=0
cfg.members[2].slaveDelay=120
cfg.members[2].hidden=true

注:這里的2是rs.conf()顯示的順序(除主庫(kù)之外),非ID

重寫(xiě)復(fù)制集配置

rs.reconfig(cfg)   

也可將延時(shí)節(jié)點(diǎn)配置為arbiter節(jié)點(diǎn)

cfg.members[2].arbiterOnly=true

配置成功后,通過(guò)以下命令查詢(xún)配置后的屬性

rs.conf();

1.4.8 副本集其他操作命令

查看副本集的配置信息

my_repl:PRIMARY> rs.config()

查看副本集各成員的狀態(tài)

my_repl:PRIMARY> rs.status()

1.4.8.1副本集角色切換(不要人為隨便操作)


rs.stepDown()
rs.freeze(300)  # 鎖定從,使其不會(huì)轉(zhuǎn)變成主庫(kù),freeze()和stepDown單位都是秒。
rs.slaveOk()    # 設(shè)置副本節(jié)點(diǎn)可讀:在副本節(jié)點(diǎn)執(zhí)行

插入數(shù)據(jù)


> use app
switched to db app
app> db.createCollection('a')
{ "ok" : 0, "errmsg" : "not master", "code" : 10107 }
查看副本節(jié)點(diǎn)
> rs.printSlaveReplicationInfo()
source: 192.168.1.22:27017
    syncedTo: Thu May 26 2016 1056 GMT+0800 (CST)
    0 secs (0 hrs) behind the primary

MongoDB分片(Sharding)技術(shù)

分片(sharding)是MongoDB用來(lái)將大型集合分割到不同服務(wù)器(或者說(shuō)一個(gè)集群)上所采用的方法。盡管分片起源于關(guān)系型數(shù)據(jù)庫(kù)分區(qū),但MongoDB分片完全又是另一回事。

和MySQL分區(qū)方案相比,MongoDB的最大區(qū)別在于它幾乎能自動(dòng)完成所有事情,只要告訴MongoDB要分配數(shù)據(jù),它就能自動(dòng)維護(hù)數(shù)據(jù)在不同服務(wù)器之間的均衡。

2.1 MongoDB分片介紹

2.1.1 分片的目的

高數(shù)據(jù)量和吞吐量的數(shù)據(jù)庫(kù)應(yīng)用會(huì)對(duì)單機(jī)的性能造成較大壓力,大的查詢(xún)量會(huì)將單機(jī)的CPU耗盡,大的數(shù)據(jù)量對(duì)單機(jī)的存儲(chǔ)壓力較大,最終會(huì)耗盡系統(tǒng)的內(nèi)存而將壓力轉(zhuǎn)移到磁盤(pán)IO上。

為了解決這些問(wèn)題,有兩個(gè)基本的方法: 垂直擴(kuò)展和水平擴(kuò)展。

垂直擴(kuò)展:增加更多的CPU和存儲(chǔ)資源來(lái)擴(kuò)展容量。

水平擴(kuò)展:將數(shù)據(jù)集分布在多個(gè)服務(wù)器上。水平擴(kuò)展即分片。

2.1.2 分片設(shè)計(jì)思想

分片為應(yīng)對(duì)高吞吐量與大數(shù)據(jù)量提供了方法。使用分片減少了每個(gè)分片需要處理的請(qǐng)求數(shù),因此,通過(guò)水平擴(kuò)展,集群可以提高自己的存儲(chǔ)容量和吞吐量。舉例來(lái)說(shuō),當(dāng)插入一條數(shù)據(jù)時(shí),應(yīng)用只需要訪問(wèn)存儲(chǔ)這條數(shù)據(jù)的分片.

使用分片減少了每個(gè)分片存儲(chǔ)的數(shù)據(jù)。

例如,如果數(shù)據(jù)庫(kù)1tb的數(shù)據(jù)集,并有4個(gè)分片,然后每個(gè)分片可能僅持有256 GB的數(shù)據(jù)。如果有40個(gè)分片,那么每個(gè)切分可能只有25GB的數(shù)據(jù)。

3e58d0c2-049a-11ef-a297-92fbcf53809c.png

2.1.3 分片機(jī)制提供了如下三種優(yōu)勢(shì)

1.對(duì)集群進(jìn)行抽象,讓集群“不可見(jiàn)”

MongoDB自帶了一個(gè)叫做mongos的專(zhuān)有路由進(jìn)程。mongos就是掌握統(tǒng)一路口的路由器,其會(huì)將客戶(hù)端發(fā)來(lái)的請(qǐng)求準(zhǔn)確無(wú)誤的路由到集群中的一個(gè)或者一組服務(wù)器上,同時(shí)會(huì)把接收到的響應(yīng)拼裝起來(lái)發(fā)回到客戶(hù)端。

2.保證集群總是可讀寫(xiě)

MongoDB通過(guò)多種途徑來(lái)確保集群的可用性和可靠性。將MongoDB的分片和復(fù)制功能結(jié)合使用,在確保數(shù)據(jù)分片到多臺(tái)服務(wù)器的同時(shí),也確保了每分?jǐn)?shù)據(jù)都有相應(yīng)的備份,這樣就可以確保有服務(wù)器換掉時(shí),其他的從庫(kù)可以立即接替壞掉的部分繼續(xù)工作。

3.使集群易于擴(kuò)展

當(dāng)系統(tǒng)需要更多的空間和資源的時(shí)候,MongoDB使我們可以按需方便的擴(kuò)充系統(tǒng)容量。

2.1.4 分片集群架構(gòu)

組件 說(shuō)明
Config Server 存儲(chǔ)集群所有節(jié)點(diǎn)、分片數(shù)據(jù)路由信息。默認(rèn)需要配置3個(gè)Config Server節(jié)點(diǎn)。
Mongos 提供對(duì)外應(yīng)用訪問(wèn),所有操作均通過(guò)mongos執(zhí)行。一般有多個(gè)mongos節(jié)點(diǎn)。數(shù)據(jù)遷移和數(shù)據(jù)自動(dòng)平衡。
Mongod 存儲(chǔ)應(yīng)用數(shù)據(jù)記錄。一般有多個(gè)Mongod節(jié)點(diǎn),達(dá)到數(shù)據(jù)分片目的。

3e75af62-049a-11ef-a297-92fbcf53809c.png

分片集群的構(gòu)造

(1)mongos :數(shù)據(jù)路由,和客戶(hù)端打交道的模塊。mongos本身沒(méi)有任何數(shù)據(jù),他也不知道該怎么處理這數(shù)據(jù),去找config server

(2)config server:所有存、取數(shù)據(jù)的方式,所有shard節(jié)點(diǎn)的信息,分片功能的一些配置信息。可以理解為真實(shí)數(shù)據(jù)的元數(shù)據(jù)。

(3)shard:真正的數(shù)據(jù)存儲(chǔ)位置,以chunk為單位存數(shù)據(jù)。

Mongos本身并不持久化數(shù)據(jù),Sharded cluster所有的元數(shù)據(jù)都會(huì)存儲(chǔ)到Config Server,而用戶(hù)的數(shù)據(jù)會(huì)議分散存儲(chǔ)到各個(gè)shard。Mongos啟動(dòng)后,會(huì)從配置服務(wù)器加載元數(shù)據(jù),開(kāi)始提供服務(wù),將用戶(hù)的請(qǐng)求正確路由到對(duì)應(yīng)的碎片。

Mongos的路由功能

當(dāng)數(shù)據(jù)寫(xiě)入時(shí),MongoDB Cluster根據(jù)分片鍵設(shè)計(jì)寫(xiě)入數(shù)據(jù)。

當(dāng)外部語(yǔ)句發(fā)起數(shù)據(jù)查詢(xún)時(shí),MongoDB根據(jù)數(shù)據(jù)分布自動(dòng)路由至指定節(jié)點(diǎn)返回?cái)?shù)據(jù)。

2.2 集群中數(shù)據(jù)分布

2.2.1 Chunk是什么

在一個(gè)shard server內(nèi)部,MongoDB還是會(huì)把數(shù)據(jù)分為chunks,每個(gè)chunk代表這個(gè)shard server內(nèi)部一部分?jǐn)?shù)據(jù)。chunk的產(chǎn)生,會(huì)有以下兩個(gè)用途:

Splitting當(dāng)一個(gè)chunk的大小超過(guò)配置中的chunk size時(shí),MongoDB的后臺(tái)進(jìn)程會(huì)把這個(gè)chunk切分成更小的chunk,從而避免chunk過(guò)大的情況

Balancing在MongoDB中,balancer是一個(gè)后臺(tái)進(jìn)程,負(fù)責(zé)chunk的遷移,從而均衡各個(gè)shard server的負(fù)載,系統(tǒng)初始1個(gè)chunk,chunk size默認(rèn)值64M,生產(chǎn)庫(kù)上選擇適合業(yè)務(wù)的chunk size是最好的。ongoDB會(huì)自動(dòng)拆分和遷移chunks。

分片集群的數(shù)據(jù)分布(shard節(jié)點(diǎn))

(1)使用chunk來(lái)存儲(chǔ)數(shù)據(jù)

(2)進(jìn)群搭建完成之后,默認(rèn)開(kāi)啟一個(gè)chunk,大小是64M,

(3)存儲(chǔ)需求超過(guò)64M,chunk會(huì)進(jìn)行分裂,如果單位時(shí)間存儲(chǔ)需求很大,設(shè)置更大的chunk

(4)chunk會(huì)被自動(dòng)均衡遷移。

2.2.2 chunksize的選擇

適合業(yè)務(wù)的chunksize是最好的。

chunk的分裂和遷移非常消耗IO資源;chunk分裂的時(shí)機(jī):在插入和更新,讀數(shù)據(jù)不會(huì)分裂。

chunksize的選擇:

小的chunksize:數(shù)據(jù)均衡是遷移速度快,數(shù)據(jù)分布更均勻。數(shù)據(jù)分裂頻繁,路由節(jié)點(diǎn)消耗更多資源。大的chunksize:數(shù)據(jù)分裂少。數(shù)據(jù)塊移動(dòng)集中消耗IO資源。通常100-200M

2.2.3 chunk分裂及遷移

隨著數(shù)據(jù)的增長(zhǎng),其中的數(shù)據(jù)大小超過(guò)了配置的chunk size,默認(rèn)是64M,則這個(gè)chunk就會(huì)分裂成兩個(gè)。數(shù)據(jù)的增長(zhǎng)會(huì)讓chunk分裂得越來(lái)越多。

3e84e266-049a-11ef-a297-92fbcf53809c.png

這時(shí)候,各個(gè)shard 上的chunk數(shù)量就會(huì)不平衡。這時(shí)候,mongos中的一個(gè)組件balancer 就會(huì)執(zhí)行自動(dòng)平衡。把chunk從chunk數(shù)量最多的shard節(jié)點(diǎn)挪動(dòng)到數(shù)量最少的節(jié)點(diǎn)。

3e985620-049a-11ef-a297-92fbcf53809c.png

chunkSize對(duì)分裂及遷移的影響

MongoDB 默認(rèn)的 chunkSize 為64MB,如無(wú)特殊需求,建議保持默認(rèn)值;chunkSize 會(huì)直接影響到 chunk 分裂、遷移的行為。

chunkSize 越小,chunk 分裂及遷移越多,數(shù)據(jù)分布越均衡;反之,chunkSize 越大,chunk 分裂及遷移會(huì)更少,但可能導(dǎo)致數(shù)據(jù)分布不均。

chunkSize 太小,容易出現(xiàn) jumbo chunk(即shardKey 的某個(gè)取值出現(xiàn)頻率很高,這些文檔只能放到一個(gè) chunk 里,無(wú)法再分裂)而無(wú)法遷移;chunkSize 越大,則可能出現(xiàn) chunk 內(nèi)文檔數(shù)太多(chunk 內(nèi)文檔數(shù)不能超過(guò) 250000 )而無(wú)法遷移。

chunk 自動(dòng)分裂只會(huì)在數(shù)據(jù)寫(xiě)入時(shí)觸發(fā),所以如果將 chunkSize 改小,系統(tǒng)需要一定的時(shí)間來(lái)將 chunk 分裂到指定的大小。

chunk 只會(huì)分裂,不會(huì)合并,所以即使將 chunkSize 改大,現(xiàn)有的 chunk 數(shù)量不會(huì)減少,但 chunk 大小會(huì)隨著寫(xiě)入不斷增長(zhǎng),直到達(dá)到目標(biāo)大小。

2.3 數(shù)據(jù)區(qū)分

2.3.1 分片鍵shard key

MongoDB中數(shù)據(jù)的分片是、以集合為基本單位的,集合中的數(shù)據(jù)通過(guò)片鍵(Shard key)被分成多部分。其實(shí)片鍵就是在集合中選一個(gè)鍵,用該鍵的值作為數(shù)據(jù)拆分的依據(jù)。

所以一個(gè)好的片鍵對(duì)分片至關(guān)重要。片鍵必須是一個(gè)索引,通過(guò)sh.shardCollection加會(huì)自動(dòng)創(chuàng)建索引(前提是此集合不存在的情況下)。一個(gè)自增的片鍵對(duì)寫(xiě)入和數(shù)據(jù)均勻分布就不是很好,因?yàn)樽栽龅钠I總會(huì)在一個(gè)分片上寫(xiě)入,后續(xù)達(dá)到某個(gè)閥值可能會(huì)寫(xiě)到別的分片。但是按照片鍵查詢(xún)會(huì)非常高效。

隨機(jī)片鍵對(duì)數(shù)據(jù)的均勻分布效果很好。注意盡量避免在多個(gè)分片上進(jìn)行查詢(xún)。在所有分片上查詢(xún),mongos會(huì)對(duì)結(jié)果進(jìn)行歸并排序。

對(duì)集合進(jìn)行分片時(shí),你需要選擇一個(gè)片鍵,片鍵是每條記錄都必須包含的,且建立了索引的單個(gè)字段或復(fù)合字段,MongoDB按照片鍵將數(shù)據(jù)劃分到不同的數(shù)據(jù)塊中,并將數(shù)據(jù)塊均衡地分布到所有分片中。

為了按照片鍵劃分?jǐn)?shù)據(jù)塊,MongoDB使用基于范圍的分片方式或者 基于哈希的分片方式。

注意:

分片鍵是不可變。

分片鍵必須有索引。

分片鍵大小限制512bytes。

分片鍵用于路由查詢(xún)。

MongoDB不接受已進(jìn)行collection級(jí)分片的collection上插入無(wú)分片

鍵的文檔(也不支持空值插入)

2.3.2 以范圍為基礎(chǔ)的分片Sharded Cluster

Sharded Cluster支持將單個(gè)集合的數(shù)據(jù)分散存儲(chǔ)在多shard上,用戶(hù)可以指定根據(jù)集合內(nèi)文檔的某個(gè)字段即shard key來(lái)進(jìn)行范圍分片(range sharding)。

3eadf066-049a-11ef-a297-92fbcf53809c.png

對(duì)于基于范圍的分片,MongoDB按照片鍵的范圍把數(shù)據(jù)分成不同部分。

假設(shè)有一個(gè)數(shù)字的片鍵:想象一個(gè)從負(fù)無(wú)窮到正無(wú)窮的直線(xiàn),每一個(gè)片鍵的值都在直線(xiàn)上畫(huà)了一個(gè)點(diǎn)。MongoDB把這條直線(xiàn)劃分為更短的不重疊的片段,并稱(chēng)之為數(shù)據(jù)塊,每個(gè)數(shù)據(jù)塊包含了片鍵在一定范圍內(nèi)的數(shù)據(jù)。在使用片鍵做范圍劃分的系統(tǒng)中,擁有”相近”片鍵的文檔很可能存儲(chǔ)在同一個(gè)數(shù)據(jù)塊中,因此也會(huì)存儲(chǔ)在同一個(gè)分片中。

2.3.3 基于哈希的分片

分片過(guò)程中利用哈希索引作為分片的單個(gè)鍵,且哈希分片的片鍵只能使用一個(gè)字段,而基于哈希片鍵最大的好處就是保證數(shù)據(jù)在各個(gè)節(jié)點(diǎn)分布基本均勻。

3ebe4fa6-049a-11ef-a297-92fbcf53809c.png

對(duì)于基于哈希的分片,MongoDB計(jì)算一個(gè)字段的哈希值,并用這個(gè)哈希值來(lái)創(chuàng)建數(shù)據(jù)塊。在使用基于哈希分片的系統(tǒng)中,擁有”相近”片鍵的文檔很可能不會(huì)存儲(chǔ)在同一個(gè)數(shù)據(jù)塊中,因此數(shù)據(jù)的分離性更好一些。

Hash分片與范圍分片互補(bǔ),能將文檔隨機(jī)的分散到各個(gè)chunk,充分的擴(kuò)展寫(xiě)能力,彌補(bǔ)了范圍分片的不足,但不能高效的服務(wù)范圍查詢(xún),所有的范圍查詢(xún)要分發(fā)到后端所有的Shard才能找出滿(mǎn)足條件的文檔。

2.3.4 分片鍵選擇建議

1、遞增的sharding key

數(shù)據(jù)文件挪動(dòng)小。(優(yōu)勢(shì))

因?yàn)閿?shù)據(jù)文件遞增,所以會(huì)把insert的寫(xiě)IO永久放在最后一片上,造成最后一片的寫(xiě)熱點(diǎn)。同時(shí),隨著最后一片的數(shù)據(jù)量增大,將不斷的發(fā)生遷移至之前的片上。

2、隨機(jī)的sharding key

數(shù)據(jù)分布均勻,insert的寫(xiě)IO均勻分布在多個(gè)片上。(優(yōu)勢(shì))

大量的隨機(jī)IO,磁盤(pán)不堪重荷。

3、混合型key

大方向隨機(jī)遞增,小范圍隨機(jī)分布。

為了防止出現(xiàn)大量的chunk均衡遷移,可能造成的IO壓力。我們需要設(shè)置合理分片使用策略(片鍵的選擇、分片算法(range、hash))

分片注意:

分片鍵是不可變、分片鍵必須有索引、分片鍵大小限制512bytes、分片鍵用于路由查詢(xún)。

MongoDB不接受已進(jìn)行collection級(jí)分片的collection上插入無(wú)分片鍵的文檔(也不支持空值插入)

2.4 部署分片集群

本集群的部署基于1.1的復(fù)制集搭建完成。

2.4.1 環(huán)境準(zhǔn)備

創(chuàng)建程序所需的目錄


for  i in 17 18 19 20 21 22 23 24 25 26 
  do 
  mkdir -p /mongodb/280$i/conf  
  mkdir -p /mongodb/280$i/data  
  mkdir -p /mongodb/280$i/log
done

2.4.2 shard集群配置

編輯shard集群配置文件
cat > /mongodb/28021/conf/mongod.conf <<'EOF'
systemLog:
  destination: file
  path: /mongodb/28021/log/mongodb.log   
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /mongodb/28021/data
  directoryPerDB: true
  #engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
net:
  bindIp: 10.0.0.152
  port: 28021
replication:
  oplogSizeMB: 2048
  replSetName: sh1
sharding:
  clusterRole: shardsvr
processManagement: 
  fork: true
EOF
復(fù)制shard集群配置文件
for  i in  22 23 24 25 26  
  do  
   cp  /mongodb/28021/conf/mongod.conf  /mongodb/280$i/conf/
done
修改配置文件端口
for  i in   22 23 24 25 26  
  do 
    sed  -i  "s#28021#280$i#g" /mongodb/280$i/conf/mongod.conf
done
   修改配置文件復(fù)制集名稱(chēng)(replSetName)
for  i in    24 25 26  
  do 
    sed  -i  "s#sh1#sh2#g" /mongodb/280$i/conf/mongod.conf
done
啟動(dòng)shard集群
for  i in  21 22 23 24 25 26
  do  
    mongod -f /mongodb/280$i/conf/mongod.conf 
done
配置復(fù)制集1
mongo --host 10.0.0.152 --port 28021  admin
  # 配置復(fù)制集
config = {_id: 'sh1', members: [
                          {_id: 0, host: '10.0.0.152:28021'},
                          {_id: 1, host: '10.0.0.152:28022'},
                          {_id: 2, host: '10.0.0.152:28023',"arbiterOnly":true}]
           }  
 # 初始化配置
rs.initiate(config)  
 配置復(fù)制集2
mongo --host 10.0.0.152 --port 28024  admin
  # 配置復(fù)制集
config = {_id: 'sh2', members: [
                          {_id: 0, host: '10.0.0.152:28024'},
                          {_id: 1, host: '10.0.0.152:28025'},
                          {_id: 2, host: '10.0.0.152:28026',"arbiterOnly":true}]
           }
# 初始化配置
rs.initiate(config)

2.4.3 config集群配置

創(chuàng)建主節(jié)點(diǎn)配置文件
cat > /mongodb/28018/conf/mongod.conf <<'EOF'
systemLog:
  destination: file
  path: /mongodb/28018/log/mongodb.conf
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /mongodb/28018/data
  directoryPerDB: true
  #engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
net:
  bindIp: 10.0.0.152
  port: 28018
replication:
  oplogSizeMB: 2048
  replSetName: configReplSet
sharding:
  clusterRole: configsvr
processManagement: 
  fork: true
EOF

將配置文件分發(fā)到從節(jié)點(diǎn)
for  i in 19 20 
  do  
   cp  /mongodb/28018/conf/mongod.conf  /mongodb/280$i/conf/
done

修改配置文件端口信息
for  i in 19 20  
  do 
    sed  -i  "s#28018#280$i#g" /mongodb/280$i/conf/mongod.conf
done

啟動(dòng)config server集群
for  i in  18 19 20 
  do  
    mongod -f /mongodb/280$i/conf/mongod.conf 
done
配置config server復(fù)制集
mongo --host 10.0.0.152 --port 28018  admin
# 配置復(fù)制集信息
config = {_id: 'configReplSet', members: [
                          {_id: 0, host: '10.0.0.152:28018'},
                          {_id: 1, host: '10.0.0.152:28019'},
                          {_id: 2, host: '10.0.0.152:28020'}]
           }
# 初始化配置
rs.initiate(config) 

注:config server 使用復(fù)制集不用有arbiter節(jié)點(diǎn)。3.4版本以后config必須為復(fù)制集

2.4.4 mongos節(jié)點(diǎn)配置

修改配置文件

cat > /mongodb/28017/conf/mongos.conf <<'EOF'
systemLog:
  destination: file
  path: /mongodb/28017/log/mongos.log
  logAppend: true
net:
  bindIp: 10.0.0.152
  port: 28017
sharding:
  configDB: configReplSet/10.0.0.152:28108,10.0.0.152:28019,10.0.0.152:28020
processManagement: 
  fork: true
EOF

啟動(dòng)mongos

mongos -f /mongodb/28017/conf/mongos.conf

登陸到mongos

mongo 10.0.0.152:28017/admin

添加分片節(jié)點(diǎn)

db.runCommand( { addshard : "sh1/10.0.0.152:28021,10.0.0.152:28022,10.0.0.152:28023",name:"shard1"} )
db.runCommand( { addshard : "sh2/10.0.0.152:28024,10.0.0.152:28025,10.0.0.152:28026",name:"shard2"} )

列出分片

mongos> db.runCommand( { listshards : 1 } )
{
    "shards" : [
        {
            "_id" : "shard2",
            "host" : "sh2/10.0.0.152:28024,10.0.0.152:28025"
        },
        {
            "_id" : "shard1",
            "host" : "sh1/10.0.0.152:28021,10.0.0.152:28022"
        }
    ],
    "ok" : 1
}

整體狀態(tài)查看

mongos> sh.status();

至此MongoDB的分片集群就搭建完成。

2.4.5 數(shù)據(jù)庫(kù)分片配置

激活數(shù)據(jù)庫(kù)分片功能


語(yǔ)法:( { enablesharding : "數(shù)據(jù)庫(kù)名稱(chēng)" } )


mongos> db.runCommand( { enablesharding : "test" } )

指定分片建對(duì)集合分片,范圍片鍵--創(chuàng)建索引

mongos> use test 
mongos> db.vast.ensureIndex( { id: 1 } )
mongos> use admin
mongos> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )

集合分片驗(yàn)證

mongos> use test
mongos> for(i=0;i<20000;i++){ db.vast1.insert({"id":i,"name":"clsn","age":70,"date":new Date()}); }
mongos> db.vast.stats()

插入數(shù)據(jù)的條數(shù)盡量大些,能夠看出更好的效果。

2.5 分片集群的操作

2.5.1 不同分片鍵的配置

范圍片鍵

admin> sh.shardCollection("數(shù)據(jù)庫(kù)名稱(chēng).集合名稱(chēng)",key : {分片鍵: 1}  )
或
admin> db.runCommand( { shardcollection : "數(shù)據(jù)庫(kù)名稱(chēng).集合名稱(chēng)",key : {分片鍵: 1} } )

eg:

admin > sh.shardCollection("test.vast",key : {id: 1}  )
或
admin> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )

哈希片鍵

admin > sh.shardCollection( "數(shù)據(jù)庫(kù)名.集合名", { 片鍵: "hashed" } )
創(chuàng)建哈希索引
admin> db.vast.ensureIndex( { a: "hashed" } )
admin > sh.shardCollection( "test.vast", { a: "hashed" } )

2.5.2 分片集群的操作

判斷是否Shard集群

admin> db.runCommand({ isdbgrid : 1})

列出所有分片信息

admin> db.runCommand({ listshards : 1})

列出開(kāi)啟分片的數(shù)據(jù)庫(kù)

admin> use config
config> db.databases.find( { "partitioned": true } )
config> db.databases.find() //列出所有數(shù)據(jù)庫(kù)分片情況

查看分片的片鍵

config> db.collections.find()
{
    "_id" : "test.vast",
    "lastmodEpoch" : ObjectId("58a599f19c898bbfb818b63c"),
    "lastmod" : ISODate("1970-02-19T1747.296Z"),
    "dropped" : false,
    "key" : {
        "id" : 1
    },
    "unique" : false
}

查看分片的詳細(xì)信息

admin> db.printShardingStatus()
或
admin> sh.status()
刪除分片節(jié)點(diǎn)

sh.getBalancerState()
mongos> db.runCommand( { removeShard: "shard2" } )

2.6 balance操作

查看mongo集群是否開(kāi)啟了 balance 狀態(tài)

mongos> sh.getBalancerState()
true

當(dāng)然你也可以通過(guò)在路由節(jié)點(diǎn)mongos上執(zhí)行sh.status() 查看balance狀態(tài)。

如果balance開(kāi)啟,查看是否正在有數(shù)據(jù)的遷移

連接mongo集群的路由節(jié)點(diǎn)

mongos> sh.isBalancerRunning()
false

2.6.1 設(shè)置balance 窗口

(1)連接mongo集群的路由節(jié)點(diǎn)

(2)切換到配置節(jié)點(diǎn)

     use config

(3)確定balance 開(kāi)啟中

     sh.getBalancerState()

如果未開(kāi)啟,執(zhí)行命令

   sh.setBalancerState( true )

(4)修改balance 窗口的時(shí)間

db.settings.update(
   { _id: "balancer" },
   { $set: { activeWindow : { start : "", stop : "" } } },
   { upsert: true }
)

eg:
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { sta

rt : "00:00", stop : "5:00" } } }, true )

當(dāng)你設(shè)置了activeWindow,就不能用sh.startBalancer() 啟動(dòng)balance

NOTE

The balancer window must be sufficient to complete the migration of all data inserted during the day.

As data insert rates can change based on activity and usage patterns, it is important to ensure that the balancing window you select will be sufficient to support the needs of your deployment.

(5)刪除balance 窗口


use config
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })

2.6.2 關(guān)閉balance

默認(rèn)balance 的運(yùn)行可以在任何時(shí)間,只遷移需要遷移的chunk,如果要關(guān)閉balance運(yùn)行,停止一段時(shí)間可以用下列方法:

(1) 連接到路由mongos節(jié)點(diǎn)

(2) 停止balance

      sh.stopBalancer()

(3) 查看balance狀態(tài)

  sh.getBalancerState()

(4)停止balance 后,沒(méi)有遷移進(jìn)程正在遷移,可以執(zhí)行下列命令


use config
while( sh.isBalancerRunning() ) {
          print("waiting...");
          sleep(1000);
}

2.6.3 重新打開(kāi)balance

如果你關(guān)閉了balance,準(zhǔn)備重新打開(kāi)balance

(1) 連接到路由mongos節(jié)點(diǎn)

(2) 打開(kāi)balance

        sh.setBalancerState(true)

如果驅(qū)動(dòng)沒(méi)有命令 sh.startBalancer(),可以用下列命令


use config
db.settings.update( { _id: "balancer" }, { $set : { stopped: false } } , { upsert: true } )

2.6.4 關(guān)于集合的balance

關(guān)閉某個(gè)集合的balance

sh.disableBalancing("students.grades")

打開(kāi)某個(gè)集合的balance

sh.enableBalancing("students.grades")

確定某個(gè)集合的balance是開(kāi)啟或者關(guān)閉

db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;
2.6.5 問(wèn)題解決

mongodb在做自動(dòng)分片平衡的時(shí)候,或引起數(shù)據(jù)庫(kù)響應(yīng)的緩慢,可以通過(guò)禁用自動(dòng)平衡以及設(shè)置自動(dòng)平衡進(jìn)行的時(shí)間來(lái)解決這一問(wèn)題。

(1)禁用分片的自動(dòng)平衡


// connect to mongos
> use config
> db.settings.update( { _id: "balancer" }, { $set : { stopped: true } } , true );

(2)自定義 自動(dòng)平衡進(jìn)行的時(shí)間段


// connect to mongos
> use config
> db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "21:00", stop : "9:00" } } }, true )

審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8849

    瀏覽量

    84949
  • mongodb
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

    357

原文標(biāo)題:MongoDB分片(Sharding)技術(shù)

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    MySQL和MongoDB的對(duì)比

    IT技術(shù)社區(qū))概要 關(guān)系型數(shù)據(jù)庫(kù)已經(jīng)成為企業(yè)應(yīng)用程序的基礎(chǔ),自從MySQL在1995年發(fā)布以來(lái),它已經(jīng)成為種受歡迎并且廉價(jià)的選擇。然而隨著近年來(lái)數(shù)據(jù)量和數(shù)據(jù)的不斷激增,非關(guān)系數(shù)據(jù)庫(kù)技術(shù)Mo
    發(fā)表于 08-28 14:51

    MongoDB 4.0 RC 版本強(qiáng)勢(shì)登陸

    MongoDB 4.2 版本,還會(huì)支持分片集群的分布式事務(wù)。MongoDB 的事務(wù)接口非常簡(jiǎn)單,開(kāi)發(fā)者只需要將「需要保證原子性的更新序列」放到個(gè) session 的 開(kāi)始事務(wù) 與
    發(fā)表于 06-11 19:42

     華為云MongoDB彈性伸縮能力提升100倍

    (云原生)的文檔數(shù)據(jù)庫(kù)服務(wù)DDS,不但完全兼容MongoDB協(xié)議,而且提供鍵部署,彈性擴(kuò)容,容災(zāi),備份,恢復(fù),監(jiān)控等服務(wù)能力。目前,DDS支持分片集群(Sharding)、副本
    發(fā)表于 08-03 13:00

    科普分片技術(shù)

    科普:分片技術(shù)1. 為什么需要 Sharding現(xiàn)在感覺(jué)整個(gè)世界最熱的詞就是區(qū)塊鏈了,各大公司各個(gè)行業(yè)急吼吼的布局區(qū)塊鏈技術(shù)忙得不亦樂(lè)乎,但是讓我們看
    發(fā)表于 01-04 17:50

    MongoDB分片集群概念

    MongoDB分片集群(Sharding
    發(fā)表于 09-19 06:25

    初識(shí)sharding技術(shù)

    什么是sharding,sharding到底能為你的數(shù)據(jù)庫(kù)應(yīng)用帶來(lái)哪些好處。另外最重要的,如何實(shí)現(xiàn)個(gè)sharding系統(tǒng),有哪些sharding
    發(fā)表于 02-15 14:31 ?6222次閱讀
    初識(shí)<b class='flag-5'>sharding</b><b class='flag-5'>技術(shù)</b>

    IP的分片與重裝

    TCP-IP詳解卷2 IP的分片與重裝,學(xué)習(xí)TCP很好的資料。歡迎下載。
    發(fā)表于 05-09 14:33 ?0次下載

    Zilliqa推區(qū)塊鏈分片技術(shù)與Visa互別苗頭

    2017年加密貨幣市場(chǎng)迅速成長(zhǎng),區(qū)塊鏈技術(shù)也成為各界熱烈討論的焦點(diǎn)議題,目前各區(qū)塊鏈交易平臺(tái)面臨的最大的根本問(wèn)題是規(guī)模,新加坡科技公司Zilliqa開(kāi)發(fā)出分片(sharding)的技術(shù)
    發(fā)表于 02-05 12:56 ?6350次閱讀

    冷熱數(shù)據(jù)的MongoDB自動(dòng)分片

    MongoDB數(shù)據(jù)庫(kù)中的自動(dòng)分片(Auto-Sharding)機(jī)制僅通過(guò)數(shù)據(jù)量來(lái)進(jìn)行分片遷移,會(huì)導(dǎo)致負(fù)載不均衡的問(wèn)題。為此,提出種基于數(shù)據(jù)
    發(fā)表于 02-09 10:54 ?0次下載
    冷熱數(shù)據(jù)的<b class='flag-5'>MongoDB</b>自動(dòng)<b class='flag-5'>分片</b>

    什么是分片Sharding

    分片Sharding)是種創(chuàng)新方法,可以幫助區(qū)塊鏈擴(kuò)展和處理交易。 Emotiq正在建立個(gè)基于分片的區(qū)塊鏈,旨在擴(kuò)展到每秒一百萬(wàn)次交易
    發(fā)表于 04-08 11:20 ?5127次閱讀

    如何使用區(qū)塊鏈分片來(lái)進(jìn)行區(qū)塊鏈擴(kuò)容

    區(qū)塊鏈分片(Blockchain Sharding)是為區(qū)塊鏈進(jìn)行擴(kuò)容的種重要技術(shù),以通過(guò)改變網(wǎng)絡(luò)驗(yàn)證的方式,增加吞吐量。這是區(qū)塊鏈技術(shù)
    發(fā)表于 11-27 10:36 ?2060次閱讀

    詳解精密封裝技術(shù)

    詳解精密封裝技術(shù)
    的頭像 發(fā)表于 12-30 15:41 ?1579次閱讀

    詳解分立元件門(mén)電路

    詳解分立元件門(mén)電路
    的頭像 發(fā)表于 03-27 17:44 ?2746次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>詳解</b>分立元件門(mén)電路

    詳解pcb和smt的區(qū)別

    詳解pcb和smt的區(qū)別
    的頭像 發(fā)表于 10-08 09:31 ?3057次閱讀

    詳解pcb的msl等級(jí)

    詳解pcb的msl等級(jí)
    的頭像 發(fā)表于 12-13 16:52 ?8201次閱讀