【NOTE】Prometheus

This is a note taken when investigating Prometheus.

TODO

  • get familiar with Grafana
  • setup mail server and send alert via email as well as Slack

【NOTES】Consul

The followings are the notes taken when spiking Consul.

miscs

MySQLでレプリケーションを設定する

レプリケーションMySQLで最も重要な機能の一つで、その用途は多岐に渡ります。それゆえ素早くセットアップできることが好ましいです。ここではその手順をまとめておきます。

方法はいくつかありますがここではマスターからmysqldumpでデータを取ってくる方法を使います。

1. マスターサーバーのコンフィギュレーション

マスターでは以下のようにオプションを設定します。

[mysqld]
bind-address = 10.132.0.2
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
sync_binlog = 1

server_idレプリケーションするグループ内で一意である必要があります。デフォルトが1なので他のインスタンスと衝突しないように違う値を割り当てるのが安全ですがここではデフォルトのままにしておきます。今回はローカルネットワーク内にマスター・レプリカを立てるのでbind-addressにはローカルIPを書いておきます。log_binにはバイナリログの位置を指定、sync_binlogフラグを立てることでトランザクション毎にバイナリログが同期することを保証します。

2. マスターにレプリケーションユーザーを作成する

レプリケーションではマスターがサーバーでレプリカがクライアントの役割を果たします。よってマスター側にレプリカがアクセスする用のユーザーを作成します。

GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

ここではクライアントホストに%を指定することで複数のレプリカでユーザーを使い回す想定で作成します。

3. マスターのデータをmysqldumpで取得する

バックアップをとる方法でまとめたのと同様にmysqldumpコマンドによりデータの論理バックアップを取得します。

$ sudo mysqldump --all-databases --master-data=2 --single-transaction --flush-logs > backup/dumpfile.sql

--all-databasesにより全てのデータベースを対象にし、--master-data=2によりダンプデータにレプリケーションの開始位置を書き込ませます。--single-transactionは複数データベースのデータを取得する際の不整合を防ぐオプション(InnoDB専用)、--flush-logsによりバイナリログのローテートを指示します。

4. スレーブのコンフィギュレーション

スレーブのmysql.confファイルを以下のように設定します。

[mysqld]
bind-address = 10.132.0.3
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log

スレーブはserver-idに2を割り当て、ローカルIPの設定もします。マスターから取得するバイナリログはまずリレーログという領域に置かれます。その後マスター接続するのとは別のスレッドがリレーログの内容をデータに書き込みます。relay-logの値にリレーログを書き込む場所を指定しておきます。

5. ダンプしたデータのリストア

先ほどマスターから取得したダンプファイルをスレーブに適用します。

$ sudo mysql < dumpfile.sql

6. スレーブでレプリケーションの設定をする

スレーブでマスターとバイナリログ上のレプリケーションの開始位置を指定します。レプリケーションの開始位置は以下のようにダンプデータから取得できます。

$ cat dumpfile.sql | head -n30 | grep CHANGE
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=154;

mysqlに以下のクエリを流します。

CHANGE MASTER TO
    MASTER_HOST='10.132.0.2',
    MASTER_USER='slave_user',
    MASTER_PASSWORD='password',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='mysql-bin.000002',
    MASTER_LOG_POS=154,
    MASTER_CONNECT_RETRY=10;

7. マスターに更新クエリをかける

レプリケーションがうまくいってることを確認するためにマスターのデータを更新してみましょう。

8. レプリケーションの開始

スレーブ側でレプリケーションを開始します。

START SLAVE;

9. レプリケーションの確認

スレーブ側では以下のように確認します。

SHOW SLAVE STATUS\G

またマスター側での確認は

SHOW MASTER STATUS;
SHOW SLAVE HOSTS;

です。

先ほどマスターで更新したデータがスレーブに書き込まれていること、マスターへの更新クエリがスレーブに反映されることも確認しましょう。

参考

MySQLで差分バックアップをとる

リストア処理においてフルバックアップと合わせて必要になるのが差分バックアップです。ということで備忘録。

1. バイナリログを記録する

まずはこれをしないと始まりません。設定ファイルのlog-binの項目をコメントインし、サーバーを再起動しておきましょう。

2. フルバックアップをとる

--flush-logsオプションをつけてログをローテートしておきます。こうしておくとリストア時にファイルの先頭から復元すればよいため手順がシンプルになります。

$ sudo mysqldump --flush-logs --lock-all-tables --all-databases > backup/full-$(date +%Y%m%d).sql

3. バイナリログを保存しておく

$ sudo mysqlbinlog /var/log/mysql/mysql-bin.000005 > binlog/diff-$(date +%H%M%S).sql

これで保存した分まで復元できるので常に最新のものを安全な場所に保管できるようにしておきましょう。

