日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
MongoDB集群搭建及Sharding的實現(xiàn)思路

MongoDB集群搭建

10年的資源網站建設經驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。營銷型網站建設的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調整資源建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)公司從事“資源網站設計”,“資源網站推廣”以來,每個客戶項目都認真落實執(zhí)行。

MongoDB的復制集群類型:

·主從模式(master/slave)

·副本集模式(replica set)

副本及模式至少3個節(jié)點(一主二從),從節(jié)點負責復制主節(jié)點的oplog到本地并且應用到本地從而實現(xiàn)冗余。

(·arbiter:僅參與選舉,但不持有任何數(shù)據(jù)

·0優(yōu)先級:可以觸發(fā)選舉,但是不能被選舉成為主節(jié)點

·可以使用repiset來定義集群名稱)

1.編譯安裝MongDB

準備環(huán)境:

系統(tǒng):Debian 7.2 64位

mongodb:mongodb-linux-x86_64-2.4.5.tgz(官網有下)

 
 
  1. root@namenode1:/usr/local/tools# tar xfmongodb-linux-x86_64-2.4.5.tgz 
  2. root@namenode1:/usr/local/tools# mv mongodb-linux-x86_64-2.4.5 /usr/local/
  3. root@namenode1:/usr/local/tools# cd /usr/local/
  4. root@namenode1:/usr/local# ln -s /usr/local/mongodb-linux-x86_64-2.4.5//usr/local/mongodb
  5. root@namenode1:/usr/local# ll | grep mongo
  6. lrwxrwxrwx  1 root   staff    38  3月 17 15:35 mongodb ->/usr/local/mongodb-linux-x86_64-2.4.5/
  7. drwxr-sr-x  3 root   staff  4096  3月 17 15:08 mongodb-linux-x86_64-2.4.5

#創(chuàng)建用戶

 
 
  1. root@namenode1:~# groupadd -r mongod
  2. root@namenode1:~# useradd -M -r -g mongod -d /data/db -s /bin/false -c mongodmongod

#建立目錄

 
 
  1. root@namenode1:~# mkdir -p /var/log/mongo/
  2. root@namenode1:~# mkdir -p /mongo/data
  3. root@namenode1:~# chown mongod /mongo/data /var/log/mongo/
  4. root@namenode1:~# ll /var/log/ | grep mongo
  5. drwxr-xr-x 2mongod           root          4096 Mar 17 15:25mongo
  6. root@namenode1:~# ll /mongo/
  7. total 4
  8. drwxr-xr-x 2 mongod root 4096 Mar 17 15:27 data

#將LC_ALL="C"加入環(huán)境變量,以防啟動出錯

 
 
  1. root@namenode1:~# echo ‘export LC_ALL="C"’ >> /etc/profile

#創(chuàng)建配置文件(將之前rpm包安裝mongodb后的配置文件拷貝過來即可)

 
 
  1. root@namenode1:~# cat /etc/mongod.conf
  2. # mongo.conf
  3. #where to log
  4. logpath=/var/log/mongo/mongod.log
  5. logappend=true
  6. # fork and run in background
  7. fork = true
  8. #port = 27017
  9. dbpath=/mongo/data
  10. # location of pidfile
  11. pidfilepath = /var/run/mongodb/mongod.pid
  12. # Disables write-ahead journaling
  13. # nojournal = true
  14. # Enables periodic logging of CPU utilization and I/O wait
  15. #cpu = true
  16. # Turn on/off security.  Off is currently the default
  17. #noauth = true
  18. #auth = true
  19. # Verbose logging output.
  20. #verbose = true
  21. # Inspect all client data for validity on receipt (useful for
  22. # developing drivers)
  23. #objcheck = true
  24. # Enable db quota management
  25. #quota = true
  26. # Set oplogging level where n is
  27. #   0=off (default)
  28. #   1=W
  29. #   2=R
  30. #   3=both
  31. #   7=W+some reads
  32. #diaglog = 0
  33. # Ignore query hints
  34. #nohints = true
  35. # Disable the HTTP interface (Defaults to localhost:27018).
  36. #nohttpinterface = true
  37. # Turns off server-side scripting.  This will result in greatly limited
  38. # functionality
  39. #noscripting = true
  40. # Turns off table scans.  Any query that would do a table scan fails.
  41. #notablescan = true
  42. # Disable data file preallocation.
  43. #noprealloc = true
  44. # Specify .ns file size for new databases.
  45. # nssize = 
  46. # Accout token for Mongo monitoring server.
  47. #mms-token = 
  48. # Server name for Mongo monitoring server.
  49. #mms-name = 
  50. # Ping interval for Mongo monitoring server.
  51. #mms-interval = 
  52. # Replication Options
  53. # in replicated mongo databases, specify here whether this is a slave or master
  54. #slave = true
  55. #source = master.cdxwcx.com
  56. # Slave only: specify a single database to replicate
  57. #only = master.cdxwcx.com
  58. # or
  59. #master = true
  60. #source = slave.cdxwcx.com

