Dockerコンテナは定期的にデータベースをバックアップし、指定されたメールボックスに送信します(設計アイデア)

Dockerコンテナは定期的にデータベースをバックアップし、指定されたメールボックスに送信します(設計アイデア)

プロジェクトのアドレスと手順: https://gitee.com/noovertime/mysqlmail

1. 背景:

当初の目的は、サーバーの使用率が高いプロセスを監視し、それを電子メールで送信するスクリプトを作成することでした。その後、突然、この方法を使用してデータベースをバックアップできることに気付き、作業を開始しました。

2. デザインのアイデア:

シェル スクリプトを作成し、Linux メール ツールを呼び出し、mysqldump を使用してデータベースの sql ファイルを保存し、メール ツールを通じて添付ファイルに追加し、最後にメールボックスに送信します。

3. 起動スクリプトを書く

まず、起動スクリプトを記述します。将来のパーソナライズされた構成を容易にするために、スクリプト内のすべての変数を application.yml ファイルに抽出します。ファイルは次のとおりです。

 RUNTIME: 084900 ##起動時間。コンテナのタイムゾーンの問題により、現在の時刻から8時間を引いた値が必要です。HOST: 172.17.0.3 ##データベースのIPアドレス USER: root ##データベースのユーザー PASSWORD: 123456 ##データベースのパスワード DATABASE: solo ##データベース名 TARGETMAIL: [email protected] ##送信先のメールアドレス

次に、シェルスクリプトを書いてみます。ロジックも非常にシンプルです。現在時刻が起動時刻と同じになったら、sendmail関数を呼び出してメールを送信します。

 #!/bin/bash
#著者: チェンテン

RUNTIME=$(cat ./application.yml | grep RUNTIME| awk '{print $2}')
HOST=$(cat ./application.yml | grep HOST| awk '{print $2}')
USER=$(cat ./application.yml | grep USER| awk '{print $2}')
PASSWORD=$(cat ./application.yml | grep PASSWORD| awk '{print $2}')
DATABASE=$(cat ./application.yml | grep DATABASE| awk '{print $2}')
TARGETMAIL=$(cat ./application.yml | grep TARGETMAIL| awk '{print $2}')

関数sendmail(){
  mysqldump -h$HOST -u$USER -p$PASSWORD --complete-insert --skip-add-drop-table --hex-blob $DATABASE > $DATABASE.sql
  echo -e "mysqlbak_$CURRENT_TIME" |mail -s "mysqlbak_$CURRENT_TIME" -a $DATABASE.sql $TARGETMAIL
  睡眠1
}
真実である
する 
  CURRENT_TIME=$(日付 +%H%M%S)
  [ $CURRENT_TIME = $RUNTIME ]の場合;
    echo "bak mysql データベースを開始しています"
    送信メール
    続く
  それ以外
    $CURRENT_TIME をエコーする
    睡眠1
  フィ
終わり

4. イメージを構築する

最終的にはk8sプラットフォームに配置するため、イメージを構築する必要があります。イメージを構築する前に、application.yml demo.sh Dockerfileを同じディレクトリに置いてください。
Dockerfile は次のとおりです。
PS: MySQLクライアントとメールクライアントを追加しました

Centosより
mkdir /app && yum install -y mysql.x86_64 sendmail mailx libreport-plugin-mailx を実行します。 
ワークディレクトリ /app
demo.sh をコピーします。
application.yml をコピーします。
コマンド ["/bin/sh","demo.sh"]

docker buildコマンドを使用してイメージをビルドします。最後のドットを忘れずに付けてください。

ビルドは -t mysqlmail-bak:1.0.1 です。

5. サイドカーコンテナの追加

サイドカー コンテナ: サイドカー コンテナは、メイン コンテナと同じポッドで実行され、ビジネス コンテナを強化し、ネットワーク スペースを共有するコンテナであるため、127.0.0.1:3306 を使用してメイン コンテナのデータベースに接続できます。

5.1 設定ファイルを作成する

