国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MongoDB 分片集群

這篇具有很好參考價值的文章主要介紹了MongoDB 分片集群。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

  在了解分片集群之前,務(wù)必要先了解復(fù)制集技術(shù)!


?1.1 MongoDB復(fù)制集簡介

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

1.1.1 復(fù)制集的目的

  保證數(shù)據(jù)在生產(chǎn)部署時的冗余和可靠性,通過在不同的機器上保存副本來保證數(shù)據(jù)的不會因為單點損壞而丟失。能夠隨時應(yīng)對數(shù)據(jù)丟失、機器損壞帶來的風(fēng)險。

  換一句話來說,還能提高讀取能力,用戶的讀取服務(wù)器和寫入服務(wù)器在不同的地方,而且,由不同的服務(wù)器為不同的用戶提供服務(wù),提高整個系統(tǒng)的負載。

1.1.2 簡單介紹

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

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

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

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

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

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

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

一個主庫;

兩個從庫組成,主庫宕機時,這兩個從庫都可以被選為主庫。

?

MongoDB 分片集群,MongoDB,mongodb,數(shù)據(jù)庫

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

MongoDB 分片集群,MongoDB,mongodb,數(shù)據(jù)庫

?

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

在三個成員的復(fù)制集中,有兩個正常的主從,及一臺arbiter節(jié)點:

? ? 一個主庫

??? 一個從庫,可以在選舉中成為主庫

??? 一個aribiter節(jié)點,在選舉中,只進行投票,不能成為主庫

MongoDB 分片集群,MongoDB,mongodb,數(shù)據(jù)庫

?

說明:

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

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

MongoDB 分片集群,MongoDB,mongodb,數(shù)據(jù)庫

?

