2019年06月30日 13:21:05 2014Team 閱讀數 77更多html
分類專欄: MongoDBnode
版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。linux
本文連接:https://blog.csdn.net/u012965203/article/details/94307690mongodb
官網地址:https://www.mongodb.com/
MongoDB 是一個基於【分佈式文件存儲】的數據庫,它屬於NoSQL數據庫。由 C++ 語言編寫。旨在爲 WEB 應用提
供【可擴展】的【高性能】數據存儲解決方案。
MongoDB是一個介於非係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。
它支持的數據結構很是鬆散,是相似json的bson格式,所以能夠存儲比較複雜的數據類型。Mongo最大的特色是它
支持的查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部
分功能,並且還支持對數據創建索引。數據庫
(1)下載json
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.7.tgz
(2)解壓vim
mkdir -p /opt/apps/
安全
tar -zxvf mongodb-linux-x86_64-rhel70-4.0.7.tgz -C /opt/apps/
服務器
(3)重命名mongodb-linux-x86_64-rhel70-4.0.7數據結構
cd /opt/apps
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
設置立刻生效
副本集中有三種角色:主節點、從節點、仲裁節點。
仲裁節點不存儲數據,主從節點都存儲數據。
優勢:
主若是宕機,仲裁節點會選舉從做爲新的主
若是副本集中沒有仲裁節點,那麼集羣的主從切換依然能夠進行。
缺點:
若是副本集中擁有仲裁節點,那麼一旦仲裁節點掛了,集羣中就不能進行主從切換了。
(1)架構圖
(2)建立目錄
存放數據目錄
mkdir -p /opt/apps/mongodb/rs/data/node1
mkdir -p /opt/apps/mongodb/rs/data/node2
mkdir -p /opt/apps/mongodb/rs/data/node3
存放日誌目錄
mkdir -p /opt/apps/mongodb/rs/logs/
存放配置文件目錄
mkdir -p /opt/apps/mongodb/rs/conf/node1/
mkdir -p /opt/apps/mongodb/rs/conf/node2/
mkdir -p /opt/apps/mongodb/rs/conf/node3/
(3)建立Master配置文件
vim /opt/apps/mongodb/rs/conf/node1/mongodb.cfg
mongodb.cfg內容爲
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs/data/node1
#日誌文件
logpath=/opt/apps/mongodb/rs/logs/node1.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=27001
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=rs001
(4)建立Arbiter配置文件
vim /opt/apps/mongodb/rs/conf/node2/mongodb.cfg
mongodb.cfg內容爲
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs/data/node2
#日誌文件
logpath=/opt/apps/mongodb/rs/logs/node2.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=27002
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=rs001
(5)建立Slave配置文件
vim /opt/apps/mongodb/rs/conf/node3/mongodb.cfg
mongodb.cfg內容爲
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs/data/node3
#日誌文件
logpath=/opt/apps/mongodb/rs/logs/node3.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=27003
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=rs001
(6)啓動全部mongodb
mongod -config /opt/apps/mongodb/rs/conf/node1/mongodb.cfg
mongod -config /opt/apps/mongodb/rs/conf/node2/mongodb.cfg
mongod -config /opt/apps/mongodb/rs/conf/node3/mongodb.cfg
(7)配置主備和仲裁
須要登陸到mongodb的客戶端進行配置主備和仲裁角色
mongo 172.17.56.175:27001
用admin身份
use admin
執行Master、Arbiter、Slave配置命令
rs.initiate({_id:"rs001",members: [
{_id:0,host:"172.17.56.175:27001",priority:2},
{_id:1,host:"172.17.56.175:27002",priority:1},
{_id:2,host:"172.17.56.175:27003",arbiterOnly:true}
]});
說明:
(8)測試
rs.status()
rs001:PRIMARY> rs.status()
{
"set" : "rs001",
"date" : ISODate("2019-06-30T05:20:18.846Z"),
"myState" : 1,
"term" : NumberLong(2),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1561872010, 1),
"t" : NumberLong(2)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1561872010, 1),
"t" : NumberLong(2)
},
"appliedOpTime" : {
"ts" : Timestamp(1561872010, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1561872010, 1),
"t" : NumberLong(2)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1561871968, 1),
"members" : [
{
"_id" : 0,
"name" : "172.17.56.175:27001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 351,
"optime" : {
"ts" : Timestamp(1561872010, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2019-06-30T05:20:10Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1561871679, 1),
"electionDate" : ISODate("2019-06-30T05:14:39Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "172.17.56.175:27002",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 345,
"optime" : {
"ts" : Timestamp(1561872010, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1561872010, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2019-06-30T05:20:10Z"),
"optimeDurableDate" : ISODate("2019-06-30T05:20:10Z"),
"lastHeartbeat" : ISODate("2019-06-30T05:20:17.056Z"),
"lastHeartbeatRecv" : ISODate("2019-06-30T05:20:17.832Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "172.17.56.175:27001",
"syncSourceHost" : "172.17.56.175:27001",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "172.17.56.175:27003",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 340,
"lastHeartbeat" : ISODate("2019-06-30T05:20:17.055Z"),
"lastHeartbeatRecv" : ISODate("2019-06-30T05:20:18.193Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1561872010, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1561872010, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
rs001:PRIMARY>
(1)Sharding集羣簡介
MongoDB分片羣集包含如下組件:
mongos
充當查詢路由器,提供客戶端應用程序和分片集羣之間的接口。啓動服務使用mongod腳本命令各節點都須要自定義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詳見: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前須要考慮的一些事情
(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
mkdir -p /opt/apps/mongodb/rs1/shareconf1/data/node1
mkdir -p /opt/apps/mongodb/rs1/shareconf2/data/node1
mkdir -p /opt/apps/mongodb/rs1/shareconf3/data/node1
--Master
mkdir -p /opt/apps/mongodb/rs1/share1/data/node1
mkdir -p /opt/apps/mongodb/rs1/share1/data/node2
mkdir -p /opt/apps/mongodb/rs1/share1/data/node3
--Slavte
mkdir -p /opt/apps/mongodb/rs1/share2/data/node1
mkdir -p /opt/apps/mongodb/rs1/share2/data/node2
mkdir -p /opt/apps/mongodb/rs1/share2/data/node3
--Arbiter
mkdir -p /opt/apps/mongodb/rs1/share3/data/node1
mkdir -p /opt/apps/mongodb/rs1/share3/data/node2
mkdir -p /opt/apps/mongodb/rs1/share3/data/node3
mkdir -p /opt/apps/mongodb/rs1/share1/logs
mkdir -p /opt/apps/mongodb/rs1/share2/logs
mkdir -p /opt/apps/mongodb/rs1/share3/logs
mkdir -p /opt/apps/mongodb/rs1/shareconf1/logs
mkdir -p /opt/apps/mongodb/rs1/shareconf2/logs
mkdir -p /opt/apps/mongodb/rs1/shareconf3/logs
mkdir -p /opt/apps/mongodb/rs1/routers/logs
(9)建立Config配置
vim /opt/apps/mongodb/rs1/conf/shareconf1/mongodb.cfg
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs1/shareconf1/data/node1
#日誌文件
logpath=/opt/apps/mongodb/rs1/shareconf1/logs/node1.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=28001
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=config
#指定配置服務器
configsvr=true
vim /opt/apps/mongodb/rs1/conf/shareconf2/mongodb.cfg
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs1/shareconf2/data/node1
#日誌文件
logpath=/opt/apps/mongodb/rs1/shareconf2/logs/node1.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=28002
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=config
#指定配置服務器
configsvr=true
vim /opt/apps/mongodb/rs1/conf/shareconf3/mongodb.cfg
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs1/shareconf3/data/node1
#日誌文件
logpath=/opt/apps/mongodb/rs1/shareconf3/logs/node1.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=28003
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=config
#指定配置服務器
configsvr=true
(10)建立Share1配置
vim /opt/apps/mongodb/rs1/conf/node4/mongodb.cfg
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs1/share1/data/node1
#日誌文件
logpath=/opt/apps/mongodb/rs1/share1/logs/node1.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=27004
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=share1
#指定是Shard
shardsvr=true
vim /opt/apps/mongodb/rs1/conf/node5/mongodb.cfg
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs1/share1/data/node2
#日誌文件
logpath=/opt/apps/mongodb/rs1/share1/logs/node2.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=27005
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=share1
#指定是Shard
shardsvr=true
vim /opt/apps/mongodb/rs1/conf/node6/mongodb.cfg
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs1/share1/data/node3
#日誌文件
logpath=/opt/apps/mongodb/rs1/share1/logs/node3.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=27006
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=share1
#指定是share
shardsvr=true
(11)建立Share2配置
vim /opt/apps/mongodb/rs1/conf/node7/mongodb.cfg
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs1/share2/data/node1
#日誌文件
logpath=/opt/apps/mongodb/rs1/share2/logs/node1.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=27007
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=share2
#指定是share
shardsvr=true
vim /opt/apps/mongodb/rs1/conf/node8/mongodb.cfg
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs1/share2/data/node2
#日誌文件
logpath=/opt/apps/mongodb/rs1/share2/logs/node2.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=27008
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=share2
#指定是share
shardsvr=true
vim /opt/apps/mongodb/rs1/conf/node9/mongodb.cfg
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs1/share2/data/node3
#日誌文件
logpath=/opt/apps/mongodb/rs1/share2/logs/node3.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=27009
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=share2
#指定是share
shardsvr=true
(12)建立Share3配置
vim /opt/apps/mongodb/rs1/conf/node11/mongodb.cfg
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs1/share3/data/node1
#日誌文件
logpath=/opt/apps/mongodb/rs1/share3/logs/node1.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=27011
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=share3
#指定是share
shardsvr=true
vim /opt/apps/mongodb/rs1/conf/node12/mongodb.cfg
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs1/share3/data/node2
#日誌文件
logpath=/opt/apps/mongodb/rs1/share3/logs/node2.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=27012
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=share3
#指定是share
shardsvr=true
vim /opt/apps/mongodb/rs1/conf/node13/mongodb.cfg
#數據庫文件位置
dbpath=/opt/apps/mongodb/rs1/share3/data/node3
#日誌文件
logpath=/opt/apps/mongodb/rs1/share3/logs/node3.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork = true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=27013
#注意:不須要顯式的去指定主從,主從是動態選舉的
#副本集集羣,須要指定一個名稱,在一個副本集下,名稱是相同的
replSet=share3
#指定是share
shardsvr=true
(13)建立路由配置
vim /opt/apps/mongodb/rs1/conf/routers/mongodb.cfg
#數據庫文件位置
configdb=config/172.17.56.175:28001,172.17.56.175:28002,172.17.56.175:28003
#日誌文件
logpath=/opt/apps/mongodb/rs1/routers/logs/node1.log
#以追加方式寫日誌
logappend=true
#是否以守護進程方式啓動
fork=true
#綁定ip地址
bind_ip=172.17.56.175
#默認端口27017
port=30000
(14)啓動並配置config server
啓動全部
mongod -f /opt/apps/mongodb/rs1/conf/shareconf1/mongodb.cfg
mongod -f /opt/apps/mongodb/rs1/conf/shareconf2/mongodb.cfg
mongod -f /opt/apps/mongodb/rs1/conf/shareconf3/mongodb.cfg
mongod -config /opt/apps/mongodb/rs1/conf/node4/mongodb.cfg
mongod -config /opt/apps/mongodb/rs1/conf/node5/mongodb.cfg
mongod -config /opt/apps/mongodb/rs1/conf/node6/mongodb.cfg
mongod -config /opt/apps/mongodb/rs1/conf/node7/mongodb.cfg
mongod -config /opt/apps/mongodb/rs1/conf/node8/mongodb.cfg
mongod -config /opt/apps/mongodb/rs1/conf/node9/mongodb.cfg
mongod -config /opt/apps/mongodb/rs1/conf/node11/mongodb.cfg
mongod -config /opt/apps/mongodb/rs1/conf/node12/mongodb.cfg
mongod -config /opt/apps/mongodb/rs1/conf/node13/mongodb.cfg
mongos -config /opt/apps/mongodb/rs1/conf/routers/mongodb.cfg
客戶端鏈接
mongo 172.17.56.175:28001
配置
使用admin用戶
use admin
rs.initiate({_id:"config",members: [
{_id:0,host:"172.17.56.175:28001",priority:2},
{_id:1,host:"172.17.56.175:28002",priority:1},
{_id:2,host:"172.17.56.175:28003",priority:1}
]})
用rs.status(),顯示以下內容證實成功
config:PRIMARY> rs.status()
{
"set" : "config",
"date" : ISODate("2019-06-30T15:59:05.588Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"configsvr" : true,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1561910326, 3),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1561910326, 3),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1561910326, 3),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1561910326, 3),
"t" : NumberLong(1)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1561910325, 1),
"members" : [
{
"_id" : 0,
"name" : "172.17.56.175:28001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1342,
"optime" : {
"ts" : Timestamp(1561910326, 3),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-06-30T15:58:46Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1561910324, 1),
"electionDate" : ISODate("2019-06-30T15:58:44Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "172.17.56.175:28002",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 32,
"optime" : {
"ts" : Timestamp(1561910326, 3),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1561910326, 3),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-06-30T15:58:46Z"),
"optimeDurableDate" : ISODate("2019-06-30T15:58:46Z"),
"lastHeartbeat" : ISODate("2019-06-30T15:59:04.297Z"),
"lastHeartbeatRecv" : ISODate("2019-06-30T15:59:04.549Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "172.17.56.175:28001",
"syncSourceHost" : "172.17.56.175:28001",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "172.17.56.175:28003",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 32,
"optime" : {
"ts" : Timestamp(1561910326, 3),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1561910326, 3),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-06-30T15:58:46Z"),
"optimeDurableDate" : ISODate("2019-06-30T15:58:46Z"),
"lastHeartbeat" : ISODate("2019-06-30T15:59:04.297Z"),
"lastHeartbeatRecv" : ISODate("2019-06-30T15:59:04.549Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "172.17.56.175:28001",
"syncSourceHost" : "172.17.56.175:28001",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1561910326, 3),
"$gleStats" : {
"lastOpTime" : Timestamp(1561910313, 1),
"electionId" : ObjectId("7fffffff0000000000000001")
},
"lastCommittedOpTime" : Timestamp(1561910326, 3),
"$clusterTime" : {
"clusterTime" : Timestamp(1561910326, 3),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
config:PRIMARY>
(15)配置share1
客戶端鏈接
mongo 172.17.56.175:27004
使用admin用用戶
use admin
配置
rs.initiate({_id:"share1",members: [
{_id:0,host:"172.17.56.175:27004",priority:2},
{_id:1,host:"172.17.56.175:27005",priority:1},
{_id:2,host:"172.17.56.175:27006",arbiterOnly:true}
]})
(16)配置share2
客戶端鏈接
mongo 172.17.56.175:27007
使用admin用用戶
use admin
配置
rs.initiate({_id:"share2",members: [
{_id:0,host:"172.17.56.175:27007",priority:2},
{_id:1,host:"172.17.56.175:27008",priority:1},
{_id:2,host:"172.17.56.175:27009",arbiterOnly:true}
]})
(17)配置share3
客戶端鏈接
mongo 172.17.56.175:27011
使用admin用用戶
use admin
配置
rs.initiate({_id:"share3",members: [
{_id:0,host:"172.17.56.175:27011",priority:2},
{_id:1,host:"172.17.56.175:27012",priority:1},
{_id:2,host:"172.17.56.175:27013",arbiterOnly:true}
]})
(18)至此完成了全部服務器的配置,接下來開始配置具體collection的分片策略
客戶端鏈接路由
mongo 172.17.56.175:30000
使用admin用用戶
use admin
sh.addShard("share1/172.17.56.175:27004,172.17.56.175:27005,172.17.56.175:27005");
sh.addShard("share2/172.17.56.175:27007,172.17.56.175:27008,172.17.56.175:27009");
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分片驗證
mongo 172.17.56.175:30000
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()查看本庫內全部集合的分片信息