デバッグを容易にするために、シェル スクリプトも内部にマウントしました。
コンテナ内の設定ファイルとシェル スクリプトにそれぞれ対応する 2 つの configmaps を作成します。後でデバッグが必要ない場合は、mysqlshell のマウントをキャンセルできます。

 APIバージョン: v1
種類: ConfigMap
メタデータ:
  名前: mysqlmail-conf
  名前空間: ソロ
データ:
  アプリケーション.yml: |
    実行時間: 105800
    ホスト: 127.0.0.1
    ユーザー: ルート
    パスワード: 123456
    データベース: ソロ
    ターゲットメール: [email protected]
---
APIバージョン: v1
種類: ConfigMap
メタデータ:
  名前: mysqlmail-shell
  名前空間: ソロ
データ:
  デモ: |
    #!/bin/bash
    #著者: チェンテン
    RUNTIME=$(cat ./application.yml | grep RUNTIME| awk '{print $2}')
    HOST=$(cat ./application.yml | grep HOST| awk '{print $2}')
    USER=$(cat ./application.yml | grep USER| awk '{print $2}')
    PASSWORD=$(cat ./application.yml | grep PASSWORD| awk '{print $2}')
    DATABASE=$(cat ./application.yml | grep DATABASE| awk '{print $2}')
    TARGETMAIL=$(cat ./application.yml | grep TARGETMAIL| awk '{print $2}')
    関数sendmail(){
      mysqldump -h$HOST -u$USER -p$PASSWORD --complete-insert --skip-add-drop-table --column-statistics=0 --hex-blob $DATABASE > $DATABASE.sql
      echo -e "mysqlbak_$CURRENT_TIME" |mail -s "mysqlbak_$CURRENT_TIME" -a $DATABASE.sql $TARGETMAIL
      睡眠1
    }
    真実である
    する 
      CURRENT_TIME=$(日付 +%H%M%S)
      [ $CURRENT_TIME = $RUNTIME ]の場合;
        echo "bak mysql データベースを開始しています"
        送信メール
        続く
      それ以外
        $CURRENT_TIME をエコーする
        睡眠1
      フィ
    終わり

5.2 ステートフルサービスデプロイメントファイルを作成する

デプロイファイルは、前回の記事で作成した mysql ステートフル サービスの yaml ファイルを使用します。興味があれば、前回の移行記事をお読みください。

 APIバージョン: アプリ/v1
種類: ステートフルセット
メタデータ:
  名前: mysql
  名前空間: ソロ
仕様:
  サービス名: mysql-service
  セレクタ:
    一致ラベル:
      アプリ:mysql
  レプリカ: 1
  テンプレート:
    メタデータ:
      ラベル:
        アプリ:mysql
    仕様:
      コンテナ:
      - 名前: mysqlmail-bak
        イメージプルポリシー: IfNotPresent
        イメージ: mysqlmail-bak:1.0.1
        ボリュームマウント:
        - 名前: mysqlmail-conf
          マウントパス: /app/application.yml
          サブパス: application.yml
        - 名前: mysqlmail-shell
          マウントパス: /app/demo.sh
          サブパス: demo.sh
      - 名前: mysql-pod
        イメージプルポリシー: IfNotPresent
        イメージ:mysql:5.7
        環境:
        - 名前: MYSQL_ROOT_PASSWORD
          値: "123456"
        ポート:
        - コンテナポート: 3306
          名前: msyql-listin
        ボリュームマウント:
        - 名前: mysql-data
          マウントパス: /var/lib/mysql
          サブパス: mysql-data
        - 名前: mysql-conf
          マウントパス: /etc/mysql/conf.d/my.cnf
          サブパス: my.cnf
      ボリューム:
      - 名前: mysql-data
        ホストパス:
          パス: /data/mysql
      - 名前: mysql-conf
        構成マップ:
          名前: mysql-conf
      - 名前: mysqlmail-conf
        構成マップ: 
          名前: mysqlmail-conf
      - 名前: mysqlmail-shell
        構成マップ:
          名前: mysqlmail-shell
---

