MongoDB集羣配置

MongoDB集羣配置

2019年06月30日 13:21:05 2014Team 閱讀數 77更多html

分類專欄: MongoDBnode

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。linux

本文連接:https://blog.csdn.net/u012965203/article/details/94307690mongodb

1、簡介

官網地址:https://www.mongodb.com/
            MongoDB 是一個基於【分佈式文件存儲】的數據庫,它屬於NoSQL數據庫。由 C++ 語言編寫。旨在爲 WEB 應用提
供【可擴展】的【高性能】數據存儲解決方案。
            MongoDB是一個介於非係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。
它支持的數據結構很是鬆散,是相似json的bson格式,所以能夠存儲比較複雜的數據類型。Mongo最大的特色是它
支持的查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部
分功能,並且還支持對數據創建索引。數據庫

2、下載

(1)下載json

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.7.tgz

(2)解壓vim

 
  1. mkdir -p /opt/apps/安全

  2. tar -zxvf mongodb-linux-x86_64-rhel70-4.0.7.tgz -C /opt/apps/服務器

(3)重命名mongodb-linux-x86_64-rhel70-4.0.7數據結構

 
  1. cd /opt/apps

  2. mv mongodb-linux-x86_64-rhel70-4.0.7.tgz mongodb

(4)配置環境變量

vim /etc/profile

末尾加上

export PATH=$JAVA_HOME/bin:/opt/apps/mongodb/bin:$PATH 

設置立刻生效

3、MongoDB副本集集羣

副本集中有三種角色:主節點、從節點、仲裁節點。

仲裁節點不存儲數據,主從節點都存儲數據。

優勢:
主若是宕機,仲裁節點會選舉從做爲新的主
若是副本集中沒有仲裁節點,那麼集羣的主從切換依然能夠進行。
缺點:
若是副本集中擁有仲裁節點,那麼一旦仲裁節點掛了,集羣中就不能進行主從切換了。

(1)架構圖

(2)建立目錄

存放數據目錄

 
  1. mkdir -p /opt/apps/mongodb/rs/data/node1

  2. mkdir -p /opt/apps/mongodb/rs/data/node2

  3. mkdir -p /opt/apps/mongodb/rs/data/node3

存放日誌目錄

mkdir -p /opt/apps/mongodb/rs/logs/

存放配置文件目錄

 
  1. mkdir -p /opt/apps/mongodb/rs/conf/node1/

  2. mkdir -p /opt/apps/mongodb/rs/conf/node2/

  3. mkdir -p /opt/apps/mongodb/rs/conf/node3/

(3)建立Master配置文件

vim /opt/apps/mongodb/rs/conf/node1/mongodb.cfg

mongodb.cfg內容爲

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs/data/node1

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs/logs/node1.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=27001

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=rs001

(4)建立Arbiter配置文件

vim /opt/apps/mongodb/rs/conf/node2/mongodb.cfg

mongodb.cfg內容爲

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs/data/node2

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs/logs/node2.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=27002

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=rs001

(5)建立Slave配置文件

vim /opt/apps/mongodb/rs/conf/node3/mongodb.cfg

mongodb.cfg內容爲

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs/data/node3

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs/logs/node3.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=27003

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=rs001

(6)啓動全部mongodb

 
  1. mongod -config /opt/apps/mongodb/rs/conf/node1/mongodb.cfg

  2. mongod -config /opt/apps/mongodb/rs/conf/node2/mongodb.cfg

  3. mongod -config /opt/apps/mongodb/rs/conf/node3/mongodb.cfg

(7)配置主備和仲裁

須要登陸到mongodb的客戶端進行配置主備和仲裁角色

mongo 172.17.56.175:27001

用admin身份

use admin

執行Master、Arbiter、Slave配置命令

 
  1. rs.initiate({_id:"rs001",members: [

  2. {_id:0,host:"172.17.56.175:27001",priority:2},

  3. {_id:1,host:"172.17.56.175:27002",priority:1},

  4. {_id:2,host:"172.17.56.175:27003",arbiterOnly:true}

  5. ]});

說明:

  • cfg中的_id的值是【副本集名稱】
  • priority:數字越大,優先級越高。優先級最高的會被選舉爲主庫
  • arbiterOnly:true,若是是仲裁節點,必須設置該參數

