從 阿里云上 遷移 Mongo 副本集 數(shù)據(jù)庫(kù) 到 ECS 自建服務(wù)器的記錄
環(huán)境:
阿里云 —— Mongo 3.2 版本 , 副本集環(huán)境, 3節(jié)點(diǎn) 一主, 一從, 一隱藏節(jié)點(diǎn)
ECS ——— Ubuntu 16.04 64位 4核8G 系統(tǒng)盤(pán) 20G, 數(shù)據(jù)盤(pán)200G
注意!!! ECS 上的 Mongo要和 阿里云上的 Mongo 同一版本,詳情參考阿里云說(shuō)明
阿里云Mongo遷移說(shuō)明--MongoDB物理備份文件恢復(fù)至自建數(shù)據(jù)庫(kù)
這里是 3.2 版本
ECS 基本環(huán)境準(zhǔn)備:
安裝 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
過(guò)程中 Y 同意 然后 有個(gè)圖形化頁(yè)面 ,可用鍵盤(pán)剪頭選擇,繼續(xù)同意.
最后驗(yàn)證
$ java -version
2.安裝 Mongo 3.2
參考: https://docs.mongodb.com/v3.2/tutorial/install-mongodb-on-ubuntu/
首先導(dǎo)入 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
安裝指定的對(duì)應(yīng)的版本包
$ 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
查看配置的 數(shù)據(jù)庫(kù)文件路徑
默認(rèn)是 /var/lib/mongodb
日志默認(rèn)是 /var/log/mongodb/mongod.log
到這個(gè)時(shí)候先別著急運(yùn)行 Mongo
$ cd /var/lib/mongodb
//(清除Mongo數(shù)據(jù)庫(kù)文件,請(qǐng)注意在 mongo 數(shù)據(jù)庫(kù)文件目錄下執(zhí)行該操作,防止誤刪其他文件)
$ rm -r *
如果是副本集的 最少需要3臺(tái)ECS (生產(chǎn)環(huán)境) 還有一個(gè)仲裁節(jié)點(diǎn)可以放在其中一臺(tái)上面(另起一個(gè)端口再跑一個(gè)Mongo)也可以再用另外一臺(tái)服務(wù)器上面部署,起仲裁作用而已,也無(wú)需保存數(shù)據(jù).
另外3臺(tái)都同樣部上相同的環(huán)境配置.
==============此處先告一段落================
首先先從阿里云上的數(shù)據(jù)庫(kù)進(jìn)行, 全量備份(物理備份) ——之前可能有自動(dòng)備份策略,可根據(jù)需求來(lái).
如果 ECS 是新買(mǎi)的,那么它的數(shù)據(jù)盤(pán)肯定是已經(jīng)在阿里云控制臺(tái)上顯示掛載了, 但是還要在ECS上進(jìn)行掛載的,具體掛載方法參考 阿里云的教程,很全.
注意數(shù)據(jù)盤(pán)要掛載在 mongo 的 數(shù)據(jù)庫(kù)文件夾下 /var/lib/mongodb
阿里云的 參考里面是 /mnt
注意別掛錯(cuò)了!
參考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服務(wù)器上從 wget 下載 全量備份文件
停止Mongo 的進(jìn)程 ,如果有的話(huà)
$ ps -ef | grep mongod
$ kill -9 <mongod pid>
$ cd /var/lib/mongodb
//(清除Mongo數(shù)據(jù)庫(kù)文件,請(qǐng)注意在 mongo 數(shù)據(jù)庫(kù)文件目錄下執(zhí)行該操作,防止誤刪其他文件)
$ rm -r *
//從 XXX地址下載文件 到當(dāng)前文件夾下并指定名字為 mongo_data.tar.gz
$ wget "XXXXXX" -O mongo_data.tar.gz
需要蠻久的,ECS我選 100M 按流量計(jì)費(fèi)的帶寬, 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
看看有無(wú)此目錄 如果沒(méi)有就創(chuàng)建
$ sudo mkdir -p /etc/mongodb
//啟動(dòng)Mongo
// --fork 是守護(hù)進(jìn)程模式啟動(dòng)
$ /usr/bin/mongod --config /etc/mongod.conf --fork
$ mongo --host 127.0.0.1 -u <username> -p <password> --authenticationDatabase admin
- <username>:云數(shù)據(jù)庫(kù)MongoDB上該實(shí)例的用戶(hù)名,默認(rèn)為 root 费变。
- <password>:云數(shù)據(jù)庫(kù)MongoDB上該實(shí)例設(shè)置的密碼摧扇。
由于 從云數(shù)據(jù)庫(kù)MongoDB 備份下來(lái)的 數(shù)據(jù)是 隱藏節(jié)點(diǎn)備份的數(shù)據(jù), 所以可能會(huì)報(bào)沒(méi)有權(quán)限的問(wèn)題.
這是阿里云官方刪除 副本集配置的命令:
登錄Mongo之后:
use local
db.system.replset.remove({})
如果提示沒(méi)有權(quán)限,可嘗試如下操作:
重新初始化local庫(kù)
- 1.單機(jī)啟動(dòng)mongodb,不帶--replSet參數(shù) && conf文件也注釋掉replication
- 2.刪掉local庫(kù)
db.getSiblingDB('local').dropDatabase()
關(guān)閉Mongo
$ mongo --host 127.0.0.1 -u <username> -p <password> --authenticationDatabase admin
use admin
db.shutdownServer()
exit
- 3.配置新的的 副本集名稱(chēng) (conf文件指定replication)
- 4.配置副本集之間連通的Key (需要修改conf, 下邊說(shuō)明)
- 5.重啟mongodb副本集挚歧,conf文件指定replication
- 6.執(zhí)行rs.initate()重新初始化新的oplog和副本集配置
//指定副本集名稱(chēng) 其他的節(jié)點(diǎn)也要 寫(xiě)入此配置
$ vi /etc/mongod.conf
replication:
#副本集名稱(chēng)
replSetName: rs0
:wq
配置 Key ,復(fù)制集之間的互聯(lián)也是需要驗(yàn)證的扛稽,所以要配置keyfile來(lái)滿(mǎn)足這個(gè)需求,如果開(kāi)啟了 authorization 滑负,投票節(jié)點(diǎn)通過(guò)證書(shū)的形式與復(fù)制集中其他節(jié)點(diǎn)進(jìn)行認(rèn)證在张。MongoDB的身份認(rèn)證過(guò)程是加密的。MongoDB的認(rèn)證交互是通過(guò)密碼進(jìn)行的
創(chuàng)建一個(gè)keyfile,并且拷貝到其他從節(jié)點(diǎn)
$ mkdir -p /var/lib/key
// 隨機(jī)生成 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:
其他的節(jié)點(diǎn)(其他的3個(gè)節(jié)點(diǎn),還有仲裁節(jié)點(diǎn)) 也要 寫(xiě)入此 key 和 replication 配置
然后啟動(dòng)重啟全部節(jié)點(diǎn)
tips:
!!注意:如果是搭建過(guò)一次 副本集的情況,都需要清除 local 庫(kù) 把 rs 的配置清除掉(參照重新初始化local庫(kù))
刪除的時(shí)候取消 key 的認(rèn)證 和 authorization 開(kāi)關(guān) 還有 副本集的名稱(chēng) replication 配置啟動(dòng)
重啟Mongo
在要成為主節(jié)點(diǎn)的服務(wù)器上操作 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 表示這個(gè)是仲裁節(jié)點(diǎn)
rs.status()
查看各個(gè)節(jié)點(diǎn)的狀態(tài)
狀態(tài) 情況顯示如下:
主節(jié)點(diǎn) 應(yīng)該是顯示 PRIMARY
這個(gè)時(shí)候從節(jié)點(diǎn) 會(huì)看到 STARTUP2 (Mongo 的數(shù)據(jù)還在備份)
從節(jié)點(diǎn):
rs.slaveOk()
show dbs
可以看到 數(shù)據(jù)庫(kù)數(shù)據(jù)慢慢增加,這個(gè)時(shí)候就是正常的了
到最后完成后狀態(tài)會(huì)變成:
show dbs
可能會(huì)發(fā)現(xiàn) 數(shù)據(jù)庫(kù)的數(shù)據(jù)大小不一樣,其實(shí)是正常的.
可 查詢(xún)表的條數(shù) 驗(yàn)證
eg:
use iot08
show collections
//與主節(jié)點(diǎn)的表的數(shù)據(jù)條數(shù)對(duì)比
db.<XX表>.count()
至此,遷移算是完成了.
關(guān)于Mongo 的讀寫(xiě)分離問(wèn)題, 我們使用的 API 使用Python - Pymongo , 讀寫(xiě)分離是 連接Mongo時(shí)的連接方式?jīng)Q定.
以下是以參考文章:
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(配置驗(yàn)證Key參考)
http://www.reibang.com/p/36bb2bbbe461(狀態(tài)參考)