真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Mongodbcluster-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括曲沃網(wǎng)站建設(shè)、曲沃網(wǎng)站制作、曲沃網(wǎng)頁制作以及曲沃網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,曲沃網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到曲沃省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

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

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

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

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

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

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

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

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

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

Docker部署
架構(gòu)設(shè)計(jì):

三臺主機(jī)啟動相同的進(jìn)程,mongos 、config server、shard server

Rancher 部署
每個主機(jī)按照計(jì)劃添加標(biāo)簽:

mongos=true

shard2=true

shard3=true

shard1=true

config=true

host網(wǎng)絡(luò)模式,端口務(wù)必不能被占用

新建服務(wù):

粘貼以下內(nèi)容:

compose
version: '2'
services:
  shard2:
    image: mongo:4.0.1-xenial
    stdin_open: true
    network_mode: host
    volumes:
    - /data/shard2:/data/db
    tty: true
    command:
    - /usr/bin/mongod
    - --shardsvr
    - --replSet
    - shard2
    - --port
    - '27002'
    - --bind_ip_all
    - --dbpath
    - /data/db
    - --logpath
    - /data/db/shard2.log
    - --oplogSize
    - '10'
    labels:
      io.rancher.scheduler.affinity:host_label: shard2=true
      io.rancher.container.pull_image: always
      io.rancher.scheduler.global: 'true'
  mongos:
    image: mongo:4.0.1-xenial
    stdin_open: true
    network_mode: host
    volumes:
    - /data/mongos:/data/db
    tty: true
    command:
    - mongos
    - --configdb
    - myset/172.20.101.132:27000,172.20.101.133:27000,172.20.101.134:27000
    - --port
    - '27017'
    - --bind_ip_all
    labels:
      io.rancher.scheduler.affinity:host_label: mongos=true
      io.rancher.container.pull_image: always
      io.rancher.scheduler.global: 'true'
  shard3:
    image: mongo:4.0.1-xenial
    stdin_open: true
    network_mode: host
    volumes:
    - /data/shard3:/data/db
    tty: true
    command:
    - /usr/bin/mongod
    - --shardsvr
    - --replSet
    - shard3
    - --port
    - '27003'
    - --bind_ip_all
    - --dbpath
    - /data/db
    - --logpath
    - /data/db/shard3.log
    - --oplogSize
    - '10'
    labels:
      io.rancher.scheduler.affinity:host_label: shard3=true
      io.rancher.container.pull_image: always
      io.rancher.scheduler.global: 'true'
  shard1:
    image: mongo:4.0.1-xenial
    stdin_open: true
    network_mode: host
    volumes:
    - /data/shard1:/data/db
    tty: true
    command:
    - /usr/bin/mongod
    - --shardsvr
    - --replSet
    - shard1
    - --port
    - '27001'
    - --bind_ip_all
    - --dbpath
    - /data/db
    - --logpath
    - /data/db/shard1.log
    - --oplogSize
    - '10'
    labels:
      io.rancher.scheduler.affinity:host_label: shard1=true
      io.rancher.container.pull_image: always
      io.rancher.scheduler.global: 'true'
  config:
    image: mongo:4.0.1-xenial
    stdin_open: true
    network_mode: host
    volumes:
    - /data/config:/data/db
    tty: true
    command:
    - /usr/bin/mongod
    - --configsvr
    - --replSet
    - myset
    - --bind_ip_all
    - --dbpath
    - /data/db
    - --port
    - '27000'
    - --logpath
    - /data/db/config.log
    labels:
      io.rancher.scheduler.affinity:host_label: config=true
      io.rancher.container.pull_image: always
      io.rancher.scheduler.global: 'true'
rancher-compose:

rancher-compose
version: '2'
services:
  mongos:
    start_on_create: true
  shard2:
    start_on_create: true
  shard3:
    start_on_create: true
  shard1:
    start_on_create: true
  config:
    start_on_create: true