(8)測試

rs.status()
 
  1. rs001:PRIMARY> rs.status()

  2. {

  3. "set" : "rs001",

  4. "date" : ISODate("2019-06-30T05:20:18.846Z"),

  5. "myState" : 1,

  6. "term" : NumberLong(2),

  7. "syncingTo" : "",

  8. "syncSourceHost" : "",

  9. "syncSourceId" : -1,

  10. "heartbeatIntervalMillis" : NumberLong(2000),

  11. "optimes" : {

  12. "lastCommittedOpTime" : {

  13. "ts" : Timestamp(1561872010, 1),

  14. "t" : NumberLong(2)

  15. },

  16. "readConcernMajorityOpTime" : {

  17. "ts" : Timestamp(1561872010, 1),

  18. "t" : NumberLong(2)

  19. },

  20. "appliedOpTime" : {

  21. "ts" : Timestamp(1561872010, 1),

  22. "t" : NumberLong(2)

  23. },

  24. "durableOpTime" : {

  25. "ts" : Timestamp(1561872010, 1),

  26. "t" : NumberLong(2)

  27. }

  28. },

  29. "lastStableCheckpointTimestamp" : Timestamp(1561871968, 1),

  30. "members" : [

  31. {

  32. "_id" : 0,

  33. "name" : "172.17.56.175:27001",

  34. "health" : 1,

  35. "state" : 1,

  36. "stateStr" : "PRIMARY",

  37. "uptime" : 351,

  38. "optime" : {

  39. "ts" : Timestamp(1561872010, 1),

  40. "t" : NumberLong(2)

  41. },

  42. "optimeDate" : ISODate("2019-06-30T05:20:10Z"),

  43. "syncingTo" : "",

  44. "syncSourceHost" : "",

  45. "syncSourceId" : -1,

  46. "infoMessage" : "",

  47. "electionTime" : Timestamp(1561871679, 1),

  48. "electionDate" : ISODate("2019-06-30T05:14:39Z"),

  49. "configVersion" : 1,

  50. "self" : true,

  51. "lastHeartbeatMessage" : ""

  52. },

  53. {

  54. "_id" : 1,

  55. "name" : "172.17.56.175:27002",

  56. "health" : 1,

  57. "state" : 2,

  58. "stateStr" : "SECONDARY",

  59. "uptime" : 345,

  60. "optime" : {

  61. "ts" : Timestamp(1561872010, 1),

  62. "t" : NumberLong(2)

  63. },

  64. "optimeDurable" : {

  65. "ts" : Timestamp(1561872010, 1),

  66. "t" : NumberLong(2)

  67. },

  68. "optimeDate" : ISODate("2019-06-30T05:20:10Z"),

  69. "optimeDurableDate" : ISODate("2019-06-30T05:20:10Z"),

  70. "lastHeartbeat" : ISODate("2019-06-30T05:20:17.056Z"),

  71. "lastHeartbeatRecv" : ISODate("2019-06-30T05:20:17.832Z"),

  72. "pingMs" : NumberLong(0),

  73. "lastHeartbeatMessage" : "",

  74. "syncingTo" : "172.17.56.175:27001",

  75. "syncSourceHost" : "172.17.56.175:27001",

  76. "syncSourceId" : 0,

  77. "infoMessage" : "",

  78. "configVersion" : 1

  79. },

  80. {

  81. "_id" : 2,

  82. "name" : "172.17.56.175:27003",

  83. "health" : 1,

  84. "state" : 7,

  85. "stateStr" : "ARBITER",

  86. "uptime" : 340,

  87. "lastHeartbeat" : ISODate("2019-06-30T05:20:17.055Z"),

  88. "lastHeartbeatRecv" : ISODate("2019-06-30T05:20:18.193Z"),

  89. "pingMs" : NumberLong(0),

  90. "lastHeartbeatMessage" : "",

  91. "syncingTo" : "",

  92. "syncSourceHost" : "",

  93. "syncSourceId" : -1,

  94. "infoMessage" : "",

  95. "configVersion" : 1

  96. }

  97. ],

  98. "ok" : 1,

  99. "operationTime" : Timestamp(1561872010, 1),

  100. "$clusterTime" : {

  101. "clusterTime" : Timestamp(1561872010, 1),

  102. "signature" : {

  103. "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

  104. "keyId" : NumberLong(0)

  105. }

  106. }

  107. }

  108. rs001:PRIMARY>