1.2.3 Primary選舉

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

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

  假設(shè)復(fù)制集內(nèi)投票成員(后續(xù)介紹)數(shù)量為N,則大多數(shù)為 N/2 + 1,當(dāng)復(fù)制集內(nèi)存活成員數(shù)量不足大多數(shù)時,整個復(fù)制集將無法選舉出Primary,復(fù)制集將無法提供寫服務(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個節(jié)點和4個節(jié)點的復(fù)制集都只能容忍1個節(jié)點失效,從『服務(wù)可用性』的角度看,其效果是一樣的。(但無疑4個節(jié)點能提供更可靠的數(shù)據(jù)存儲)

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

1.3.1 所有成員說明?

成員

說明

Secondary

正常情況下,復(fù)制集的Seconary會參與Primary選舉(自身也可能會被選為Primary),并從Primary同步最新寫入的數(shù)據(jù),以保證與Primary存儲相同的數(shù)據(jù)。

Secondary可以提供讀服務(wù),增加Secondary節(jié)點可以提供復(fù)制集的讀服務(wù)能力,同時提升復(fù)制集的可用性。另外,Mongodb支持對復(fù)制集的Secondary節(jié)點進行靈活的配置,以適應(yīng)多種場景的需求。

Arbiter

Arbiter節(jié)點只參與投票,不能被選為Primary,并且不從Primary同步數(shù)據(jù)。

比如你部署了一個2個節(jié)點的復(fù)制集,1個Primary,1個Secondary,任意節(jié)點宕機,復(fù)制集將不能提供服務(wù)了(無法選出Primary),這時可以給復(fù)制集添加一個Arbiter節(jié)點,即使有節(jié)點宕機,仍能選出Primary。

Arbiter本身不存儲數(shù)據(jù),是非常輕量級的服務(wù),當(dāng)復(fù)制集成員為偶數(shù)時,最好加入一個Arbiter節(jié)點,以提升復(fù)制集可用性。

Priority0

Priority0節(jié)點的選舉優(yōu)先級為0,不會被選舉為Primary

比如你跨機房A、B部署了一個復(fù)制集,并且想指定Primary必須在A機房,這時可以將B機房的復(fù)制集成員Priority設(shè)置為0,這樣Primary就一定會是A機房的成員。

(注意:如果這樣部署,最好將『大多數(shù)』節(jié)點部署在A機房,否則網(wǎng)絡(luò)分區(qū)時可能無法選出Primary)

Vote0

Mongodb 3.0里,復(fù)制集成員最多50個,參與Primary選舉投票的成員最多7個,其他成員(Vote0)的vote屬性必須設(shè)置為0,即不參與投票。

Hidden

Hidden節(jié)點不能被選為主(Priority為0),并且對Driver不可見。因Hidden節(jié)點不會接受Driver的請求,可使用Hidden節(jié)點做一些數(shù)據(jù)備份、離線計算的任務(wù),不會影響復(fù)制集的服務(wù)。

Delayed

Delayed節(jié)點必須是Hidden節(jié)點,并且其數(shù)據(jù)落后與Primary一段時間(可配置,比如1個小時)。

因Delayed節(jié)點的數(shù)據(jù)比Primary落后一段時間,當(dāng)錯誤或者無效的數(shù)據(jù)寫入Primary時,可通過Delayed節(jié)點的數(shù)據(jù)來恢復(fù)到之前的時間點。

1.3.2 Priority 0節(jié)點

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

?

MongoDB 分片集群,MongoDB,mongodb,數(shù)據(jù)庫

1.3.3 Hidden 節(jié)點(隱藏節(jié)點)

  客戶端將不會把讀請求分發(fā)到隱藏節(jié)點上,即使我們設(shè)定了 復(fù)制集讀選項 。

  這些隱藏節(jié)點將不會收到來自應(yīng)用程序的請求。我們可以將隱藏節(jié)點專用于報表節(jié)點或是備份節(jié)點。 延時節(jié)點也應(yīng)該是一個隱藏節(jié)點。

?

MongoDB 分片集群,MongoDB,mongodb,數(shù)據(jù)庫

1.3.4 Delayed 節(jié)點(延時節(jié)點)

  延時節(jié)點的數(shù)據(jù)集是延時的,因此它可以幫助我們在人為誤操作或是其他意外情況下恢復(fù)數(shù)據(jù)。

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

?

MongoDB 分片集群,MongoDB,mongodb,數(shù)據(jù)庫

1.4 配置MongoDB復(fù)制集

1.4.1 環(huán)境說明

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

[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

軟件版本說明

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

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

  本次復(fù)制集復(fù)制采用Mongodb多實例進行

  所有的操作都基于安裝完成的mongodb服務(wù),詳情參照:MongoDB入門

#創(chuàng)建mongod用戶
    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用戶進行后續(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 配置多實例環(huán)境

編輯第一個實例配置文件

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

啟動服務(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ù)庫,配置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'}]
          }

初始化這個配置

> rs.initiate(config)

  ? ?到此復(fù)制集配置完成

1.4.6 測試主從復(fù)制

在主節(jié)點插入數(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é)點查看數(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)中,默認從庫不允許讀寫。

在從庫打開配置(危險)

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

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
}

  在從庫查看完成在登陸到主庫

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

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

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

(2)添加刪除節(jié)點

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

注:

添加特殊節(jié)點時,

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

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

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

(3)配置延時節(jié)點(一般延時節(jié)點也配置成hidden

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

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

重寫復(fù)制集配置

rs.reconfig(cfg)   

?? 也可將延時節(jié)點配置為arbiter節(jié)點

cfg.members[2].arbiterOnly=true

配置成功后,通過以下命令查詢配置后的屬性

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)  # 鎖定從,使其不會轉(zhuǎn)變成主庫,freeze()和stepDown單位都是秒。
rs.slaveOk()    # 設(shè)置副本節(jié)點可讀:在副本節(jié)點執(zhí)行

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

> use app
switched to db app
app> db.createCollection('a')
{ "ok" : 0, "errmsg" : "not master", "code" : 10107 }

查看副本節(jié)點

> rs.printSlaveReplicationInfo()
source: 192.168.1.22:27017
    syncedTo: Thu May 26 2016 10:28:56 GMT+0800 (CST)
    0 secs (0 hrs) behind the primary

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

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

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

2.1 MongoDB分片介紹

2.1.1 分片的目的

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

  為了解決這些問題,有兩個基本的方法: 垂直擴展和水平擴展。

    垂直擴展:增加更多的CPU和存儲資源來擴展容量。

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

2.1.2 分片設(shè)計思想

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

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

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

MongoDB 分片集群,MongoDB,mongodb,數(shù)據(jù)庫

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

1.對集群進行抽象,讓集群“不可見”

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

2.保證集群總是可讀寫

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

3.使集群易于擴展

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

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

組件

說明

Config Server

存儲集群所有節(jié)點、分片數(shù)據(jù)路由信息。默認需要配置3個Config Server節(jié)點。

Mongos

提供對外應(yīng)用訪問,所有操作均通過mongos執(zhí)行。一般有多個mongos節(jié)點。數(shù)據(jù)遷移和數(shù)據(jù)自動平衡。

Mongod

存儲應(yīng)用數(shù)據(jù)記錄。一般有多個Mongod節(jié)點,達到數(shù)據(jù)分片目的。

?

MongoDB 分片集群,MongoDB,mongodb,數(shù)據(jù)庫

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

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

(2)config server:所有存、取數(shù)據(jù)的方式,所有shard節(jié)點的信息,分片功能的一些配置信息??梢岳斫鉃檎鎸崝?shù)據(jù)的元數(shù)據(jù)。

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

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