バックアップの処理はここまでで以降リストアの処理です。緊張感が欲しい方はDROP DATABASEしましょう。

4. フルバックアップを復元する

$ sudo mysql < backup/full-20181030.sql

フルバックアップ取得時まで復元しました。次にバイナリログ分を適用します。

5. バイナリログの適用

フルバックアップと同じようにmysqlコマンドに流すだけです。

$ sudo mysql < binlog/diff-193632.sql

これで完了です。

ログをローテートしたくないとき

バックアップ時に--master-data=2オプションをつけましょう。こうすることでダンプデータにどのバイナリログのどの位置からリストアすればいいかがわかります。

sudo mysqldump --lock-all-tables --all-databases --master-data=2 > backup/full-$(date +%Y%m%d).sql
$ head -n30 backup/full-20181030.sql | grep 'CHANGE MASTER'
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=831724;

位置を指定してリストアする

mysqlbinlog時に--start-positionを指定して展開します。

$ sudo mysqlbinlog --start-position=831724 /var/log/mysql/mysql-bin.000005 > binlog/diff-$(date +%H%M%S).sql

あとは同じリストア手順。(ということはバイナリログはmysqlbinlogを通さずそのまま保管したほうがいいのか......。)

参考

mysqldumpでフルバックアップとリストア

MySQLのバックアップにはいくつか方法があります。その中でも最もオーソドックスな方法であるmysqldumpを使った方法についてまとめておきます。

mysqldumpを使った方法の特徴としては

  • 手軽である
  • 無停止でバックアップが取れる(オンラインバックアップ)
  • データのダンプを出力する(論理バックアップ)
  • リストアに時間がかかる

などがあります。

1. セットアップ

こちらの記事にしたがってMySQLサーバーを用意します。

2. ダンプの取得

以下のようにmysqldumpコマンドを使いダンプデータを取得します。

$ sudo mysqldump example > backup/backup-$(date +%Y%m%d).sql

以上です。簡単。

リストア

リストアのためDROP TABLEしておきます。

リストアの際には先ほどのダンプデータをリダイレクトで入力するだけ。

$ sudo mysql example < backup/backup-20181029.sql

リストアも簡単。

全てのデータベースをバックアップしたい

--all-databasesオプションを使います。

$ sudo mysqldump --all-databases > backup/backup-$(date +%Y%m%d).sql

これならDROP DATABASEした状態でも以下でリストア可能。

$ sudo mysql < backup/backup-20181029.sql

バックアップを圧縮して取りたい

gzipにパイプすれば圧縮も簡単。

$ sudo mysqldump --all-databases | gzip > backup/backup-$(date +%Y%m%d).sql.gz

リストアもgunzip経由で。

$ gunzip < backup/backup-20181029.sql.gz | sudo mysql

cronで定期的にバックアップしたい

最後にcronの設定をしてみます。MySQL接続のため.my.cnfは事前に設定しておきましょう。 例えば毎日午前3時にバックアップを取りたかったらcrontab -eに以下を追加します。

0 3 * * * /usr/bin/mysqldump -u root --all-databases > /path/to/home/backup/full-$(date +\%Y\%m\%d).sql

参考

MySQLサーバーの設置

チュートリアルなどでMySQLサーバーが欲しいことがよくあるので手順をまとめておきます。OSはUbuntu18.04TLSです。

【参考】

1. インスタンスの作成

自分の環境に合わせてインスタンスをセットアップします。今回はGCP上に設置します。

$ gcloud compute instances create mysql-example3 --machine-type=f1-micro --image=ubuntu-1804-bionic-v20181029 --image-project=ubuntu-os-cloud
Created [https://www.googleapis.com/compute/v1/projects/playground-192621/zones/europe-west1-b/instances/mysql-example3].
NAME            ZONE            MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
mysql-example3  europe-west1-b  f1-micro                   10.132.0.5   35.205.118.215  RUNNING

2. 作成したインスタンスSSHする

$ gcloud computh ssh mysql-example3

3. mysqlのダウンロード

$ sudo apt-get update && sudo apt-get install -y mysql-server

これだけ。一応ps aux | grep mysqlで確認しておきます。

4. .my.cnfの設置

便利のためにホームディレクトリに.my.cnfファイルを設置しておきます。中身はこんな感じ(userとpassは適宜変えてね)。

[client]
user = root
password = 

5. ダミーデータの作成と導入

ここのサイトでダミーのデータを簡単に作れます。

6. .sqlファイルを作成したらインスタンスに送る。

$ gcloud compute scp data.sql mysql-example3:~

7. データベースの作成

$ sudo mysql -e 'create database example;'

7. リダイレクトでmysqlコマンドに繋ぐ

$ sudo mysql -- example < data.sql

ここまで5分でできるようになろう。