1. 程式人生 > >MongoDB分片環境下整體資料遷移解決方案

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')

至此,分片、配置、路由伺服器資料都遷移完成。
這裡寫圖片描述