APIバージョン: v1
種類: サービス
メタデータ:
  名前: mysql-service
  名前空間: ソロ
  ラベル:
    アプリ:mysql
仕様:
  ポート:
  - ターゲットポート: 3306
    ポート: 3306
  クラスターIP: なし
  セレクタ:
     アプリ:mysql

6. テスト

上記で設定した時間は RUNTIME: 105800 で、上海タイムゾーンでは 18:58 です。効果を確認してログを確認してみましょう。
注: ポッドに複数のコンテナが含まれている場合は、-c パラメータを使用して表示するコンテナを指定します。

 [root@VM-24-15-centos solo]# kubectl logs -n solo mysql-0 -c mysqlmail-bak | grep mysql -C 5
105755
105756
105757
105758
105759
MySQLデータベースの再起動
mysqldump: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
105801
105802

ログから、メールが正常に送信されたことがわかります。メールボックスを確認すると、メールも成功していました。これで私たちの実験は完璧に完了しました!

ここに画像の説明を挿入

Docker コンテナでデータベースのバックアップをスケジュールし、指定したメールボックスに送信する方法については、これで終わりです。Docker でのデータベースのスケジュール バックアップの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • docker での psql データベースのバックアップとリカバリの詳細な説明
  • docker 環境でのデータベース バックアップ (postgresql、mysql) のサンプル コード

<<:  HTML ページで JSON データを表示およびフォーマットする方法

>>:  JavaScript におけるブラウザ互換性の問題について簡単に説明します

推薦する

SVN のインストールと基本操作 (グラフィック チュートリアル)

目次1. SVNとは何か2. SVNサーバーとクライアントの取得方法3. SVN ワークフローとアー...

MySQL がデュアルマスターで構成されている場合にデータループの競合を回避する方法

あなたはこの質問について考えたことがあるでしょうか?デュアルアクティブが構成されている場合、データル...

echarts ワードクラウドチャートを使用した Vue の実践記録

echartsワードクラウドはechartsの拡張版ですhttps://echarts.apache...

スライダー効果を実装するミニプログラム

この記事の例では、スライディングブロック効果を実現するための小さなプログラムの具体的なコードを参考ま...

Vue3 (パート 2) Ant Design Vue の統合

目次1. Ant Design Vueを統合する2. コンポーネントの使用1. 完全な引用2. コン...

Linux で jar パッケージを起動してバックグラウンドで実行する方法

jar パッケージを実行する Linux コマンドは次のとおりです。方法1: java -jar s...

Vue バックグラウンドでステータス ラベルをエレガントに記述する例

目次序文最適化変数の抽出二次包装 el-tag コンポーネント使用要約する序文バックエンドシステムの...

HTMLでは、div内のコンテンツが次のサイズを超えたときに自動的にスクロールバーが表示されるように設定します。

HTML ページでは、div 内のコンテンツが制限を超えた後に自動的にスクロール バーを表示する必要...

Windows 10 インストール vmware14 チュートリアル図

ソフトウェアのダウンロードソフトウェアのダウンロード リンク: https://pan.baidu....

リンクAの意味論、書き方、ベストプラクティス

リンク A のセマンティクス、ライティング スタイル、およびベスト プラクティス。私は JavaEy...

React を使って小さなプログラムを書くための Remax フレームワークのコンパイル プロセス分析 (推奨)

Remax は、実行時に構文制限のないソリューションを採用した React を使用して小規模なプロ...

HTMLタグオーバーフロー処理アプリケーション

CSSを使用してスクロールバーを変更する1.コンテンツがオーバーフローした場合のオーバーフロー設定水...

HTML で余分なテキストを省略記号に変換する方法

HTML で余分なテキストを省略記号として表示したい場合は、いくつかの方法があります。 1行テキスト...

Bash スクリプトを使用して Linux のメモリ使用量を監視する方法

序文Linux システムのパフォーマンスを監視するために使用できるオープンソースの監視ツールが市場に...

JS で単一ファイルコンポーネントを実装する方法

目次概要単一ファイルコンポーネント基本概念シンプルなローダーコンポーネントコンテンツの解析コンポーネ...