4、MongoDB混合方式集羣

(1)Sharding集羣簡介

MongoDB分片羣集包含如下組件

  • 數據分片(Shards):每一個分片包含分片數據的子集。每一個分片均可以部署爲副本集。啓動服務使用mongo腳本命令
  • 查詢路由(Query Routers)mongos充當查詢路由器,提供客戶端應用程序和分片集羣之間的接口。啓動服務使用mongod腳本命令
  • 配置服務器(Config servers):配置服務器存儲羣集的元數據和配置設置。從MongoDB 3.2開始,配置服務器能夠部署爲副本集,config server的rs不能有arbiter。啓動服務使用mongos腳本命令。

各節點都須要自定義mongodb.cfg文件,由於在一臺機器配置,安裝一次mongodb,配置7份配置文件便可。

Mongod中的Replica set1與Replica set  Replica set2 (副文本集),Replica set 與Replica set1內容是不同的,因此能夠無限擴容。

Mongod副文本集中的副本內容是同樣,除仲裁節點。

Cluster由多個Replica set組成,Replica set由多個數據節點組成,每一個數據節點有多少chunk(塊)組成。

(2)分片鍵:Shard keys

  • shard key在sharding搭建完畢後是不能修改的,一個collection上只能有一個shard key。
  • shard key上必須有索引(能夠是以shard key開頭的聯合索引),若是沒有mongodb會爲shard key建立索引。若是是已經存在的collection那麼必須手動爲shard key建立索引。
  • 在sharding的collection中只有_id和shard key前綴的索引能夠是unique index,其餘索引只能是普通索引。若是一個普通key上有unique index那麼你不能以其餘key爲shard key對collection進行sharding。
  • shard key的選擇將會影響整個集羣的效率,可擴展性和性能。並且也會影響你所能選擇的分片策略。

關於shard key詳見:https://docs.mongodb.com/v3.2/core/sharding-shard-key/

分片範圍是[shard_key_value_m,shard_key_value_n),MongoDB把每一個分片叫作一個shard,一部分shard key的集合叫作chunk,一個shard上能夠有多個chunk也能夠只有一個chunk,通常會有多個

(3)Sharding的優點

  • 讀寫方面:

sharding將讀寫負載均勻到各個shard,且workload上限能夠經過水平擴展來增長。

  • 擴容方面:

每一個shard保存一部分數據,能夠經過增長shards來擴容。

  • 高可用方面:

即使某個shard不可用了,整個集羣也能夠對外提供服務,只不過訪問down掉的shard會報"Connection refused"的錯誤。並且MongoDB3.2之後能夠爲每一個shard都配置副本集(replica set),這樣保證最大程度的高可用性。

(4)Sharding的劣勢

數據量較少時不建議使用sharding,畢竟讀寫都要通過一層路由會有性能損耗,直接表現就是ips和qps會下降。

(5)使用Sharding前須要考慮的一些事情

  • sharding集羣不支持一些常規的單實例方法,如group(),可使用mapReduce()或者aggregate()中的group來替代,所以建議從一開始學習就直接使用aggregate(),這種寫法較爲簡單明瞭,且統一化易於識別。
  • 對於沒有用到shard key的查詢,路由進行全集羣廣播(broadcast operation),對每一個shard都查一遍進行scatter/gather,此時效率會很低。
  • 生產上使用副本集或sharding時,要考慮到安全認證的問題,除了開啓對外的auth帳戶認證外,集羣節點間最好指定keyfile啓動,這樣能夠防止陌生節點隨意加入集羣。

(6)Sharding策略選擇

當shard key老是單調遞增時hash sharding並非一個很好的選擇,其查詢分發基本和broadcast operation同樣了,由於hash會把數據比較均勻的分佈在各個shard上,但此時選擇ranged sharding也有缺點,由於數據過分集中會致使數據集中於某個shard。

