阿里云上遷移Mongo副本集數據庫到ECS自建服務器的記錄

從 阿里云上 遷移 Mongo 副本集 數據庫 到 ECS 自建服務器的記錄

環境:

  • 阿里云 —— Mongo 3.2 版本 , 副本集環境, 3節點 一主, 一從, 一隱藏節點

  • ECS ——— Ubuntu 16.04 64位 4核8G 系統盤 20G, 數據盤200G

注意!!! ECS 上的 Mongo要和 阿里云上的 Mongo 同一版本,詳情參考阿里云說明
阿里云Mongo遷移說明--MongoDB物理備份文件恢復至自建數據庫

這里是 3.2 版本

ECS 基本環境準備:

  • 安裝 JDK 8

  • 安裝 Mongo 3.2

這里使用包管理工具 APT包 管理工具

1.安裝 JDK 8

先更新包源

$ sudo apt-get update

安裝python-software-properties

$sudo apt-get install python-software-properties

$sudo apt-get install software-properties-common

添加ppa

$ sudo add-apt-repository ppa:webupd8team/java

然后再次更新一下

$ sudo apt-get update

安裝

$ sudo apt-get install oracle-java8-installer

過程中 Y 同意 然后 有個圖形化頁面 ,可用鍵盤剪頭選擇,繼續同意.

最后驗證

$ java -version
2.安裝 Mongo 3.2

參考: https://docs.mongodb.com/v3.2/tutorial/install-mongodb-on-ubuntu/

首先導入 Mongo GPG密鑰

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv D68FA50FEA312927

Ubuntu 16.04

$ echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list

$ sudo apt-get update

安裝指定的對應的版本包

$ sudo apt-get install -y mongodb-org=3.2.22 mongodb-org-server=3.2.22 mongodb-org-shell=3.2.22 mongodb-org-mongos=3.2.22 mongodb-org-tools=3.2.22

等待安裝完成.

Mongo 的 配置文件在 /etc/mongod.conf

查看配置的 數據庫文件路徑

默認是 /var/lib/mongodb

日志默認是 /var/log/mongodb/mongod.log

到這個時候先別著急運行 Mongo

$ cd /var/lib/mongodb 

//(清除Mongo數據庫文件,請注意在 mongo 數據庫文件目錄下執行該操作,防止誤刪其他文件)
$ rm -r * 

如果是副本集的 最少需要3臺ECS (生產環境) 還有一個仲裁節點可以放在其中一臺上面(另起一個端口再跑一個Mongo)也可以再用另外一臺服務器上面部署,起仲裁作用而已,也無需保存數據.

另外3臺都同樣部上相同的環境配置.

==============此處先告一段落================

首先先從阿里云上的數據庫進行, 全量備份(物理備份) ——之前可能有自動備份策略,可根據需求來.

如果 ECS 是新買的,那么它的數據盤肯定是已經在阿里云控制臺上顯示掛載了, 但是還要在ECS上進行掛載的,具體掛載方法參考 阿里云的教程,很全.


阿里云掛載云盤操作示例

注意數據盤要掛載在 mongo 的 數據庫文件夾下 /var/lib/mongodb

阿里云的 參考里面是 /mnt 注意別掛錯了!

掛載云盤注意

參考1: https://help.aliyun.com/document_detail/25446.html?spm=5176.2020520101.121.2.8b1f4df56ohr1f

參考2: https://help.aliyun.com/document_detail/108501.html?spm=a2c4g.11186623.6.788.73cc7d56IQ0yED (Linux 看這里)

然后在ECS服務器上從 wget 下載 全量備份文件


下載 全量備份文件操作示意

停止Mongo 的進程 ,如果有的話

$ ps -ef | grep mongod 

$ kill -9 <mongod pid>

$ cd /var/lib/mongodb

//(清除Mongo數據庫文件,請注意在 mongo 數據庫文件目錄下執行該操作,防止誤刪其他文件)
$ rm -r * 

//從 XXX地址下載文件 到當前文件夾下并指定名字為 mongo_data.tar.gz
$ wget "XXXXXX" -O mongo_data.tar.gz

需要蠻久的,ECS我選 100M 按流量計費的帶寬, 12M/s 53G 要 70 多分鐘

下載完成, 解壓, 解壓較快 10~20分鐘

$ tar xzvf mongo_data.tar.gz

參考: https://help.aliyun.com/document_detail/58329.html?spm=a2c6r.11610030.0.0.3c5e4231z2GjdA

$ vi /etc/mongod.conf

把 配置文件 按照下面配置

storage:
  dbPath: /var/lib/mongodb
 # journal:
   # enabled: true
  directoryPerDB: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
    bindIp: 0.0.0.0
    http:
        enabled: false
    port: 27017
    unixDomainSocket:
        enabled: false

processManagement:
  fork: true
  pidFilePath: /etc/mongodb/mongod.pid

:wq 保存

$ cd /etc/mongodb 看看有無此目錄 如果沒有就創建

$ sudo mkdir -p /etc/mongodb

