Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
MySQL 4.0で9年動き続けたサーバを! 
リプレイスしてバージョンアップした話 
OKUMURA Takahiro 
MySQL Casual Talks vol.7
OKUMURA Takahiro! 
@hfm @tacahilo! 
2013年ペパボ新卒入社の2年目インフラエンジニア
今日の話 
MySQL 4.0.25で9年動き続けたサーバを,新 
しいサーバへリプレイスし,MySQL 5.0.96 
にバージョンアップした話! 
ホントはもっとバージョンを上げたかったけ 
ど,他の仕事の兼ね合いで間に合いませんで 
した...
背景 
2013年度新卒採用でペパボに入社! 
7/15からhetemlにインフラエンジニアのOJT! 
ITインフラのことは何一つ分かってなかった
MySQLとの馴れ初め
MySQLとの馴れ初め
MySQLとの馴れ初め 
規模がよくわかっておらず,ノリノリで応答している
しかし課題は山積み… 
当初はSELECT文すらろくに書けなかった(↓を埋められない) 
SELECT ????????? FROM ???????? 
知識不足経験不足,勉強も並行するとして,まずは現状の把握から…
passport0 
heteml の顧客管理DB 
2005年から投入されてるサーバ 
(hetemlサービスリリース時点で投入されたサーバの1つらしい) 
よぼよぼ
passport0 
# uname -a 
Linux passport0.heteml.jp 2.6.17-1.2142_FC4 #1 Tue Jul 
11 22:41:06 EDT 2006 x86_64 x86_64 x86_64 G...
passport系DBの構成 
MySQL ! 
4.0.25! 
! 
MASTER 
MySQL! 
5.1.49! 
! 
SLAVE 
MySQL ! 
4.0.25! 
! 
SLAVE
passport系DBの構成 
MySQL ! 
4.0.25! 
! 
MASTER 
masterしか信用出来ない… 
MySQL! 
5.1.49! 
! 
SLAVE 
MySQL ! 
4.0.25! 
! 
SLAVE 
maste...
ハードウェアがいつ死んでもおかしくない 
ソフトウェアも古く扱いづらい! 
CentOS6, MySQL X.Y.Z ( > 4.0.25) にハード 
ウェアリプレイス&ソフトウェアアップグレー 
ドしたい!!
MySQL 4.0からレプリケーション可能なバージョンは? 
各バージョンのMySQLをビルドして,4.0.25からレプリケー 
ション出来るか各バージョン毎に調べたり 
https://github.com/kamipo/mysql-buil...
MySQL 4.0! 
! 
port 3306 
VagrantのVM (1個)
MySQL 4.0! 
! 
port 3306 
MySQL 4.1! 
! 
3307 
VagrantのVM (1個)
MySQL 4.0! 
! 
port 3306 
MySQL 4.1! 
! 
3307 
VagrantのVM (1個) 
MySQL 5.0! 
! 
3308
MySQL 4.0! 
! 
port 3306 
MySQL 4.1! 
! 
3307 
VagrantのVM (1個) 
MySQL 5.0! 
! 
3308 
MySQL 5.1! 
! 
3309
MySQL 4.0! 
! 
port 3306 
MySQL 4.1! 
! 
3307 
MySQL 5.0! 
! 
3308 
MySQL 5.1! 
! 
3309 
MySQL 5.5! 
! 
3310 
VagrantのVM (...
MySQL 4.0! 
! 
port 3306 
MySQL 4.1! 
! 
3307 
MySQL 5.0! 
! 
3308 
MySQL 5.1! 
! 
3309 
MySQL 5.5! 
! 
3310 
MySQL 5.6! 
...
途中成果物 
https://speakerdeck.com/hfm/27 
https://github.com/tacahilo/mysql-allstar
MySQL 5.0化へ 
そんなこんなで検証を続け,最終的には 
MySQL 5.0へのアップグレードを計画するこ 
とにした.
MySQL 5.0化へ 
社内でMySQL 4.0 -> 5.0へのアップグレード 
経験があった(ので不安も少なめ) 
CentOS 6用のMySQL 5.0.86 rpmが社内yum 
リポジトリにあった(昔ビルドしたらしい)
passport系DBの構成 
MySQL ! 
4.0.25! 
! 
MASTER 
masterしか信用出来ない… 
MySQL! 
5.1.49! 
! 
SLAVE 
MySQL ! 
4.0.25! 
! 
SLAVE 
maste...
リプレイス概要 
MySQL ! 
4.0.25
リプレイス概要 
MySQL ! 
4.0.25 
dump
リプレイス概要 
MySQL ! 
4.0.25 
MySQL ! 
5.0.86 
dump
リプレイス概要 
MySQL ! 
4.0.25 
MySQL ! 
5.0.86! 
! 
MASTER 
dump 
MySQL ! 
5.0.86! 
! 
SLAVE
6/20 リプレイス夜間メンテナンス 
MySQL 4.0からのdump,そしてMySQL 5.0 
へのリストアが成功し,無事メンテは成功し 
たかに思えた…
!! INSERT breaks bin-log !! 
レプリケーションを作ろうとして発覚! 
INSERTクエリが実行されたときのみ,bin-log 
が壊れる現象に遭遇
!! INSERT breaks bin-log !! 
use testdb; 
INSERT INTO a_data (id, create_date) VALUES ('1', NOW());
!! INSERT breaks bin-log !! 
ERROR: Error in Log_event::read_log_event(): 'read error', 
data_len: 66899, event_type: 41 
...
!! INSERT breaks bin-log !! 
ERROR: Error in Log_event::read_log_event(): 'read error', 
data_len: 66899, event_type: 41 
...
切り戻し(メンテ失敗)
bin-log問題の調査 
@hiboma先生に助けを求めた
MySQL 5.0系のsourceとGCCバージョンの相性に問題? 
• http://bugs.mysql.com/bug.php?id=48357 
• https://gcc.gnu.org/bugzilla/show_bug.cgi?i...
MySQL 5.0系のsourceとGCCバージョンの相性に問題? 
log_event.cc: 
! 
write_str_with_code_and_len((char **)(&start), 
catalog, catalog_len,...
MySQL 5.0系のsourceとGCCバージョンの相性に問題? 
該当箇所では char * を Log_event::Byte* ( = unsigned char) として 
扱っている 
これは strict aliasing に違反...
MySQL 5.0系のsourceとGCCバージョンの相性に問題? 
MySQL 5.0にバグがあった? => NO 
GCCにバグがあった? => NO 
GCCの特定バージョン (4.3.3~4.4.0あたり) でMySQL 5.0をビルド...
MySQL 5.0系のsourceとGCCバージョンの相性に問題? 
@hiboma先生の調査メモに再現方法つきで更に詳細が載っております 
(僕自身がちゃんと問題を把握しきれてなくてすみません…) 
https://github.com/hi...
gccが悪かったのか!yum updateと-O2 
-fno-strict-aliasingで解決だ!
やった!これで行ける!! 
と思ったら
新しいGCCでrpmbuildしたら! 
別の場所でコケた
MySQLをrpmbuildする過程 
specファイルを見ると,2回ビルドしていることが分かる 
1. DEBUG=1をつけてビルドする 
• mysql-debugバイナリを生成する 
• 1回目のテストを走らせる 
2. DEBUG=0を...
MySQLをrpmbuildする過程 
specファイルを見ると,2回ビルドしていることが分かる 
1. DEBUG=1をつけてビルドする 
• mysql-debugバイナリを生成する 
• 1回目のテストを走らせる 
2. DEBUG=0を...
そのとき出ていたエラー 
RPM build errors: 
File not found: /home/vagrant/rpmbuild/BUILDROOT/MySQL-community- 
5.0.96-1.rhel5.x86_64/u...
redhat-rpm-configの罠 
Development Toolsに同梱されているrpmパッケージ 
/usr/lib/rpm/redhatにマクロやヘルパスクリプトを用意してる! 
本当ならきっとイイヤツ
/usr/lib/rpm/redhat/macros 
#=================================================================== 
# ---- Build policy macr...
/usr/lib/rpm/redhat/macros 
#=================================================================== 
# ---- Build policy macr...
yum remove redhat-rpm-macros! 
でビルド通ったーーーーーーーー
こうしてCentOS 6用! 
MySQL 5.0.96 rpmが生まれた
CentOS6 (Vagrantがオススメ) で走らせるとMySQL 5.0.96 rpmが 
出来上がるshellscript 
https://gist.github.com/tacahilo/321657c75722a24204fa
8/22 リベンジメンテ 
MySQL ! 
5.0.96! 
! 
SLAVE 
MySQL ! 
4.0.25! 
! 
MASTER
8/22 リベンジメンテ 
MySQL ! 
5.0.96! 
! 
MASTER 
MySQL ! 
4.0.25! 
!
8/22 リベンジメンテ 
MySQL ! 
4.0.25! 
! 
MySQL ! 
5.0.96! 
! 
SLAVE 
MASTER 
MySQL ! 
5.0.96! 
! 
SLAVE
8/22 リベンジメンテ 
バッチ処理や利用時間帯を考えて,2回目は早朝メンテになった. 
1回目のメンテで取ったdumpのおかげで,具体的な作業はマスタ昇格 
のみ.すぐ終わった. 
メンテ終わりに,朝日に照らされながら飲んだ珈琲が美味しかっ...
before after 
MySQL ! 
5.0.96! 
! 
MASTER 
MySQL! 
5.5.40! 
! 
SLAVE 
MySQL ! 
5.0.96! 
! 
SLAVE 
MySQL ! 
4.0.25! 
! 
MAS...
実は100%成功ではなかったり… 
MySQL 4.0にMovable Typeのデータ (UTF-8) が入っていた. 
手を変え品を変えてデータリカバリに取り組んだが,どうしてもMTの 
DBだけが壊れてしまう… 
一応現在はmiddlem...
passport0は今 
リプレイスから約一ヶ月後の9/24,サーバから応答が無くなり引退
謝辞 
当時の自分にとっては難易度が高く,何度も挫けそうになりましたが, 
先輩方の支えがあって,ここまで漕ぎ着けることが出来ました. 
やることはまだ残っていますが,ひとまずここで感謝させてください.
ご清聴! 
ありがとうございました
MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話
MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話
Upcoming SlideShare
Loading in …5
×

MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話

52,640 views

Published on

MySQL Casual Talks vol.7
http://mysql-casual.connpass.com/event/9767/

Published in: Internet
  • Be the first to comment

MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話

  1. 1. MySQL 4.0で9年動き続けたサーバを! リプレイスしてバージョンアップした話 OKUMURA Takahiro MySQL Casual Talks vol.7
  2. 2. OKUMURA Takahiro! @hfm @tacahilo! 2013年ペパボ新卒入社の2年目インフラエンジニア
  3. 3. 今日の話 MySQL 4.0.25で9年動き続けたサーバを,新 しいサーバへリプレイスし,MySQL 5.0.96 にバージョンアップした話! ホントはもっとバージョンを上げたかったけ ど,他の仕事の兼ね合いで間に合いませんで した
  4. 4. 背景 2013年度新卒採用でペパボに入社! 7/15からhetemlにインフラエンジニアのOJT! ITインフラのことは何一つ分かってなかった
  5. 5. MySQLとの馴れ初め
  6. 6. MySQLとの馴れ初め
  7. 7. MySQLとの馴れ初め 規模がよくわかっておらず,ノリノリで応答している
  8. 8. しかし課題は山積み… 当初はSELECT文すらろくに書けなかった(↓を埋められない) SELECT ????????? FROM ???????? 知識不足経験不足,勉強も並行するとして,まずは現状の把握から…
  9. 9. passport0 heteml の顧客管理DB 2005年から投入されてるサーバ (hetemlサービスリリース時点で投入されたサーバの1つらしい) よぼよぼ
  10. 10. passport0 # uname -a Linux passport0.heteml.jp 2.6.17-1.2142_FC4 #1 Tue Jul 11 22:41:06 EDT 2006 x86_64 x86_64 x86_64 GNU/Linux ! # cat /etc/redhat-release Fedora Core release 4 (Stentz) ! # mysql --version mysql Ver 12.22 Distrib 4.0.25, for unknown-linux-gnu (x86_64)
  11. 11. passport系DBの構成 MySQL ! 4.0.25! ! MASTER MySQL! 5.1.49! ! SLAVE MySQL ! 4.0.25! ! SLAVE
  12. 12. passport系DBの構成 MySQL ! 4.0.25! ! MASTER masterしか信用出来ない… MySQL! 5.1.49! ! SLAVE MySQL ! 4.0.25! ! SLAVE masterに(無い|有る)DBや ユーザがいたりしてデータ が不安 masterに(無い|有る)DBやユーザがい るし,独自パッチが当たっているし, あと一部DBの中身がぶっ壊れたまま レプリケーションしてた
  13. 13. ハードウェアがいつ死んでもおかしくない ソフトウェアも古く扱いづらい! CentOS6, MySQL X.Y.Z ( > 4.0.25) にハード ウェアリプレイス&ソフトウェアアップグレー ドしたい!!
  14. 14. MySQL 4.0からレプリケーション可能なバージョンは? 各バージョンのMySQLをビルドして,4.0.25からレプリケー ション出来るか各バージョン毎に調べたり https://github.com/kamipo/mysql-build (神) 途中,道を外してただひたすらチェインレプリケーションを行っ たりも
  15. 15. MySQL 4.0! ! port 3306 VagrantのVM (1個)
  16. 16. MySQL 4.0! ! port 3306 MySQL 4.1! ! 3307 VagrantのVM (1個)
  17. 17. MySQL 4.0! ! port 3306 MySQL 4.1! ! 3307 VagrantのVM (1個) MySQL 5.0! ! 3308
  18. 18. MySQL 4.0! ! port 3306 MySQL 4.1! ! 3307 VagrantのVM (1個) MySQL 5.0! ! 3308 MySQL 5.1! ! 3309
  19. 19. MySQL 4.0! ! port 3306 MySQL 4.1! ! 3307 MySQL 5.0! ! 3308 MySQL 5.1! ! 3309 MySQL 5.5! ! 3310 VagrantのVM (1個)
  20. 20. MySQL 4.0! ! port 3306 MySQL 4.1! ! 3307 MySQL 5.0! ! 3308 MySQL 5.1! ! 3309 MySQL 5.5! ! 3310 MySQL 5.6! ! 3311 VagrantのVM (1個)
  21. 21. 途中成果物 https://speakerdeck.com/hfm/27 https://github.com/tacahilo/mysql-allstar
  22. 22. MySQL 5.0化へ そんなこんなで検証を続け,最終的には MySQL 5.0へのアップグレードを計画するこ とにした.
  23. 23. MySQL 5.0化へ 社内でMySQL 4.0 -> 5.0へのアップグレード 経験があった(ので不安も少なめ) CentOS 6用のMySQL 5.0.86 rpmが社内yum リポジトリにあった(昔ビルドしたらしい)
  24. 24. passport系DBの構成 MySQL ! 4.0.25! ! MASTER masterしか信用出来ない… MySQL! 5.1.49! ! SLAVE MySQL ! 4.0.25! ! SLAVE masterに無いDBやユーザ がいたりしてデータが不安 masterに無いDBやユーザがいるし, 独自パッチが当たっているし,あと 一部DBの中身がぶっ壊れたままレプ リケーションしてた (再掲)
  25. 25. リプレイス概要 MySQL ! 4.0.25
  26. 26. リプレイス概要 MySQL ! 4.0.25 dump
  27. 27. リプレイス概要 MySQL ! 4.0.25 MySQL ! 5.0.86 dump
  28. 28. リプレイス概要 MySQL ! 4.0.25 MySQL ! 5.0.86! ! MASTER dump MySQL ! 5.0.86! ! SLAVE
  29. 29. 6/20 リプレイス夜間メンテナンス MySQL 4.0からのdump,そしてMySQL 5.0 へのリストアが成功し,無事メンテは成功し たかに思えた…
  30. 30. !! INSERT breaks bin-log !! レプリケーションを作ろうとして発覚! INSERTクエリが実行されたときのみ,bin-log が壊れる現象に遭遇
  31. 31. !! INSERT breaks bin-log !! use testdb; INSERT INTO a_data (id, create_date) VALUES ('1', NOW());
  32. 32. !! INSERT breaks bin-log !! ERROR: Error in Log_event::read_log_event(): 'read error', data_len: 66899, event_type: 41 Could not read entry at offset 881:Error in log format or read error # at 575 #140620 3:59:32 server id 1 end_log_pos 642 Query thread_id=575 exec_time=0 error_code=0 ! BEGIN /*!*/; -- use SYSTEMtestdb/*!*/; etstdbINSERT INTO a_data (id, create_date) VALUES ('1', /*!*/;
  33. 33. !! INSERT breaks bin-log !! ERROR: Error in Log_event::read_log_event(): 'read error', data_len: 66899, event_type: 41 Could not read entry at offset 881:Error in log format or read error # at 575 #140620 3:59:32 server id 1 end_log_pos 642 Query thread_id=575 exec_time=0 error_code=0 ! BEGIN /*!*/; -- use SYSTEMtestdb/*!*/; etstdbINSERT INTO a_data (id, create_date) VALUES ('1', /*!*/; 1. 途中挟まっている「SYSTEM」という文字列はタイムゾーン 2. 「use <database>」の間にタイムゾーンの文字が割り込む 3. INSERT文行頭に「1文字削れたDB名」がくっつき,VALUES以降が消失してしまう 4. flushすれば再開するが,結局INSERT毎にbin-logが破損してしまう
  34. 34. 切り戻し(メンテ失敗)
  35. 35. bin-log問題の調査 @hiboma先生に助けを求めた
  36. 36. MySQL 5.0系のsourceとGCCバージョンの相性に問題? • http://bugs.mysql.com/bug.php?id=48357 • https://gcc.gnu.org/bugzilla/show_bug.cgi?id=38562
  37. 37. MySQL 5.0系のsourceとGCCバージョンの相性に問題? log_event.cc: ! write_str_with_code_and_len((char **)(&start), catalog, catalog_len, Q_CATALOG_NZ_CODE); ! ! (*dst)+= len;
  38. 38. MySQL 5.0系のsourceとGCCバージョンの相性に問題? 該当箇所では char * を Log_event::Byte* ( = unsigned char) として 扱っている これは strict aliasing に違反するコードになる(難しくてよく分かってない) http://d.hatena.ne.jp/yohhoy/20120220/p1 strict aliasing に違反(あるいは有効にしている場合?)は,異なる型でポインタ を操作すると動作が未定義になるらしい => 未定義の結果として、ポインタのサイズが期待通りに計算されなくて binlog のポジションがズレて物故割れた
  39. 39. MySQL 5.0系のsourceとGCCバージョンの相性に問題? MySQL 5.0にバグがあった? => NO GCCにバグがあった? => NO GCCの特定バージョン (4.3.3~4.4.0あたり) でMySQL 5.0をビルドしようと するとバグってしまうという,組み合わせの問題っぽい • -O1でビルドするとmysqlのテストスイートがコケる • -O2でビルドするとbinlog周りのテストがコケる • -O2 -fno-strict-aliasingならテスト通る
  40. 40. MySQL 5.0系のsourceとGCCバージョンの相性に問題? @hiboma先生の調査メモに再現方法つきで更に詳細が載っております (僕自身がちゃんと問題を把握しきれてなくてすみません…) https://github.com/hiboma/hiboma/blob/master/mysql/bug-48357- binlog-corruputed.md
  41. 41. gccが悪かったのか!yum updateと-O2 -fno-strict-aliasingで解決だ!
  42. 42. やった!これで行ける!! と思ったら
  43. 43. 新しいGCCでrpmbuildしたら! 別の場所でコケた
  44. 44. MySQLをrpmbuildする過程 specファイルを見ると,2回ビルドしていることが分かる 1. DEBUG=1をつけてビルドする • mysql-debugバイナリを生成する • 1回目のテストを走らせる 2. DEBUG=0をつけてビルドする • 2回目のテストを走らせる • mysqldバイナリを生成する
  45. 45. MySQLをrpmbuildする過程 specファイルを見ると,2回ビルドしていることが分かる 1. DEBUG=1をつけてビルドする • mysql-debugバイナリを生成する • 1回目のテストを走らせる 2. DEBUG=0をつけてビルドする • 2回目のテストを走らせる • mysqldバイナリを生成する この時点でmysqld-debug.sym というファイルが生成される 何故か途中でmysqld-debug.symが消え てビルドがコケる
  46. 46. そのとき出ていたエラー RPM build errors: File not found: /home/vagrant/rpmbuild/BUILDROOT/MySQL-community- 5.0.96-1.rhel5.x86_64/usr/sbin/mysqld-debug File not found: /home/vagrant/rpmbuild/BUILDROOT/MySQL-community- 5.0.96-1.rhel5.x86_64/usr/lib64/mysql/mysqld-debug.sym
  47. 47. redhat-rpm-configの罠 Development Toolsに同梱されているrpmパッケージ /usr/lib/rpm/redhatにマクロやヘルパスクリプトを用意してる! 本当ならきっとイイヤツ
  48. 48. /usr/lib/rpm/redhat/macros #=================================================================== # ---- Build policy macros. # # #------------------------------------------------------------------- # Expanded at beginning of %install scriptlet. # ! %__spec_install_pre %{___build_pre} [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "${RPM_BUILD_ROOT}" mkdir -p `dirname "$RPM_BUILD_ROOT"` mkdir "$RPM_BUILD_ROOT" %{nil}
  49. 49. /usr/lib/rpm/redhat/macros #=================================================================== # ---- Build policy macros. # # #------------------------------------------------------------------- # Expanded at beginning of %install scriptlet. # ! %__spec_install_pre %{___build_pre} [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "${RPM_BUILD_ROOT}" mkdir -p `dirname "$RPM_BUILD_ROOT"` mkdir "$RPM_BUILD_ROOT" %{nil} %install前にディレクトリ消してる…
  50. 50. yum remove redhat-rpm-macros! でビルド通ったーーーーーーーー
  51. 51. こうしてCentOS 6用! MySQL 5.0.96 rpmが生まれた
  52. 52. CentOS6 (Vagrantがオススメ) で走らせるとMySQL 5.0.96 rpmが 出来上がるshellscript https://gist.github.com/tacahilo/321657c75722a24204fa
  53. 53. 8/22 リベンジメンテ MySQL ! 5.0.96! ! SLAVE MySQL ! 4.0.25! ! MASTER
  54. 54. 8/22 リベンジメンテ MySQL ! 5.0.96! ! MASTER MySQL ! 4.0.25! !
  55. 55. 8/22 リベンジメンテ MySQL ! 4.0.25! ! MySQL ! 5.0.96! ! SLAVE MASTER MySQL ! 5.0.96! ! SLAVE
  56. 56. 8/22 リベンジメンテ バッチ処理や利用時間帯を考えて,2回目は早朝メンテになった. 1回目のメンテで取ったdumpのおかげで,具体的な作業はマスタ昇格 のみ.すぐ終わった. メンテ終わりに,朝日に照らされながら飲んだ珈琲が美味しかった☕
  57. 57. before after MySQL ! 5.0.96! ! MASTER MySQL! 5.5.40! ! SLAVE MySQL ! 5.0.96! ! SLAVE MySQL ! 4.0.25! ! MASTER MySQL! 5.1.49! ! SLAVE MySQL ! 4.0.25! ! SLAVE
  58. 58. 実は100%成功ではなかったり… MySQL 4.0にMovable Typeのデータ (UTF-8) が入っていた. 手を変え品を変えてデータリカバリに取り組んだが,どうしてもMTの DBだけが壊れてしまう… 一応現在はmiddlemanをベースにリプレイス作業が進行中.
  59. 59. passport0は今 リプレイスから約一ヶ月後の9/24,サーバから応答が無くなり引退
  60. 60. 謝辞 当時の自分にとっては難易度が高く,何度も挫けそうになりましたが, 先輩方の支えがあって,ここまで漕ぎ着けることが出来ました. やることはまだ残っていますが,ひとまずここで感謝させてください.
  61. 61. ご清聴! ありがとうございました

×