在shard key選取不正確的狀況下,範圍分片會致使數據分佈不均勻,也可能遭遇性能瓶頸,所以須要合理的選擇ranged shard key。

原理以下:

sh.addShardTag() 給shard設置標籤A

sh.addTagRange() 給集合的某個chunk範圍設置標籤A,最終MongoDB會保證設置標籤 A 的chunk範圍(或該範圍的超集)分佈設置了標籤 A 的 shard 上。

Tag aware sharding可應用在以下場景:

將部署在不一樣機房的shard設置機房標籤,將不一樣chunk範圍的數據分佈到指定的機房

將服務能力不通的shard設置服務等級標籤,將更多的chunk分散到服務能力更強的shard上去

 

使用 Tag aware sharding 須要注意是,chunk分配到對應標籤的shard上不是當即完成,而是在不斷insert、update後觸發split、moveChunk後逐步完成的,而且須要保證balancer是開啓的。因此你可能會觀察到,在設置了tag range後一段時間後,寫入仍然沒有分佈到tag相同的shard上去

(7)搭建設計

config server配置服務器
172.17.56.175:28001 172.17.56.175:28002 172.17.56.175:28003
mongos路由
172.17.56.175:30000
Shards數據分片master
172.17.56.175:27004 172.17.56.175:27007 172.17.56.175:27011
Shards數據分片Slave
172.17.56.175:27005 172.17.56.175:27008 172.17.56.175:27012
Shards數據分片arbiter
172.17.56.175:27006 172.17.56.175:27009 172.17.56.175:27013

(8)建立目錄

  • 建立數據目錄

--Config

 
  1. mkdir -p /opt/apps/mongodb/rs1/shareconf1/data/node1

  2. mkdir -p /opt/apps/mongodb/rs1/shareconf2/data/node1

  3. mkdir -p /opt/apps/mongodb/rs1/shareconf3/data/node1

--Master

 
  1. mkdir -p /opt/apps/mongodb/rs1/share1/data/node1

  2. mkdir -p /opt/apps/mongodb/rs1/share1/data/node2

  3. mkdir -p /opt/apps/mongodb/rs1/share1/data/node3

--Slavte

 
  1. mkdir -p /opt/apps/mongodb/rs1/share2/data/node1

  2. mkdir -p /opt/apps/mongodb/rs1/share2/data/node2

  3. mkdir -p /opt/apps/mongodb/rs1/share2/data/node3

--Arbiter

 
  1. mkdir -p /opt/apps/mongodb/rs1/share3/data/node1

  2. mkdir -p /opt/apps/mongodb/rs1/share3/data/node2

  3. mkdir -p /opt/apps/mongodb/rs1/share3/data/node3

  • 建立日誌目錄
 
  1. mkdir -p /opt/apps/mongodb/rs1/share1/logs

  2. mkdir -p /opt/apps/mongodb/rs1/share2/logs

  3. mkdir -p /opt/apps/mongodb/rs1/share3/logs

  4.  
  5. mkdir -p /opt/apps/mongodb/rs1/shareconf1/logs

  6. mkdir -p /opt/apps/mongodb/rs1/shareconf2/logs

  7. mkdir -p /opt/apps/mongodb/rs1/shareconf3/logs

  8.  
  9. mkdir -p /opt/apps/mongodb/rs1/routers/logs

(9)建立Config配置

vim /opt/apps/mongodb/rs1/conf/shareconf1/mongodb.cfg

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs1/shareconf1/data/node1

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs1/shareconf1/logs/node1.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=28001

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=config

  16. #指定配置服務器

  17. configsvr=true

vim /opt/apps/mongodb/rs1/conf/shareconf2/mongodb.cfg

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs1/shareconf2/data/node1

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs1/shareconf2/logs/node1.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=28002

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=config

  16. #指定配置服務器

  17. configsvr=true

vim /opt/apps/mongodb/rs1/conf/shareconf3/mongodb.cfg

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs1/shareconf3/data/node1

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs1/shareconf3/logs/node1.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=28003

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=config

  16. #指定配置服務器

  17. configsvr=true