//啟動Mongo
// --fork 是守護進程模式啟動  
$ /usr/bin/mongod --config /etc/mongod.conf --fork 

$ mongo --host 127.0.0.1 -u <username> -p <password> --authenticationDatabase admin
  • <username>:云數據庫MongoDB上該實例的用戶名,默認為 root 。
  • <password>:云數據庫MongoDB上該實例設置的密碼。

由于 從云數據庫MongoDB 備份下來的 數據是 隱藏節點備份的數據, 所以可能會報沒有權限的問題.

這是阿里云官方刪除 副本集配置的命令:

登錄Mongo之后:

use local

db.system.replset.remove({})

如果提示沒有權限,可嘗試如下操作:

重新初始化local庫

  • 1.單機啟動mongodb,不帶--replSet參數 && conf文件也注釋掉replication
  • 2.刪掉local庫 db.getSiblingDB('local').dropDatabase()
    關閉Mongo
$ mongo --host 127.0.0.1 -u <username> -p <password> --authenticationDatabase admin
use admin
db.shutdownServer()
exit
  • 3.配置新的的 副本集名稱 (conf文件指定replication)
  • 4.配置副本集之間連通的Key (需要修改conf, 下邊說明)
  • 5.重啟mongodb副本集,conf文件指定replication
  • 6.執行rs.initate()重新初始化新的oplog和副本集配置

//指定副本集名稱 其他的節點也要 寫入此配置

$ vi /etc/mongod.conf

replication:

 #副本集名稱

 replSetName: rs0

:wq

配置 Key ,復制集之間的互聯也是需要驗證的,所以要配置keyfile來滿足這個需求,如果開啟了 authorization ,投票節點通過證書的形式與復制集中其他節點進行認證。MongoDB的身份認證過程是加密的。MongoDB的認證交互是通過密碼進行的

創建一個keyfile,并且拷貝到其他從節點

$ mkdir -p /var/lib/key

// 隨機生成 base64 的 756 位碼作為key

$ openssl rand -base64 756 > /var/lib/key/autokey

$ chmod 400 /var/lib/key/autokey

$ vi /etc/mongod.conf

security:

 authorization: enabled

 # 配置的Key 文件路徑

 keyFile: /var/lib/key/autokey

:wq

tips:

其他的節點(其他的3個節點,還有仲裁節點) 也要 寫入此 key 和 replication 配置
然后啟動重啟全部節點

tips:

!!注意:如果是搭建過一次 副本集的情況,都需要清除 local 庫 把 rs 的配置清除掉(參照重新初始化local庫)
刪除的時候取消 key 的認證 和 authorization 開關 還有 副本集的名稱 replication 配置啟動

重啟Mongo

在要成為主節點的服務器上操作 Mongo

$ /usr/bin/mongod -config /etc/mongod.conf

重新初始化配置 副本集配置

//登錄

$ mongo --host 127.0.0.1 -u <username> -p <password> --authenticationDatabase admin
rs.initiate(
  {
    _id: "rs0",
    members: [{
        _id: 0,
        host: '172.18.114.103:27017',
    }, {
        _id: 1,
        host: '172.18.114.101:27017'
    }, {
        _id: 2,
        host: '172.18.114.102:27017'
    }, {
        _id: 3,
        host: '172.18.114.91:27017',
        arbiterOnly: true
    }]
  }
)

//其中 arbiterOnly: true 表示這個是仲裁節點
rs.status()

查看各個節點的狀態
狀態 情況顯示如下:


狀態

主節點 應該是顯示 PRIMARY


主節點

這個時候從節點 會看到 STARTUP2 (Mongo 的數據還在備份)

從節點:

rs.slaveOk()

show dbs

可以看到 數據庫數據慢慢增加,這個時候就是正常的了

到最后完成后狀態會變成:

show dbs 可能會發現 數據庫的數據大小不一樣,其實是正常的.

可 查詢表的條數 驗證

eg:

use iot08

show collections

//與主節點的表的數據條數對比

db.<XX表>.count() 

至此,遷移算是完成了.

關于Mongo 的讀寫分離問題, 我們使用的 API 使用Python - Pymongo , 讀寫分離是 連接Mongo時的連接方式決定.

以下是以參考文章:
Mongo--
https://docs.mongodb.com/v3.2/tutorial/install-mongodb-on-ubuntu/
Mongo添加副本集配置--
https://docs.mongodb.com/manual/reference/method/rs.initiate/?spm=a2c4g.11186623.2.25.e7fc2124WDnFbc

阿里云--
https://help.aliyun.com/document_detail/25446.html?spm=5176.2020520101.121.2.8b1f4df56ohr1f
https://help.aliyun.com/document_detail/108501.html?spm=a2c4g.11186623.6.788.73cc7d56IQ0yED
https://help.aliyun.com/document_detail/58329.html?spm=a2c6r.11610030.0.0.3c5e4231z2GjdA

其他的--
https://www.cnblogs.com/shengdimaya/p/6598450.html(配置驗證Key參考)
http://www.lxweimin.com/p/36bb2bbbe461(狀態參考)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容