婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 分布式文檔存儲數據庫之MongoDB分片集群的問題

分布式文檔存儲數據庫之MongoDB分片集群的問題

熱門標簽:外呼線路資源屬于電信業務嗎 內蒙古營銷智能外呼系統哪個好 河南電話外呼系統招商 呼和浩特外呼系統原理是什么 青白江400企業電話申請 小裙科技電銷機器人怎樣 智能外呼系統官網 長沙電銷外呼防封卡是什么 crm外呼系統聯系方式

  前文我們聊到了mongodb的副本集以及配置副本集,回顧請參考  https://www.jb51.net/article/167270.htm 今天我們來聊下mongodb的分片;

  1、什么是分片?為什么要分片?

  我們知道數據庫服務器一般出現瓶頸是在磁盤io上,或者高并發網絡io,又或者單臺server的cpu、內存等等一系列原因;于是,為了解決這些瓶頸問題,我們就必須擴展服務器性能;通常擴展服務器有向上擴展和向外擴展;所謂向上擴展就是給服務器加更大的磁盤,使用更大更好的內存,更換更好的cpu;這種擴展在一定程度上是可以解決性能瓶頸問題,但隨著數據量大增大,瓶頸會再次出現;所以通常這種向上擴展的方式不推薦;向外擴展是指一臺服務器不夠加兩臺,兩臺不夠加三臺,以這種方式擴展,只要出現瓶頸我們就可以使用增加服務器來解決;這樣一來服務器性能解決了,但用戶的讀寫怎么分散到多個服務器上去呢?所以我們還要想辦法把數據切分成多塊,讓每個服務器只保存整個數據集的部分數據,這樣一來使得原來一個很大的數據集就通過切片的方式,把它切分成多分,分散的存放在多個服務器上,這就是分片;分片是可以有效解決用戶寫操作性能瓶頸;雖然解決了服務器性能問題和用戶寫性能問題,同時也帶來了一個新問題,就是用戶的查詢;我們把整個數據集分散到多個server上,那么用戶怎么查詢數據呢?比如用戶要查詢年齡大于30的用戶,該怎么查詢呢?而年齡大于30的用戶的數據,可能server1上有一部分數據,server2上有部分數據,我們怎么才能夠把所有滿足條件的數據全部查詢到呢?這個場景有點類似我們之前說的mogilefs的架構,用戶上傳圖片到mogilefs首先要把圖片的元數據寫進tracker,然后在把數據存放在對應的data節點,這樣一來用戶來查詢,首先找tracker節點,tracker會把用戶的請求文件的元數據告訴客戶端,然后客戶端在到對應的data節點取數據,最后拼湊成一張圖片;而在mongodb上也是很類似,不同的的是在mogilefs上,客戶端需要自己去和后端的data節點交互,取出數據;在mongdb上客戶端不需要直接和后端的data節點交互,而是通過mongodb專有的客戶端代理去代客戶端交互,最后把數據統一由代理返回給客戶端;這樣一來就可以解決用戶的查詢問題;簡單講所謂分片就是把一個大的數據集通過切分的方式切分成多分,分散的存放在多個服務器上;分片的目的是為了解決數據量過大而導致的性能問題;

  2、數據集分片示意圖

  提示:我們通過分片,可以將原本1T的數據集,平均分成4分,每個節點存儲原有數據集的1/4,使得原來用一臺服務器處理1T的數據,現在可以用4臺服務器來處理,這樣一來就有效的提高了數據處理過程;這也是分布式系統的意義;在mongodb中我們把這種共同處理一個數據集的部分數據的節點叫shard,我們把使用這種分片機制的mongodb集群就叫做mongodb分片集群;

  3、mongodb分片集群架構

  提示:在mongodb分片集群中,通常有三類角色,第一類是router角色,router角色主要用來接收客戶端的讀寫請求,主要運行mongos這個服務;為了使得router角色的高可用,通常會用多個節點來組成router高可用集群;第二類是config server,這類角色主要用來保存mongodb分片集群中的數據和集群的元數據信息,有點類似mogilefs中的tracker的作用;為了保證config server的高可用性,通常config server也會將其運行為一個副本集;第三類是shard角色,這類角色主要用來存放數據,類似mogilefs的數據節點,為了保證數據的高可用和完整性,通常每個shard是一個副本集;

  4、mongodb分片集群工作過程

  首先用戶將請求發送給router,router接收到用戶請求,然后去找config server拿對應請求的元數據信息,router拿到元數據信息后,然后再向對應的shard請求數據,最后將數據整合后響應給用戶;在這個過程中router 就相當于mongodb的一個客戶端代理;而config server用來存放數據的元數據信息,這些信息主要包含了那些shard上存放了那些數據,對應的那些數據存放在那些shard上,和mogilefs上的tracker非常類似,主要存放了兩張表,一個是以數據為中心的一張表,一個是以shard節點為中心的一張表;

  5、mongodb是怎么分片的?

  在mongodb的分片集群中,分片是按照collection字段來分的,我們把指定的字段叫shard key;根據shard key的取值不同和應用場景,我們可以基于shard key取值范圍來分片,也可以基于shard key做hash分片;分好片以后將結果保存在config server上;在configserver 上保存了每一個分片對應的數據集;比如我們基于shardkey的范圍來分片,在configserver上就記錄了一個連續范圍的shardkey的值都保存在一個分片上;如下圖

  上圖主要描述了基于范圍的分片,從shardkey最小值到最大值進行分片,把最小值到-75這個范圍值的數據塊保存在第一個分片上,把-75到25這個范圍值的數據塊保存在第二個分片上,依次類推;這種基于范圍的分片,很容易導致某個分片上的數據過大,而有的分片上的數據又很小,造成分片數據不均勻;所以除了基與shard key的值的范圍分片,也可以基于shard key的值做hash分片,如下圖

  基于hash分片,主要是對shardkey做hash計算后,然后根據最后的結果落在哪個分片上就把對應的數據塊保存在對應的分片上;比如我們把shandkey做hash計算,然后對分片數量進行取模計算,如果得到的結果是0,那么就把對應的數據塊保存在第一個分片上,如果取得到結果是1就保存在第二個分片上依次類推;這種基于hash分片,就有效的降低分片數據不均衡的情況,因為hash計算的值是散列的;

  除了上述兩種切片的方式以外,我們還可以根據區域切片,也叫基于列表切片,如下圖

  上圖主要描述了基于區域分片,這種分片一般是針對shardkey的取值范圍不是一個順序的集合,而是一個離散的集合,比如我們可用這種方式對全國省份這個字段做切片,把流量特別大的省份單獨切一個片,把流量小的幾個省份組合切分一片,把國外的訪問或不是國內省份的切分為一片;這種切片有點類似給shardkey做分類;不管用什么方式去做分片,我們盡可能的遵循寫操作要越分散越好,讀操作要越集中越好;

  6、mongodb分片集群搭建

  環境說明