(10)建立Share1配置
vim /opt/apps/mongodb/rs1/conf/node4/mongodb.cfg

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs1/share1/data/node1

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs1/share1/logs/node1.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=27004

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=share1

  16. #指定是Shard

  17. shardsvr=true

vim /opt/apps/mongodb/rs1/conf/node5/mongodb.cfg

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs1/share1/data/node2

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs1/share1/logs/node2.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=27005

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=share1

  16. #指定是Shard

  17. shardsvr=true

vim /opt/apps/mongodb/rs1/conf/node6/mongodb.cfg

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs1/share1/data/node3

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs1/share1/logs/node3.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=27006

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=share1

  16. #指定是share

  17. shardsvr=true

(11)建立Share2配置

vim /opt/apps/mongodb/rs1/conf/node7/mongodb.cfg

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs1/share2/data/node1

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs1/share2/logs/node1.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=27007

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=share2

  16. #指定是share

  17. shardsvr=true

vim /opt/apps/mongodb/rs1/conf/node8/mongodb.cfg

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs1/share2/data/node2

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs1/share2/logs/node2.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=27008

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=share2

  16. #指定是share

  17. shardsvr=true

vim /opt/apps/mongodb/rs1/conf/node9/mongodb.cfg

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs1/share2/data/node3

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs1/share2/logs/node3.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=27009

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=share2

  16. #指定是share

  17. shardsvr=true

(12)建立Share3配置
vim /opt/apps/mongodb/rs1/conf/node11/mongodb.cfg

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs1/share3/data/node1

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs1/share3/logs/node1.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=27011

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=share3

  16. #指定是share

  17. shardsvr=true

vim /opt/apps/mongodb/rs1/conf/node12/mongodb.cfg

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs1/share3/data/node2

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs1/share3/logs/node2.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=27012

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=share3

  16. #指定是share

  17. shardsvr=true

vim /opt/apps/mongodb/rs1/conf/node13/mongodb.cfg

 
  1. #數據庫文件位置

  2. dbpath=/opt/apps/mongodb/rs1/share3/data/node3

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs1/share3/logs/node3.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork = true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=27013

  13. #注意:不須要顯式的去指定主從,主從是動態選舉的

  14. #副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的

  15. replSet=share3

  16. #指定是share

  17. shardsvr=true

(13)建立路由配置

vim /opt/apps/mongodb/rs1/conf/routers/mongodb.cfg

 
  1. #數據庫文件位置

  2. configdb=config/172.17.56.175:28001,172.17.56.175:28002,172.17.56.175:28003

  3. #日誌文件

  4. logpath=/opt/apps/mongodb/rs1/routers/logs/node1.log

  5. #以追加方式寫日誌

  6. logappend=true

  7. #是否以守護進程方式啓動

  8. fork=true

  9. #綁定ip地址

  10. bind_ip=172.17.56.175

  11. #默認端口27017

  12. port=30000

(14)啓動並配置config server

啓動全部

 
  1.  
  2. mongod -f /opt/apps/mongodb/rs1/conf/shareconf1/mongodb.cfg

  3. mongod -f /opt/apps/mongodb/rs1/conf/shareconf2/mongodb.cfg

  4. mongod -f /opt/apps/mongodb/rs1/conf/shareconf3/mongodb.cfg

  5.  
  6.  
  7. mongod -config /opt/apps/mongodb/rs1/conf/node4/mongodb.cfg

  8. mongod -config /opt/apps/mongodb/rs1/conf/node5/mongodb.cfg

  9. mongod -config /opt/apps/mongodb/rs1/conf/node6/mongodb.cfg

  10.  
  11. mongod -config /opt/apps/mongodb/rs1/conf/node7/mongodb.cfg

  12. mongod -config /opt/apps/mongodb/rs1/conf/node8/mongodb.cfg

  13. mongod -config /opt/apps/mongodb/rs1/conf/node9/mongodb.cfg

  14.  
  15.  
  16. mongod -config /opt/apps/mongodb/rs1/conf/node11/mongodb.cfg

  17. mongod -config /opt/apps/mongodb/rs1/conf/node12/mongodb.cfg

  18. mongod -config /opt/apps/mongodb/rs1/conf/node13/mongodb.cfg

  19.  
  20. mongos -config /opt/apps/mongodb/rs1/conf/routers/mongodb.cfg