啟動mongodb

 
 
  1. export LC_ALL="C"
  2. root@namenode2:/usr/local/mongodb/bin# mongod -f /etc/mongod.conf  

2.安裝Rockmongo

RockMongo 是一個PHP5寫的MongoDB管理工具。主要特征:使用寬松的New BSD License協(xié)議,速度快,安裝簡單,與mysql的phpmyadmin相似

 
 
  1. root@namenode1:~# apt-get install apache2 php5 php5-dev php5-cli
  2. root@namenode1:/etc/apache2# cd /var/www/
  3. root@namenode1:/var/www# wgethttp://rock-php.googlecode.com/files/rockmongo-v1.0.11.zip
  4. root@namenode1:/var/www# unzip rockmongo-v1.0.11.zip

#二次編譯php模塊

 
 
  1. root@namenode1:/var/www/mongo-php-driver-master# phpize 
  2. root@namenode1:/var/www/mongo-php-driver-master# ./configure  
  3. root@namenode1:/var/www/mongo-php-driver-master# make && makeinstall

#找到php模塊所在路徑

 
 
  1. root@namenode1:/var/www/mongo-php-driver-master#  php -i | grepextension_dir
  2. extension_dir => /usr/lib/php5/20100525 => /usr/lib/php5/20100525
  3. root@namenode1:/var/www/mongo-php-driver-master# ll /usr/lib/php5/20100525
  4. total 2084
  5. -rwxr-xr-x 1 root root 2016810 Mar 17 16:35 mongo.so
  6. -rw-r--r-- 1 root root  113072 Dec 12 16:53 pdo.so

#php在debian系統(tǒng)所安裝的路徑在以下的位置,如果是其他系統(tǒng)需根據(jù)相對路徑進行查找

 
 
  1. root@namenode1:/var/www/mongo-php-driver-master# ll/etc/php5/apache2/php.ini
  2. -rw-r--r-- 1 root root 65755 Dec 12 16:53 /etc/php5/apache2/php.ini
  3. root@namenode1:/var/www/mongo-php-driver-master# vi/etc/php5/apache2/php.ini

在733行加入內容,并保存退出

 
 
  1. 733 extension = mongo.so  

重啟apache并查看url是否生效

 
 
  1. root@namenode1:/etc/init.d/apache restart

訪問以下地址

 
 
  1. http://172.23.214.50/rockmongo/index.php?action=index.login

可以看到如下圖所示,已經可以正常顯示mongodb的管理登陸界面,默認情況下用戶名與密碼默認都為admin

確認用戶名和密碼,登陸成功,如下所示

#p#

部署MongoDB主從復制:

1.規(guī)劃如下:

服務器IP

服務器角色

172.23.214.47

Master

172.23.214.50

Slave

2.配置主從

