原創(chuàng)文章眨攘,歡迎轉(zhuǎn)載主慰。轉(zhuǎn)載請注明:轉(zhuǎn)載自IT人故事會,謝謝鲫售!
原文鏈接地址:「實戰(zhàn)篇」開源項目docker化運維部署-mysql 熱備份數(shù)據(jù)(五)
本次說說熱熱備份數(shù)據(jù)共螺,上次搭建了pxc的集群,搭建好了復雜均衡情竹,做了雙機熱備這種方案藐不。無論做前后端分離的項目,還是做微服務的項目秦效,都需要有一個強大穩(wěn)定的集群雏蛮。數(shù)據(jù)庫備份分為:熱備份和冷備份,如果項目沒有上線冷備份沒問題阱州。如果上線用冷備份就有問題挑秉。源碼:https://github.com/limingios/netFuture/tree/master/mysql-pxc/
冷備份
- 冷備份是關閉數(shù)據(jù)庫時候的備份方式,通常做法是拷貝數(shù)據(jù)文件
- 冷備份是最簡單最安全的一種備份方式
- 大型網(wǎng)站無法做到關閉業(yè)務備份數(shù)據(jù)苔货,所以冷備份不是最佳選擇
- PXC冷備份方案
先讓其中的一個PXC下線犀概,然后通過拷貝數(shù)據(jù)文件的方式完成備份,備份完畢下線的PXC上線夜惭,完整于其他節(jié)點的自動同步阱冶。
熱備份
- 熱備份是在系統(tǒng)運行的狀態(tài)下備份數(shù)據(jù),也是難度最大的備份滥嘴。舉個例子木蹬,如果淘寶下線1個小時備份數(shù)據(jù),淘寶損失多少錢若皱,誰受的的了啊镊叁。這都是白花花的銀子啊。
- Mysql常用的熱備份有LVM和XtraBackup兩種方案走触。LVM是針對的分區(qū)備份晦譬,針對linux系統(tǒng)下的,他號稱任何一種數(shù)據(jù)庫都可以完成備份互广,但是有個弊端敛腌,就是在備份的時候只能讀不能寫入。
- 建議使用XtrBackup熱備Mysql惫皱,不需要鎖像樊,備份的時候即可讀也可以寫,XtraBackup而且還是免費的旅敷。
XtrBackup
是一款基于InnoDB的在線熱備工具生棍,具有開源免費的,支持在線熱備媳谁,占用磁盤空間小涂滴,能夠非秤呀矗快速的備份與恢復mysql數(shù)據(jù)庫。它支持mysql的各種衍生版本柔纵。
- XtraBackup優(yōu)勢
- 備份過程不鎖表缔杉,快速可靠
- 備份過程不會打斷正在執(zhí)行的事務
- 能夠基于壓縮等功能節(jié)約磁盤空間和流量
- 全量備份和增量備份
- 全量備份是備份全部數(shù)據(jù),備份過程時間搁料,占用空間大或详。
- 增量備份是只備份變化的那部分數(shù)據(jù)。備份時間短加缘。占用空間小鸭叙。
在正常的生產(chǎn)系統(tǒng)上,一般是一周做一次全量的備份拣宏,一周做一次增量的備份沈贝。就足夠了。
XtraBackup 安裝
- 準備工作
這個工具要求在數(shù)據(jù)庫的節(jié)點之內(nèi)勋乾。備份的出來的數(shù)據(jù)就直接宋下。需要創(chuàng)建一個數(shù)據(jù)卷,他用來備份XtraBackup 產(chǎn)生的文件辑莫,然后映射到宿主機的磁盤里面学歧。
創(chuàng)建數(shù)據(jù)卷
docker volume create backup
停止其中一個節(jié)點,這里選擇node1各吨,目的就是為了刪除node1枝笨,增加新創(chuàng)建的數(shù)據(jù)卷。已經(jīng)運行的容器是不可以增加新的數(shù)據(jù)卷的揭蜒。只要還掛載v1的數(shù)據(jù)卷横浑,v1的文件并沒有刪除,所以數(shù)據(jù)不會丟失屉更。
docker stop node1
docker rm node1
重新安裝node1 掛載新的節(jié)點徙融,并同步其他4個節(jié)點。 --CLUSTER_JONIN=node2 新創(chuàng)建的node1瑰谜,同步node2節(jié)點欺冀。
docker run -d -p 3306:3306 --net=net1 --name=node1 \
-e CLUSTER_NAME=PXC \
-e MYSQL_ROOT_PASSWORD=a123456 \
-e XTRABACKUP_PASSWORD=a123456 \
-v v1:/var/lib/mysql \
--privileged \
--ip 172.18.0.2 \
-v backup:/data \
-e CLUSTER_JOIN=node2 \
percona/percona-xtradb-cluster
- PXC 全量備份數(shù)據(jù)
PXC容器中安全XtraBackup,并執(zhí)行備份萨脑,后悔啊當初PXC的時候沒直接找個帶XtraBackup的鏡像隐轩。
docker exec -it --user root node1
echo "nameserver 8.8.8.8" | tee /etc/resolv.conf > /dev/null
apt-get clean
apt-get update
apt-get install vim
vi /etc/apt/sources.list
sources.list 添加下面的內(nèi)容
deb http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
deb-src http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
deb http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
apt-get clean
apt-get update
apt-get install percona-xtrabackup-24
全量備份的命令
出現(xiàn)completed OK!說明備份完畢砚哗。
innobackupex --user=root --password=a123456 /data/backup/full
PXC 全量恢復步驟
數(shù)據(jù)庫可以熱備份龙助,但是不能熱還原。為了避免恢復過程中的數(shù)據(jù)同步蛛芥,我們采用空白的mysql還原數(shù)據(jù)提鸟,然后再建立PXC集群的方式。所以在開發(fā)中一定要注意權(quán)限問題仅淑,不要給開發(fā)人員root用戶称勋。
還原數(shù)據(jù)前要將未提交的事務回滾,還原數(shù)據(jù)之后重啟!
- 執(zhí)行代碼
原來的容器全部刪除
docker stop node1 node2 node3 node4 node5
docker rm node1 node2 node3 node4 node5
docker volume rm v1 v2 v3 v4 v5
docker volume create v1
創(chuàng)建node1 和數(shù)據(jù)卷
docker volume create v1
docker run -d -p 3306:3306 --net=net1 --name=node1 \
-e CLUSTER_NAME=PXC \
-e MYSQL_ROOT_PASSWORD=a123456 \
-e XTRABACKUP_PASSWORD=a123456 \
-v v1:/var/lib/mysql \
--privileged \
--ip 172.18.0.2 \
-v backup:/data \
percona/percona-xtradb-cluster
進入容器內(nèi)還原數(shù)據(jù)庫
#root用戶登錄
docker exec -it --user root node1 bash
#刪除數(shù)據(jù)
rm -rf /var/lib/mysql/*
#沒有提交的數(shù)據(jù)回滾
innobackupex --user=root --password=a123456 --apply-back /data/backup/full/2018-12-06_17-18-19/
#執(zhí)行下冷還原
innobackupex --user=root --password=a123456 --copy-back /data/backup/full/2018-12-06_17-18-19/
chown -R mysql:mysql /var/lib/mysql/
退出容器重啟下,node1節(jié)點
docker stop node1
docker start node1
PS:數(shù)據(jù)庫的熱備份,冷還原也講完了事秀,真心感覺也不是那么復雜寞奸。其實就是這樣,但是在云平臺越來越盛行的今天洛姑,基本上買個rdrs數(shù)據(jù)庫這些功能都有了。了解下XtraBackup 這個工具確定很重要晚上很多的寫成shell腳本的,更加方便了揩瞪。