客戶端鏈接

mongo 172.17.56.175:28001

配置

使用admin用戶

use admin
 
  1. rs.initiate({_id:"config",members: [

  2. {_id:0,host:"172.17.56.175:28001",priority:2},

  3. {_id:1,host:"172.17.56.175:28002",priority:1},

  4. {_id:2,host:"172.17.56.175:28003",priority:1}

  5. ]})

用rs.status(),顯示以下內容證實成功

 
  1. config:PRIMARY> rs.status()

  2. {

  3. "set" : "config",

  4. "date" : ISODate("2019-06-30T15:59:05.588Z"),

  5. "myState" : 1,

  6. "term" : NumberLong(1),

  7. "syncingTo" : "",

  8. "syncSourceHost" : "",

  9. "syncSourceId" : -1,

  10. "configsvr" : true,

  11. "heartbeatIntervalMillis" : NumberLong(2000),

  12. "optimes" : {

  13. "lastCommittedOpTime" : {

  14. "ts" : Timestamp(1561910326, 3),

  15. "t" : NumberLong(1)

  16. },

  17. "readConcernMajorityOpTime" : {

  18. "ts" : Timestamp(1561910326, 3),

  19. "t" : NumberLong(1)

  20. },

  21. "appliedOpTime" : {

  22. "ts" : Timestamp(1561910326, 3),

  23. "t" : NumberLong(1)

  24. },

  25. "durableOpTime" : {

  26. "ts" : Timestamp(1561910326, 3),

  27. "t" : NumberLong(1)

  28. }

  29. },

  30. "lastStableCheckpointTimestamp" : Timestamp(1561910325, 1),

  31. "members" : [

  32. {

  33. "_id" : 0,

  34. "name" : "172.17.56.175:28001",

  35. "health" : 1,

  36. "state" : 1,

  37. "stateStr" : "PRIMARY",

  38. "uptime" : 1342,

  39. "optime" : {

  40. "ts" : Timestamp(1561910326, 3),

  41. "t" : NumberLong(1)

  42. },

  43. "optimeDate" : ISODate("2019-06-30T15:58:46Z"),

  44. "syncingTo" : "",

  45. "syncSourceHost" : "",

  46. "syncSourceId" : -1,

  47. "infoMessage" : "could not find member to sync from",

  48. "electionTime" : Timestamp(1561910324, 1),

  49. "electionDate" : ISODate("2019-06-30T15:58:44Z"),

  50. "configVersion" : 1,

  51. "self" : true,

  52. "lastHeartbeatMessage" : ""

  53. },

  54. {

  55. "_id" : 1,

  56. "name" : "172.17.56.175:28002",

  57. "health" : 1,

  58. "state" : 2,

  59. "stateStr" : "SECONDARY",

  60. "uptime" : 32,

  61. "optime" : {

  62. "ts" : Timestamp(1561910326, 3),

  63. "t" : NumberLong(1)

  64. },

  65. "optimeDurable" : {

  66. "ts" : Timestamp(1561910326, 3),

  67. "t" : NumberLong(1)

  68. },

  69. "optimeDate" : ISODate("2019-06-30T15:58:46Z"),

  70. "optimeDurableDate" : ISODate("2019-06-30T15:58:46Z"),

  71. "lastHeartbeat" : ISODate("2019-06-30T15:59:04.297Z"),

  72. "lastHeartbeatRecv" : ISODate("2019-06-30T15:59:04.549Z"),

  73. "pingMs" : NumberLong(0),

  74. "lastHeartbeatMessage" : "",

  75. "syncingTo" : "172.17.56.175:28001",

  76. "syncSourceHost" : "172.17.56.175:28001",

  77. "syncSourceId" : 0,

  78. "infoMessage" : "",

  79. "configVersion" : 1

  80. },

  81. {

  82. "_id" : 2,

  83. "name" : "172.17.56.175:28003",

  84. "health" : 1,

  85. "state" : 2,

  86. "stateStr" : "SECONDARY",

  87. "uptime" : 32,

  88. "optime" : {

  89. "ts" : Timestamp(1561910326, 3),

  90. "t" : NumberLong(1)

  91. },

  92. "optimeDurable" : {

  93. "ts" : Timestamp(1561910326, 3),

  94. "t" : NumberLong(1)

  95. },

  96. "optimeDate" : ISODate("2019-06-30T15:58:46Z"),

  97. "optimeDurableDate" : ISODate("2019-06-30T15:58:46Z"),

  98. "lastHeartbeat" : ISODate("2019-06-30T15:59:04.297Z"),

  99. "lastHeartbeatRecv" : ISODate("2019-06-30T15:59:04.549Z"),

  100. "pingMs" : NumberLong(0),

  101. "lastHeartbeatMessage" : "",

  102. "syncingTo" : "172.17.56.175:28001",

  103. "syncSourceHost" : "172.17.56.175:28001",

  104. "syncSourceId" : 0,

  105. "infoMessage" : "",

  106. "configVersion" : 1

  107. }

  108. ],

  109. "ok" : 1,

  110. "operationTime" : Timestamp(1561910326, 3),

  111. "$gleStats" : {

  112. "lastOpTime" : Timestamp(1561910313, 1),

  113. "electionId" : ObjectId("7fffffff0000000000000001")

  114. },

  115. "lastCommittedOpTime" : Timestamp(1561910326, 3),

  116. "$clusterTime" : {

  117. "clusterTime" : Timestamp(1561910326, 3),

  118. "signature" : {

  119. "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

  120. "keyId" : NumberLong(0)

  121. }

  122. }

  123. }

  124. config:PRIMARY>

