MongoDB分片環境下整體資料遷移解決方案
背景:這周請了幾天假,25號早上來了,就開始搞MongoDB資料庫分片叢集環境的整體遷移,起初以為很容易,但是在遷移的過程中,遇到了各種問題。還好經過兩天的研究,現在終於搞定!匆忙之中,整理了一下文件,由於網上關於MongoDB資料庫遷移的文章較少,顧發表了一篇blog,希望後面的小夥伴少走彎路,快速上路!
由於之前測試環境的叢集機器配置不一致,導致在壓測的時候,對其中一臺機器壓力過大,嚴重影響效能,所以申請了兩臺相同配置的新機器,需要將原先分片環境中的資料全部遷移到新的機器中,舊的機器暫停服務!
一、部署架構圖
二、基礎常識
1.路由伺服器和分片伺服器(單個副本集)認證資訊儲存的位置不同。路由儲存在配置伺服器中,分片伺服器自身進行儲存。所以拿路由的認證資訊不能去分片伺服器進行安全認證。想對單個副本集進行操作,需針對單個副本集建立認證資訊,認證後進行操作。
三、分片伺服器資料遷移
1.新建節點
環境:10.20.222.63/10.20.222.64兩個節點機器
新增二個節點,IP和port分別為10.20.222.63:20011, 10.20.222.64:20012,1 0.20.222.63:20013
1.1 環境部署:
1.1.1兩臺機器分別執行
curl https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.7.tgz > mongo.tgz
tar -zxvf mongo.tgz
mv mongodb-linux-x86_64-rhel62-3.2.7 / mongo
(將原先分片叢集環境中的keyfile拷貝到mongo中,記得許可權問題。chmod 600 keyfile )
1.1.2建立三個節點
mkdir shard1.1 (63)
mkdir shard1.2 (64)
mkdir shard1.3 (63)
// 分別執行下面命令:
cd shard1.1
mkdir data
mkdir logs
touch ./logs/mongodb.log
vim config.cfg
port = 20011 #20012 20013
dbpath = /home/unisound/shard1.1/data
logpath = /home/unisound/shard1.1/logs/mongodb.log
fork = true
logappend = true
shardsvr = true
replSet = shard1
keyFile = /home/unisound/mongo/keyfile
1.2啟動三個節點
./bin/mongod --config config_shard11.cfg
./bin/mongod --config config_shard12.cfg
./bin/mongod --config config_shard13.cfg
至此,新建的三個節點準備完畢,下面準備新增到單個副本集中。
2.新增節點
1.從原先的三個節點找出主節點
10.20.0.44:20011,10.20.0.44:20012(主),10.20.0.44:20013
./mongo/bin/mongo --port 20012
use admin
show dbs
Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" : 13
}
新增使用者
db.createUser({
user: "root",
pwd: "123456",
roles: [
{ role: "root", db: "admin" }
]
})
認證
db.auth('root','123456')
新增節點
rs.add("10.20.222.63:20011")
rs.add("10.20.222.64:20012")
rs.add("10.20.222.63:20013",true)
shard1:PRIMARY>
rs.status()
{
"set" : "shard1",
"date" : ISODate("2017-05-26T07:06:34.935Z"),
"myState" : 1,
"term" : NumberLong(2),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "10.20.0.44:20011",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2136,
"optime" : {
"ts" : Timestamp(1495782392, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2017-05-26T07:06:32Z"),
"electionTime" : Timestamp(1495780269, 1),
"electionDate" : ISODate("2017-05-26T06:31:09Z"),
"configVersion" : 4,
"self" : true
},
{
"_id" : 1,
"name" : "10.20.0.44:20012",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 2130,
"optime" : {
"ts" : Timestamp(1495782392, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2017-05-26T07:06:32Z"),
"lastHeartbeat" : ISODate("2017-05-26T07:06:34.640Z"),
"lastHeartbeatRecv" : ISODate("2017-05-26T07:06:34.830Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "10.20.0.44:20011",
"configVersion" : 4
},
{
"_id" : 2,
"name" : "10.20.0.44:20013",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 2125,
"lastHeartbeat" : ISODate("2017-05-26T07:06:34.640Z"),
"lastHeartbeatRecv" : ISODate("2017-05-26T07:06:32.800Z"),
"pingMs" : NumberLong(0),
"configVersion" : 4
},
{
"_id" : 3,
"name" : "10.20.222.63:20011",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 151,
"optime" : {
"ts" : Timestamp(1495782392, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2017-05-26T07:06:32Z"),
"lastHeartbeat" : ISODate("2017-05-26T07:06:34.640Z"),
"lastHeartbeatRecv" : ISODate("2017-05-26T07:06:34.726Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "10.20.0.44:20011",
"configVersion" : 4
},
{
"_id" : 4,
"name" : "10.20.222.64:20012",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 83,
"optime" : {
"ts" : Timestamp(1495782392, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2017-05-26T07:06:32Z"),
"lastHeartbeat" : ISODate("2017-05-26T07:06:34.640Z"),
"lastHeartbeatRecv" : ISODate("2017-05-26T07:06:32.729Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "10.20.222.63:20011",
"configVersion" : 4
},
{
"_id" : 5,
"name" : "10.20.222.63:20013",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 2,
"lastHeartbeat" : ISODate("2017-05-26T07:06:34.733Z"),
"lastHeartbeatRecv" : ISODate("2017-05-26T07:06:32.850Z"),
"pingMs" : NumberLong(0),
"configVersion" : 4
}
],
"ok" : 1
}
至此,節點新增完成,資料會自動同步過來。
在移除的時候,只能在PRIMARY節點型別上操作
rs.remove("10.20.0.44:20011")
rs.remove("10.20.0.44:20012")
rs.remove("10.20.0.44:20013")
移除成功後,資料遷移完成.
四、配置伺服器資料遷移
10.20.222.63:20011, 10.20.222.64:20012,1 0.20.222.63:20013
分別建立三個目錄,執行
mkdir config1 (63)
mkdir config2 (64)
mkdir config3 (63)
mkdir data
mkdir logs
touch ./logs/mongodb.log
vim config
port = 10001 #10002 10003
dbpath = /home/unisound/config1/data
replSet = config
configsvr = true
logpath = /home/unisound/config1/logs/mongodb.log
logappend = true
fork = true
keyFile = /home/unisound/mongo/keyfile
啟動配置伺服器
./mongo/bin/mongo --config config1/config.cfg
./mongo/bin/mongo --config config2/config.cfg
./mongo/bin/mongo --config config3/config.cfg
新增節點
找到配置伺服器的主節點
./mongo/bin/mongo --port 10001
use admin
db.auth('root','123456')
rs.status()
rs.add("10.20.222.63:10001")
rs.add("10.20.222.64:10002")
rs.add("10.20.222.63:10003")
在移除的時候,只能在PRIMARY節點型別上操作
rs.remove("10.20.0.44:10001")
rs.remove("10.20.0.44:10002")
rs.remove("10.20.0.44:10003")
配置伺服器遷移完成,在移除remove的時候,會自動選舉其中一個作為主節點。
五、路由伺服器遷移
mkdir router
mkdir data
mkdir logs
touch ./logs/mongodb.log
vim config
logpath = /home/unisound/router/logs/mongodb.log
port = 27017
configdb = config/10.20.222.63:10001,10.20.222.64:10002,10.20.222.63:10003
fork = true
logappend = true
keyFile = /home/unisound/mongo/keyfile
./mongo/bin/mongos --config router/config.cfg
./mongo/bin/mongo
use user_center
db.auth('dev','123456')
至此,分片、配置、路由伺服器資料都遷移完成。