Dockerでmariadbバージョンアップ(詳細編4-google cloudでdockerコンテナの永続化領域をgoogle driveへバックアップする)

概要編から参照されるための詳細編4。

google cloudでdockerコンテナの永続化領域をgoogle driveへバックアップする

コンテナはすべて永続化領域を持たせてる。

前からやってて、業務用の文書やdockerの永続化領域の一部をgoogle driveにzip保管してる。
自分の場合はnariDockerDatってフォルダがその対象。

これをlocal-linuxに展開して使うと、本番データのコピーをいつも使って運用するようになる。

gcpからバックアップの速度

google driveへのzip書き込みはけっこう速い。
gcpの中のxrdpコンテナからrcloneを使ってバックアップするんやけど、rcloneはrsyncみたいな使い勝手でシェルスクリプトから呼び出す。

10GBぐらいのサイズのzipファイルのrclone処理が、3年ぐらい前は10分ぐらいかかってたのが、今は3分もかからない。

Speedtest by Ookla - The Global Broadband Speed Test
Use Speedtest on all your devices with our free desktop and mobile apps.
でlocal-linuxのxrdpコンテナが400〜500Mpbs出るのが、gcpのxrdpコンテナだと5000Mbps速度が出る。

これは、めっちゃくちゃ速い。2022年に測定しなおしたら、また速度上がってた。
測定した数字で10倍以上、xrdpコンテナ内のfirefoxでgoogle drive開いてもgcpの中だと3倍以上速く感じる。

しかもこの速度、曜日で変動したりしない。
ネットワークの障害とかがなければ、いつも同じ。

けど、嬉しがって何度も使ったらアカン。

gcpへのアップロードは課金ないけど、ダウンロードは課金がある。
それがgoogle driveならgcpからのダウンロードやから、コストがかかる。

自分がgcpを使う理由の1つに、バックアップにかかるコストを低く抑えられることがある。
試験利用したのはかなり昔やけど、gcpからgoogle cloudへのバックアップ速度とコストは、awsと組み合わせたときのものよりも安くて済んだから。

gcpやめられまへんなぁ。

永続化領域保管の前に

mariadb10.5から10.11へのバージョンアップがうまくいったので、いったん全コンテナ停止してdocker-compose.ymlから現行のmariadbの記述を外す。
永続化領域も一時的に退避して、新しいほうのmariadbだけが動く状態にしておく。

gcpからコンテナの永続化領域をバックアップ

実際のバックアップ処理。

local-linuxのバックアップ処理を流用して作ってて、利用OSを変更する都度内容更新してる。最近はcentos8からubuntu20へ乗り換えた頃やったかな。

いくつかあるSRC_ROOTから、BACKUP_ROOTへ向けてバックアップして、tar.gzしてからzip化する処理を呼び出す。

#!/bin/sh

## -------------------------------------------------------------------------
## Script Name  :
##  Created by  : T.Naritomi
##          on  : 2007.12.20
##  Updated by  : 2019.02.14
##          on  :
##  Parameters  : $1 = password
##  Return Code : 0=Normal End
##     Comments : 
## -------------------------------------------------------------------------

## ---detail----------------------------------------------------------------

SRC_ROOT=/gvis/nari