(15)配置share1

客戶端鏈接

mongo 172.17.56.175:27004

使用admin用用戶

use admin

配置

 
  1. rs.initiate({_id:"share1",members: [

  2. {_id:0,host:"172.17.56.175:27004",priority:2},

  3. {_id:1,host:"172.17.56.175:27005",priority:1},

  4. {_id:2,host:"172.17.56.175:27006",arbiterOnly:true}

  5. ]})

(16)配置share2

客戶端鏈接

mongo 172.17.56.175:27007

使用admin用用戶

use admin

配置

 
  1. rs.initiate({_id:"share2",members: [

  2. {_id:0,host:"172.17.56.175:27007",priority:2},

  3. {_id:1,host:"172.17.56.175:27008",priority:1},

  4. {_id:2,host:"172.17.56.175:27009",arbiterOnly:true}

  5. ]})

(17)配置share3

客戶端鏈接

mongo 172.17.56.175:27011

使用admin用用戶

use admin

配置

 
  1. rs.initiate({_id:"share3",members: [

  2. {_id:0,host:"172.17.56.175:27011",priority:2},

  3. {_id:1,host:"172.17.56.175:27012",priority:1},

  4. {_id:2,host:"172.17.56.175:27013",arbiterOnly:true}

  5. ]})

(18)至此完成了全部服務器的配置,接下來開始配置具體collection的分片策略

客戶端鏈接路由

mongo 172.17.56.175:30000

使用admin用用戶

 
  1. use admin

  2. sh.addShard("share1/172.17.56.175:27004,172.17.56.175:27005,172.17.56.175:27005");

  3. sh.addShard("share2/172.17.56.175:27007,172.17.56.175:27008,172.17.56.175:27009");

  4. sh.addShard("share3/172.17.56.175:27011,172.17.56.175:27012,172.17.56.175:27013");

而後在mongos上爲具體的數據庫配置sharding:

sh.enableSharding("test")

--容許test數據庫進行sharding

--對test.t集合以id列爲shard key進行hashed sharding

sh.shardCollection("test.t",{id:"hashed"})

經過db.t.getIndexes()能夠看到自動爲id列建立了索引。

(19)hashed分片驗證

 
  1. mongo 172.17.56.175:30000

  2.  
  3. use test

for (i=1;i<=1000;i++) {db.t.insert({id:i,name:"Leo"})}

在3個shard的primary上使用db.t.find().count()會發現1000條數據近似均勻的分佈到了3個shard上。

使用db.t.stats()查看分片結果,使用sh.status()查看本庫內全部集合的分片信息

推薦文章:https://www.cnblogs.com/leohahah/p/8652572.html

相關文章
相關標籤/搜索