Kafka への流入量の試算
AWS RDS の CDC を Kafka でストリーミングし Iceberg テーブルへ配信し分析基盤を構築しました。
その際に RDS のメトリクスから Kafka への流入量を試算するスクリプトを作成しましたので公開します。
SaaS への見積もりで流入量が必要だったので、スクリプトで試算した数値と合わせてスクリプトも提出した所、概ね問題ないことを確認いただけました。
AWS RDS の CDC を Kafka でストリーミングし Iceberg テーブルへ配信し分析基盤を構築しました。
その際に RDS のメトリクスから Kafka への流入量を試算するスクリプトを作成しましたので公開します。
SaaS への見積もりで流入量が必要だったので、スクリプトで試算した数値と合わせてスクリプトも提出した所、概ね問題ないことを確認いただけました。
メモ
1 | $ mysql -h <host> -u <user> -p -e'SELECT GROUP_CONCAT(ID) FROM information_schema.PROCESSLIST WHERE TIME > 300;' |
1 | $ mysqladmin kill <pid,pid,pid...> -h <host> -u <user> -p |
ECサイトに新しい決済機能の利用率出したいな
と思ったときのクエリです。
ちょうどいくつかの集計関数がまとまった1クエリとなったので
まとめました。
1 | SELECT |
CASE文をさらっと書けるようになると少し大人になった気分になります。
心残りは比率部分の重複部分がまとまったらかっこいいかなと。
精進します。
fluentd でエラーログを Slack へ通知 の続きです。
MySQL DB サーバ の SlowQuery 状況を
リアルタイムに Slack で確認できるようにする為に導入しました。
今回必要モジュールをインストールします。
1 | # td-agent-gem install fluent-plugin-nata2 |
fluent-plugin-nata2
fluent-plugin-mysql_explain
fluent-plugin-sql_fingerprint
fluent-plugin-sql_fingerprint で利用する fingersprint をインストールします。
1 | # rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm |
以下ファイル設定するとします。
1 | <source> |
※slowquery のパス、DB のアクセスアカウントなどは各環境により変更してください。
1 | # service td-agent restart |
SlowQuery を発行し、Slack に通知されるか確認します。
1 | mysql > SELECT count(*), sleep(3) FROM <table>; |
Slack に通知されました!
show more をクリックすると Explain が通知されているのがわかる。
リアルタイム通知は
特に新規開発時に効果的でした。
また
ElasticSearch へ蓄積し時間軸で分析するのは
サイトのイベントとの相関性が見え面白いです。
その環境と状況により発生するスロークエリが見えてきます。
以上です。
1 | mysql> use zabbix |
1 | +----------------------------+--------+----------+-------+-------+------+------+ |
ちなみに上記は Zabbix DBの結果
history (履歴) にデータが肥大化傾向にあるので
パーティション や Zabbix housekeeping での
保存期間設定を調整するなど必要なことがわかります。
AWS E2 インスタンス上に MySQL, SonarQube インストールし起動するものの
MySQL が落ちるという事象が発生。
ログを見ると以下のエラーが。。
1 | InnoDB: mmap(137363456 bytes) failed; errno 12 |
1 | Cannot allocate memory for the buffer pool |
割りあてるメモリがないという話。
なので、メモリを作ります。
1 | // 空ファイル作成 |
1 | # free |
1 | # systemctl restart mysqld |
1 | $ mysql -u <user> -p<pass> <db> -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size'" |
エラーログにあった 137363456 を下回ってるのがわかります。
この割当メモリを増やします。
左から順に検索し該当するファイルがあればその my.cnf を参照します。
/etc/my.cnf → /etc/mysql/my.cnf → /usr/etc/my.cnf → ~/.my.cnf
1 | # mysql --help | grep my.cnf |
自分の方では
my.cnf 上に innodb_buffer_pool_size の設定項目がなかったので
追加しました。
1 | [mysqld] |
1 | # systemctl restart mysqld |
1 | $ mysql -u <user> -p<pass> <db> -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size'" |
今回発生していたエラーログが消えました。
MySQL SELECT 文の結果を csv で取得する際
以下のように CLI 上で実行することで取得できます。
1 | $ mysql -u <user> -p<password> <db_name> |
ですが、mysql ログインユーザ
以下のようなエラーで出力できません。
1 | RROR 1 (HY000): Can't create/write to file '/tmp/output.csv' (Errcode: 13) |
FILE の READ/WRITE 権限を付与すれば問題ないですが
権限周りをいじりたくないときなどあるかと思います。
本番環境の DB で権限周りがブラックボックス化していて
FLUSH PRIVILEGES すると何か障害が出るんじゃないかとか汗
その際に実施したことを以下まとめました。
TXT として取得して sed で csv ファイルに加工する、
という方法で実行しています。
例) 以下のような SQL 実行結果を取得したとすると
1 | $ less output.txt |
↓ Excel で表示されるように加工すると
1 | $ less output.txt |
1 | $ mysql -u <user> -p<password> <db_name> -e"<query>" > output.txt |
1 | // 各行の一番前(「^」)に「"」を付加 |
この CSV を利用する方(提出先)の方の文字コードに合わせます。
提出先では Shift JIS がデフォルトとのことで そこに変更します。
1 | $ nkf -g output4.txt |
1 | $ nkf -sLw output4.txt > output.csv |
これで INTO OUTFILE を利用せず CSV ファイルを取得できました。
ouput.csv
ファイル名に日付をつける。
1 | $ mv output.csv output_`date '+%Y%m%d'`.csv |
1 | $ ls |
以下のように mysqldump コマンド実行時に掲題のエラーが発生しました。
1 | $ mysqldump --lock-all-tables --events -h <host_name> -u <user> -p<password> --no-create-info <db_name> <table, ...> > output.sql |
エラー文の通り、RELOAD権限を付与する。
1 | mysql> GRANT RELOAD ON *.* TO '<user>'@'<host_name>'; |
以上
ローカルでMacOSXでMAMPを使っていてある日誤った操作により以下のようなエラーが発生した為
対応まとめました。
1 | $ mysql -u root |
ローカル環境でrootユーザのアクセス権を誤って削除してしまったときなどに発生します。
1 | // mysql停止 |
rootユーザに権限が失われお手上げ状態になったとき、困ったときに safe_mode
使えます。
以上
DBインポート時に掲題のエラーが発生しました。
インポートサイズが大きすぎる為です。
インポートデータサイズのデフォルト値は 1M
です。
以下コマンドで確認できます。
1 | mysql> show variables like 'max_allowed_packet'; |
2点あります。
再起動の必要がなく影響範囲が少なく済みます。
但し、再起動後、デフォルト値に戻るので
恒久的な対応が必要な場合
my.cnf に設定しmysqldを再起動する必要があります。
例) 10MB に設定
1 | mysql> set global max_allowed_packet = 1000000; |
max_allowed_packet
を引き上げる様設定1 | # mysql --help | grep my.cnf |
以下の順で my.cnf を探しています。/etc/my.cnf
→ /etc/mysql/my.cnf
→ /usr/etc/my.cnf
→ ~/.my.cnf
個々の環境で異なるので本当に存在するかも含め設定ファイルを見定めてください。
おおよそ /etc/my.cnf
が一般的かと思います。
10MBに設定してみます。
1 | [mysqld] |
以上設定して再起動で設定反映完了です。
設定が反映されているか確認します。
1 | mysql> show variables like 'max_allowed_packet'; |
以上