主機名 角色 ip地址
node01 router 192.168.0.41
node02/node03/node04 config server replication set

192.168.0.42

192.168.0.43

192.168.0.44

node05/node06/node07 shard1 replication set

192.168.0.45

192.168.0.46

192.168.0.47

node08/node09/node10 shard2 replication set

192.168.0.48

192.168.0.49

192.168.0.50

  基礎環境,各server做時間同步,關閉防火墻,關閉selinux,ssh互信,主機名解析

  主機名解析

[root@node01 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1   localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.99 time.test.org time-node
192.168.0.41 node01.test.org node01
192.168.0.42 node02.test.org node02
192.168.0.43 node03.test.org node03
192.168.0.44 node04.test.org node04
192.168.0.45 node05.test.org node05
192.168.0.46 node06.test.org node06
192.168.0.47 node07.test.org node07
192.168.0.48 node08.test.org node08
192.168.0.49 node09.test.org node09
192.168.0.50 node10.test.org node10
192.168.0.51 node11.test.org node11
192.168.0.52 node12.test.org node12
[root@node01 ~]#

  準備好基礎環境以后,配置mongodb yum源

[root@node01 ~]# cat /etc/yum.repos.d/mongodb.repo
[mongodb-org]
name = MongoDB Repository
baseurl = https://mirrors.aliyun.com/mongodb/yum/redhat/7/mongodb-org/4.4/x86_64/
gpgcheck = 1
enabled = 1
gpgkey = https://www.mongodb.org/static/pgp/server-4.4.asc
[root@node01 ~]#

  將mongodb yum源復制給其他節點

[root@node01 ~]# for i in {02..10} ; do scp /etc/yum.repos.d/mongodb.repo node$i:/etc/yum.repos.d/; done
mongodb.repo                 100% 206 247.2KB/s 00:00 
mongodb.repo                 100% 206 222.3KB/s 00:00 
mongodb.repo                 100% 206 118.7KB/s 00:00 
mongodb.repo                 100% 206 164.0KB/s 00:00 
mongodb.repo                 100% 206 145.2KB/s 00:00 
mongodb.repo                 100% 206 119.9KB/s 00:00 
mongodb.repo                 100% 206 219.2KB/s 00:00 
mongodb.repo                 100% 206 302.1KB/s 00:00 
mongodb.repo                 100% 206 289.3KB/s 00:00 
[root@node01 ~]#

  在每個節點上安裝mongodb-org這個包

for i in {01..10} ;
 do ssh node$i ' yum -y install mongodb-org '; 
done

  在config server 和shard節點上創建數據目錄和日志目錄,并將其屬主和屬組更改為mongod

[root@node01 ~]# for i in {02..10} ; do ssh node$i 'mkdir -p /mongodb/{data,log}  chown -R mongod.mongod /mongodb/  ls -ld /mongodb'; done
drwxr-xr-x 4 mongod mongod 29 Nov 11 22:47 /mongodb
drwxr-xr-x 4 mongod mongod 29 Nov 11 22:45 /mongodb
drwxr-xr-x 4 mongod mongod 29 Nov 11 22:45 /mongodb
drwxr-xr-x 4 mongod mongod 29 Nov 11 22:45 /mongodb
drwxr-xr-x 4 mongod mongod 29 Nov 11 22:45 /mongodb
drwxr-xr-x 4 mongod mongod 29 Nov 11 22:45 /mongodb
drwxr-xr-x 4 mongod mongod 29 Nov 11 22:45 /mongodb
drwxr-xr-x 4 mongod mongod 29 Nov 11 22:45 /mongodb
drwxr-xr-x 4 mongod mongod 29 Nov 11 22:45 /mongodb
[root@node01 ~]#

  配置shard1 replication set

[root@node05 ~]# cat /etc/mongod.conf
systemLog:
 destination: file
 logAppend: true
 path: /mongodb/log/mongod.log
 
storage:
 dbPath: /mongodb/data/
 journal:
 enabled: true
 
processManagement:
 fork: true
 pidFilePath: /var/run/mongodb/mongod.pid
 timeZoneInfo: /usr/share/zoneinfo
 
net:
 bindIp: 0.0.0.0
 
sharding:
 clusterRole: shardsvr
 
replication:
 replSetName: shard1_replset
[root@node05 ~]# scp /etc/mongod.conf node06:/etc/
mongod.conf                 100% 360 394.5KB/s 00:00 
[root@node05 ~]# scp /etc/mongod.conf node07:/etc/
mongod.conf                 100% 360 351.7KB/s 00:00 
[root@node05 ~]#

  配置shard2 replication set

[root@node08 ~]# cat /etc/mongod.conf
systemLog:
 destination: file
 logAppend: true
 path: /mongodb/log/mongod.log
 
storage:
 dbPath: /mongodb/data/
 journal:
 enabled: true
 
processManagement:
 fork: true
 pidFilePath: /var/run/mongodb/mongod.pid
 timeZoneInfo: /usr/share/zoneinfo
 
net:
 bindIp: 0.0.0.0
 
sharding:
 clusterRole: shardsvr
 
replication:
 replSetName: shard2_replset
[root@node08 ~]# scp /etc/mongod.conf node09:/etc/
mongod.conf                 100% 360 330.9KB/s 00:00 
[root@node08 ~]# scp /etc/mongod.conf node10:/etc/
mongod.conf                 100% 360 385.9KB/s 00:00 
[root@node08 ~]#

  啟動shard1 replication set和shard2 replication set

[root@node05 ~]# systemctl start mongod.service
[root@node05 ~]# ss -tnl
State  Recv-Q Send-Q   Local Address:Port       Peer Address:Port    
LISTEN  0  128       *:22          *:*     
LISTEN  0  100     127.0.0.1:25          *:*     
LISTEN  0  128       *:27018         *:*     
LISTEN  0  128       :::22          :::*     
LISTEN  0  100      ::1:25          :::*     
[root@node05 ~]#for i in {06..10} ; do ssh node$i 'systemctl start mongod.service  ss -tnl';done
State  Recv-Q Send-Q Local Address:Port    Peer Address:Port    
LISTEN  0  128   *:22      *:*     
LISTEN  0  100 127.0.0.1:25      *:*     
LISTEN  0  128   *:27018     *:*     
LISTEN  0  128   :::22      :::*     
LISTEN  0  100  ::1:25      :::*     
State  Recv-Q Send-Q Local Address:Port    Peer Address:Port    
LISTEN  0  128   *:22      *:*     
LISTEN  0  100 127.0.0.1:25      *:*     
LISTEN  0  128   *:27018     *:*     
LISTEN  0  128   :::22      :::*     
LISTEN  0  100  ::1:25      :::*     
State  Recv-Q Send-Q Local Address:Port    Peer Address:Port    
LISTEN  0  128   *:22      *:*     
LISTEN  0  100 127.0.0.1:25      *:*     
LISTEN  0  128   *:27018     *:*     
LISTEN  0  128   :::22      :::*     
LISTEN  0  100  ::1:25      :::*     
State  Recv-Q Send-Q Local Address:Port    Peer Address:Port    
LISTEN  0  128   *:22      *:*     
LISTEN  0  100 127.0.0.1:25      *:*     
LISTEN  0  128   *:27018     *:*     
LISTEN  0  128   :::22      :::*     
LISTEN  0  100  ::1:25      :::*     
State  Recv-Q Send-Q Local Address:Port    Peer Address:Port    
LISTEN  0  128   *:22      *:*     
LISTEN  0  100 127.0.0.1:25      *:*     
LISTEN  0  128   *:27018     *:*     
LISTEN  0  128   :::22      :::*     
LISTEN  0  100  ::1:25      :::*     
[root@node05 ~]#

  提示:默認不指定shard監聽端口,它默認就監聽在27018端口,所以啟動shard節點后,請確保27018端口正常監聽即可;

  連接node05的mongodb 初始化shard1_replset副本集

> rs.initiate(
... {
...  _id : "shard1_replset",
...  members: [
...  { _id : 0, host : "node05:27018" },
...  { _id : 1, host : "node06:27018" },
...  { _id : 2, host : "node07:27018" }
...  ]
... }
... )
{
  "ok" : 1,
  "$clusterTime" : {
    "clusterTime" : Timestamp(1605107401, 1),
    "signature" : {
      "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
      "keyId" : NumberLong(0)
    }
  },
  "operationTime" : Timestamp(1605107401, 1)
}
shard1_replset:SECONDARY>

  連接node08的mongodb 初始化shard2_replset副本集

> rs.initiate(
... {
...  _id : "shard2_replset",
...  members: [
...  { _id : 0, host : "node08:27018" },
...  { _id : 1, host : "node09:27018" },
...  { _id : 2, host : "node10:27018" }
...  ]
... }
... )
{
  "ok" : 1,
  "$clusterTime" : {
    "clusterTime" : Timestamp(1605107644, 1),
    "signature" : {
      "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
      "keyId" : NumberLong(0)
    }
  },
  "operationTime" : Timestamp(1605107644, 1)
}
shard2_replset:OTHER>

  配置configserver replication set

[root@node02 ~]# cat /etc/mongod.conf
systemLog:
 destination: file
 logAppend: true
 path: /mongodb/log/mongod.log
 
storage:
 dbPath: /mongodb/data/
 journal:
 enabled: true
 
processManagement:
 fork: true
 pidFilePath: /var/run/mongodb/mongod.pid
 timeZoneInfo: /usr/share/zoneinfo
 
net:
 bindIp: 0.0.0.0
 
sharding:
 clusterRole: configsvr
 
replication:
 replSetName: cfg_replset
[root@node02 ~]# scp /etc/mongod.conf node03:/etc/mongod.conf
mongod.conf                 100% 358 398.9KB/s 00:00 
[root@node02 ~]# scp /etc/mongod.conf node04:/etc/mongod.conf 
mongod.conf                 100% 358 270.7KB/s 00:00 
[root@node02 ~]#

  啟動config server

[root@node02 ~]# systemctl start mongod.service
[root@node02 ~]# ss -tnl
State  Recv-Q Send-Q   Local Address:Port       Peer Address:Port    
LISTEN  0  128       *:27019         *:*     
LISTEN  0  128       *:22          *:*     
LISTEN  0  100     127.0.0.1:25          *:*     
LISTEN  0  128       :::22          :::*     
LISTEN  0  100      ::1:25          :::*     
[root@node02 ~]# ssh node03 'systemctl start mongod.service  ss -tnl' 
State  Recv-Q Send-Q Local Address:Port    Peer Address:Port    
LISTEN  0  128   *:27019     *:*     
LISTEN  0  128   *:22      *:*     
LISTEN  0  100 127.0.0.1:25      *:*     
LISTEN  0  128   :::22      :::*     
LISTEN  0  100  ::1:25      :::*     
[root@node02 ~]# ssh node04 'systemctl start mongod.service  ss -tnl'
State  Recv-Q Send-Q Local Address:Port    Peer Address:Port    
LISTEN  0  128   *:27019     *:*     
LISTEN  0  128   *:22      *:*     
LISTEN  0  100 127.0.0.1:25      *:*     
LISTEN  0  128   :::22      :::*     
LISTEN  0  100  ::1:25      :::*     
[root@node02 ~]#

  提示:config server 默認在不指定端口的情況監聽在27019這個端口,啟動后,請確保該端口處于正常監聽;

  連接node02的mongodb,初始化cfg_replset 副本集

> rs.initiate(
... {
...  _id: "cfg_replset",
...  configsvr: true,
...  members: [
...  { _id : 0, host : "node02:27019" },
...  { _id : 1, host : "node03:27019" },
...  { _id : 2, host : "node04:27019" }
...  ]
... }
... )
{
  "ok" : 1,
  "$gleStats" : {
    "lastOpTime" : Timestamp(1605108177, 1),
    "electionId" : ObjectId("000000000000000000000000")
  },
  "lastCommittedOpTime" : Timestamp(0, 0),
  "$clusterTime" : {
    "clusterTime" : Timestamp(1605108177, 1),
    "signature" : {
      "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
      "keyId" : NumberLong(0)
    }
  },
  "operationTime" : Timestamp(1605108177, 1)
}
cfg_replset:SECONDARY>

  配置router

[root@node01 ~]# cat /etc/mongos.conf
systemLog:
 destination: file
 path: /var/log/mongodb/mongos.log
 logAppend: true
 
processManagement:
 fork: true
 
net:
 bindIp: 0.0.0.0
sharding:
 configDB: "cfg_replset/node02:27019,node03:27019,node04:27019"
[root@node01 ~]#

  提示:configDB必須是副本集名稱/成員監聽地址:port的形式,成員至少要寫一個;

  啟動router

[root@node01 ~]# mongos -f /etc/mongos.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1510
child process started successfully, parent exiting
[root@node01 ~]# ss -tnl
State  Recv-Q Send-Q   Local Address:Port       Peer Address:Port    
LISTEN  0  128       *:22          *:*     
LISTEN  0  100     127.0.0.1:25          *:*     
LISTEN  0  128       *:27017         *:*     
LISTEN  0  128       :::22          :::*     
LISTEN  0  100      ::1:25          :::*     
[root@node01 ~]#

  連接mongos,添加shard1 replication set 和shard2 replication set

mongos> sh.addShard("shard1_replset/node05:27018,node06:27018,node07:27018")
{
  "shardAdded" : "shard1_replset",
  "ok" : 1,
  "operationTime" : Timestamp(1605109085, 3),
  "$clusterTime" : {
    "clusterTime" : Timestamp(1605109086, 1),
    "signature" : {
      "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
      "keyId" : NumberLong(0)
    }
  }
}
mongos> sh.addShard("shard2_replset/node08:27018,node09:27018,node10:27018")
{
  "shardAdded" : "shard2_replset",
  "ok" : 1,
  "operationTime" : Timestamp(1605109118, 2),
  "$clusterTime" : {
    "clusterTime" : Timestamp(1605109118, 3),
    "signature" : {
      "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
      "keyId" : NumberLong(0)
    }
  }
}
mongos>

  提示:添加shard 副本集也是需要指明副本集名稱/成員的格式添加;

  到此分片集群就配置好了

  查看sharding 集群狀態

mongos> sh.status()
--- Sharding Status ---
 sharding version: {
  "_id" : 1,
  "minCompatibleVersion" : 5,
  "currentVersion" : 6,
  "clusterId" : ObjectId("5fac01dd8d6fa3fe899662c8")
 }
 shards:
  { "_id" : "shard1_replset", "host" : "shard1_replset/node05:27018,node06:27018,node07:27018", "state" : 1 }
  { "_id" : "shard2_replset", "host" : "shard2_replset/node08:27018,node09:27018,node10:27018", "state" : 1 }
 active mongoses:
  "4.4.1" : 1
 autosplit:
  Currently enabled: yes
 balancer:
  Currently enabled: yes
  Currently running: yes
  Collections with active migrations:
    config.system.sessions started at Wed Nov 11 2020 23:43:14 GMT+0800 (CST)
  Failed balancer rounds in last 5 attempts: 0
  Migration Results for the last 24 hours:
    45 : Success
 databases:
  { "_id" : "config", "primary" : "config", "partitioned" : true }
    config.system.sessions
      shard key: { "_id" : 1 }
      unique: false
      balancing: true
      chunks:
        shard1_replset 978
        shard2_replset 46
      too many chunks to print, use verbose if you want to force print
mongos>

  提示:可以看到當前分片集群中有兩個shard 副本集,分別是shard1_replset和shard2_replset;以及一個config server

  對testdb數據庫啟用sharding功能

mongos> sh.enableSharding("testdb")
{
  "ok" : 1,
  "operationTime" : Timestamp(1605109993, 9),
  "$clusterTime" : {
    "clusterTime" : Timestamp(1605109993, 9),
    "signature" : {
      "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
      "keyId" : NumberLong(0)
    }
  }
}
mongos> sh.status()
--- Sharding Status ---
 sharding version: {
  "_id" : 1,
  "minCompatibleVersion" : 5,
  "currentVersion" : 6,
  "clusterId" : ObjectId("5fac01dd8d6fa3fe899662c8")
 }
 shards:
  { "_id" : "shard1_replset", "host" : "shard1_replset/node05:27018,node06:27018,node07:27018", "state" : 1 }
  { "_id" : "shard2_replset", "host" : "shard2_replset/node08:27018,node09:27018,node10:27018", "state" : 1 }
 active mongoses:
  "4.4.1" : 1
 autosplit:
  Currently enabled: yes
 balancer:
  Currently enabled: yes
  Currently running: no
  Failed balancer rounds in last 5 attempts: 0
  Migration Results for the last 24 hours:
    214 : Success
 databases:
  { "_id" : "config", "primary" : "config", "partitioned" : true }
    config.system.sessions
      shard key: { "_id" : 1 }
      unique: false
      balancing: true
      chunks:
        shard1_replset 810
        shard2_replset 214
      too many chunks to print, use verbose if you want to force print
  { "_id" : "testdb", "primary" : "shard2_replset", "partitioned" : true, "version" : { "uuid" : UUID("454aad2e-b397-4c88-b5c4-c3b21d37e480"), "lastMod" : 1 } }
mongos>

  提示:在對某個數據庫啟動sharding功能后,它會給我們分片一個主shard所謂主shard是用來存放該數據庫下沒有做分片的colleciton;對于分片的collection會分散在各個shard上;

  啟用對testdb庫下的peoples集合啟動sharding,并指明在age字段上做基于范圍的分片

mongos> sh.shardCollection("testdb.peoples",{"age":1})
{
  "collectionsharded" : "testdb.peoples",
  "collectionUUID" : UUID("ec095411-240d-4484-b45d-b541c33c3975"),
  "ok" : 1,
  "operationTime" : Timestamp(1605110694, 11),
  "$clusterTime" : {
    "clusterTime" : Timestamp(1605110694, 11),
    "signature" : {
      "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
      "keyId" : NumberLong(0)
    }
  }
}
mongos> sh.status()
--- Sharding Status ---
 sharding version: {
  "_id" : 1,
  "minCompatibleVersion" : 5,
  "currentVersion" : 6,
  "clusterId" : ObjectId("5fac01dd8d6fa3fe899662c8")
 }
 shards:
  { "_id" : "shard1_replset", "host" : "shard1_replset/node05:27018,node06:27018,node07:27018", "state" : 1 }
  { "_id" : "shard2_replset", "host" : "shard2_replset/node08:27018,node09:27018,node10:27018", "state" : 1 }
 active mongoses:
  "4.4.1" : 1
 autosplit:
  Currently enabled: yes
 balancer:
  Currently enabled: yes
  Currently running: no
  Failed balancer rounds in last 5 attempts: 0
  Migration Results for the last 24 hours:
    408 : Success
 databases:
  { "_id" : "config", "primary" : "config", "partitioned" : true }
    config.system.sessions
      shard key: { "_id" : 1 }
      unique: false
      balancing: true
      chunks:
        shard1_replset 616
        shard2_replset 408
      too many chunks to print, use verbose if you want to force print
  { "_id" : "testdb", "primary" : "shard2_replset", "partitioned" : true, "version" : { "uuid" : UUID("454aad2e-b397-4c88-b5c4-c3b21d37e480"), "lastMod" : 1 } }
    testdb.peoples
      shard key: { "age" : 1 }
      unique: false
      balancing: true
      chunks:
        shard2_replset 1
      { "age" : { "$minKey" : 1 } } -->> { "age" : { "$maxKey" : 1 } } on : shard2_replset Timestamp(1, 0)
mongos>

  提示:如果對應的collection存在,我們還需要先對collection創建shardkey索引,然后在使用sh.shardCollection()來對colleciton啟用sharding功能;基于范圍做分片,我們可以在多個字段上做;

  基于hash做分片

mongos> sh.shardCollection("testdb.peoples1",{"name":"hashed"})
{
  "collectionsharded" : "testdb.peoples1",
  "collectionUUID" : UUID("f6213da1-7c7d-4d5e-8fb1-fc554efb9df2"),
  "ok" : 1,
  "operationTime" : Timestamp(1605111014, 2),
  "$clusterTime" : {
    "clusterTime" : Timestamp(1605111014, 2),
    "signature" : {
      "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
      "keyId" : NumberLong(0)
    }
  }
}
mongos> sh.status()
--- Sharding Status ---
 sharding version: {
  "_id" : 1,
  "minCompatibleVersion" : 5,
  "currentVersion" : 6,
  "clusterId" : ObjectId("5fac01dd8d6fa3fe899662c8")
 }
 shards:
  { "_id" : "shard1_replset", "host" : "shard1_replset/node05:27018,node06:27018,node07:27018", "state" : 1 }
  { "_id" : "shard2_replset", "host" : "shard2_replset/node08:27018,node09:27018,node10:27018", "state" : 1 }
 active mongoses:
  "4.4.1" : 1
 autosplit:
  Currently enabled: yes
 balancer:
  Currently enabled: yes
  Currently running: yes
  Collections with active migrations:
    config.system.sessions started at Thu Nov 12 2020 00:10:16 GMT+0800 (CST)
  Failed balancer rounds in last 5 attempts: 0
  Migration Results for the last 24 hours:
    480 : Success
 databases:
  { "_id" : "config", "primary" : "config", "partitioned" : true }
    config.system.sessions
      shard key: { "_id" : 1 }
      unique: false
      balancing: true
      chunks:
        shard1_replset 543
        shard2_replset 481
      too many chunks to print, use verbose if you want to force print
  { "_id" : "testdb", "primary" : "shard2_replset", "partitioned" : true, "version" : { "uuid" : UUID("454aad2e-b397-4c88-b5c4-c3b21d37e480"), "lastMod" : 1 } }
    testdb.peoples
      shard key: { "age" : 1 }
      unique: false
      balancing: true
      chunks:
        shard2_replset 1
      { "age" : { "$minKey" : 1 } } -->> { "age" : { "$maxKey" : 1 } } on : shard2_replset Timestamp(1, 0)
    testdb.peoples1
      shard key: { "name" : "hashed" }
      unique: false
      balancing: true
      chunks:
        shard1_replset 2
        shard2_replset 2
      { "name" : { "$minKey" : 1 } } -->> { "name" : NumberLong("-4611686018427387902") } on : shard1_replset Timestamp(1, 0)
      { "name" : NumberLong("-4611686018427387902") } -->> { "name" : NumberLong(0) } on : shard1_replset Timestamp(1, 1)
      { "name" : NumberLong(0) } -->> { "name" : NumberLong("4611686018427387902") } on : shard2_replset Timestamp(1, 2)
      { "name" : NumberLong("4611686018427387902") } -->> { "name" : { "$maxKey" : 1 } } on : shard2_replset Timestamp(1, 3)
mongos>

  提示:基于hash做分片只能在一個字段上做,不能指定多個字段;從上面的狀態信息可以看到testdb.peoples被分到了shard2上,peoples1一部分分到了shard1,一部分分到了shard2上;所以在peoples中插入多少條數據,它都會寫到shard2上,在peoples1中插入數據會被寫入到shard1和shard2上;

  驗證:在peoples1 集合上插入數據,看看是否將數據分片到不同的shard上呢?

  在mongos上插入數據

mongos> use testdb
switched to db testdb
mongos> for (i=1;i=10000;i++) db.peoples1.insert({name:"people"+i,age:(i%120),classes:(i%20)})
WriteResult({ "nInserted" : 1 })
mongos>

  在shard1上查看數據

shard1_replset:PRIMARY> show dbs
admin 0.000GB
config 0.001GB
local 0.001GB
testdb 0.000GB
shard1_replset:PRIMARY> use testdb
switched to db testdb
shard1_replset:PRIMARY> show tables
peoples1
shard1_replset:PRIMARY> db.peoples1.find().count()
4966
shard1_replset:PRIMARY>

 提示:在shard1上可以看到對應collection保存了4966條數據;

  在shard2上查看數據

shard2_replset:PRIMARY> show dbs
admin 0.000GB
config 0.001GB
local 0.011GB
testdb 0.011GB
shard2_replset:PRIMARY> use testdb
switched to db testdb
shard2_replset:PRIMARY> show tables
peoples
peoples1
shard2_replset:PRIMARY> db.peoples1.find().count()
5034
shard2_replset:PRIMARY>

  提示:在shard2上可以看到有peoples集合和peoples1集合,其中peoples1集合保存了5034條數據;shard1和shard2總共就保存了我們剛才插入的10000條數據;

  ok,到此mongodb的分片集群就搭建,測試完畢了;

到此這篇關于分布式文檔存儲數據庫之MongoDB分片集群的文章就介紹到這了,更多相關MongoDB分片集群內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 分布式文檔存儲數據庫之MongoDB訪問控制的操作方法
  • 分布式文檔存儲數據庫之MongoDB備份與恢復的實踐詳解
  • SpringDataMongoDB多文檔事務的實現
  • mongodb如何對文檔內數組進行過濾的方法步驟
  • MongoDB中文檔的更新操作示例詳解
  • MongoDB數據庫文檔操作方法(必看篇)
  • mongodb 數據類型(null/字符串/數字/日期/內嵌文檔/數組等)
  • PHP庫 查詢Mongodb中的文檔ID的方法
  • MongoDB如何更新多級文檔的數據

標簽:呼倫貝爾 菏澤 池州 安順 黃石 舟山 楚雄 白山

巨人網絡通訊聲明:本文標題《分布式文檔存儲數據庫之MongoDB分片集群的問題》,本文關鍵詞  分布式,文檔,存儲,數據庫,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《分布式文檔存儲數據庫之MongoDB分片集群的問題》相關的同類信息!
  • 本頁收集關于分布式文檔存儲數據庫之MongoDB分片集群的問題的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美精品在线观看一区二区| 国产白丝精品91爽爽久久| 亚洲午夜电影在线| eeuss鲁片一区二区三区| 精品久久五月天| 日本中文字幕不卡| 欧美精品乱码久久久久久| 亚洲不卡av一区二区三区| 欧美午夜电影网| 亚洲成人一区在线| 欧美日本乱大交xxxxx| 亚洲bt欧美bt精品| 日韩视频在线你懂得| 青青草一区二区三区| 7777精品久久久大香线蕉| 亚洲少妇中出一区| 亚洲国产中文字幕在线视频综合| 91麻豆免费观看| 欧美国产日韩一二三区| 成人精品一区二区三区四区| 亚洲精品日产精品乱码不卡| 欧美精品一卡两卡| 国产精品综合av一区二区国产馆| 久久久久久一二三区| 91美女片黄在线观看91美女| 亚洲一二三区在线观看| 欧美哺乳videos| av在线免费不卡| 亚洲一级二级在线| 欧美成人在线直播| 色天天综合久久久久综合片| 丝袜美腿亚洲一区二区图片| 久久久亚洲午夜电影| 99精品国产99久久久久久白柏| 婷婷成人综合网| 国产精品久久久久久久裸模 | 亚洲夂夂婷婷色拍ww47| 精品区一区二区| 91福利视频网站| 风间由美一区二区av101| 午夜精品一区在线观看| 国产日韩欧美麻豆| 欧美高清视频一二三区| 99国产精品99久久久久久| 久久精品国产久精国产爱| 亚洲免费av观看| 欧美国产激情一区二区三区蜜月 | 精品国产精品网麻豆系列 | 久久久久99精品一区| 欧美日韩中文字幕一区| 成人国产精品免费网站| 蜜臂av日日欢夜夜爽一区| 欧美mv日韩mv国产网站app| 成人性生交大片免费看视频在线| 午夜精品久久久久久久蜜桃app| 久久精品一二三| 日韩欧美色电影| 欧美精品xxxxbbbb| 色婷婷av一区二区三区之一色屋| 成人性生交大片免费看视频在线 | 国产欧美一区二区三区在线老狼| 久久久综合视频| 久久成人羞羞网站| 视频在线观看一区二区三区| 亚洲女人的天堂| 日韩理论电影院| 国产精品国产三级国产三级人妇| 欧美v亚洲v综合ⅴ国产v| 日韩亚洲欧美成人一区| 欧美日韩久久不卡| 91精品午夜视频| 在线不卡a资源高清| 欧美挠脚心视频网站| 在线观看亚洲精品视频| 欧美怡红院视频| 欧美日韩欧美一区二区| 日韩一区二区在线播放| 日韩欧美一区二区久久婷婷| 久久综合国产精品| 中文字幕av资源一区| 亚洲欧洲99久久| 亚洲一区在线播放| 日韩精品一级二级| 精品一区二区av| 国产白丝网站精品污在线入口| 国产乱对白刺激视频不卡| 成人激情午夜影院| 欧美伊人精品成人久久综合97 | 亚洲欧洲制服丝袜| 亚洲美女视频在线| 欧美日韩国产高清一区二区三区| 欧美视频一区在线| www.一区二区| 国产欧美精品一区二区三区四区 | 成人黄色一级视频| 亚洲sss视频在线视频| 777奇米四色成人影色区| 韩国成人精品a∨在线观看| 国产精品水嫩水嫩| 在线免费一区三区| 国内成人精品2018免费看| 国产精品久久久久天堂| 色综合天天综合网天天看片| 欧美aaaaa成人免费观看视频| 91女人视频在线观看| 欧美另类videos死尸| 日韩天堂在线观看| 中文字幕一区视频| 精品毛片乱码1区2区3区| 亚洲国产中文字幕| 欧美色爱综合网| 日韩写真欧美这视频| 欧美三区免费完整视频在线观看| 日韩电影在线看| 欧美激情在线一区二区| 91精品国产综合久久久久| 国产精品1区2区3区在线观看| 国产精品视频一二三区| 免费看精品久久片| 日韩免费一区二区| 欧美日韩在线亚洲一区蜜芽| 欧美变态口味重另类| 欧美优质美女网站| 欧美午夜精品一区二区三区| 日韩欧美一二三区| 136国产福利精品导航| 久久精品国产99| 国产一区二区三区在线观看免费| 亚洲电影一区二区三区| 婷婷久久综合九色综合绿巨人| 国产成人欧美日韩在线电影| 国产精品成人午夜| 欧美一区二区久久| 18涩涩午夜精品.www| 国产精品 日产精品 欧美精品| 精品视频123区在线观看| 1000精品久久久久久久久| 国产一区二区影院| 欧美精品在线观看播放| 亚洲精品国产成人久久av盗摄| 成人在线综合网| 国产日韩成人精品| 国产精一品亚洲二区在线视频| 日韩限制级电影在线观看| 婷婷夜色潮精品综合在线| 欧美亚洲综合网| 亚洲国产欧美日韩另类综合| 色老汉一区二区三区| 中文字幕欧美一| 一本久久a久久免费精品不卡| 亚洲图片欧美激情| 不卡一区二区中文字幕| 亚洲丝袜制服诱惑| 91在线精品一区二区三区| 中文字幕一区二区三区乱码在线| 成人永久免费视频| 亚洲精品中文字幕在线观看| 在线观看欧美黄色| 亚洲成a人v欧美综合天堂| 欧美在线短视频| 午夜婷婷国产麻豆精品| 欧美成人精品二区三区99精品| 老司机免费视频一区二区| 久久众筹精品私拍模特| 99国产欧美另类久久久精品| 亚洲成人福利片| 日韩欧美一区二区在线视频| 韩国v欧美v日本v亚洲v| 国产精品69久久久久水密桃| 中文字幕一区二区在线观看| 欧美日韩成人高清| 日av在线不卡| 欧美国产精品劲爆| 欧美日韩高清一区二区不卡| 日日骚欧美日韩| 精品国精品国产尤物美女| 成人在线一区二区三区| 亚洲午夜久久久久久久久电影网 | 国产成人亚洲精品青草天美| 中文字幕一区不卡| 日韩一区二区精品葵司在线| 国产精品一级在线| 亚洲一级二级三级在线免费观看| 欧美日韩日日夜夜| 亚洲va天堂va国产va久| 国产亚洲人成网站| 色又黄又爽网站www久久| 九色综合狠狠综合久久| 亚洲综合丁香婷婷六月香| 久久精品免费在线观看| 在线播放日韩导航| 色悠久久久久综合欧美99| 免费欧美在线视频| 一区二区三区免费在线观看| 欧美va亚洲va| 欧美日韩精品欧美日韩精品| 国产91精品一区二区麻豆网站| 日韩成人一区二区| 亚洲视频小说图片| 国产精品久久久久久一区二区三区|