要構建一個 MongoDB Sharding Cluster,需要三種角色:
•Shard Server: mongod 實例,用于存儲實際的數據塊。
•Config Server: mongod 實例,存儲了整個 Cluster Metadata,其中包括 chunk 信息。
•Route Server: mongos 實例,前端路由,客戶端由此接入,且讓整個集群看上去像單一進程
數據庫。
方案一:
192.168.136.14 |
192.168.136.15 |
192.168.136.16 |
192.168.136.26 |
192.168.136.29 |
Shard1(master) |
Shard2(master) |
Shard3(master) |
Shard1(slave) |
Shard1(arbiter) |
Shard2(slave) |
Shard3(slave) |
Shard1(slave) |
Shard3(slave) |
Shard2(arbiter) |
Shard3(arbiter) |
Shard1(arbiter) |
Shard2(arbiter) |
Shard2(slave) |
Shard3 (arbiter) |
1.節點:
S1: 192.168.136..14,192.168.136..26,192.168.136..16,192.168.136.15,192.168.136.29(arbiter)
S2: 192.168.136.15,192.168.136.26,192.168.136.14,192.168.136.16,192.168.136.29(arbiter)
S3: 192.168.136.16,192.168.136.26,192.168.136.15,192.168.136.14,192.168.136.29(arbiter)
c
主機 |
端口信息 |
192.168.136.14 |
mongod shard1:27017(master) mongod shard2:27018(slave) mongod shard3:27019(arbiter) mongod config:30000 mongs:40000 |
192.168.136.15 |
mongod shard1:27017(arbiter) mongod shard2:27018(master) mongod shard3:27019(slave) mongod config:30000 mongs:40000 |
192.168.136.16 |
mongod shard1:27017(slave) mongod shard2:27018(arbiter) mongod shard3:27019(master) mongod config:30000 mongs:40000 |
192.168.136.26 |
mongod shard1:27017(slave) mongod shard2:27018(slave) mongod shard3:27019(slave) |
192.168.136.29 |
mongod shard1:27017(arbiter) mongod shard2:27018(arbiter) mongod shard3:27019(arbiter) |
軟件準備及目錄
1.下載mongodb程序
curl -O http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.8.3.tgz
2.解壓mongodb-linux-x86_64-2.0.0.tgz
tar zxvf mongodb-linux-x86_64-1.8.3.tgz
3.重命名mongodb-linux-x86_64-2.0.0.tgz為mongodb
mv mongodb-linux-x86_64-2.0.0 mongodb
4.進入mongodb目錄
cd mongodb
5.新建文件夾data
mkdir data
mkdir logs
配置Replica Sets,Config Server
※配置配置文件conf
# 1.start_mongod Shard1.conf
shardsvr=true
port=27017
dbpath=/data/database/shard1/
logpath=/data/logs/shard1.log
logappend=true
fork=true
replSet=s1
rest=true
journal=true
# 2.start_mongod Shard2.conf
shardsvr=true
port=27018
dbpath=/data/database/shard2/
logpath=/data/logs/shard2.log
logappend=true
fork=true
replSet=s2
rest=true
journal=true
# 3.start_mongod Shard3.conf
shardsvr=true
port=27019
dbpath=/data/database/shard3/
logpath=/data/logs/shard3.log
logappend=true
fork=true
replSet=s3
rest=true
journal=true
192.168.136.14
1.創建相應的文件夾(注意此處的testadmin是客戶端登陸名)
mkdir -p /data/database/shard1
mkdir -p /data/database/shard2
mkdir -p /data/database/shard3
mkdir -p /data/database/config
mkdir -p /data/logs
2.配置mongod
./mongod --config /mongodb/shard1.conf
./mongod --config /mongodb/shard2.conf
./mongod --config /mongodb/shard3.conf
./mongod --config /mongodb/configsvr.conf
3.查看mongod的進程是否啟動
ps aux | grep mongodb | grep -v grep
4.初始化replica sets(此處ip是對應的內網IP)
/testadmin/mongodb/bin/mongo --port 27017
config = {_id: 's1', members: [{_id: 0,host: '192.168.136.14:27017',priority:5},{_id: 1, host: '192.168.136.26:27017',priority:2},{_id: 2, host: '192.168.136.16:27017',priority:.5},{_id: 3, host: '192.168.136.15:27017',arbiterOnly: true},{_id: 4, host: '192.168.136.29:27017', arbiterOnly: true}]}
rs.initiate(config)
rs.status()
192.168.136.15
1.創建相應的文件夾(注意此處的testadmin是客戶端登陸名)
mkdir -p /data/database/shard1
mkdir -p /data/database/shard2
mkdir -p /data/database/shard3
mkdir -p /data/database/config
mkdir -p /data/logs
2.配置mongod
./mongod --config /mongodb/shard1.conf
./mongod --config /mongodb/shard2.conf
./mongod --config /mongodb/shard3.conf
./mongod --config /mongodb/configsvr.conf
3.查看mongod的進程是否啟動
ps aux | grep mongodb | grep -v grep
4.初始化replica sets
/testadmin/mongodb/bin/mongo --port 27018
config={_id: 's2', members: [{_id: 0, host: '192.168.136.15:27018',priority:5},{_id: 1, host: '192.168.136.26:27018',priority:2},{_id: 2, host: '192.168.136.14:27018',priority:.5},{_id: 3, host: '192.168.136.16:27018', arbiterOnly: true},{_id: 4, host: '192.168.136.29:27018', arbiterOnly: true}]}
rs.initiate(config)
192.168.136.16
1.創建相應的文件夾(注意此處的testadmin是客戶端登陸名)
mkdir -p /data/shard1
mkdir -p /data/shard2
mkdir -p /data/shard3
mkdir -p /data/config
mkdir -p /data/logs
2.配置mongod
./mongod --config /mongodb/shard1.conf
./mongod --config /mongodb/shard2.conf
./mongod --config /mongodb/shard3.conf
./mongod --config /mongodb/configsvr.conf
3.查看mongod的進程是否啟動
ps aux | grep mongodb | grep -v grep
4.初始化replica sets
/testadmin/mongodb/bin/mongo --port 27019
config={_id: 's3',members: [{_id: 0, host: '192.168.136.16:27019',priority:5},{_id: 1, host: '192.168.136.26:27019',priority:2},{_id: 2, host: '192.168.136.15:27019',priority:.5},{_id: 3, host: '192.168.136.14:27019', arbiterOnly: true},{_id: 4, host: '192.168.136.29:27019', arbiterOnly: true}]}
rs.status()
192.168.136.26,192.168.136.29分別執行如下:
1.創建相應的文件夾(注意此處的testadmin是客戶端登陸名)
mkdir -p /data/shard1
mkdir -p /data/shard2
mkdir -p /data/shard3
mkdir -p /data/config
mkdir -p /data/logs
2.配置mongod
./mongod --config /mongodb/shard1.conf
./mongod --config /mongodb/shard2.conf
./mongod --config /mongodb/shard3.conf
3.查看mongod的進程是否啟動
ps aux | grep mongodb | grep -v grep
配置Mongos(在每一臺機子上建立路由)
/mongodb/bin/
./mongos --fork --port 40000 --logpath /data/logs/mongos.log --configdb 192.168.136.14:30000,192.168.136.15:30000,192.168.136.16:30000
添加分片
1連接任意一臺,其他無需這樣操作:
/home/testadmin/bin/mongo --port 40000
use admin
db.runCommand({addshard:'s1/192.168.136.14:27017,192.168.136.26:27017,192.168.136.16:27017'}) db.runCommand({addshard:'s2/192.168.136.15:27018,192.168.136.26:27018,192.168.136.14:27018'}) db.runCommand({addshard:'s3/192.168.136.16:27019,192.168.136.26:27019,192.168.136.15:27019'})
db.runCommand({ listshards:1 })
db.runCommand({ enablesharding:'weibo' })
db.runCommand({shardcollection:'weibo.test', key:{_id:1},unique:true}) printShardingStatus()
db.data.stats();
1.注意1.9.1之前復制集不支持用戶認證,只能通過keyFile密匙文件,幸好這幾天2.0正式版出來了,很多功能問題都已解決。呵呵
注意:用戶驗證,啟動mongod必須添加--auth
#設置用戶名和密碼
>use test
>db.addUser('mongo','456123');
>db.auth('mongo','456123')
>db.system.users.find() --查看該用戶是否添加成功
>db.system.users.remove('mongo','456123')
>mongo 數據庫 -u mongo -p
注意:啟動時必須添加--auth用戶權限才會生效,第一次配置完成后,沒效果就重啟下。
1.如果讀得鴨梨大了,則添加加slave節點,分散讀得鴨梨。
啟動后,在primary節點中添加節點
如:rs.add("10.168.0.100:27017") 當我們看到變為secondary后,就一切正常。
2.如果寫的鴨梨打了,則可以添加一組shard節點分散寫的鴨梨。
如:如上所述啟動mongod,添加即可。
增量備份(添加延遲備份節點)
1、利用另外一臺secondary機器傳送數據
2、在新機器上中配置文件中添加fastsync=true配置(當需要從有數據中啟動節點,那么必須加上fastsync=true,否則啟動會報錯,如果是從主庫直接同步所有數據,那么就不需要添加這個參數)
3、啟動后,在primary節點中添加節點
如:rs.add("10.168.0.102:27017") 當我們看到變為secondary后,就一切正常,可以正常提供線上服務了
4、通過rs.conf()命令查看現在的節點信息(需要admin庫密碼權限)
5、rs.remove("10.168.0.102:27017")刪除節點
6、添加arbiter節點:rs.addArb("10.73.24.171:19003")
7、添加延時備份機器:
rs.add({_id:5,host:"10.168.0.102:27017",priority:0,slaveDelay:300});
rs.add({_id:5,host:"10.168.0.102:27018",priority:0,slaveDelay:300});
rs.add({_id:5,host:"10.168.0.102:27019",priority:0,slaveDelay:300});
注意:slaveDelay單位秒.
8、出現這個錯誤時:replSet error RS102 too stale to catch up,我們可以db.printReplicationInfo()查看主庫、從庫的oplog信息;
利用延遲備份節點恢復數據
1. 先把延遲備份節點的數據,備份到各節點的master機子上。如:
#./mongodump -h 192.168.136.14:27017 -d weibo -o /data/mongoback/
#./mongodump -h 192.168.136.15:27018 -d weibo -o /data/mongoback/
#./mongodump -h 192.168.136.16:27019 -d weibo -o /data/mongoback/
2. 把備份的數據導入到個節點的master上。如:
建議先修復下,壓縮空間
db.repairDatabase();修復數據(和壓縮(刪除數據)空間)
./mongorestore -h 127.0.0.1:27017 --directoryperdb /data/mongoback --drop --indexesLast
./mongorestore -h 127.0.0.1:27018 --directoryperdb /data/mongoback --drop --indexesLast
./mongorestore -h 127.0.0.1:27019 --directoryperdb /data/mongoback --drop --indexesLast
全量備份(添加延遲備份節點)
1. 寫好腳本定期凌晨備份數據,如:
./mongodump -h 10.168.0.187:40000 -d weibo -o /data/mongoback/
2. 恢復數據
3. 建議先修復下,壓縮空間
4. db.repairDatabase();修復數據(和壓縮(刪除數據)空間)
./mongorestore -h 10.168.0.187:40000 --directoryperdb /data/mongoback --drop --indexesLast
1.如果啟動不成功,則嘗試修復.如:
./mongod --port 27017 --repair --dbpath /data/database/shard1/
2如果master節點kill了,則起來之后通過rs.stepDown(100)讓出master的位置。
3.其他問題請隨時歡迎提出,聯系我(李航),圍脖:http://weibo.com/lidaohang~
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。