Slide 1

Slide 1 text

Redmineバージョンアップとともに DBMS変えてみた 2019/08/31 第20回 Redmine大阪 @ryouma_nagare

Slide 2

Slide 2 text

自己紹介 • @ryouma_nagare(りょうま) • 今はインフラ系エンジニア&マネージャ • Redmine/Ansible/ElasticStack/Zabbix/PostgreSQL • 好きなディストリビューションはVineLinux • redmine歴:8年 • redmine.tokyo スタッフ • 趣味:技術的人柱、監視、昔のガジェット

Slide 3

Slide 3 text

質問!

Slide 4

Slide 4 text

Redmineのバージョンは? ①4.0 ②3.x ③2.6以前 ④trunk

Slide 5

Slide 5 text

RedmineのDBMSは? ①MySQL ②PostgreSQL ③上記以外

Slide 6

Slide 6 text

今回やったこと

Slide 7

Slide 7 text

Redmineバージョンアップ&DBMS変更 対象 以前 直前 今回 OS CentOS5→6→7 CentOS7 CentOS7 Redmine 1.3→2.0→2.2~ 3.3 3.4 4.0 DBMS MySQL5.1 →MariaDB5.5 →MariaDB10 MariaDB10 PostgreSQL11 Ruby 忘れた 2.4 2.5 Web/AP サーバ apache/passenger →nginx/unicorn nginx/unicorn nginx/unicorn

Slide 8

Slide 8 text

そもそも、なぜMariaDB? ここを参考に初めてRedmineをインストール。 そのまま惰性でMySQL→MariaDBとしていた…

Slide 9

Slide 9 text

ということで4.0に向けて試行錯誤 embulkではダメなことも… pgloaderでOK!

Slide 10

Slide 10 text

おれは人間 MariaDBをやめるぞ!

Slide 11

Slide 11 text

無事完了

Slide 12

Slide 12 text

環境を変更したので メトリックを確認

Slide 13

Slide 13 text

監視対象 ※サイジング/データ量 • 4コア/8GB • チケット数:5万強 • DBサイズ:1GB強 監視対象 監視方法 メトリック production.log logstash リクエストごとの処理時間 Rails ElasticAPM トランザクションごとの処理時間 サーバリソース Zabbix 一般的なサーバリソース access.log logstash 一般的なWebアクセス解析 DBMS Zabbix コネクション数、CacheHitRatioなど

Slide 14

Slide 14 text

監視サーバ (Zephyranthes) 監視構成 Amazon Elasticsearch Service production.log解析 パフォーマンスメトリック収集 ダッシュボード

Slide 15

Slide 15 text

可視化

Slide 16

Slide 16 text

production.log – active_record_time グラフの変化っぷりが 激しい

Slide 17

Slide 17 text

APM – max(duration) MariaDB10 PostgreSQL11 桁が変わった

Slide 18

Slide 18 text

APMで確認したSQLを投げてみる

Slide 19

Slide 19 text

実行計画(サブクエリ部のみ) PostgreSQL11 -> Index Scan using idx_113458_enabled_modules_project_id on enabled_modules em (cost=0.28..1.31 rows=1 width=8) Index Cond: (project_id = wikis.project_id) Filter: ((name)::text = 'wiki'::text) MariaDB10 +------+--------------+-------------+--------+----------------------------+--------------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+--------------+-------------+--------+----------------------------+--------------+---------+------+------+-------------+ | 1 | PRIMARY | | eq_ref | distinct_key | distinct_key | 4 | func | 1 | | | 2 | MATERIALIZED | em | ALL | enabled_modules_project_id | NULL | NULL | NULL | 3499 | Using where | +------+--------------+-------------+--------+----------------------------+--------------+---------+------+------+-------------+ キーを使用せず、行数がふくれる →MySQL8でも実行計画は変わらず メインテーブルのキーを使用

Slide 20

Slide 20 text

Durationを比較 Duration(msec) 16029 12333 5604 遅いクエリも出てきたが、あき らかに体感で速い ※3週間経過後

Slide 21

Slide 21 text

サーバリソース CPU使用率 空きメモリ CPU/メモリの使用率低下はDB変更により フルスキャンが減ったためと想定 ※定期的にCPUが跳ねてるのはDBバックアップ バージョンアップ

Slide 22

Slide 22 text

ちょっとだけ不具合

Slide 23

Slide 23 text

オブジェクト名の64byte制限 移行時のWarningだけなので 特に問題ない

Slide 24

Slide 24 text

UTF8のCOLLATEの問題 気づいたところだけ対応 すればいいんじゃね?

Slide 25

Slide 25 text

結論

Slide 26

Slide 26 text

の前に 対応いただいたプラグイン作者の みなさまに感謝です!

Slide 27

Slide 27 text

結論 • ユーザに優しい機能が多いので、Redmineは4.0にあげよう ➢アクティブに更新しているプラグインを選べばバージョンアップについていけるはず ➢動かないプラグインは捨てる勇気も必要 • DBはできればPostgreSQLを使おう ➢速度的なメリットは大きい ➢MySQLではRedmineの既知の問題とか、ギャップロックとか、古いバージョンのパラメータデフォルト値とか … • 失敗の試行錯誤も、最新を突っ込みすぎたがゆえのバグを踏んだとしても、それはそれで ネタとしておいしい

Slide 28

Slide 28 text

APPENDIX

Slide 29

Slide 29 text

Qiita • Redmine4.0でプラグインの動作確認をした • Redmineのproduction.logを監視する • AmazonES、オンプレKibanaでRedmineのパフォーマンス監視を行う • RaspberryPi3のRedmine4.0.2のデータベースをMySQLからPostgreSQLに pgloaderで移行した

Slide 30

Slide 30 text

ふだんはこういう遊びをしています 石川さんありがとう @forenoonMありがとう

Slide 31

Slide 31 text

ご静聴ありがとう ございました