從 阿里云上 遷移 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(狀態參考)