十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
MongoDB集群搭建

10年的資源網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整資源建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)公司從事“資源網(wǎng)站設(shè)計”,“資源網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。
MongoDB的復(fù)制集群類型:
·主從模式(master/slave)
·副本集模式(replica set)
副本及模式至少3個節(jié)點(一主二從),從節(jié)點負(fù)責(zé)復(fù)制主節(jié)點的oplog到本地并且應(yīng)用到本地從而實現(xiàn)冗余。
(·arbiter:僅參與選舉,但不持有任何數(shù)據(jù)
·0優(yōu)先級:可以觸發(fā)選舉,但是不能被選舉成為主節(jié)點
·可以使用repiset來定義集群名稱)
1.編譯安裝MongDB
準(zhǔn)備環(huán)境:
系統(tǒng):Debian 7.2 64位
mongodb:mongodb-linux-x86_64-2.4.5.tgz(官網(wǎng)有下)
- root@namenode1:/usr/local/tools# tar xfmongodb-linux-x86_64-2.4.5.tgz
- root@namenode1:/usr/local/tools# mv mongodb-linux-x86_64-2.4.5 /usr/local/
- root@namenode1:/usr/local/tools# cd /usr/local/
- root@namenode1:/usr/local# ln -s /usr/local/mongodb-linux-x86_64-2.4.5//usr/local/mongodb
- root@namenode1:/usr/local# ll | grep mongo
- lrwxrwxrwx 1 root staff 38 3月 17 15:35 mongodb ->/usr/local/mongodb-linux-x86_64-2.4.5/
- drwxr-sr-x 3 root staff 4096 3月 17 15:08 mongodb-linux-x86_64-2.4.5
#創(chuàng)建用戶
- root@namenode1:~# groupadd -r mongod
- root@namenode1:~# useradd -M -r -g mongod -d /data/db -s /bin/false -c mongodmongod
#建立目錄
- root@namenode1:~# mkdir -p /var/log/mongo/
- root@namenode1:~# mkdir -p /mongo/data
- root@namenode1:~# chown mongod /mongo/data /var/log/mongo/
- root@namenode1:~# ll /var/log/ | grep mongo
- drwxr-xr-x 2mongod root 4096 Mar 17 15:25mongo
- root@namenode1:~# ll /mongo/
- total 4
- drwxr-xr-x 2 mongod root 4096 Mar 17 15:27 data
#將LC_ALL="C"加入環(huán)境變量,以防啟動出錯
- root@namenode1:~# echo ‘export LC_ALL="C"’ >> /etc/profile
#創(chuàng)建配置文件(將之前rpm包安裝mongodb后的配置文件拷貝過來即可)
- root@namenode1:~# cat /etc/mongod.conf
- # mongo.conf
- #where to log
- logpath=/var/log/mongo/mongod.log
- logappend=true
- # fork and run in background
- fork = true
- #port = 27017
- dbpath=/mongo/data
- # location of pidfile
- pidfilepath = /var/run/mongodb/mongod.pid
- # Disables write-ahead journaling
- # nojournal = true
- # Enables periodic logging of CPU utilization and I/O wait
- #cpu = true
- # Turn on/off security. Off is currently the default
- #noauth = true
- #auth = true
- # Verbose logging output.
- #verbose = true
- # Inspect all client data for validity on receipt (useful for
- # developing drivers)
- #objcheck = true
- # Enable db quota management
- #quota = true
- # Set oplogging level where n is
- # 0=off (default)
- # 1=W
- # 2=R
- # 3=both
- # 7=W+some reads
- #diaglog = 0
- # Ignore query hints
- #nohints = true
- # Disable the HTTP interface (Defaults to localhost:27018).
- #nohttpinterface = true
- # Turns off server-side scripting. This will result in greatly limited
- # functionality
- #noscripting = true
- # Turns off table scans. Any query that would do a table scan fails.
- #notablescan = true
- # Disable data file preallocation.
- #noprealloc = true
- # Specify .ns file size for new databases.
- # nssize =
- # Accout token for Mongo monitoring server.
- #mms-token =
- # Server name for Mongo monitoring server.
- #mms-name =
- # Ping interval for Mongo monitoring server.
- #mms-interval =
- # Replication Options
- # in replicated mongo databases, specify here whether this is a slave or master
- #slave = true
- #source = master.cdxwcx.com
- # Slave only: specify a single database to replicate
- #only = master.cdxwcx.com
- # or
- #master = true
- #source = slave.cdxwcx.com
啟動mongodb
- export LC_ALL="C"
- root@namenode2:/usr/local/mongodb/bin# mongod -f /etc/mongod.conf
2.安裝Rockmongo
RockMongo 是一個PHP5寫的MongoDB管理工具。主要特征:使用寬松的New BSD License協(xié)議,速度快,安裝簡單,與mysql的phpmyadmin相似
- root@namenode1:~# apt-get install apache2 php5 php5-dev php5-cli
- root@namenode1:/etc/apache2# cd /var/www/
- root@namenode1:/var/www# wgethttp://rock-php.googlecode.com/files/rockmongo-v1.0.11.zip
- root@namenode1:/var/www# unzip rockmongo-v1.0.11.zip
#二次編譯php模塊
- root@namenode1:/var/www/mongo-php-driver-master# phpize
- root@namenode1:/var/www/mongo-php-driver-master# ./configure
- root@namenode1:/var/www/mongo-php-driver-master# make && makeinstall
#找到php模塊所在路徑
- root@namenode1:/var/www/mongo-php-driver-master# php -i | grepextension_dir
- extension_dir => /usr/lib/php5/20100525 => /usr/lib/php5/20100525
- root@namenode1:/var/www/mongo-php-driver-master# ll /usr/lib/php5/20100525
- total 2084
- -rwxr-xr-x 1 root root 2016810 Mar 17 16:35 mongo.so
- -rw-r--r-- 1 root root 113072 Dec 12 16:53 pdo.so
#php在debian系統(tǒng)所安裝的路徑在以下的位置,如果是其他系統(tǒng)需根據(jù)相對路徑進行查找
- root@namenode1:/var/www/mongo-php-driver-master# ll/etc/php5/apache2/php.ini
- -rw-r--r-- 1 root root 65755 Dec 12 16:53 /etc/php5/apache2/php.ini
- root@namenode1:/var/www/mongo-php-driver-master# vi/etc/php5/apache2/php.ini
在733行加入內(nèi)容,并保存退出
- 733 extension = mongo.so
重啟apache并查看url是否生效
- root@namenode1:/etc/init.d/apache restart
訪問以下地址
- http://172.23.214.50/rockmongo/index.php?action=index.login
可以看到如下圖所示,已經(jīng)可以正常顯示mongodb的管理登陸界面,默認(rèn)情況下用戶名與密碼默認(rèn)都為admin
確認(rèn)用戶名和密碼,登陸成功,如下所示
#p#
部署MongoDB主從復(fù)制:
1.規(guī)劃如下:
|
服務(wù)器IP |
服務(wù)器角色 |
|
172.23.214.47 |
Master |
|
172.23.214.50 |
Slave |
2.配置主從
編輯Master配置文件:
- root@namenode2:/var/log/mongo# grep -v "#" /etc/mongod.conf |grep -v "^$"
- logpath=/var/log/mongo/mongod.log
- logappend=true
- fork = true
- port = 27017
- dbpath=/mongo/data
- pidfilepath = /var/run/mongodb/mongod.pid
- rest = true
- maxConns=1024
- master=true #將指定其為master
- oplogSize=2048
編輯Slave配置文件
- root@namenode1:/etc# cat mongod.conf.bak_slave | grep -v "#" | grep -v"^$"
- logpath=/var/log/mongo/mongod.log
- logappend=true
- fork = true
- port = 27017
- dbpath=/mongo/data
- maxConns = 1024
- slave = true #指定其為slave
- source = 172.23.214.47:27017 #指定master的主機地址及端口號
- autoresync = true
- pidfilepath = /var/run/mongodb/mongod.pid
編輯好配置文件,雙方啟動mongodb
- root@namenode1: mongod --f /etc/mongod.conf
主庫查看日志信息:
- root@namenode2:/var/log/mongo# cat mongod.log
- Tue Mar 18 13:24:32.115 [initandlisten] connection accepted from172.23.214.50:57356 #2 (1 connection now open)
從庫查看日志信息
- root@namenode1:/var/log/mongo# tail mongod.log | grep 47
- Tue Mar 18 13:24:30.025 [initandlisten] options: { autoresync:"true", config: "/etc/mongod.conf", dbpath:"/mongo/data", fork: "true", logappend: "true",logpath: "/var/log/mongo/mongod.log", maxConns: 1024, pidfilepath:"/var/run/mongodb/mongod.pid", port: 27017, slave: "true",source: "172.23.214.47:27017" }
- Tue Mar 18 13:24:31.188 [replslave] repl: syncingfrom host:172.23.214.47:27017
驗證:主庫創(chuàng)建庫,并在從庫查看
- > db.testcoll.find()
- > show collections
- > db.testcoll.insert ( {name:"tom"})
- > show collections
- system.indexes
- testcoll
- > db.testcoll.find()
- { "_id" : ObjectId("5327dabc9d62778b7a74ccab"),"name" : "tom" }
在從庫上查看
- >show dbs;
- local 0.078125GB
- testdb 0.203125GB
- > use testdb;
- switched to db testdb
- > db.testcoll.find()
- { "_id" : ObjectId("5327dabc9d62778b7a74ccab"),"name" : "tom" }
查看從庫日志
- root@namenode1:/var/log/mongo# tail mongod.log
- Tue Mar 18 13:33:48.042 [replslave] build index testdb.testcoll { _id: 1 }
- Tue Mar 18 13:33:48.042 [replslave] fastBuildIndexdupsToDrop:0
- Tue Mar 18 13:33:48.043 [replslave] build index done. scanned 1 totalrecords. 0 secs
- Tue Mar 18 13:33:48.062 [replslave] resync: done with initial clone for db:testdb
- Tue Mar 18 13:34:55.757 [initandlisten] connection accepted from127.0.0.1:32942 #1 (1 connection now open)
- Tue Mar 18 13:35:53.979 [replslave] repl: checkpoint applied 15operations
- Tue Mar 18 13:35:53.979 [replslave] repl: syncedTo: Mar 18 13:35:445327db30:1
- Tue Mar 18 13:38:06.018 [conn1] end connection 127.0.0.1:32942 (0 connectionsnow open)
- Tue Mar 18 13:38:23.981 [replslave] repl: checkpoint applied 15operations
- Tue Mar 18 13:38:23.982 [replslave] repl: syncedTo: Mar 18 13:38:145327dbc6:1
登錄主庫管理頁面,查看其狀態(tài)信息(master:1)
2.mongodb副本集部署
準(zhǔn)備環(huán)境
|
服務(wù)器IP |
服務(wù)器角色 |
系統(tǒng)環(huán)境 |
|
172.23.214.47 |
master |
DeBian 7 |
|
172.23.214.50 |
Slave |
DeBian 7 |
|
172.23.215.61 |
Slave |
DeBian 7 |
首先屏蔽掉配置文件中的master/slave這等敏感信息,將配置文件還原為最初狀態(tài)
***配置hosts,如果不指hosts則寫ip也可以
編輯配置文件:
3臺主機配置文件都相同
- root@namenode1:~# grep -v "#" /etc/mongod.conf | grep -v"^$"
- logpath=/var/log/mongo/mongod.log
- logappend=true
- fork = true
- port = 27017
- dbpath=/mongo/data
- pidfilepath = /var/run/mongodb/mongod.pid
- replSet = true #副本集的名字
- rest = true
- maxConns=1024
- oplogSize=2048
先將master節(jié)點啟動起來,登錄想成為master的主機,啟動mongod
- root@ namenode2:~# mongod -f /etc/mongod.conf
進入mongo
- root@namenode2:/mongo/data# mongo
初始化副本集:
- >rs.initiate()
構(gòu)建對象
- {
- "_id" : "ture", #副本集的名字,要與配置文件對應(yīng)
- "members" : [ #指定副本集成員
- {
- "_id" : 0, #指定副本集成員的id號
- "host" : 172.23.214.47:27017" #先將master添加進來而后再依次將其他成員添加進副本集
- }
- ]
- }
等待大約30秒鐘
- > rs.initiate( rsconf )
- {
- "info" : "Config now savedlocally. Should come online in about a minute.", #提示需要等待大約1分鐘,如果及時查看副本集內(nèi)容很可能報錯
- "ok" : 1
查看副本集
- > rs.conf()
添加slave
- true:PRIMARY> rs.add("172.23.214.47:27017")
- { "ok" : 1 }
- true:PRIMARY> rs.add("172.23.215.61:27017")
- { "ok" : 1 }
分別在slave上執(zhí)行:
- true:RECOVERING> rs.slaveOk()
驗證:
在master上創(chuàng)建庫:
- true:PRIMARY> use testdb;
- switched to db testdb
- true:PRIMARY> for(i=1;i<=100;i++) db.testcoll.insert({Name:"User"+i,Age:i,Gender:"M",preferbook:["bluebook","yellow book"]})
在slave節(jié)點上查看數(shù)據(jù)庫,可以看到已經(jīng)被通過到本地
- true:RECOVERING> show dbs;
- local 2.0771484375GB
- testdb 0.203125GB
- rs.initiate()//先初始化,再通過rs.add等方法修改
- 這里的config_object會記錄在local.system.replset這個集合內(nèi),這個集合會自動的在副本集成員之間廣播,而且我們不能直接修改他們,需要使用命令來改變它,例如(replSetInitiate 命令)。
設(shè)定某節(jié)點的優(yōu)先級
將一個普通數(shù)據(jù)節(jié)點修改為passive節(jié)點,也就是能同步數(shù)據(jù)、投票,但是不能成為primay
除了仲裁節(jié)點,其他每個節(jié)點都有個優(yōu)先權(quán),我們可以通過設(shè)置優(yōu)先權(quán)來決定誰的成為primay的權(quán)重***,MongoDB replica sets中通過設(shè)置priority的值來決定優(yōu)先權(quán)的大小,這個值的范圍是0--100,值越大,優(yōu)先權(quán)越高。如果值是0,那么不能成為prima
如下所示:
(#這個環(huán)境是之前保留的鏡像副本,以Host_Name進行添加的)
- true:PRIMARY> rs.conf()
- {
- "_id" : "true",
- "version" : 3,
- "members" : [
- {
- "_id" : 0,
- "host" : "namenode1:27017"
- },
- {
- "_id" : 1,
- "host" : "namenode2:27017"
- },
- {
- "_id" : 2,
- "host" : "datanode1:27017"
- }
- ]
- }
設(shè)置優(yōu)先級別
#參考http://www.cnblogs.com/Amaranthus/p/3616951.html
- true:PRIMARY> cfg.members[0].priority=2
- true:PRIMARY> rs.conf()
- {
- "_id" : "true",
- "version" : 3,
- "members" : [
- {
- "_id" : 0,
- "host" : "namenode1:27017"
- "priority": 2
- },
- {
- "_id" : 1,
- "host" : "namenode2:27017"
- },
- {
- "_id" : 2,
- "host" : "datanode1:27017"
- }
- ]
- }
#p#
節(jié)點變更
如果需要對副本集進行擴容,例如加入一臺mongodb服務(wù)器進入副本集,需要先啟動這個節(jié)點(***是將數(shù)據(jù)事先拷貝一份啟動,不然一個新的空的數(shù)據(jù)庫進來同步可能會復(fù)制過多的數(shù)據(jù)而導(dǎo)致應(yīng)用崩潰)
比如我們想將節(jié)點datanode1:27017 移除從而新加入節(jié)點test:27017
那么首先將集群中的datanode1:27017節(jié)點移除
查看節(jié)點
- true:PRIMARY> rs.status()
- {
- "set" : "true",
- "date" : ISODate("2014-03-19T04:38:52Z"),
- "myState" : 1,
- "members" : [
- {
- "_id" : 0,
- "name" : "namenode1:27017",
- "health" : 1,
- "state" : 1,
- "stateStr" : "PRIMARY",
- "uptime" : 9510,
- "optime" : Timestamp(1395197587, 1),
- "optimeDate" : ISODate("2014-03-19T02:53:07Z"),
- "self" : true
- },
- {
- "_id" : 1,
- "name" : "namenode2:27017",
- "health" : 1,
- "state" : 2,
- "stateStr" : "SECONDARY",
- "uptime" : 9183,
- "optime" : Timestamp(1395197587, 1),
- "optimeDate" : ISODate("2014-03-19T02:53:07Z"),
- "lastHeartbeat" : ISODate("2014-03-19T04:38:51Z"),
- "lastHeartbeatRecv" : ISODate("2014-03-19T04:38:51Z"),
- "pingMs" : 0,
- "syncingTo" : "namenode1:27017"
- },
- {
- "_id" : 2,
- "name" : "datanode1:27017", #將這個節(jié)點刪除
- "health" : 1,
- "state" : 2,
- "stateStr" : "SECONDARY",
- "uptime" : 6345,
- "optime" : Timestamp(1395197587, 1),
- "optimeDate" : ISODate("2014-03-19T02:53:07Z"),
- "lastHeartbeat" : ISODate("2014-03-19T04:38:50Z"),
- "lastHeartbeatRecv" : ISODate("2014-03-19T04:38:51Z"),
- "pingMs" : 0,
- "syncingTo" : "namenode1:27017"
- }
- ],
- "ok" : 1
- }
移除節(jié)點
- true:PRIMARY> rs.remove("datanode1:27017")
- Wed Mar 19 12:40:44.497 DBClientCursor::init call() failed
- Wed Mar 19 12:40:44.498 JavaScript execution failed: Error: error doing query:failed at src/mongo/shell/query.js:L78
- Wed Mar 19 12:40:44.498 trying reconnect to 127.0.0.1:27017
- Wed Mar 19 12:40:44.498 reconnect 127.0.0.1:27017 ok
再次查看副本集狀態(tài),發(fā)現(xiàn)datanode1已經(jīng)沒有了
- true:PRIMARY> rs.status()
- {
- "set" : "true",
- "date" : ISODate("2014-03-19T04:41:03Z"),
- "myState" : 1,
- "members" : [
- {
- "_id" : 0,
- "name" : "namenode1:27017",
- "health" : 1,
- "state" : 1,
- "stateStr" : "PRIMARY",
- "uptime" : 9641,
- "optime" : Timestamp(1395204044, 1),
- "optimeDate" : ISODate("2014-03-19T04:40:44Z"),
- "self" : true
- },
- {
- "_id" : 1,
- "name" : "namenode2:27017",
- "health" : 1,
- "state" : 2,
- "stateStr" : "SECONDARY",
- "uptime" : 19,
- "optime" : Timestamp(1395204044, 1),
- "optimeDate" : ISODate("2014-03-19T04:40:44Z"),
- "lastHeartbeat" : ISODate("2014-03-19T04:41:02Z"),
- "lastHeartbeatRecv" : ISODate("2014-03-19T04:41:03Z"),
- "pingMs" : 0,
- "lastHeartbeatMessage" : "syncing to: namenode1:27017",
- "syncingTo" : "namenode1:27017"
- }
- ],
- "ok" : 1
- }
接著配置啟動test節(jié)點并啟動,配置文件是相同的,啟動之后它會自動復(fù)制數(shù)據(jù)。如果數(shù)據(jù)量過大,還是建議事先通過其它機制同步數(shù)據(jù)
在master加入新節(jié)點
- true:PRIMARY> rs.add("test:27017")
- { "ok" : 1 }
查看狀態(tài)
- true:PRIMARY> rs.status()
- {
- "set" : "true",
- "date" : ISODate("2014-03-19T04:43:08Z"),
- "myState" : 1,
- "members" : [
- {
- "_id" : 0,
- "name" : "namenode1:27017",
- "health" : 1,
- "state" : 1,
- "stateStr" : "PRIMARY",
- "uptime" : 9766,
- "optime" : Timestamp(1395204185, 1),
- "optimeDate" : ISODate("2014-03-19T04:43:05Z"),
- "self" : true
- },
- {
- "_id" : 1,
- "name" : "namenode2:27017",
- "health" : 1,
- "state" : 2,
- "stateStr" : "SECONDARY",
- "uptime" : 144,
- "optime" : Timestamp(1395204185, 1),
- "optimeDate" : ISODate("2014-03-19T04:43:05Z"),
- "lastHeartbeat" : ISODate("2014-03-19T04:43:06Z"),
- "lastHeartbeatRecv" : ISODate("2014-03-19T04:43:07Z"),
- "pingMs" : 0,
- "syncingTo" : "namenode1:27017"
- },
- {
- "_id" : 2,
- "name" : "test:27017",
- "health" : 1,
- "state" : 6,
- "stateStr" : "UNKNOWN",
- "uptime" : 3,
- "optime" : Timestamp(0, 0),
- "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
- "lastHeartbeat" : ISODate("2014-03-19T04:43:07Z"),
- "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
- "pingMs" : 0,
- "lastHeartbeatMessage" : "still initializing"
- }
- ],
- "ok" : 1
- }
切換至test節(jié)點查看數(shù)據(jù)庫
- root@test:/var/log/mongo# mongo
- MongoDB shell version: 2.4.5
- connecting to: test
- true:SECONDARY> show dbs;
- admin (empty)
- local 2.0771484375GB
- testdb 0.203125GB
- true:SECONDARY> rs.slaveOk()
部署Sharding集群
sharding通過將數(shù)據(jù)集分布于多個也稱作分片(shard)的節(jié)點上來降低單節(jié)點的訪問壓力。每個分片都是一個獨立的數(shù)據(jù)庫,所有的分片組合起來構(gòu)成一個邏輯上的完整意義的數(shù)據(jù)庫。因此,分片機制降低了每個分片的數(shù)據(jù)操作量及需要存儲的數(shù)據(jù)量
sharding的實現(xiàn)思路
選擇一個合適索引而減少索引量,這種索引叫做重復(fù)索引
能夠在索引中直接查找到所有要查詢的索引,叫做覆蓋索引,能夠滿足覆蓋索引的條件并且排序次序又能夠與索引的次序相同,這種次序是"3星"的
所以任何時候創(chuàng)建索引的目的一定要與搜索碼完全匹配,至少保持一致
mongodb中可以使用db.mycoll.find().hint().explain()
來顯示索引的查詢過程mysql中可以使用 explain select XXX
副本集的集群在剛開始配置的時候有以下幾個細(xì)節(jié):
1、初始化:根據(jù)定義好的配置文件初始化,也可以讓其系統(tǒng)本身進行簡單初始化
2、簡單初始化只是將同一個repiset節(jié)點的信息添加進來,但默認(rèn)只初始化當(dāng)前節(jié)點信息
如果想重新配置這個集群的話,可以實現(xiàn)將現(xiàn)有的配置信息讀取出來而后在里面做設(shè)置之后并重新讓后續(xù)的配置生效,而也可以在后續(xù)新增節(jié)點到集群中也可以將已經(jīng)運行的節(jié)點從集群中移除出去,不管是新增和移除它們之間都會進行選舉操作的
#p#
mongodb shard架構(gòu)
1、config server : 元數(shù)據(jù)服務(wù)器,3臺,1臺為單點故障,而如果使用2臺在選舉時候,會無法得到分布式 (zookeeper)在實驗環(huán)境中有一個即可
2、mongos:路由,默認(rèn)端口27017 ,啟動的時候必須制定其config server為其指路
3、shard:能夠存儲分片的服務(wù),可以是獨立的服務(wù)器,也可以是replica set(副本集,生成環(huán)境建議使用此類型),因此生成環(huán)境中,一般都需要部署這樣的集群
sharding集群
sharding目的:
·當(dāng)單個節(jié)點所持有的數(shù)據(jù)太大,單個節(jié)點無法存儲下的時候需要做shard
·如果某個單節(jié)點所持有的數(shù)據(jù)集太大,一個節(jié)點無法存儲下的時候,則需要做shard
·如果某個單節(jié)點承載的讀寫并發(fā)請求過大時
·可預(yù)見的時間內(nèi),單個節(jié)點索引、經(jīng)常被訪問數(shù)據(jù)量,難在內(nèi)存容納下的時候,意味著可能用到swap,如果使用swap那么性能顯著下降,對于此種情況需要用到shard
sharding主要做法無非將一個數(shù)據(jù)分割為多塊,平局分布在各個節(jié)點,為了保證讀寫的性能,那么讀的操作則不做離散,而寫操作需要做離散操作
所以,mongodb主要是根據(jù)sharding key來決定分片切割的:
sharding key就是collection的索引,而collection的索引(sharding key)的選擇至關(guān)重要。通常是***個shard,也就是主shard
在shard上使用索引
使用順序索引:
使用順序插入時,寫操作會集中在有限的shard上這樣寫操作很難均勻分布
使用離散索引:
會被分散到各節(jié)點中去,很難提高讀性能
如何使用sharding key
假設(shè)我們數(shù)據(jù)庫中有個表,表內(nèi)數(shù)據(jù)分別為name,Age,Gender, 那么假設(shè)將一個collection 按照name切割,而name上創(chuàng)建的索引而是順序索引,那就意味著是按范圍進行切割的,那切割完成之后,那我們經(jīng)常按照name查詢,一般問題不大,查詢的請求只交給config server即可,config server可以幫我們完成路由,而name則是charding key。
config server中保存的是每個shard和它所持有的數(shù)據(jù)的key的范圍
以Age為例
如果是范圍分區(qū)的話,那么我們想查詢年齡在0-30歲的時
分享標(biāo)題:MongoDB集群搭建及Sharding的實現(xiàn)思路
網(wǎng)站路徑:http://www.jiaotiyi.com/article/dhopopg.html