Mongos的路由功能

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

  當(dāng)外部語句發(fā)起數(shù)據(jù)查詢時,MongoDB根據(jù)數(shù)據(jù)分布自動路由至指定節(jié)點返回數(shù)據(jù)。

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

2.2.1 Chunk是什么

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

  Splitting當(dāng)一個chunk的大小超過配置中的chunk size時,MongoDB的后臺進程會把這個chunk切分成更小的chunk,從而避免chunk過大的情況

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

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

(1)使用chunk來存儲數(shù)據(jù)

(2)進群搭建完成之后,默認開啟一個chunk,大小是64M,

(3)存儲需求超過64M,chunk會進行分裂,如果單位時間存儲需求很大,設(shè)置更大的chunk

(4)chunk會被自動均衡遷移。

2.2.2 chunksize的選擇

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

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

  chunksize的選擇:

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

2.2.3 chunk分裂及遷移

  隨著數(shù)據(jù)的增長,其中的數(shù)據(jù)大小超過了配置的chunk size,默認是64M,則這個chunk就會分裂成兩個。數(shù)據(jù)的增長會讓chunk分裂得越來越多。

?

MongoDB 分片集群,MongoDB,mongodb,數(shù)據(jù)庫

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

MongoDB 分片集群,MongoDB,mongodb,數(shù)據(jù)庫

?

chunkSize?對分裂及遷移的影響

  MongoDB 默認的 chunkSize 為64MB,如無特殊需求,建議保持默認值;chunkSize 會直接影響到 chunk 分裂、遷移的行為。

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

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

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

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

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

2.3.1 分片鍵shard key

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

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

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

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

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

注意:

分片鍵是不可變。

分片鍵必須有索引。

分片鍵大小限制512bytes。

分片鍵用于路由查詢。

MongoDB不接受已進行collection級分片的collection上插入無分片

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

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

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

?

MongoDB 分片集群,MongoDB,mongodb,數(shù)據(jù)庫

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

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

2.3.3 基于哈希的分片

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

?

MongoDB 分片集群,MongoDB,mongodb,數(shù)據(jù)庫

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

  Hash分片與范圍分片互補,能將文檔隨機的分散到各個chunk,充分的擴展寫能力,彌補了范圍分片的不足,但不能高效的服務(wù)范圍查詢,所有的范圍查詢要分發(fā)到后端所有的Shard才能找出滿足條件的文檔。

2.3.4 分片鍵選擇建議

1、遞增的sharding key

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

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

2、隨機的sharding key

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

大量的隨機IO,磁盤不堪重荷。

3、混合型key

大方向隨機遞增,小范圍隨機分布。

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

分片注意:

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

?? MongoDB不接受已進行collection級分片的collection上插入無分片鍵的文檔(也不支持空值插入)

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ù)制集名稱(replSetName)

for  i in    24 25 26  
  do 
    sed  -i  "s#sh1#sh2#g" /mongodb/280$i/conf/mongod.conf
done

啟動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é)點配置文件

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é)點

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

啟動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é)點。3.4版本以后config必須為復(fù)制集

2.4.4 mongos節(jié)點配置

修改配置文件

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

啟動mongos

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

登陸到mongos

mongo 10.0.0.152:28017/admin

添加分片節(jié)點

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ù)庫分片配置

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

語法:( { enablesharding : "數(shù)據(jù)庫名稱" } )

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

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

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