編輯Master配置文件:

 
 
  1. root@namenode2:/var/log/mongo# grep -v "#" /etc/mongod.conf |grep -v "^$"
  2. logpath=/var/log/mongo/mongod.log
  3. logappend=true
  4. fork = true
  5. port = 27017
  6. dbpath=/mongo/data
  7. pidfilepath = /var/run/mongodb/mongod.pid
  8. rest = true
  9. maxConns=1024
  10. master=true                           #將指定其為master
  11. oplogSize=2048

編輯Slave配置文件

 
 
  1. root@namenode1:/etc# cat mongod.conf.bak_slave  | grep -v "#" | grep -v"^$"
  2. logpath=/var/log/mongo/mongod.log
  3. logappend=true
  4. fork = true
  5. port = 27017
  6. dbpath=/mongo/data
  7. maxConns = 1024
  8. slave = true                         #指定其為slave
  9. source = 172.23.214.47:27017         #指定master的主機地址及端口號
  10. autoresync = true
  11. pidfilepath = /var/run/mongodb/mongod.pid

編輯好配置文件,雙方啟動mongodb

 
 
  1. root@namenode1: mongod --f /etc/mongod.conf

主庫查看日志信息:

 
 
  1. root@namenode2:/var/log/mongo# cat mongod.log
  2. Tue Mar 18 13:24:32.115 [initandlisten] connection accepted from172.23.214.50:57356 #2 (1 connection now open)

從庫查看日志信息

 
 
  1. root@namenode1:/var/log/mongo# tail mongod.log  | grep 47
  2. 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" }
  3. Tue Mar 18 13:24:31.188 [replslave] repl: syncingfrom host:172.23.214.47:27017

驗證:主庫創(chuàng)建庫,并在從庫查看

 
 
  1. > db.testcoll.find()
  2. > show collections
  3. > db.testcoll.insert ( {name:"tom"})
  4. > show collections
  5. system.indexes
  6. testcoll
  7. > db.testcoll.find()
  8. { "_id" : ObjectId("5327dabc9d62778b7a74ccab"),"name" : "tom" }

在從庫上查看

 
 
  1. >show dbs;
  2. local     0.078125GB
  3. testdb     0.203125GB
  4. > use testdb;
  5. switched to db testdb
  6. > db.testcoll.find()
  7. { "_id" : ObjectId("5327dabc9d62778b7a74ccab"),"name" : "tom" }

查看從庫日志

 
 
  1. root@namenode1:/var/log/mongo# tail mongod.log
  2. Tue Mar 18 13:33:48.042 [replslave] build index testdb.testcoll { _id: 1 }
  3. Tue Mar 18 13:33:48.042 [replslave]      fastBuildIndexdupsToDrop:0
  4. Tue Mar 18 13:33:48.043 [replslave] build index done.  scanned 1 totalrecords. 0 secs
  5. Tue Mar 18 13:33:48.062 [replslave] resync: done with initial clone for db:testdb
  6. Tue Mar 18 13:34:55.757 [initandlisten] connection accepted from127.0.0.1:32942 #1 (1 connection now open)
  7. Tue Mar 18 13:35:53.979 [replslave] repl:   checkpoint applied 15operations
  8. Tue Mar 18 13:35:53.979 [replslave] repl:   syncedTo: Mar 18 13:35:445327db30:1
  9. Tue Mar 18 13:38:06.018 [conn1] end connection 127.0.0.1:32942 (0 connectionsnow open)
  10. Tue Mar 18 13:38:23.981 [replslave] repl:   checkpoint applied 15operations
  11. Tue Mar 18 13:38:23.982 [replslave] repl:   syncedTo: Mar 18 13:38:145327dbc6:1

登錄主庫管理頁面,查看其狀態(tài)信息(master:1)

2.mongodb副本集部署

準備環(huán)境

服務器IP

服務器角色