1、登錄某一個宿主機(jī)鏈接shard1:

127.0.0.1:27001/admin

config = { _id:"shard1", members:[

                     {_id:0,host:"172.20.101.132:27001"},

                     {_id:1,host:"172.20.101.133:27001"},

                     {_id:2,host:"172.20.101.134:27001"}

                ]

         }

rs.initiate(config)

2、鏈接shard2

127.0.0.1:27002/admin


config = { _id:"shard2", members:[

                     {_id:0,host:"172.20.101.132:27002"},

                     {_id:1,host:"172.20.101.133:27002"},

                     {_id:2,host:"172.20.101.134:27002"}

                ]

         }

rs.initiate(config)

3、鏈接shard3

127.0.0.1:27003/admin

config = { _id:"shard3", members:[
                     {_id:0,host:"172.20.101.132:27003"},
                     {_id:1,host:"172.20.101.133:27003"},
                     {_id:2,host:"172.20.101.134:27003"}
                ]
         }

rs.initiate(config)
4、鏈接config服務(wù):

config = {_id: 'myset', members: [
                          {_id: 0, host: '172.20.101.132:27000'},
                          {_id: 1, host: '172.20.101.133:27000'},
                          {_id: 2, host: '172.20.101.134:27000'}]
           }

rs.initiate(config)
5、登錄mongos:

mongo  127.0.0.1:27017/admin #登錄mongos,增加節(jié)點(diǎn)
db.runCommand( { addshard : "shard1/172.20.101.132:27001,172.20.101.133:27001,172.20.101.134:27001",name:"shard1"});
db.runCommand( { addshard : "shard2/172.20.101.132:27002,172.20.101.133:27002,172.20.101.134:27002",name:"shard2"});
db.runCommand( { addshard : "shard3/172.20.101.132:27003,172.20.101.133:27003,172.20.101.134:27003",name:"shard3"});

6、查看集群狀態(tài)
sh.status()
主機(jī)安裝
一、安裝

1、