集合分片驗證

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ù)庫名稱.集合名稱",key : {分片鍵: 1}  )
或
admin> db.runCommand( { shardcollection : "數(shù)據(jù)庫名稱.集合名稱",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ù)庫名.集合名", { 片鍵: "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})

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

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

查看分片的片鍵

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

查看分片的詳細信息

admin> db.printShardingStatus()
或
admin> sh.status()

刪除分片節(jié)點

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

2.6 balance操作

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

mongos> sh.getBalancerState()
true

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

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

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

mongos> sh.isBalancerRunning()
false

2.6.1 設(shè)置balance 窗口

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

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

     use config

(3)確定balance 開啟中

     sh.getBalancerState()

?? 如果未開啟,執(zhí)行命令

   sh.setBalancerState( true )

(4)修改balance 窗口的時間

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

eg:

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

  當(dāng)你設(shè)置了activeWindow,就不能用sh.startBalancer() 啟動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

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

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

(2) 停止balance

      sh.stopBalancer()

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

  sh.getBalancerState()

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

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

2.6.3 重新打開balance

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

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

(2) 打開balance

        sh.setBalancerState(true)

如果驅(qū)動沒有命令? sh.startBalancer(),可以用下列命令

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

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

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

sh.disableBalancing("students.grades")

打開某個集合的balance

sh.enableBalancing("students.grades")

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

db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;

2.6.5 問題解決

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

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

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

(2)自定義 自動平衡進行的時間段文章來源地址http://www.zghlxwxcb.cn/news/detail-645233.html

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