系統(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臺主機配置文件都相同

 
 
  1. root@namenode1:~# grep -v "#" /etc/mongod.conf | grep -v"^$"
  2. logpath=/var/log/mongo/mongod.log
  3. logappend=true
  4. fork = true
  5. port = 27017
  6. dbpath=/mongo/data
  7. pidfilepath = /var/run/mongodb/mongod.pid
  8. replSet = true              #副本集的名字
  9. rest = true
  10. maxConns=1024
  11. oplogSize=2048

先將master節(jié)點啟動起來,登錄想成為master的主機,啟動mongod

 
 
  1. root@ namenode2:~# mongod -f /etc/mongod.conf 

進入mongo

 
 
  1. root@namenode2:/mongo/data# mongo

初始化副本集:

 
 
  1. >rs.initiate()

構建對象

 
 
  1. {
  2.     "_id" : "ture",                                         #副本集的名字,要與配置文件對應
  3.     "members" : [                                           #指定副本集成員
  4.          {
  5.              "_id" : 0,                          #指定副本集成員的id號
  6.              "host" : 172.23.214.47:27017"       #先將master添加進來而后再依次將其他成員添加進副本集
  7.          }
  8.     ]
  9. }

等待大約30秒鐘

 
 
  1. > rs.initiate( rsconf )
  2. {
  3.     "info" : "Config now savedlocally.  Should come online in about a minute.",       #提示需要等待大約1分鐘,如果及時查看副本集內容很可能報錯
  4.     "ok" : 1

查看副本集

 
 
  1. > rs.conf()  

添加slave

 
 
  1. true:PRIMARY> rs.add("172.23.214.47:27017")
  2. { "ok" : 1 }
  3. true:PRIMARY> rs.add("172.23.215.61:27017")
  4. { "ok" : 1 }

分別在slave上執(zhí)行:

 
 
  1. true:RECOVERING> rs.slaveOk()

驗證:

在master上創(chuàng)建庫:

 
 
  1. true:PRIMARY> use testdb;
  2. switched to db testdb
  3. 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ù)庫,可以看到已經被通過到本地

 
 
  1. true:RECOVERING> show dbs;
  2. local     2.0771484375GB
  3. testdb    0.203125GB
  4. rs.initiate()//先初始化,再通過rs.add等方法修改
  5. 這里的config_object會記錄在local.system.replset這個集合內,這個集合會自動的在副本集成員之間廣播,而且我們不能直接修改他們,需要使用命令來改變它,例如(replSetInitiate 命令)。

設定某節(jié)點的優(yōu)先級

將一個普通數(shù)據(jù)節(jié)點修改為passive節(jié)點,也就是能同步數(shù)據(jù)、投票,但是不能成為primay
除了仲裁節(jié)點,其他每個節(jié)點都有個優(yōu)先權,我們可以通過設置優(yōu)先權來決定誰的成為primay的權重***,MongoDB replica sets中通過設置priority的值來決定優(yōu)先權的大小,這個值的范圍是0--100,值越大,優(yōu)先權越高。如果值是0,那么不能成為prima

如下所示:

(#這個環(huán)境是之前保留的鏡像副本,以Host_Name進行添加的)

 
 
  1. true:PRIMARY> rs.conf()
  2. {
  3.     "_id" : "true",
  4.     "version" : 3,
  5.     "members" : [
  6.          {
  7.              "_id" : 0,
  8.              "host" : "namenode1:27017"
  9.          },
  10.          {
  11.              "_id" : 1,
  12.              "host" : "namenode2:27017"
  13.          },
  14.          {
  15.              "_id" : 2,
  16.              "host" : "datanode1:27017"
  17.          }
  18.     ]
  19. }

設置優(yōu)先級別

#參考http://www.cnblogs.com/Amaranthus/p/3616951.html

 
 
  1. true:PRIMARY> cfg.members[0].priority=2 
  2. true:PRIMARY> rs.conf()
  3. {
  4.     "_id" : "true",
  5.     "version" : 3,
  6.     "members" : [
  7.          {
  8.              "_id" : 0,
  9.              "host" : "namenode1:27017"
  10. "priority": 2
  11.          },
  12.          {
  13.              "_id" : 1,
  14.              "host" : "namenode2:27017"
  15.          },
  16.          {
  17.              "_id" : 2,
  18.              "host" : "datanode1:27017"
  19.          }
  20.     ]
  21. }

#p#

節(jié)點變更

如果需要對副本集進行擴容,例如加入一臺mongodb服務器進入副本集,需要先啟動這個節(jié)點(***是將數(shù)據(jù)事先拷貝一份啟動,不然一個新的空的數(shù)據(jù)庫進來同步可能會復制過多的數(shù)據(jù)而導致應用崩潰)

比如我們想將節(jié)點datanode1:27017 移除從而新加入節(jié)點test:27017

那么首先將集群中的datanode1:27017節(jié)點移除

查看節(jié)點

 
 
  1. true:PRIMARY> rs.status()
  2. {
  3.     "set" : "true",
  4.     "date" : ISODate("2014-03-19T04:38:52Z"),
  5.     "myState" : 1,
  6.     "members" : [
  7.          {
  8.              "_id" : 0,
  9.              "name" : "namenode1:27017",
  10.              "health" : 1,
  11.              "state" : 1,
  12.              "stateStr" : "PRIMARY",
  13.              "uptime" : 9510,
  14.              "optime" : Timestamp(1395197587, 1),
  15.              "optimeDate" : ISODate("2014-03-19T02:53:07Z"),
  16.              "self" : true
  17.          },
  18.          {
  19.              "_id" : 1,
  20.              "name" : "namenode2:27017",
  21.              "health" : 1,
  22.              "state" : 2,
  23.              "stateStr" : "SECONDARY",
  24.              "uptime" : 9183,
  25.              "optime" : Timestamp(1395197587, 1),
  26.              "optimeDate" : ISODate("2014-03-19T02:53:07Z"),
  27.              "lastHeartbeat" : ISODate("2014-03-19T04:38:51Z"),
  28.              "lastHeartbeatRecv" : ISODate("2014-03-19T04:38:51Z"),
  29.              "pingMs" : 0,
  30.              "syncingTo" : "namenode1:27017"
  31.          },
  32.          {
  33.              "_id" : 2,               
  34.              "name" : "datanode1:27017",     #將這個節(jié)點刪除
  35.              "health" : 1,
  36.              "state" : 2,
  37.              "stateStr" : "SECONDARY",
  38.              "uptime" : 6345,
  39.              "optime" : Timestamp(1395197587, 1),
  40.              "optimeDate" : ISODate("2014-03-19T02:53:07Z"),
  41.              "lastHeartbeat" : ISODate("2014-03-19T04:38:50Z"),
  42.              "lastHeartbeatRecv" : ISODate("2014-03-19T04:38:51Z"),
  43.              "pingMs" : 0,
  44.              "syncingTo" : "namenode1:27017"
  45.          }
  46.     ],
  47.     "ok" : 1
  48. }

移除節(jié)點

 
 
  1. true:PRIMARY> rs.remove("datanode1:27017")
  2. Wed Mar 19 12:40:44.497 DBClientCursor::init call() failed
  3. Wed Mar 19 12:40:44.498 JavaScript execution failed: Error: error doing query:failed at src/mongo/shell/query.js:L78
  4. Wed Mar 19 12:40:44.498 trying reconnect to 127.0.0.1:27017
  5. Wed Mar 19 12:40:44.498 reconnect 127.0.0.1:27017 ok

再次查看副本集狀態(tài),發(fā)現(xiàn)datanode1已經沒有了

 
 
  1. true:PRIMARY> rs.status()
  2. {
  3.     "set" : "true",
  4.     "date" : ISODate("2014-03-19T04:41:03Z"),
  5.     "myState" : 1,
  6.     "members" : [
  7.          {
  8.              "_id" : 0,
  9.              "name" : "namenode1:27017",
  10.              "health" : 1,
  11.              "state" : 1,
  12.              "stateStr" : "PRIMARY",
  13.              "uptime" : 9641,
  14.              "optime" : Timestamp(1395204044, 1),
  15.              "optimeDate" : ISODate("2014-03-19T04:40:44Z"),
  16.              "self" : true
  17.          },
  18.          {
  19.              "_id" : 1,
  20.              "name" : "namenode2:27017",
  21.              "health" : 1,
  22.              "state" : 2,
  23.              "stateStr" : "SECONDARY",
  24.              "uptime" : 19,
  25.              "optime" : Timestamp(1395204044, 1),
  26.              "optimeDate" : ISODate("2014-03-19T04:40:44Z"),
  27.              "lastHeartbeat" : ISODate("2014-03-19T04:41:02Z"),
  28.              "lastHeartbeatRecv" : ISODate("2014-03-19T04:41:03Z"),
  29.              "pingMs" : 0,
  30.              "lastHeartbeatMessage" : "syncing to: namenode1:27017",
  31.              "syncingTo" : "namenode1:27017"
  32.          }
  33.     ],
  34.     "ok" : 1
  35. }

接著配置啟動test節(jié)點并啟動,配置文件是相同的,啟動之后它會自動復制數(shù)據(jù)。如果數(shù)據(jù)量過大,還是建議事先通過其它機制同步數(shù)據(jù)

在master加入新節(jié)點

 
 
  1. true:PRIMARY> rs.add("test:27017")
  2. { "ok" : 1 }

查看狀態(tài)

 
 
  1. true:PRIMARY> rs.status()
  2. {
  3.     "set" : "true",
  4.     "date" : ISODate("2014-03-19T04:43:08Z"),
  5.     "myState" : 1,
  6.     "members" : [
  7.          {
  8.              "_id" : 0,
  9.              "name" : "namenode1:27017",
  10.              "health" : 1,
  11.              "state" : 1,
  12.              "stateStr" : "PRIMARY",
  13.              "uptime" : 9766,
  14.              "optime" : Timestamp(1395204185, 1),
  15.              "optimeDate" : ISODate("2014-03-19T04:43:05Z"),
  16.              "self" : true
  17.          },
  18.          {
  19.              "_id" : 1,
  20.              "name" : "namenode2:27017",
  21.              "health" : 1,
  22.              "state" : 2,
  23.              "stateStr" : "SECONDARY",
  24.              "uptime" : 144,
  25.              "optime" : Timestamp(1395204185, 1),
  26.              "optimeDate" : ISODate("2014-03-19T04:43:05Z"),
  27.              "lastHeartbeat" : ISODate("2014-03-19T04:43:06Z"),
  28.              "lastHeartbeatRecv" : ISODate("2014-03-19T04:43:07Z"),
  29.              "pingMs" : 0,
  30.              "syncingTo" : "namenode1:27017"
  31.          },
  32.          {
  33.              "_id" : 2,
  34.              "name" : "test:27017",
  35.              "health" : 1,
  36.              "state" : 6,
  37.              "stateStr" : "UNKNOWN",
  38.              "uptime" : 3,
  39.              "optime" : Timestamp(0, 0),
  40.              "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
  41.              "lastHeartbeat" : ISODate("2014-03-19T04:43:07Z"),
  42.              "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
  43.              "pingMs" : 0,
  44.              "lastHeartbeatMessage" : "still initializing"
  45.          }
  46.     ],
  47.     "ok" : 1
  48. }

切換至test節(jié)點查看數(shù)據(jù)庫

 
 
  1. root@test:/var/log/mongo# mongo
  2. MongoDB shell version: 2.4.5
  3. connecting to: test
  4. true:SECONDARY> show dbs;
  5. admin     (empty)
  6. local     2.0771484375GB
  7. testdb    0.203125GB
  8. true:SECONDARY> rs.slaveOk()

部署Sharding集群

sharding通過將數(shù)據(jù)集分布于多個也稱作分片(shard)的節(jié)點上來降低單節(jié)點的訪問壓力。每個分片都是一個獨立的數(shù)據(jù)庫,所有的分片組合起來構成一個邏輯上的完整意義的數(shù)據(jù)庫。因此,分片機制降低了每個分片的數(shù)據(jù)操作量及需要存儲的數(shù)據(jù)量

sharding的實現(xiàn)思路

選擇一個合適索引而減少索引量,這種索引叫做重復索引

能夠在索引中直接查找到所有要查詢的索引,叫做覆蓋索引,能夠滿足覆蓋索引的條件并且排序次序又能夠與索引的次序相同,這種次序是"3星"的

所以任何時候創(chuàng)建索引的目的一定要與搜索碼完全匹配,至少保持一致

mongodb中可以使用db.mycoll.find().hint().explain()

來顯示索引的查詢過程mysql中可以使用 explain select XXX

副本集的集群在剛開始配置的時候有以下幾個細節(jié):

1、初始化:根據(jù)定義好的配置文件初始化,也可以讓其系統(tǒng)本身進行簡單初始化

2、簡單初始化只是將同一個repiset節(jié)點的信息添加進來,但默認只初始化當前節(jié)點信息

如果想重新配置這個集群的話,可以實現(xiàn)將現(xiàn)有的配置信息讀取出來而后在里面做設置之后并重新讓后續(xù)的配置生效,而也可以在后續(xù)新增節(jié)點到集群中也可以將已經運行的節(jié)點從集群中移除出去,不管是新增和移除它們之間都會進行選舉操作的

#p#

mongodb shard架構

1、config server : 元數(shù)據(jù)服務器,3臺,1臺為單點故障,而如果使用2臺在選舉時候,會無法得到分布式  (zookeeper)在實驗環(huán)境中有一個即可

2、mongos:路由,默認端口27017 ,啟動的時候必須制定其config server為其指路

3、shard:能夠存儲分片的服務,可以是獨立的服務器,也可以是replica set(副本集,生成環(huán)境建議使用此類型),因此生成環(huán)境中,一般都需要部署這樣的集群

sharding集群

sharding目的:

·當單個節(jié)點所持有的數(shù)據(jù)太大,單個節(jié)點無法存儲下的時候需要做shard

·如果某個單節(jié)點所持有的數(shù)據(jù)集太大,一個節(jié)點無法存儲下的時候,則需要做shard

·如果某個單節(jié)點承載的讀寫并發(fā)請求過大時

·可預見的時間內,單個節(jié)點索引、經常被訪問數(shù)據(jù)量,難在內存容納下的時候,意味著可能用到swap,如果使用swap那么性能顯著下降,對于此種情況需要用到shard

sharding主要做法無非將一個數(shù)據(jù)分割為多塊,平局分布在各個節(jié)點,為了保證讀寫的性能,那么讀的操作則不做離散,而寫操作需要做離散操作

所以,mongodb主要是根據(jù)sharding key來決定分片切割的:

sharding key就是collection的索引,而collection的索引(sharding key)的選擇至關重要。通常是***個shard,也就是主shard

在shard上使用索引

使用順序索引:

使用順序插入時,寫操作會集中在有限的shard上這樣寫操作很難均勻分布

使用離散索引:

會被分散到各節(jié)點中去,很難提高讀性能

如何使用sharding key

假設我們數(shù)據(jù)庫中有個表,表內數(shù)據(jù)分別為name,Age,Gender, 那么假設將一個collection 按照name切割,而name上創(chuàng)建的索引而是順序索引,那就意味著是按范圍進行切割的,那切割完成之后,那我們經常按照name查詢,一般問題不大,查詢的請求只交給config server即可,config server可以幫我們完成路由,而name則是charding key。

config server中保存的是每個shard和它所持有的數(shù)據(jù)的key的范圍

以Age為例

如果是范圍分區(qū)的話,那么我們想查詢年齡在0-30歲的時
當前文章:MongoDB集群搭建及Sharding的實現(xiàn)思路
分享路徑:http://www.dlmjj.cn/article/dhopopg.html