下載下傳
MongoDB 官方下載下傳位址:https://www.mongodb.com/download-center#community
下載下傳後解壓到app目錄下
tar -zxvf mongodb-linux-x86_64-rhel70-4.4.3.tgz -C /app
修改檔案夾名稱
mv mongodb-linux-x86_64-rhel70-4.4.3 mongodb-4.4.3
進入根目錄
mkdir log
mkdir data
vim conf/mongo.conf
配置
logpath=/app/mongodb-4.4.3/log/mongo.log # 日志檔案
dbpath =/app/mongodb-4.4.3/data # 資料檔案
#錯誤日志采用追加模式
logappend=true
#啟用日志檔案,預設啟用
journal=true
#這個選項可以過濾掉一些無用的日志資訊,若需要調試使用請設定為false
quiet=true
#端口号 預設為27017
port=27017
#允許遠端通路
bind_ip=0.0.0.0
#開啟子程序
fork=true
#開啟認證,必選先添加使用者, 如果不需要驗證這裡改成false
auth=true
~
啟動mongo 并設定密碼
mongo
MongoDB shell version v4.4.3
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("2eeb129e-26f3-418c-afd9-72867bf20118") }
MongoDB server version: 4.4.3
> use admin
switched to db admin
> db.createUser({user:"admin",pwd:"password",roles:["root"]})
Successfully added user: { "user" : "admin", "roles" : [ "root" ] }
下次登入後 如果不驗證 則資料是查不到的
#驗證語句
db.auth('root','123456')
至此 mongo安裝完成 下面搞mongo分片
mongo分片介紹
① 配置伺服器。是一個獨立的mongod程序,儲存叢集和分片的中繼資料,即各分片包含了哪些資料的資訊。最先開始建立,啟用日志功能。像啟動普通的mongod一樣啟動配置伺服器,指定configsvr選項。不需要太多的空間和資源,配置伺服器的1KB空間相當于真是資料的200MB。儲存的隻是資料的分布表。當服務不可用,則變成隻讀,無法分塊、遷移資料。
② 路由伺服器。即mongos,起到一個路由的功能,供程式連接配接。本身不儲存資料,在啟動時從配置伺服器加載叢集資訊,開啟mongos程序需要知道配置伺服器的位址,指定configdb選項。
③ 分片伺服器。是一個獨立普通的mongod程序,儲存資料資訊。可以是一個副本集也可以是單獨的一台伺服器。
在部署之前先明白片鍵的意義,一個好的片鍵對分片至關重要。片鍵必須是一個索引,資料根據這個片鍵進行拆分分散。通過sh.shardCollection加會自動建立索引。一個自增的片鍵對寫入和資料均勻分布就不是很好,因為自增的片鍵總會在一個分片上寫入,後續達到某個閥值可能會寫到别的分片。但是按照片鍵查詢會非常高效。随機片鍵對資料的均勻分布效果很好。注意盡量避免在多個分片上進行查詢。在所有分片上查詢,mongos會對結果進行歸并排序。
mongo分片實施 資源有限在一台機器上搞一下
1)配置伺服器。配置伺服器必須開啟1個或則3個,開啟2個則會報錯: (開啟3個,Port:20000、20001、20002 一個配置伺服器=一個副本集=三個節點)
在其根目錄下建立檔案夾
[[email protected] mongodb-4.4.3]# mkdir configServer
[[email protected] mongodb-4.4.3]# cd ./configServer
[[email protected] configServer]# mkdir configserver20000
[[email protected] configServer]# mkdir configserver20001
[[email protected] configServer]# mkdir configserver20002
[[email protected] configServer]# cd configServer20000
[[email protected] configServer20000]# mkdir data
[[email protected] configServer20000]# mkdir log
[[email protected] configServer20000]# cp /app/mongodb-4.4.3/conf/mongo.conf ./mongo.conf
[[email protected] configServer20000]# 其他節點做一樣的操作
配置節點的配置檔案 其他節點修改端口 和檔案路徑
logpath=/app/mongodb-4.4.3/configServer/configServer20000/log/mongo.log # 日志檔案
dbpath =/app/mongodb-4.4.3/configServer/configServer20000/data # 資料檔案
#錯誤日志采用追加模式
logappend=true
#啟用日志檔案,預設啟用
journal=true
#這個選項可以過濾掉一些無用的日志資訊,若需要調試使用請設定為false
quiet=true
#端口号 預設為27017
port=20000
#允許遠端通路
bind_ip=0.0.0.0
#開啟子程序
fork=true
#開啟認證,必選先添加使用者,先不開啟(不用驗證賬号密碼)
auth=false
#最大連接配接數
maxConns=20000
#複制集名稱
replSet=myShardConfigs
configsvr=true
啟動配置伺服器
./mongod -f ../configServer/configServer20000/mongo.conf
./mongod -f ../configServer/configServer20001/mongo.conf
./mongod -f ../configServer/configServer20002/mongo.conf
連接配接到某個節點 配置副本集(連接配接三個節點任意一個)
mongo --port 20000 //任意選擇一台進入
config={_id:"myShardConfigs",configsvr:true,members:[{_id:0,host:"127.0.0.1:20000"},{_id:1,host:"127.0.0.1:20001"},{_id:2,host:"127.0.0.1:20002"}]} //建立複制集
rs.initiate(config) //初始化複制集
配置伺服器 操作完畢
2)分片伺服器 兩個分片伺服器(兩個副本集) 每個分片3個節點
本文沒有使用仲裁節點 為什麼請看https://www.zhihu.com/question/27648448/answer/99091787
[[email protected] shareServer]# mkdir shareServer1-21000
[[email protected] shareServer]# mkdir shareServer1-21001-replSet1
[[email protected] shareServer]# mkdir shareServer1-21002-replSet2
[[email protected]1cf6pm8o3dv75jmev9Z shareServer]# mkdir shareServer2-21005
[[email protected] shareServer]# mkdir shareServer2-21006-replSet1
[[email protected] shareServer]# mkdir shareServer2-21007-replSet2
[[email protected] shareServer]#
分片節點的配置 其他節點修改路徑和端口和叢集名稱
logpath=/app/mongodb-4.4.3/shareServer/shareServer1-21000/log/mongo.log # 日志檔案
dbpath =/app/mongodb-4.4.3/shareServer/shareServer1-21000/data # 資料檔案
#錯誤日志采用追加模式
logappend=true
#啟用日志檔案,預設啟用
journal=true
#這個選項可以過濾掉一些無用的日志資訊,若需要調試使用請設定為false
quiet=true
#端口号 預設為27017
port=21000
#允許遠端通路
bind_ip=0.0.0.0
#開啟子程序
fork=true
#開啟認證,必選先添加使用者,先不開啟(不用驗證賬号密碼)
auth=false
#最大連接配接數
maxConns=20000
#複制集名稱
replSet=share1
# 聲明這是一個叢集的分片
shardsvr=true
啟動 六個節點
./mongod -f ../shareServer/shareServer1-21000/mongo.conf
./mongod -f ../shareServer/shareServer1-21001-replSet1/mongo.conf
./mongod -f ../shareServer/shareServer1-21002-replSet2/mongo.conf
./mongod -f ../shareServer/shareServer2-21005/mongo.conf
./mongod -f ../shareServer/shareServer2-21006-replSet1/mongo.conf
./mongod -f ../shareServer/shareServer2-21007-replSet2/mongo.conf
連接配接到某個節點 初始化複制集(21000、21001、21002為share1 ,21005、21006、21007為share2 配置的時候前三個連接配接任意一個配置 後三個任意一個配置 )
注意:如果沒有仲裁節點可以三個節點任意一台去初始化, 如果有仲裁節點隻能去不是仲裁節點的另外兩台去初始化。
share1
./mongo --port 21000
rsconf={ _id:"share1",members:[ {_id:0,host:"127.0.0.1:21000"}, {_id:1,host:"127.0.0.1:21001"}, {_id:2,host:"127.0.0.1:21002"}]}
rs.initiate(rsconf);
share2
./mongo --port 21005
rsconf={ _id:"share2",members:[ {_id:0,host:"127.0.0.1:21005"}, {_id:1,host:"127.0.0.1:21006"}, {_id:2,host:"127.0.0.1:21007"}]}
rs.initiate(rsconf);
3)路由伺服器 (這裡搞兩個路由伺服器 27017、27018)
[[email protected] mongodb-4.4.3]# cd routerServer/
[[email protected] routerServer]# mkdir router-27017
[[email protected] routerServer]# mkdir router-27018
config
logpath=/app/mongodb-4.4.3/routerServer/router-27017/log/mongo.log # 日志檔案
pidfilepath =/app/mongodb-4.4.3/routerServer/router-27017/log/mongos.pid
#錯誤日志采用追加模式
logappend=true
#這個選項可以過濾掉一些無用的日志資訊,若需要調試使用請設定為false
quiet=true
#端口号 預設為27017
port=27017
#允許遠端通路
bind_ip=0.0.0.0
#開啟子程序
fork=true
#最大連接配接數
maxConns=20000
#配置伺服器
configdb =myShardConfigs/127.0.0.1:20000,127.0.0.1:20001,127.0.0.1:20002
啟動路由(這裡啟動27017 沒有啟動27018 如果使用兩個路由代碼中要配置兩個路由的路徑)
./mongos -f ../routerServer/router-27017/mongo.conf
[[email protected] bin]# ps -ef |grep mong
root 4697 1 0 11:28 ? 00:03:16 ./mongod -f ../shareServer/shareServer1-21000/mongo.conf
root 4740 1 0 11:28 ? 00:02:46 ./mongod -f ../shareServer/shareServer1-21001-replSet1/mongo.conf
root 4783 1 0 11:28 ? 00:02:47 ./mongod -f ../shareServer/shareServer1-21002-replSet2/mongo.conf
root 4831 1 0 11:29 ? 00:03:16 ./mongod -f ../shareServer/shareServer2-21005/mongo.conf
root 4874 1 0 11:29 ? 00:02:49 ./mongod -f ../shareServer/shareServer2-21006-replSet1/mongo.conf
root 6136 1 0 14:07 ? 00:01:23 ./mongod -f ../shareServer/shareServer2-21007-replSet2/mongo.conf
root 11428 1 1 17:47 ? 00:00:03 ./mongod -f ../configServer/configServer20000/mongo.conf
root 11480 1 1 17:47 ? 00:00:02 ./mongod -f ../configServer/configServer20001/mongo.conf
root 11531 1 1 17:47 ? 00:00:02 ./mongod -f ../configServer/configServer20002/mongo.conf
root 11740 1 0 17:50 ? 00:00:00 ./mongos -f ../routerServer/router-27017/mongo.conf
root 11779 7334 0 17:51 pts/2 00:00:00 grep --color=auto mong
[[email protected] bin]#
4)此時登入路由伺服器檢視狀态 這是還沒有添加分片伺服器的狀态
mongo --port 27017
mongos> sh.status();
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("600559990c4072b92c72da2f")
}
shards:
active mongoses:
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
{ "_id" : "config", "primary" : "config", "partitioned" : true }
mongos>
手動加入分片1和分片2
admin
mongos> sh.addShard("share1/127.0.0.1:21000,127.0.0.1:21001,127.0.0.1:21002");
{
"shardAdded" : "share1",
"ok" : 1,
"operationTime" : Timestamp(1610964029, 4),
"$clusterTime" : {
"clusterTime" : Timestamp(1610964029, 4),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
mongos> sh.addShard("share2/127.0.0.1:21005,127.0.0.1:21006,127.0.0.1:21007");
{
"shardAdded" : "share2",
"ok" : 1,
"operationTime" : Timestamp(1610964053, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1610964054, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
mongos> sh.status();
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("600559990c4072b92c72da2f")
}
shards:
{ "_id" : "share1", "host" : "share1/127.0.0.1:21000,127.0.0.1:21001,127.0.0.1:21002", "state" : 1 }
{ "_id" : "share2", "host" : "share2/127.0.0.1:21005,127.0.0.1:21006,127.0.0.1:21007", "state" : 1 }
active mongoses:
"4.4.3" : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
{ "_id" : "config", "primary" : "config", "partitioned" : true }
mongos>
rs.isMaster(); # 檢視目前是否是主節點
5)實驗
修改塊的大小友善測試 預設是64MB,取值範圍是1 MB 到 1024 MB.
mongos> use config
switched to db config
mongos> db.settings.save({"_id":"chunksize","value":1}) //設定塊大小為1M是友善實驗,不然就需要插入海量資料
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "chunksize" })
建立一個mydb資料庫 并建立一個集合為user 并插入資料啟用分片
use mydb;
mongos> for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})} //插入資料
mongos> sh.enableSharding("mydb");//給mydb資料庫開啟分片
{
"ok" : 1,
"operationTime" : Timestamp(1610966409, 3),
"$clusterTime" : {
"clusterTime" : Timestamp(1610966409, 4),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
mongos>db.user.createIndex({"id":1}) //給id添加索引
mongos> sh.shardCollection("mydb.user",{"id":1})
mongos> sh.shardCollection("mydb.user",{"id":1});//以id為片鍵将user集合分片
{
"collectionsharded" : "mydb.user",
"collectionUUID" : UUID("66006f80-67a4-4dc4-8913-38d5d2274256"),
"ok" : 1,
"operationTime" : Timestamp(1610967475, 5),
"$clusterTime" : {
"clusterTime" : Timestamp(1610967475, 5),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
mongos>
檢視分片狀态
mongos> sh.status();
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("600559990c4072b92c72da2f")
}
shards:
{ "_id" : "share1", "host" : "share1/127.0.0.1:21000,127.0.0.1:21001,127.0.0.1:21002", "state" : 1 }
{ "_id" : "share2", "host" : "share2/127.0.0.1:21005,127.0.0.1:21006,127.0.0.1:21007", "state" : 1 }
active mongoses:
"4.4.3" : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
514 : Success
databases:
{ "_id" : "config", "primary" : "config", "partitioned" : true }
config.system.sessions
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
share1 512
share2 512
too many chunks to print, use verbose if you want to force print
{ "_id" : "mydb", "primary" : "share2", "partitioned" : true, "version" : { "uuid" : UUID("99f1c4c0-5440-4971-9767-12df46b379bc"), "lastMod" : 1 } }
mydb.user
shard key: { "id" : 1 }
unique: false
balancing: true
chunks:
share1 2
share2 2
{ "id" : { "$minKey" : 1 } } -->> { "id" : 2 } on : share1 Timestamp(2, 0)
{ "id" : 2 } -->> { "id" : 20604 } on : share2 Timestamp(3, 1)
{ "id" : 20604 } -->> { "id" : 31010 } on : share2 Timestamp(2, 2)
{ "id" : 31010 } -->> { "id" : { "$maxKey" : 1 } } on : share1 Timestamp(3, 0)
mongos>
此時如果你有share3 并将其sh.shard(xxx)伺服器又對資料進行重新分片,當你再次移除一個分片伺服器,此時又會對資料再次進行分片處理,MongoDB對資料的處理非常靈活
最終驗證:
結果 确實資料分片了 而且每個分片的副本集資料一緻
即 21000、21002、21003 資料量一緻
21005、21006、21007資料量一緻
share1+share2=總數
參考:https://www.imooc.com/article/277085?block_id=tuijian_wz
https://blog.51cto.com/13643643/2148825#h10
https://www.jianshu.com/p/918afbb6a8c5
https://www.jianshu.com/p/b5a7d13e1391
https://blog.51cto.com/13728740/2175905 //mongo的一些複制集實操