Database Backup Serviceを使ってみる #3 MySQL利用時のポイント

この記事は Alibaba Cloud の日本サイト の環境(ドキュメントやアカウント、そのアカウントでの検証結果)に基づいて記載しています。 日本サイトと国際サイトでは各プロダクトごとに提供機能が一部異なることがあります(そのほとんどは国際サイトの方が日本サイトよりも多機能になっている)。記事の内容は適宜最新化する予定です。

Database Backup Service(DBS)を利用してECSインスタンス上のMySQLをバックアップする場合、以下の2点を考慮する必要があります。 この2点について DBS から MySQL への接続に失敗する場合の対処方法をまとめてみました。

  1. DBSとMySQLはTCP/IPで通信
  2. DBSは指定したMySQLのユーザIDで接続 

DBSとMySQLの接続性のテスト方法

接続テストですがDBSの画面から簡単にテスト可能です。

Alibaba Cloud コンソールからDBSの管理画面にアクセスします。

バックアップ計画の設定画面からデータベースアカウントを指定し、”接続テスト”をクリックします。

 MySQLとの接続に問題が無い場合は以下の画面。”テストに合格”と表示されます。

次は存在しないデータベースアカウント”hogehoge”を指定し、意図的にテストを不合格にします。 

”接続テスト”ボタンをクリックします。

”データベースに接続中にエラーが発生しました”とメッセージが表示されました。 予定通りに接続に失敗しています。 

”テストに失敗”と表示されます。 原因を知るために、”チェック”をクリックします。

この画面で失敗した原因を確認することが可能です。 MySQL側から”Access denied for user ‘hogehoge~’”と応答があることを確認出来ます。 ここまで情報があるとトラブルシューティングも進めやすいですね。

上記の接続テスト画面のチェック項目に”Telnet”とあります。 これはTCPソケットの疎通確認ですね。 次はこの疎通確認の失敗パターンを確認することにします。

ポート番号を3307に変更します。 MySQL側では3306でListenしている状態ののままです。

失敗時の画面は以下。 Telnet行のチェック結果が失敗になっています。接続も出来ていないのでMySQL JDBC Connectも失敗です。

しかし、メッセージがわかりづらいですね。

”Your database port 10839 may have firewall settings or whitelist restrictions” 

とのことですが、この10839はMySQLの待ち受けポートではなく、DBS側の送信元のポートと思われます。 このメッセージだけ見ると、10839をOpenにする必要があるのかと勘違いしそうですよね。

また、このTCP/IPレベルでの疎通テストでわかったことが一つあります。

実はポート番号を変更する前に、セキュリティグループでDBSからの接続をブロックすることで、接続テストに失敗させることを試していました。 しかし、セキュリティグループで拒否にしても接続テストは成功します。

具体的には、事前に DBS用のホワイトリストとしてセキュリティグループルールを追加していました。 これを”許可”から”拒否”に変更しています。

権限付与オブジェクトにはDBSのバックアップ計画のホワイトリストとして支持されていたアドレスです。

うーん、謎の動きですね。 セキュリティグループではそもそも許可する設定が不要だったということでしょうか。  試しても考えてもわからないことはあきらめることにします。

DBSからMySQLへの疎通が取れない場合の対処

チェックポイントと対処をまとめました。

ループバックアドレスでバインドしていないか?

MySQLのListen ポート3306がバインドしているIPアドレスを確認します。

IPアドレス”172.24.133.26”にバインドしているので問題ありません。

root@bigriver:~# netstat -aon |grep 3306
tcp 0 0 172.24.133.26:3306 0.0.0.0:* LISTEN off (0.00/0/0)

”127.X.X.X”のループバックアドレスに3306がバインドされている場合は、MySQLの設定(mysqld.cnf)を変更しましょう。 

私の環境では既定のbind-addressは127.0.0.1のみでした。以下の太字部分を追加しています。

Instead of skip-networking the default is now to listen only on
localhost which is more compatible and is not less secure.
bind-address = 127.0.0.1
bind-address = 172.24.133.26

iptables (firewalld)でブロックしていないか?

iptablesコマンドで確認しましょう。 もし許可されていない場合は許可ルールを追加しましょう。

以下の例ではルールは設定されていないことを確認出来ます。 もちろん、この状態がお勧めということはありません。 

root@bigriver:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

DBSが利用するMySQLユーザの確認

DBSのバックアップ計画の設定画面ではMySQLのユーザを指定します。 ここで指定するユーザがMySQL上に存在し、また、適切な権限を持っている必要があります。

接続ユーザが存在するか?

CUI(mysqlコマンド)からMySQLに接続し確認する方法を紹介します。以下、抜粋した情報ですが、dbuserがすべてのホストから接続を許可する構成としています(%)。

mysql> select user,host from mysql.user;
+——————+——————————-+
| user | host |
+——————+——————————-+
| dbsuser | % |
~省略~

MySQLユーザの権限は適切か?

公式ドキュメントに詳しく乗っています。 ただ、MySQLについてのみなので他データベースの場合は別途確認が必要そうです。 

URLはこちら

以上