環境
IP | Instance |
192.168.65.129 |
mongos(30000) config(27017) shard1主節點(40001) shard2仲裁節點(40002) shard3副節點(40003) |
192.168.65.130 |
mongos(30000) config(27017) shard1副節點(40001) shard2主節點(40002) shard3仲裁節點(40003) |
192.168.65.131 |
mongos(30000) config(27017) shard1仲裁節點(40001) shard2副節點(40002) shard3主節點(40003) |
3臺機,每臺機5個實例,分別mongos 1 個,config server 1 個,shard server 3 個
創建想應目錄
mkdir -p /mongodb/{data,logs,apps}
mkdir -p /mongodb/data/shard{1,2,3}
mkdir -p /mongodb/data/config
創建用戶及修改權限
/usr/sbin/groupadd -g 10001 mongodb
/usr/sbin/useradd -u 10001 -g mongodb mongodb
id mongodb
passwd mongodb
chown -R mongodb:mongodb /mongodb
chmod 775 /mongodb
配置 config 配置服務器
配置文件(3 個節點都一樣,無需改動):
vi /mongodb/apps/mongodb/bin/mongodb-config.conf
dbpath=/mongodb/data/config
logpath=/mongodb/logs/mongodb-config.log
port=27017
fork=true
journal=true
maxConns=500
logappend=true
pidfilepath=/tmp/mongo-config.pid
directoryperdb=true
replSet=tyconfig
configsvr=true
bind_ip=0.0.0.0
啓動config實例
3臺機
mongod --config /mongodb/apps/mongodb/bin/mongodb-config.conf
創建複製集
連接一個實例
mongo 192.168.65.129:27017
config={_id:"tyconfig",members:[
{_id:0,host:"192.168.65.129:27017"},
{_id:1,host:"192.168.65.130:27017"},
{_id:2,host:"192.168.65.131:27017"},
]}
這個 tyconfig 名字一定要和config 配置文件中 replSet 的名字一致
初始化複製集
rs.initiate(config)
檢查狀態
rs.status()
複製集配完後,可能狀態不會馬上改變(可能都是secondary),過幾秒就會自動更新
部署和管理分片服務器
部署shard1分片服務器
vi /mongdb/apps/mongodb/bin/mongodb-shard1.conf
dbpath=/mongodb/data/shard1
logpath=/mongodb/logs/mongodb-shard1.log
port=40001
fork=true
#auth=true
#noauth=true
#verbose=true
#vvvv=true
journal=true
maxConns=500
logappend=true
directoryperdb=true
pidfilepath=/tmp/mongo_27018.pid
#cpu=true
#nohttpinterface=false
#notablescan=false
#profile=0
#slowms=200
#quiet=true
#syncdelay=60
replSet=tyshard1
bind_ip=0.0.0.0
shardsvr=true
將此文件copy到另外2臺機器
scp /mongodb/apps/mongodb/bin/mongodb-shard1.conf [email protected]:/mongodb/apps/mongodb/bin/
scp /mongodb/apps/mongodb/bin/mongodb-shard1.conf [email protected]:/mongodb/apps/mongodb/bin/
啓動3臺shard1實例
mongod --config /mongodb/apps/mongodb/bin/mongodb-shard1.conf
連接一個實例
mongo 192.168.65.129:40001
創建複製集
use admin
config={_id:"tyshard1",members:[
{_id:0,host:"192.168.65.129:40001",priority:2},
{_id:1,host:"192.168.65.130:40001",priority:1},
{_id:2,host:"192.168.65.131:40001",arbiterOnly:true},
]}
這個 tyshard1名字一定要和 shard1配置文件中 replSet 的名字一致
初始化複製集
rs.initiate(config)
檢查狀態
rs.status()
複製集配完後,可能狀態不會馬上改變(可能都是secondary),過幾秒就會自動更新
部署shard2分片服務器
將shard1的配置文件copy一份,修改其中的端口、路徑及複製集名稱。然後copy給另外2臺主機
啓動實例
mongod --config /mongodb/apps/mongodb/bin/mongodb-shard2.conf
連接第二個節點創建複製集(爲什麼是連接第二個,因爲規劃的shard 的仲裁節點是129:40002,仲裁節點不能寫數據,所以這裏不能連129,要連130)
mongo 192.168.65.130:40002
use admin
config={_id:"tyshard2",members:[
{_id:0,host:"192.168.65.129:40002",arbiterOnly:true},
{_id:1,host:"192.168.65.130:40002",priority:2},
{_id:2,host:"192.168.65.131:40002",priority:1},
]}
這個 tyshard1名字一定要和 shard1配置文件中 replSet 的名字一致
初始化複製集
rs.initiate(config)
檢查狀態
rs.status()
複製集配完後,可能狀態不會馬上改變(可能都是secondary),過幾秒就會自動更新
部署shard3分片服務器
將shard1的配置文件copy一份,修改其中的端口、路徑及複製集名稱。然後copy給另外2臺主機
啓動實例
mongod --config /mongodb/apps/mongodb/bin/mongodb-shard3.conf
連接第二個節點創建複製集(爲什麼是連接第二個,因爲規劃的shard 的仲裁節點是129:40002,仲裁節點不能寫數據,所以這裏不能連129,要連130)
mongo 192.168.65.129:40003
use admin
config={_id:"tyshard3",members:[
{_id:0,host:"192.168.65.129:40003",priority:1},
{_id:1,host:"192.168.65.130:40003",arbiterOnly:true},
{_id:2,host:"192.168.65.131:40003",priority:2},
]}
這個 tyshard1名字一定要和 shard1配置文件中 replSet 的名字一致
初始化複製集
rs.initiate(config)
檢查狀態
rs.status()
複製集配完後,可能狀態不會馬上改變(可能都是secondary),過幾秒就會自動更新
創建路由實例
vi /mongodb/apps/mongodb/bin/mongodb-route.conf
pidfilepath=/mongodb/apps/mongo-route.pid
logpath=/mongodb/logs/mongodb-route.log
port=30000
fork=true
maxConns=5000
logappend=true
bind_ip=0.0.0.0
configdb=tyconfig/192.168.66.129:27017,192.168.66.130:27017,192.168.66.121:27017
並傳入另外2臺機器
scp /mongodb/apps/mongodb/bin/mongodb-route.conf [email protected]://mongodb/apps/mongodb/bin/
scp /mongodb/apps/mongodb/bin/mongodb-route.conf [email protected]://mongodb/apps/mongodb/bin/
啓動路由實例
mongos --config /mongodb/apps/mongodb/bin/mongodb-route.conf
啓用分片功能
登陸路由節點
mongo 192.168.65.129:30000
use admin
sh.addShard("tyshard1/192.168.65.129:40001,192.168.65.130:40001,192.168.65.131:40001")
sh.addShard("tyshard2/192.168.65.129:40002,192.168.65.130:40002,192.168.65.131:40002")
sh.status()
測試服務器分片功能
use config
db.settings.save({"_id":"chunksize","value":1})
模擬寫入數據
在tydb庫的tyuser表中循環寫入6萬條數據
use tydb
show collections
for(i=1;i<=60000;i++){db.tyuser.insert({"id":i,"name":"ty"+i})}
啓用數據庫分片
sh.enableSharding("tydb")
圍標創建的索引
db.tyuser.createIndex({"id":1})
啓用表分片
sh.shardCollection(”tydb.tyuser",{"id":1})
查看分片情況
sh.status()
手動添加分片服務器
mongo 192.168.65.129:30000
use admin
sh.addShard("tyshard3/192.168.65.129:40003,192.168.65.130:40003,192.168.65.131:40003")
sh.status()
服務器又對數據進行重新分片,當你再次移除一個分片服務器,此時又會對數據再次進行分片
use tydb
db.tydb.stats()
其他
開啓平衡器
use admin sh.startBalance()
或者
sh.setBalancerState(true)
關閉平衡器
use admin
sh.stopBalancer()
或者
sh.setBalancerState(false)
.查看是否關閉,返回flase表示平衡器已關閉,還需要查詢均衡器正在運行的 情況
sh.getBalancerState()
刪除分片服務器
1.執行RemoveShard命令
db.runCommand({removeshard:"tyshard3"})
2.查看遷移狀態
我們可以反覆執行上面語句,查看執行結果。
db.runCommand({removeshard:"tyshard3"})
3.移出非Shard數據
db.runCommand({movePrimary:"tydb",to:"tyshard1"})
4.最後的清理
上面步驟都完成後,還需要在執行一次RemoveShard,清理殘餘數據。
db.runCommand({removeshard:"mongodb0"})
如果要移除的分片正好是某一個表的primary,就會報錯無法移除,那麼就先進行如下操作
db.runCommand({moveprimary:"tydb",to:"tyshard1"})