Upgrade to Pro — share decks privately, control downloads, hide ads and more …

約1名で300台のMySQLを管理する技術

yoku0825
October 10, 2019

 約1名で300台のMySQLを管理する技術

2019/10/10 OpenSourceConference 2019.Enterprise
https://www.ospn.jp/osc2019.enterprise/

yoku0825

October 10, 2019
Tweet

More Decks by yoku0825

Other Decks in Technology

Transcript

  1. \こんにちは/ yoku0825@とある企業のDBA オラクれない ‐ ポスグれない ‐ マイエスキューエる ‐ 生息域 Twitter:

    @yoku0825 ‐ Blog: 日々の覚書 ‐ 日本MySQLユーザ会 ‐ MySQL Casual ‐ GMO Media, Inc. ‐ 1/71
  2. MySQLの面倒を見る #とは 障害対応 DBサーバーのシェルを使えるのはDBチームとインフラチームのみ ‐ AP起因でMySQLがぶん回ったりするものを含む ‐ H/W交換はお任せ、OSを再セットアップしてからが出番 ‐ MySQLに関するサポート

    「新しい開発環境のDBがほしいんですけど」 ‐ 「APサーバーが追加されたからユーザー追加してほしいんだけど」 ‐ 「クエリー遅いんですけど」 ‐ 7/71
  3. MySQLの面倒を見る #とは DBに特化した(広義の)インフラデザイン バックアップの頻度, 保管先, ..etc. + その実装 ‐ 監視,

    リソースモニタリング, ..etc. + その実装 ‐ mikasafabric for MySQL + MySQL Router ‐ メジャーバージョンアップの検証とか、Percona ServerとかMariaDBとか ‐ DBに特化したショット作業 吊るしの ALTER TABLE 以外を使ったテーブル定義の更新 < 5.6 だったり、テーブルが大きすぎてレプリケーションが詰まったりするケース ‐ スロークエリーチューニング ‐ マイナーバージョンアップ ‐ 8/71
  4. 管理台帳 データはMySQLに保管 各サイト1台ずつ保管用のMySQLがあって、横串に見たい時用にグローバルアクセス可能な API Gateway + DynamoDBにキャッシュ ‐ 実体はPerlのスクリプトで、数台のインスタンスのMySQLに次々ログインして SHOW

    VARIABLES とか SHOW SLAVE STATUS とか諸々引っこ抜いてくる 定期的(2/day)に登録済のmysqldをチェック バージョンアップ、レプリケーションの構成変更など、勝手に情報を更新 ‐ マスター切り替えがあっても定期実行スクリプトを手で流し直してやるだけで台帳が最新に ‐ 16/71
  5. 管理台帳 正直何に保管しても良いしどんな言語で書いても良いと思うんだけど、定期ポーリ ングはした方が良い 人間はついうっかり忘れる ‐ mysql コマンドラインクライアントや curl でアクセスするのでCLIフレンドリー 普段ターミナルと仕事をしているので

    grep, awk と組み合わせてワンライナーにしやすいと嬉し い ‐ Ansibleのダイナミックインベントリーとか ‐ pecoと連携してssh接続先を検索するとか ‐ 監視への流用とか ‐ 18/71
  6. アドオンした死活(?)監視 AUTO_INCREMENT なカラムの使用量 あふれると即死なわりに意外と監視されていない ‐ オススメ ‐ information_schema.tables と information_schema.columns

    を JOIN して得る sys.schema_auto_increment_columns なら一発で取れる ‐ テーブルの数が多いと逆にこれが負荷になるので、テーブル数と相談しながら監視するかしな いか決めてる ‐ 26/71
  7. アドオンした死活(?)監視 SHOW STATUS, SHOW VARIABLES Threads_connected / max_connections を監視 100%になると当然

    Too many connections Percona Serverだとエラーログに出るんだけど 監視ユーザーは Super 持ちなことが多くて意外と気付かない ‐ 27/71
  8. アドオンした死活(?)監視 SHOW SLAVE STATUS はMulti-Source Replication対応 意外と対応されてなかった。。 ‐ マスター、スレーブの自動判定 胸に手を当てて考えてみたら、俺は

    SHOW SLAVE STATUS の出力有無や SHOW PROCESSLIST の Binlog Dump スレッドの存在でマスターかスレーブか中間マスターなのか判断してるよね ‐ じゃあスクリプトにもそれやらせればいいんじゃないか ‐ 29/71
  9. yt-healthcheck item master slave intermidiate fabric SHOW PROCESSLIST o o

    o - Too many connections o o o - AUTO_INCREMENT o - o - read_only OFF ON OFF - latest_deadlock o - o - SHOW SLAVE STATUS - o o - mikasafabric - - - o https://github.com/yoku0825/ytkit/blob/master/lib/Ytkit/ HealthCheck.pm#L104-L136 32/71
  10. 管理台帳 with 死活(?)監視 $ admin xx-db-s12 192.168.140.112 3306 /data/mysql/ 5.6.40-log

    192.168.140.101: 3306 ACTIVE xx-bk11 192.168.140.121 3306 /data/mysql/ 5.6.40-log 192.168.140.101: 3306 ACTIVE xx-db-m11 192.168.140.101 3306 /data/mysql/ 5.6.40-log master ACTIVE xx-bk11 192.168.140.121 3307 /data/admintool/ 8.0.11 master ACTIVE 34/71
  11. 管理台帳 with 死活(?)監視 $ type admin admin () { export

    MYSQL_PWD="$admintool_password"; mysql --default-character-set=utf8 -h${admintool_host} -P${admintool_port} -u${admint ool_user} -sse "SELECT * FROM AdminView.instance_list" } 35/71
  12. 管理台帳 with 死活(?)監視 $ admin | awk '{print $2, $3}'

    | while read ip port ; do > yt-healthcheck -h $ip -P $port -u $username -p $password > done OK on xx-db-s12: (slave) OK on xx-bk11: (slave) WARNING on xx-db-m11: table xx.some_log_table uses auto_increment column hogehoge_id 52.4 5%(1126261308/2147483648)" (master) OK on xx-bk11: (master) 36/71
  13. 死活(?)監視を充実させると 多少雑にサイジングしてもワーニングのうちに回収できるケースが増える サイジングにかける時間を減らせる ‐ 予め必要そうな情報を残すようにしておく 障害 ⇒ 再現待ち ⇒ 情報収集

    ⇒ 対処 のサイクルを短くする ‐ OSSにしておくことで一度踏んだ轍(= 「これも監視しておくべきだった」) をど んどん追加する気分になる 37/71
  14. ログ監視 [Note] Slave: received end packet from server due to

    dump thread being killed on master server_uuidカブりとかで出るやつ(I/Oスレッドが無限に再起動するやつ) ‐ mysqld_safe Number of processes running now: 0 OOM Killerに亭主を殺されたり、SEGVでmysqldが死んだりした時はまずこれが出る。 mysqld_safeを使ってると瞬間的に再起動されちゃって死活監視に引っかからないことがある ので。 ‐ [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. binlog_format = STATEMENT でレプリケーションアンセーフな関数使っちゃった時に ‐ 今はもう binlog_format = STATEMENT 撲滅したので二度と出ることはないような気もする ‐ 40/71
  15. コンフィグテンプレートエンジン 例にしやすかったのでPHPにしましたが実際に使っているのはPerlです <?php $ipaddr= getHostByName(getHostName()); $server_id= ip2long($ipaddr) & 65535; $memsize_kb=

    exec("head -1 /proc/meminfo | awk '{print $2}'"); ?> [mysqld] .. server-id= <?=$server_id?> <?= isset($opt["slave"]) ? "read_only" : ""?> report-host= <?=gethostname()?> innodb_buffer_pool_size= <?=(int) ($memsize_kb * 0.6)?>K innodb_log_file_size= <?=(int) ($memsize_kb * 0.6 * 0.2)?>K .. 44/71
  16. mikasafabric for MySQL もとはMySQL FabricというHAフレームワーク 高可用性とデータ・シャーディングを実現できるMySQL Fabricとは? | Think IT(シンクイッ

    ト) ‐ MySQL Fabricを使うと、マスターのサーバーに障害が発生した際のフェイル オーバー処理を自動化できるだけでなく、フェイルオーバーによってMySQL サーバーの構成が変更された場合でも、アプリケーションからMySQLサー バーへの接続先を切り替える必要がありません。アプリケーションを変更する 必要無く、そのまま使い続けられます。 48/71
  17. mikasafabric for MySQL もともとは Master/Slave 1台ずつでSlaveがホットスタンバイのやつを管理するた めにMySQL Fabricにパッチを当てていた 現在、最大でフツーのAsync Mater/Slave

    構成20台くらいをさばかせている もちろん連絡はするけど DBAだけでスイッチオーバーが完遂できる のは気分的に すごく楽 52/71
  18. yt-collect $ yt-collect -h 172.17.0.1 -u user_name -p'password' -P 3306

    --output=sql --sql-update yoku0825/ytkit: Yoku-san no Tool KIT 56/71
  19. yt-binlog-groupby $ mysqlbinlog -vv /path/to/binlog | yt-binlog-groupby --cell=10m --group-by=time,table 170720

    15:10 d1.t1 2 170720 15:20 d1.t1 1 170724 14:20 mysqlslap.t1 644 170724 14:50 t1 644 170724 15:40 t1 644 170724 20:00 d1.t1 2 170724 20:00 t2 1 170814 18:20 d1.t1 1 62/71
  20. yt-binlog-groupby yoku0825/ytkit: Yoku-san no Tool KIT バイナリーログをGROUP BYするためのスクリプト(time, table, statement)に対応

    ‐ バイナリーログさえ残っていればいつでも任意の時間帯でどのテーブルがホットスポットに なっていたかわかる ‐ 63/71