到了這里,關(guān)于MongoDB 分片集群的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • MongoDB分片集群架構(gòu)詳解

    MongoDB分片集群架構(gòu)詳解

    分片(shard)是指在將數(shù)據(jù)進行水平切分之后,將其存儲到多個不同的服務(wù)器節(jié)點上的一種擴展方式。分片在概念上非常類似于應(yīng)用開發(fā)中的“水平分表”。不同的點在于,MongoDB 本身就自帶了分片管理的能力,對于開發(fā)者來說可以做到開箱即用。 為什么要使用分片? MongoD

    2024年02月01日
    瀏覽(22)
  • 53.MongoDB分片集群&高級集群架構(gòu)詳解

    為什么要使用分片 分片(shard)是指在將數(shù)據(jù)進行水平切分之后,將其存儲到多個不同的服務(wù)器節(jié)點上的一種擴展方式。 一個復(fù)制集能承載的容量和負載是有限的,遇到以下場景就需要考慮使用分片 存儲容量需求超出單機的磁盤容量。 活躍的數(shù)據(jù)集超出單機內(nèi)存容量,導(dǎo)致

    2024年02月08日
    瀏覽(59)
  • 使用 Docker 部署高可用 MongoDB 分片集群

    使用 Docker 部署高可用 MongoDB 分片集群

    mongodb 集群搭建的方式有三種: 主從備份(Master - Slave)模式,或者叫主從復(fù)制模式。 副本集(Replica Set)模式。 分片(Sharding)模式。 其中,第一種方式基本沒什么意義,官方也不推薦這種方式搭建。另外兩種分別就是副本集和分片的方式。今天介紹副本集的方式搭建 mo

    2024年02月06日
    瀏覽(19)
  • [虛幻引擎 MongoDB Client 插件說明] DTMongoDB MongoDB數(shù)據(jù)庫連接插件,UE藍圖可以操作MongoDB數(shù)據(jù)庫增刪改查。

    [虛幻引擎 MongoDB Client 插件說明] DTMongoDB MongoDB數(shù)據(jù)庫連接插件,UE藍圖可以操作MongoDB數(shù)據(jù)庫增刪改查。

    本插件可以在UE里面使用藍圖操作MongoDB數(shù)據(jù)庫, 對數(shù)據(jù)庫進行查詢,刪除,插入,替換,更新操作。 插件下載地址在文章最后。 Create MongoDB Client - 創(chuàng)建客戶端對象 創(chuàng)建一個 MongoDB 客戶端對象。 Connect By Url - 連接到數(shù)據(jù)庫 Url :MongoDB的連接地址。 如 mongoDB://account:password@ip:

    2024年02月14日
    瀏覽(64)
  • MongoDB——MongoDB刪除系統(tǒng)自帶的local數(shù)據(jù)庫

    MongoDB——MongoDB刪除系統(tǒng)自帶的local數(shù)據(jù)庫

    1.1、linux環(huán)境進入mongo客戶端 輸入 mongo 命令,進入命令行客戶端 進入admin庫,并登錄,查看所有數(shù)據(jù)庫 提升用戶權(quán)限,然后進入local庫并刪除local庫 然后重新進入admin庫,把提升的用戶權(quán)限降回,再次查看所有數(shù)據(jù)庫 由上圖可知,local庫已被刪除。

    2024年02月06日
    瀏覽(26)
  • 〖Python 數(shù)據(jù)庫開發(fā)實戰(zhàn) - MongoDB篇⑧〗- MongoDB的數(shù)據(jù)結(jié)構(gòu)

    訂閱 Python全棧白寶書-零基礎(chǔ)入門篇 可報銷! 白嫖入口-請點擊我。 推薦他人訂閱,可獲取扣除平臺費用后的35%收益,文末名片加V! 說明:該文屬于 Python全棧白寶書專欄, 免費階段訂閱數(shù)量4300+ , 購買任意白寶書體系化專欄可加入 TFS-CLUB 私域社區(qū)。 福利:加入社區(qū)的小伙

    2023年04月09日
    瀏覽(105)
  • MongoDB數(shù)據(jù)庫從入門到精通系列文章之:MongoDB數(shù)據(jù)庫百篇技術(shù)文章匯總

    MongoDB數(shù)據(jù)庫系列文章持續(xù)更新中: 更多數(shù)據(jù)庫內(nèi)容請閱讀博主數(shù)據(jù)庫專欄,數(shù)據(jù)庫專欄涵蓋了Mysql、SQLServer、PostgreSQL、MongoDB、Oracle、Cassandra等數(shù)據(jù)庫 數(shù)據(jù)庫專欄 文章名稱 文章鏈接 數(shù)據(jù)庫安裝部署系列之:部署Mongodb5.0.6高可用集群詳細步驟 數(shù)據(jù)庫安裝部署系列之:部署M

    2024年02月11日
    瀏覽(54)
  • mongodb 數(shù)據(jù)庫管理(數(shù)據(jù)庫、集合、文檔)

    mongodb 數(shù)據(jù)庫管理(數(shù)據(jù)庫、集合、文檔)

    目錄 一、數(shù)據(jù)庫操作 1、創(chuàng)建數(shù)據(jù)庫 2、刪除數(shù)據(jù)庫 二、集合操作 1、創(chuàng)建集合 2、刪除集合 三、文檔操作 1、創(chuàng)建文檔 2、 插入文檔 3、查看文檔 4、更新文檔 1)update() 方法 2)replace() 方法 創(chuàng)建數(shù)據(jù)庫的語法格式如下: 如果數(shù)據(jù)庫不存在,則創(chuàng)建數(shù)據(jù)庫,否則切換到該數(shù)據(jù)

    2024年02月12日
    瀏覽(33)
  • MongoDB數(shù)據(jù)庫安裝

    MongoDB數(shù)據(jù)庫安裝

    MongoDB數(shù)據(jù)的特點: 面相文檔存儲的分布式數(shù)據(jù)庫 具有很強的擴展性 支持豐富的查詢表達式,很接近于關(guān)系性數(shù)據(jù)庫 使用類似于json的結(jié)構(gòu)保存數(shù)據(jù),可以輕易的查詢到文檔中內(nèi)嵌的對象及數(shù)組 首先去官網(wǎng)下載安裝包 Download MongoDB Community Server | MongoDB 啟動MongoDB數(shù)據(jù)的服務(wù) 可

    2024年02月11日
    瀏覽(27)
  • mongodb數(shù)據(jù)庫操作

    mongodb數(shù)據(jù)庫操作

    1、啟動mongodb 在mongodb啟動命令中 --dbpath 指定mongodb的數(shù)據(jù)存儲路徑 --logpath 指定mongodb的日志存儲路徑 2、停止mongodb 第一步先進入mongo命令行模式 第二步,使用use admin 命令進入admin數(shù)據(jù)庫 第三步,執(zhí)行 db.shutdownServer()命令 停止服務(wù)。代碼及顯示如下: ?2 、導(dǎo)出Mongodb數(shù)據(jù) mon

    2024年02月09日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包