cat >/etc/yum.repos.d/mongodb-org-4.0.repo<[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
EOF

yum install -y mongodb-org-4.0.1 mongodb-org-server-4.0.1 mongodb-org-shell-4.0.1 mongodb-org-mongos-4.0.1 mongodb-org-tools-4.0.1

2、

建立目錄 mongos目錄、config server目錄、share目錄

mkdir -p /data/mongodb/{shard1,shard2,shard3,mongos,config,shard1/data,shard1/log,shard2/data,shard2/log,shard3/data,shard3/log,mongos/log,config/log,config/data}

chown mongod.mongod /data/mongodb/ -R

3、

需要啟動5個進(jìn)程所以要規(guī)劃5個組件對應(yīng)的端口號,由于一個機(jī)器需要同時部署 mongos、config server 、shard1、shard2、shard3

mongos:27017

config server:27000

shard1、shard2、shard3 : 27001 27002 27003

4、啟動各進(jìn)程

#mongos
mongos --configdb myset/172.20.101.132:27000,172.20.101.133:27000,172.20.101.134:27000 --port 27017 --logpath /data/mongodb/mongos/mongos.log --fork

#config
mongod --configsvr --replSet myset --bind_ip_all --dbpath /data/mongodb/config/data --port 27000 --logpath /data/mongodb/config/log/config.log --fork

#shard1 #shard2 #shard3

mongod --shardsvr --replSet shard1 --bind_ip_all --port 27001 --dbpath /data/mongodb/shard1/data --logpath /data/mongodb/shard1/log/shard1.log --fork --oplogSize 10
mongod --shardsvr --replSet shard2 --bind_ip_all --port 27002 --dbpath /data/mongodb/shard2/data --logpath /data/mongodb/shard2/log/shard2.log --fork --oplogSize 10
mongod --shardsvr --replSet shard3 --bind_ip_all --port 27003 --dbpath /data/mongodb/shard3/data --logpath /data/mongodb/shard3/log/shard3.log --fork --oplogSize 10

5、設(shè)置副本集

連接 shard1:mongo 127.0.0.1:27001/admin/

config = { _id:"shard1", members:[
{_id:0,host:"172.20.101.132:27001"},
{_id:1,host:"172.20.101.133:27001"},
{_id:2,host:"172.20.101.134:27001",arbiterOnly:true}
]
}
rs.initiate(config)

連接 shard2:mongo 127.0.0.1:27001/admin

config = { _id:"shard2", members:[
{_id:0,host:"172.20.101.132:27002"},
{_id:1,host:"172.20.101.133:27002"},
{_id:2,host:"172.20.101.134:27002",arbiterOnly:true}
]
}
rs.initiate(config)

連接 shard3:mongo 127.0.0.1:27001/admin

config = { _id:"shard3", members:[
{_id:0,host:"172.20.101.132:27003"},
{_id:1,host:"172.20.101.133:27003"},
{_id:2,host:"172.20.101.134:27003",arbiterOnly:true}
]
}

config server 副本

config = {_id: 'myset', members: [
{_id: 0, host: '172.20.101.132:27000'},
{_id: 1, host: '172.20.101.133:27000'},
{_id: 2, host: '172.20.101.134:27000'}]
}
rs.initiate(config)

6、mongo 127.0.0.1:27017/admin #登錄mongos,增加節(jié)點(diǎn)

db.runCommand( { addshard : "shard1/172.20.101.132:27001,172.20.101.133:27001,172.20.101.134:27001",name:"shard1"});
db.runCommand( { addshard : "shard2/172.20.101.132:27002,172.20.101.133:27002,172.20.101.134:27002",name:"shard2"});
db.runCommand( { addshard : "shard3/172.20.101.132:27003,172.20.101.133:27003,172.20.101.134:27003",name:"shard3"});

致辭,部署完成。

測試:
1、殺掉第二個節(jié)點(diǎn)所有進(jìn)程
可讀寫,沒有任何影響
2、繼續(xù)殺掉第一個主節(jié)點(diǎn)
只剩第三個節(jié)點(diǎn),第三個節(jié)點(diǎn)依然是SECONDARY,節(jié)點(diǎn)不可寫。重啟節(jié)點(diǎn)2后,節(jié)點(diǎn)3變?yōu)橹鞴?jié)點(diǎn),功能恢復(fù),繼續(xù)啟動第一個節(jié)點(diǎn),第幾節(jié)點(diǎn)變?yōu)镾ECONDARY

3、如果節(jié)點(diǎn)太長時間沒有建立連接,啟動后會變成recovery狀態(tài),操作:關(guān)掉進(jìn)程,刪除數(shù)據(jù)文件,重啟即可。

4、添加刪除shard 節(jié)點(diǎn):

rs.remove("172.20.101.134:27002");
rs.add("172.20.101.134:27002");

5、添加刪除shard分片,需要在主節(jié)點(diǎn)操作,查找主節(jié)點(diǎn),鏈接mongos:mongo ip:27017/admin,sh.status()即可找到主節(jié)點(diǎn)

db.runCommand( { addshard : "shard4/172.20.101.125:27004,172.20.101.133:27004",name:"shard4"});
db.runCommand( { removeshard : "shard4/172.20.101.125:27004,172.20.101.133:27004",name:"shard4"});

常用操作:
1、用戶相關(guān)

db.auth('admin','ptmind') #登錄認(rèn)證

創(chuàng)建用戶附權(quán)限
db.createUser({user:'datadeck', pwd:'ptmind', roles:['userAdminAnyDatabase']});
db.createUser({user:'datadeck', pwd:'ptmind', roles:['root']});

2、增刪改查:

新建并選擇數(shù)據(jù)庫
use nettest

新增并寫入數(shù)據(jù)

db.testtable.insert({'k':'3','c':'4'})
查看表
show collections
查看表內(nèi)數(shù)據(jù)
db.testtable.find().pretty()

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