SRC_ROOT1=/nariDocs/Docker
SRC_ROOT2=/gvis/log
SRC_ROOT3=/gvis/script
SRC_ROOT4=/gvis/nari/nariDocs/gvis_conf
SRC_ROOT5=/gvis/nari/nariDocs/smb/common
SRC_ROOT6=/gvis/nari/nariDocs/smb/*.html
SRC_ROOT7=/nariDocs/smb/svm

chmod -R 777 /nari/nariDocs/smb/svm

BACKUP_ROOT=/gvis/nari/nariDocs/configBackup/01_gcp-gvis-dkLinux
LOG_FILE=/gvis/log/001_sysBackup.log

echo "-------Backup Start----" `date +%F_%T_`>> ${LOG_FILE}

/usr/bin/docker exec docker-sv_mariadb1011-1 /bin/sh /etc/mysql/conf.d/nari/901_nariDB_1st_DDLout.sh
cp -p /gvis/nari/nariDocs/Docker/nariDockerDat/sv_mariadb11conf/nari/DDLdefine.txt /gvis/nari/nariDocs/smb/svm/Public/999_その他/

docker images -f     dangling=true -q | xargs docker rmi
docker volume ls -qf dangling=true    | xargs docker volume rm

/bin/sh /gvis/script/301_dockerStop.sh

rm -f /gvis/nari/nariDocs/Docker/nariDockerDat/cl_ubun18/backup/*.zip

rsync -av --delete --exclude='nariDockerSys/' \
                   --exclude 'nariDockerDat/cl_ubun18/download/gvis/' \
                   --exclude 'nariDockerDat/cl_ubun18/download/wk_apl/_old' \
                   --exclude 'nariDockerDat/cl_ubun18/download/wk_memos/_old' \
                   --exclude 'nariDockerDat/sv_gitlab2023/' \
                   --exclude 'nariDockerDat/sv_gitlab2024/' \
      ${SRC_ROOT}${SRC_ROOT1}/ ${BACKUP_ROOT}/Docker >> ${LOG_FILE}

rm -fR ${BACKUP_ROOT}/log
rm -fR ${BACKUP_ROOT}/script
rm -fR ${BACKUP_ROOT}/gvis_conf

cp -pR ${SRC_ROOT2} ${BACKUP_ROOT}/
cp -pR ${SRC_ROOT3} ${BACKUP_ROOT}/

cp -pR ${SRC_ROOT4} ${BACKUP_ROOT}/

rm -f               ${BACKUP_ROOT}/nariDocs/smb/*.html
rm -fR              ${BACKUP_ROOT}/nariDocs/smb/common
cp -pR ${SRC_ROOT5} ${BACKUP_ROOT}/nariDocs/smb/
cp -p  ${SRC_ROOT6} ${BACKUP_ROOT}/nariDocs/smb/


rsync -av --delete --exclude='.git/' \
      ${SRC_ROOT}${SRC_ROOT7}/ ${BACKUP_ROOT}${SRC_ROOT7} >> ${LOG_FILE}

/bin/sh /gvis/script/302_dockerStart.sh
/bin/sh /gvis/nari/nariDocs/Docker/dockerStart.sh
echo "-------After Backup Docker Start------" `date +%F_%T_`>> ${LOG_FILE}

/bin/sh /gvis/script/002_makeTar.sh $1

echo "-------Backup End------" `date +%F_%T_`>> ${LOG_FILE}

chown -R nari:nari ${BACKUP_ROOT}

/bin/sh /gvis/script/gdr-gavannitsales/003_SyncGavannitsales.sh

exit

主な内容。

  1. 引数にパスワードを受け取る。後半の002_makeTar.shって処理へ渡してtar.gz作った後のzip化するときにパスワードが必要な暗号化zipを作るのに使う。
  2. mariadbは901_nariDB_1st_DDLout.shdocker execでテーブル定義を書き出しして、docker images -f dangling=true -q | xargs docker rmiで不要コンテナの抹消して停止してる。
  3. テーブル定義の書き出しは、mariadb10.5から10.11へのバージョンアップする最初の工程でテーブル作成に使った。
  4. 永続化領域を含むデータファイルは、conf/log/script/docs/dockerの5つのカテゴリをrsyncでバックアップ取得してる。rsyncなので、差分処理でバックアップとってくれるから初回以降は早く終わる。ドキュメント類のコピーに効果が出る。
  5. 最後のほうで003_SyncGavannitsales.sh使って、作った5つのzipをgoogle driveへアップロード。

バックアップしてzip作った結果はこんな感じ。

-rw-r--r-- 1 nari nari    3.2G 2023-03-18 08:24:07 Docker.zip
-rw-r--r-- 1 nari nari     21M 2023-03-18 08:18:32 gvis_conf.zip
-rw-r--r-- 1 nari nari    1.4M 2023-03-18 08:18:32 log.zip
-rw-r--r-- 1 nari nari    5.5G 2023-03-18 08:28:35 nariDocs.zip
-rw-r--r-- 1 nari nari     15M 2023-03-18 08:18:33 script.zip

ubuntu22での最初の頃のログを見るとこんな感じ。
去年の6月頃は3分、最近は2分ぐらいで済んでる。

----Start Sync 2022-06-12_06:09:53 -----
/GCP  Sync Success... 2022-06-12_06:09:57
/GCP  Sync Success... 2022-06-12_06:09:59
/GCP  Sync Success... 2022-06-12_06:10:00
/GCP  Sync Success... 2022-06-12_06:12:16
/GCP  Sync Success... 2022-06-12_06:13:05
----End Sync 2022-06-12_06:13:05 -----
:(中略)
----Start Sync 2023-03-18_08:28:35 -----
/GCP  Sync Success... 2023-03-18_08:28:39
/GCP  Sync Success... 2023-03-18_08:28:41
/GCP  Sync Success... 2023-03-18_08:28:43
/GCP  Sync Success... 2023-03-18_08:29:54
/GCP  Sync Success... 2023-03-18_08:30:36
----End Sync 2023-03-18_08:30:36 -----

途中呼び出し1(901_nariDB_1st_DDLout.sh)

docker execしてコンテナの中の処理を呼びだして業務テーブルの定義を書き出してる。

docker使う前、さらにmysqlの頃に作ったけど10年ぐらい経っても元気に動いてくれてる。スクリプトの中にshow create tableを埋め込んでおいて一瞬で処理は終わる。

 #!/bin/sh
 ## -------------------------------------------------------------------------
 ## Script Name  : 901_nariDB_1st_DDLout.sh
 ##  Created by  : T.Naritomi
 ##          on  : 2014.04.12
 ##  Updated by  : 2014.11.09
 ##          on  :
 ##  Parameters  :
 ##  Return Code : 0=Normal End
 ##     Comments :
 ## -------------------------------------------------------------------------
 LANG=ja_JP.UTF-8

 TMP1_FILE=/tmp/$$_1.txt
 TMP2_FILE=/tmp/$$_1.txt
 RES_FILE=$0.res.txt
 ###CP_DEST=/nari/nariDocs/smb/svm/Public/999_その他/DDLdefine.txt
 CP_DEST=/etc/mysql/conf.d/nari/DDLdefine.txt
 DBPASS=xxxxxxxxxx

 rm -f ${RES_FILE}

 ## ----detail --------------------------------------------------------------

 ## ----Show DDL on MySQL ---------------------

 echo '----Show DDL ------' `date +%F_%T_` >> ${TMP1_FILE}

 /usr/bin/mysql -u root -p${DBPASS}  >> ${TMP1_FILE} << EOF
     use nariDB_1st ;
     set character_set_results='utf8';

     show create table GVIS_hwcheckResult                       ;
     show create table GVIS_keihi                               ;
     show create table GVIS_log                                 ;
     show create table GVIS_logon                               ;
     show create table GVIS_mst_customer                        ;
     show create table GVIS_mst_kamoku                          ;
     show create table GVIS_mst_keihishubetsu                   ;
     show create table GVIS_mst_kshisanShokyaku                 ;
     show create table GVIS_mst_kshisanShokyakuRit              ;
     show create table GVIS_mst_nohin                           ;
     show create table GVIS_transaction                         ;
     show create table GVIS_work                                ;
     show create table GVIS_zaiko                               ;

     exit

EOF

 ## ----For MySQL -----------------------------------------------------------

 ##cat ${TMP1_FILE} | awk {'gsub(/\\n/,"\n") ; print '}  > ${RES_FILE}
 cat ${TMP1_FILE} | awk {'gsub(/\\n/,"\n") ; print '} | awk {'gsub(/Table	Create Table/,"---------------------------------------------------------------------") ; print '} > ${RES_FILE}

 cp -p ${RES_FILE} ${CP_DEST}
 ls -ld ${CP_DEST} | awk 'BEGIN{print ""; print "--Update on Docker container --" ; }{print $0}' >> ${CP_DEST}

 ## ----Finish --------------------------------------------------------------

 rm -f ${TMP1_FILE}

 exit

最後のほうにawkで何か書いてるなぁ。読みやすくするための何か。
たぶん定義ごとの区切り行を入れて、行末に終端行を足してる。

実行結果はこんな感じ。a5sqlとかに貼り付けると、そのまま定義に沿ったテーブルを作ってくれる。

----Show DDL ------ 2023-03-26_07:07:02_
---------------------------------------------------------------------
GVIS_hwcheckResult	CREATE TABLE `GVIS_hwcheckResult` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `Computer` varchar(100) NOT NULL COMMENT 'コンピュータ名',
  `ItemOrder` int(11) NOT NULL COMMENT '項番',
  `Category` varchar(200) NOT NULL COMMENT 'カテゴリ',
  `ItemValue1` varchar(1000) DEFAULT NULL COMMENT '項目値1',
  `ItemValue2` varchar(1000) DEFAULT NULL COMMENT '項目値2',
  `ItemValue3` varchar(1000) DEFAULT NULL COMMENT '項目値3',
  `ItemValue4` varchar(1000) DEFAULT NULL COMMENT '項目値4',
  `ItemValue5` varchar(1000) DEFAULT NULL COMMENT '項目値5',
  `TRK_Hi` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '登録日',
  `KSN_Hi` datetime DEFAULT NULL COMMENT '更新日',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=69689 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci ROW_FORMAT=DYNAMIC
---------------------------------------------------------------------
GVIS_keihi	CREATE TABLE `GVIS_keihi` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `workPeriod` datetime DEFAULT NULL COMMENT '業務期間-開始日',
  `workShubetsu` char(4) DEFAULT NULL COMMENT '経費種別',

:(中略)

  `ins_date` datetime DEFAULT NULL COMMENT 'データ作成日',
  `ins_user` varchar(100) DEFAULT NULL COMMENT 'データ作成ユーザ',
  `upd_date` datetime DEFAULT NULL COMMENT 'データ更新日',
  `upd_user` varchar(100) DEFAULT NULL COMMENT 'データ更新ユーザ',
  PRIMARY KEY (`id`),
  KEY `IDX_zaiko` (`SerialShubetsu`,`SerialSeq1`,`SerialSeq2`,`GVIS_No`,`Category1`,`Category2`,`ShokyakuHou`,`alwayson`)
) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci ROW_FORMAT=DYNAMIC

--Update on Docker container --
-rw-r--r-- 1 1002 1003 16805 Mar 26 07:07 /etc/mysql/conf.d/nari/DDLdefine.txt

今気づいたけど、datetime型にdefaultはnull許さなくなったんと違うかなぁ。

それにDEFAULT '0000-00-00 00:00:00'DEFAULT '0001-01-01 00:00:01'ってせなアカンのとちゃうかぁ?

どうしても思い出せん。
別で調べて書き直ししとこ。

途中呼び出し2(002_makeTar.sh)

この処理もオリジナルは古い。
たぶんsolarisの中で作ったものをlinuxに移したんやなぁ。

2014年の更新で「ワシはクラウドの中のデータ置き場のセキュリティなんか信用せんぞぉ」ってトンがって、zipにパスワードかけ始めたのが見えるなぁ。

同じときに、docker使い始めたときにtarで束ねとかな所有権が崩れることに気づいてる。

#!/bin/sh

## -------------------------------------------------------------------------
## Script Name  :
##  Created by  : T.Naritomi
##          on  : 2007.12.20
##  Updated by  : 2014.02.14
##          on  :
##  Parameters  : $1 = password
##  Return Code : 0=Normal End
##     Comments : 
## -------------------------------------------------------------------------

## ---detail----------------------------------------------------------------

BACKUP_ROOT=/gvis/nari/nariDocs/configBackup/01_gcp-gvis-dkLinux
LOG_FILE=/gvis/log/002_makeTar.log

echo "-------MakeTar Start----" `date +%F_%T_`>> ${LOG_FILE}

cd ${BACKUP_ROOT}
rm -f *.zip Docker.tar.gz

zip -r -P $1 gvis_conf.zip ./gvis_conf     >> ${LOG_FILE}
zip -r -P $1 log.zip       ./log           >> ${LOG_FILE}
zip -r -P $1 script.zip    ./script        >> ${LOG_FILE}

tar czf Docker.tar.gz ./Docker             >> ${LOG_FILE}
zip -r -P $1 Docker.zip    ./Docker.tar.gz >> ${LOG_FILE}
rm -f Docker.tar.gz

### tar czf nariDocs.tar.gz ./nariDocs         >> ${LOG_FILE}
zip -r -P $1 nariDocs.zip  ./nariDocs      >> ${LOG_FILE}
### rm -f nariDocs.tar.gz

echo "-------MakeZIP End------" `date +%F_%T_`>> ${LOG_FILE}
sync ; sync ; sync 
chown -R nari:nari ${BACKUP_ROOT}
mv *.zip /gvis/nari/nariDocs/Docker/nariDockerDat/cl_ubun18/backup/

exit

途中呼び出し3(003_SyncGavannitsales.sh)

google driveの利用は普段使いのものと、バックアップ処理用のものを使ってる。

普段使いは写真とか、メールとか入ってるけどバックアップ処理用のものはほとんどがデカいzip。

OSユーザにその設定を振り分けてるから、sudoさせてる。

#!/bin/sh

## -------------------------------------------------------------------------
## Script Name  :
##  Created by  : T.Naritomi
##          on  : 2020.12.08
##  Updated by  :
##          on  :
##  Parameters  :
##  Return Code : 0=Normal End
##     Comments :
## -------------------------------------------------------------------------

## ---detail----------------------------------------------------------------
LOG=/gvis/log/004_gdr.log
chmod 666 ${LOG}

echo ----Start Sync `date +%F_%T` ----- >> $LOG

sudo -u gavannitsales /bin/sh /gvis/script/gdr-gavannitsales/002_SyncFolder.sh 1 \
    /gvis/nari/nariDocs/Docker/nariDockerDat/cl_ubun18/backup/gvis_conf.zip \
    /GCP

sudo -u gavannitsales /bin/sh /gvis/script/gdr-gavannitsales/002_SyncFolder.sh 1 \
    /gvis/nari/nariDocs/Docker/nariDockerDat/cl_ubun18/backup/log.zip \
    /GCP

sudo -u gavannitsales /bin/sh /gvis/script/gdr-gavannitsales/002_SyncFolder.sh 1 \
    /gvis/nari/nariDocs/Docker/nariDockerDat/cl_ubun18/backup/script.zip \
    /GCP

sudo -u gavannitsales /bin/sh /gvis/script/gdr-gavannitsales/002_SyncFolder.sh 1 \
    /gvis/nari/nariDocs/Docker/nariDockerDat/cl_ubun18/backup/nariDocs.zip \
    /GCP

sudo -u gavannitsales /bin/sh /gvis/script/gdr-gavannitsales/002_SyncFolder.sh 1 \
    /gvis/nari/nariDocs/Docker/nariDockerDat/cl_ubun18/backup/Docker.zip \
    /GCP

echo ----End Sync  `date +%F_%T` ----- >> $LOG

exit

さらに呼び出してる002_SyncFolder.shはこんな感じ。
最初の頃は1つ目の引数で特定の領域を隠しつつアップロードしてたけど、今は使ってない。

#!/bin/sh

## -------------------------------------------------------------------------
## Script Name  :
##  Created by  : T.Naritomi
##          on  : 2019.02.27
##  Updated by  :
##          on  :
##  Parameters  : ex) $1 = HideFlag( None=0 Hide=1 )
##                    $2 = /gvis/nari/nariDocs/Docker/nariDockerDat/cl_ubun18/
##                    $3 = /GCP
##  Return Code : 0=Normal End
##     Comments : https://rclone.org/commands/rclone_sync/
## -------------------------------------------------------------------------

## ---detail----------------------------------------------------------------

HOME=/gvis/script/gdr-gavannitsales/
CONF=/home/gavannitsales/.config/rclone/rclone.conf
LOG=/gvis/log/004_gdr.log

TMP_LST=${HOME}$$.txt

###if [ $1 -eq 1 ]; then
###  /bin/sh ${HOME}011_TempMove.sh
###fi

rclone --config ${CONF} \
	       sync $2 \
	              gvisDrive:$3 > $TMP_LST
RC=$?

if [ $RC -eq 0 ]; then
  echo $3 ' Sync Success...' `date +%F_%T` >> $LOG
else
  echo $3 ' Sync Failed ...' $RC `date +%F_%T` >> $LOG
fi

cat $TMP_LST
cat $TMP_LST >> $LOG

###if [ $1 -eq 1 ]; then
###  /bin/sh ${HOME}012_TempBack.sh
###fi

rm -f $TMP_LST

exit $RC

rcloneでアップロードさせた後のgoogle driveに対するrcloneのlsl結果はこんな感じ。

linuxのlsと違って、先頭フィールドにファイルサイズが入ってくる。

root@gcp-gvis-dklinux:~# sudo -u gavannitsales rclone --config /home/gavannitsales/.config/rclone/rclone.conf lsl gvisDrive:/ | more
    27846 2020-12-11 05:46:28.102000000 downloadSpeed.JPG
5901361633 2023-03-18 08:28:35.317000000 GCP/nariDocs.zip
3388906489 2023-03-18 08:24:07.137000000 GCP/Docker.zip
 14733862 2023-03-18 08:18:33.177000000 GCP/script.zip
  1377393 2023-03-18 08:18:32.669000000 GCP/log.zip
 21468106 2023-03-18 08:18:32.425000000 GCP/gvis_conf.zip
:(中略)

ちゃんと入っとるやんけ。

次はこのzipのうち、Docker.zipを使ってlocal-linuxにmariadb10.11の永続化領域を使わせる。

タイトルとURLをコピーしました