rs.remove("172.20.101.134:27002");
rs.add("172.20.101.134:27002");

添加刪除shard分片,需要在主節(jié)點(diǎn)操作,查找主節(jié)點(diǎn),鏈接mongos:mongo ip:27017/admin,sh.status()即可找到主節(jié)點(diǎn)

db.runCommand( { addshard : "shard4/172.20.101.125:27004,172.20.101.133:27004",name:"shard4"});
db.runCommand( { removeshard : "shard4/172.20.101.125:27004,172.20.101.133:27004",name:"shard4"});

3、集群狀態(tài)

查看副本集命令:

db.runCommand( { listshards : 1 } )

查看狀態(tài):

sh.status();

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

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

mongos> db.runCommand( { enablesharding : "test" } )
指定分片建對集合分片,范圍片鍵–創(chuàng)建索引

查看shard狀態(tài),登錄某個shard節(jié)點(diǎn)

rs.status()

4、備份恢復(fù)

a、mongodump 導(dǎo)出為二進(jìn)制bson文件

mongodump -h dbhost -d dbname -o dbdirectory(目錄)

           備份單個collection
           mongodump --db test --collection collection

           備份單個庫

mongodump -h 127.0.0.1:27017/admin -d db_distribution_test_YYJOTVSUQI -o /var/tmp/db_distribution_test_YYJOTVSUQI.mongodb

備份整個庫去掉表明即可

mongorestore恢復(fù)數(shù)據(jù)默認(rèn)是追加,如打算先刪除后導(dǎo)入,可以加上--drop參數(shù),不過添加--drop參數(shù)后,會將數(shù)據(jù)庫數(shù)據(jù)清空后再導(dǎo)入,如果數(shù)據(jù)庫備份后又新加入了數(shù)據(jù),也會將新加的數(shù)據(jù)刪除,它不像mysql有一個存在的判斷。
mongorestore -h <:port> -d dbname

b、mongoexport

-h,--host :代表遠(yuǎn)程連接的數(shù)據(jù)庫地址,默認(rèn)連接本地Mongo數(shù)據(jù)庫;
--port:代表遠(yuǎn)程連接的數(shù)據(jù)庫的端口,默認(rèn)連接的遠(yuǎn)程端口27017;
-u,--username:代表連接遠(yuǎn)程數(shù)據(jù)庫的賬號,如果設(shè)置數(shù)據(jù)庫的認(rèn)證,需要指定用戶賬號;
-p,--password:代表連接數(shù)據(jù)庫的賬號對應(yīng)的密碼;
-d,--db:代表連接的數(shù)據(jù)庫;
-c,--collection:代表連接數(shù)據(jù)庫中的集合;
-f, --fields:代表集合中的字段,可以根據(jù)設(shè)置選擇導(dǎo)出的字段;
--type:代表導(dǎo)出輸出的文件類型,包括csv和json文件;
-o, --out:代表導(dǎo)出的文件名;
-q, --query:代表查詢條件;
--skip:跳過指定數(shù)量的數(shù)據(jù);
--limit:讀取指定數(shù)量的數(shù)據(jù)記錄;
--sort:對數(shù)據(jù)進(jìn)行排序,可以通過參數(shù)指定排序的字段,并使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而-1是用于降序排列,如sort({KEY:1})。
mongoimport 簡介,通過幫助先了解下mongoimport的功能參數(shù)

關(guān)鍵參數(shù)說明:

h,--host :代表遠(yuǎn)程連接的數(shù)據(jù)庫地址,默認(rèn)連接本地Mongo數(shù)據(jù)庫;
--port:代表遠(yuǎn)程連接的數(shù)據(jù)庫的端口,默認(rèn)連接的遠(yuǎn)程端口27017;
-u,--username:代表連接遠(yuǎn)程數(shù)據(jù)庫的賬號,如果設(shè)置數(shù)據(jù)庫的認(rèn)證,需要指定用戶賬號;
-p,--password:代表連接數(shù)據(jù)庫的賬號對應(yīng)的密碼;
-d,--db:代表連接的數(shù)據(jù)庫;
-c,--collection:代表連接數(shù)據(jù)庫中的集合;
-f, --fields:代表導(dǎo)入集合中的字段;
--type:代表導(dǎo)入的文件類型,包括csv和json,tsv文件,默認(rèn)json格式;
--file:導(dǎo)入的文件名稱
--headerline:導(dǎo)入csv文件時,指明第一行是列名,不需要導(dǎo)入;
實(shí)例演示:

#首先查看集合中的數(shù)據(jù) > db.bike_bak.find() { "_id" : ObjectId("59e8c27804390e04a063159d"), "lat" : 39.9571954199, "bikeId" : "pgdAVg", "current_time" : "2017-10-19 23:19:19", "source" : "ofo", "lng" : 116.3926501736 } #刪除集合中的數(shù)據(jù) > db.bike_bak.remove({"bikeId" : "pgdAVg"}) WriteResult({ "nRemoved" : 1 }) #查看集合是否包含數(shù)據(jù) > db.bike_bak.find() > #導(dǎo)入數(shù)據(jù) [root@iZ2ze4b308vd83fulq9n7iZ ~]# mongoimport --port 27030 -u sa -p Expressin@0618 -d mapdb -c bike_bak --type=json --file bike.csv 2017-10-25T11:59:51.020+0800 connected to: localhost:27030
2017-10-25T11:59:51.030+0800 imported 1 document #檢查數(shù)據(jù)是否導(dǎo)入成功 > db.bike_bak.find() { "_id" : ObjectId("59e8c27804390e04a063159d"), "bikeId" : "pgdAVg", "current_time" : "2017-10-19 23:19:19", "lat" : 39.9571954199, "lng" : 116.3926501736, "source" : "ofo" }
[root@iZ2ze4b308vd83fulq9n7iZ ~]# mongoimport --help Usage: mongoimport

注意:

當(dāng)查詢時同時使用sort,skip,limit,無論位置先后,最先執(zhí)行順序 sort再skip再limit。

實(shí)例:

首先查看下數(shù)據(jù)庫中的數(shù)據(jù)一共多少條,通過的命令的方式查看下我們要導(dǎo)出的數(shù)據(jù)信息

db.bike.find().count() 16878865
db.bike.find({"source":"ofo"}).limit(1) { "_id" : ObjectId("59e8c27804390e04a063159d"), "lat" : 39.9571954199, "bikeId" : "pgdAVg", "current_time" : "2017-10-19 23:19:19", "source" : "ofo", "lng" : 116.3926501736 } >
如何通過mongoexport導(dǎo)出"bikeId" : "pgdAVg"的數(shù)據(jù),我導(dǎo)出了json和csv兩種類型的數(shù)據(jù);

#導(dǎo)出類型為json,數(shù)據(jù)庫:mapdb,集合:bike 字段:bikeId,lat,lng,current_time,source ,條件為source字段為ofo第一條數(shù)據(jù) mongoexport --port 27030 -u sa -p Expressin@0618 -d mapdb -c bike -f bikeId,lat,lng,current_time,source --type=json -o bike.csv --query='{"source":"ofo"}' --limit=1 #導(dǎo)出類型為csv,數(shù)據(jù)庫:mapdb,集合:bike 字段:bikeId,lat,lng,current_time,source ,條件為source字段為ofo第一條數(shù)據(jù) mongoexport --port 27030 -u sa -p Expressin@0618 -d mapdb -c bike -f bikeId,lat,lng,current_time,source --type=csv -o bike.csv --query='{"source":"ofo"}' --limit=1

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


文章名稱:Mongodbcluster-創(chuàng)新互聯(lián)
分享路徑:http://weahome.cn/article/ceiech.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部