O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

My sql casual_in_fukuoka_vol1

4.795 visualizações

Publicada em

  • Seja o primeiro a comentar

My sql casual_in_fukuoka_vol1

  1. 1. 新しいサイトを作る時のMySQL(大規模風味)2012/06/27 Wed@Spring_MT
  2. 2. 自己紹介 twitter id : Spring_MT 10xlabという会社で働いています 転職して福岡に来たばっかりです インフラ、アプリと色々見ています初心者なので皆様お手柔らかにお願いします
  3. 3. まず今やっているプロジェクトのMySQLの構成についてお話します結構大規模になってくれることを想定しています
  4. 4. 基本構成
  5. 5. 基本構成version : 5.5系Engine : InnoDB(基本的に)文字コード : UTF8複数DBかつレプリする 初心者なので黙ってUTF8 http://www.slideshare.net/tmtm/mysql-13117441
  6. 6. SJISだと5C問題とかがShift_JISの2バイト目が0x5C()であることに起因する問題。「表」とか死ぬ。セキュリティホールにもなりうる。
  7. 7. Collation(照合順序、ソート順) collation details Ex ASCII/ラテン文字の大文字小文字 utf8_general_ci デフォルト を区別しない A=a utf8_bin 全ての文字を区別する A!=a 大文字/小文字/全角/半角/カタカ a=A=A utf8_unicode_ci ナ/ひらが な/濁音を区別しない は=ば=ぱ=ハ=バ=パ=ハcollationは20種類以上あるのでここでは代表的なものを出しています参照 :http://www.slideshare.net/tmtm/mysql-13117441
  8. 8. 日付と時刻特殊な振る舞いはともかく、TIMESTAMPはDATATIMEよりもストレージ効率がよいため、TIMESTAMPを使用できる場合は一般にそれを使用すべきである。UNIXのタイムスタンプを整数値として格納することもあるが、通常はそうしたところで何の得もない。その形式は何かと扱いにくいので、お勧めしない。 実践ハイパフォーマンスMySQL 第2版 p94より抜粋
  9. 9. 日付と時刻 TIMESTAMP カラムの値は、ストレージでは現在 のタイム ゾーンから UTC へ、読み出しでは UTC からカレントのタイム ゾーンに変換します。これだと、サーバーのタイムゾーンに依存するのでアプリ側で GMTに えて、DATETIME型で保存する予定
  10. 10. Join
  11. 11. JoinDBをわけることを前提にしているので基本Joinしない(もうRDBじゃないじゃん >_<)ただし要件による
  12. 12. Replication
  13. 13. Replicationレプリはします!master 1 : slave : 4
  14. 14. 構成 DB DB slave DB slave master レプリ DB (user) DB slave slave DB DB slave DB slave レプリ DB master (user) DB slave slave
  15. 15. レプリ遅延 masterからslaveにレプリする際、どうしても遅延 する 開発の時に気付きにくい 開発では、故意にレプリを遅らせるmaster slaveの接続を意識してアプリを作る
  16. 16. pt-slave-delayPercona Toolkitの中のツールの一つSTOP SLAVEとSTART SLAVEを定期的に打ってレプリが遅延しているように見せている
  17. 17. Percona ToolkitMaatkitを継承してるツールMaatkitにあって、Perconaにないツールもある
  18. 18. $ cpanm DBD::mysql$ brew install percona-toolkit$ pt-slave-delay --delay 1m --interval 1m -u root -p xxxx -h slavehost2012-06-26T23:09:50 slave running 0 seconds behind2012-06-26T23:09:50 STOP SLAVE until 2012-06-26T23:10:50 atmaster position mysql-bin.000002/2357102012-06-26T23:10:50 no new binlog events2012-06-26T23:11:50 START SLAVE until master2012-06-26T23:10:50 mysql-bin.000002/235894--daemonizeオプションもありますSUPER or REPLICATION CLIENTの権限が必要
  19. 19. MASTER_DELAYオプションMySQL 5.6からは、CHANGE MASTER TOコマンドにおいて、MASTER_DELAYオプションで指定できるようになります(秒単位)
  20. 20. Sharding
  21. 21. Shardingとはマスター分割のこと基本的に、shardすることを前提にしていますshardすると色々と問題が、、、
  22. 22. AUTO_INCREMENT
  23. 23. AUTO_INCREMENT基本的にshardすることを考えているので、AUTO_INCREMENTは使わない AUTO_INCREMENTした場合は、IDの発行にず れがでる
  24. 24. Shardなしの場合 Shardありの場合 User User User User shard1 shard2 shard3 user_id : 1 user_id : 1 user_id : 1 user_id : 1 user_id : 2 user_id : 2 user_id : 2 user_id : 2 user_id : 3 user_id : 3 user_id : 3 user_id : 3 user_id : 4 user_id : 4 user_id : 4 user_id : 4 user_id : 5 user_id : 5 user_id : 5 user_id : 5 ・ ・ ・ ・ ・ ・ ・ ・ ID発行に重複がでてしまう!
  25. 25. sequenceテーブル CREATE TABLE `sequence` ( `id` bigint(20) unsigned NOT NULL ①ID発行 Sequence ) ENGINE=MyISAM; UPDATE sequence SET id=LAST_INSERT_ID(id+1);App User ②発行されたIDを使ってINSERT shard1 User SELECT LAST_INSERT_ID(); shard2 User shard3
  26. 26. LAST_INSERT_IDUPDATE seq_user SET id=LAST_INSERT_ID(id+1)とかでupdateを打ってIDをインクリメントした場合、生成された ID は、接続ベースで サーバ内で保持されるなので、update打ったあとに違う接続でupdateを打っても、SELECT LAST_INSERT_IDの値は変化しない。http://dev.mysql.com/doc/refman/5.1/ja/information-functions.html
  27. 27. Index
  28. 28. HandlerSocket
  29. 29. HandlerSocket MySQLデータベースへのアクセスを高速化するた めのプラグインです。MySQLのSQLパーザをすっ 飛ばし、ネットワーク通信とマルチスレッド処理 周辺を置き換えることによって、InnoDB等のデー タベースエンジンの性能を限界まで引き出します。http://engineer.dena.jp/2010/08/handlersocket-plugin-for-mysql.html より抜粋
  30. 30. MySQLのプラグイン単純なデータの書き込み、読み出しを高速に処理できるトランザクションはない
  31. 31. HandlerSocket ポート 3306 SQL 基本はこっち レイヤー レプリはこっちMySQL ストレージクライ エンジンアント ポート9998 or 9999 Handler 回数が多い or Socket
  32. 32. Install Handler Socket@Server
  33. 33. # wget http://ftp.jaist.ac.jp/pub/Linux/Fedora/updates/16/SRPMS/mysql-5.5.23-1.fc16.src.rpm# rpm2cpio mysql-5.5.23-1.fc16.src.rpm | cpio -id# tar zxvf mysql-5.5.23-nodocs.tar.gz# cd ../# git clone https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL.git# yum install libtool# yum install gcc gcc-c++# cd HandlerSocket-Plugin-for-MySQL# ./autogen.sh# ./configure --with-mysql-source=/root/src/mysql/mysql-5.5.23 --with-mysql-bindir=/usr/bin --with-mysql-plugindir=/usr/lib64/mysql/plugin# find ./ | xargs grep "DMY_PTHREAD_FASTMUTEX"DMY_PTHREAD_FASTMUTEXがあるところを消す!(Fedora 16)ERROR 1126 (HY000): Cant open shared library /usr/lib64/mysql/plugin/handlersocket.so (errno: 2 /usr/lib64/mysql/plugin/handlersocket.so: undefined symbol: my_pthread_fastmutex_lock)# make# make install# ls /usr/lib64/mysql/plugin/handlersocket*/usr/lib64/mysql/plugin/handlersocket.a /usr/lib64/mysql/plugin/handlersocket.so /usr/lib64/mysql/plugin/handlersocket.so.0.0.0/usr/lib64/mysql/plugin/handlersocket.la /usr/lib64/mysql/plugin/handlersocket.so.0
  34. 34. Install Handler Socket@Client (Ruby)
  35. 35. $ git clone https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL.git$ cd HandlerSocket-Plugin-for-MySQL/$ ./autogen.sh$ ./configure --disable-handlersocket-server$ make$ sudo make install$ gem install handlersocket・handler_socket.cc:2:10: fatal error: hstcpcli.hpp file not found#include "hstcpcli.hpp" ^1 error generated.make: *** [handler_socket.o] Error 1$ vim extconf.rb$CFLAGS << " -I/usr/include/handlersocket"↓$CFLAGS << " -I/usr/local/include/handlersocket"$ ruby extconf.rb$ makecompiling handler_socket.cc3 warnings generated.linking shared-object handler_socket.bundle$ sudo make install/usr/bin/install -c -m 0755 handler_socket.bundle /Users/makotoharuyama/.rbenv/versions/1.9.3-p125/lib/ruby/site_ruby/1.9.1/x86_64-darwin11.3.0installing default handler_socket libraries
  36. 36. サンプルコード#!/usr/bin/env ruby# encoding: UTF-8require handler_socketrequire ap@hs = HandlerSocket.new(:host => 192.168.110.25, :port =>9998)@hs.open_index(1, hs_test, test, PRIMARY, data)ap @hs.execute_single(1, =, [1], 1,0)@hs.closeCREATE DATABASE test_haru;CREATE TABLE `test` ( `id` int(11) NOT NULL, `data` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
  37. 37. パフォーマンス今回は時間がなく、自分ではベンチとってないです>_<参照に関してはIndexありInnoDBやmemdよりも約8倍位のパフォーマンスが出ています NoSQL データベースファーストガイドより
  38. 38. MHA
  39. 39. MHAMySQL Master High Availabilitymanager and tools(MySQL MHA)master/slaveのズレを解消して、自動でフェイルオーバーさせる障害 -> master切替 -> 通知までの一連の処理をしてくれる手動切替にも対応しています
  40. 40. まず、sshのkeyを登録しておくMySQLの権限を振っておく(remoteからのアクセスとレプリ)nodeをrpmで入れておく# vim /etc/app.cnf[server default]# mysql user and passworduser=rootpassword=rootssh_user=rootrepl_password=xxxxxx# working directory on the managermanager_workdir=/var/log/masterha/app1# working directory on MySQL serversremote_workdir=/var/log/masterha/app1[server1]hostname=192.168.110.27[server2]hostname=192.168.110.28# masterha_check_ssh --conf=/etc/app.cnf# masterha_check_repl --conf=/etc/app.cnf
  41. 41. Q4M
  42. 42. Q4Mとは MySQLのストレージエンジンとして実装されてる Message Queue MySQL 5.1系だけが対応 トランザクションはないレスポンスを期待するのがジョブキュー,レスポンスを必要としないのがメッセージキュー参照 : http://gihyo.jp/dev/serial/01/perl-hackers-hub/001001
  43. 43. ちょっとした Tips
  44. 44. INSERT ... ON DUPLICATEKEY UPDATE 構文UNIQUE インデックスか PRIMARY KEY 内で重複してる値をINSERTした場合、古い行のUPDATEが実行される重複しているか確認する必要がないので便利だが、扱いに気をつけないと・・・複合UNIQUEキーがあっても「複数の固有インデックス」さえなければ「INSERT ... ON DUPLICATE KEY UPDATE」構文は使える
  45. 45. YAPC
  46. 46. 参照MySQL サーバのタイム ゾーン サポート : http://dev.mysql.com/doc/refman/5.1/ja/time-zone-support.htmlINSERT ... ON DUPLICATE KEY UPDATE 構文 : http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html複合UNIQUEキーでも「INSERT ... ON DUPLICATE KEY UPDATE」構文は使える : http://d.hatena.ne.jp/IwamotoTakashi/20080329/p1
  47. 47. 参照HandlerSocket plugin for MySQL : http://www.slideshare.net/akirahiguchi/handlersocket-plugin-for-mysql-4664154HandlerSocketソースコード公開しました : http://engineer.dena.jp/2010/08/handlersocket-plugin-for-mysql.htmlahiguti / HandlerSocket-Plugin-for-MySQL : https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQLCant load handlersocket.so with Mysql 5.5.12 (and 5.5.13) on Fedora 15 x86_64 : https://github.com/DeNADev/HandlerSocket-Plugin-for-MySQL/issues/58HandlerSocket Make MySQLD got signal 11 : https://github.com/DeNADev/HandlerSocket-Plugin-for-MySQL/issues/66CentOSにMySQLとHandler Socketを入れてみる : http://d.hatena.ne.jp/kotaroito2002/20111213/1323755054handlersocket(ruby client) : https://github.com/miyucy/handlersocketHandlerSocket pluginのRubyバインディングを作りました : http://d.hatena.ne.jp/winebarrel/20100828/p1
  48. 48. 参照Percona Toolkit Documentation : http://www.percona.com/doc/percona-toolkit/2.1/index.htmlmk-slave-delay : http://www.maatkit.org/doc/mk-slave-delay.html
  49. 49. 参照Introducing MySQL MHA (JP/LT) : http://www.slideshare.net/matsunobu/introducing-mysql-mha-jpltmysql-master-ha : http://code.google.com/p/mysql-master-haQ4M : http://q4m.github.com/Q4M dist : http://q4m.kazuhooku.com/dist/Q4Mを簡単に導入する方法 : http://blog.nomadscafe.jp/2011/12/q4m---mysql-casual-advent-calendar-2011.htmlバイナリ版Q4Mインストールメモ : http://blog.nomadscafe.jp/archives/000737.html
  50. 50. 参照#mysqlbt : http://topsy.com/s?offset=160&om=aaaaaaaaaaaaaaaa&page=17&q=%23mysqlbt&window=d25初心者向けMySQLの始め方 : http://www.slideshare.net/tmtm/mysql-13117441MySQL biginners talk : http://togetter.com/li/311837NHNテクノロジーカンファレンスでしゃべって来た : http://blog.riywo.com/2012/05/22/033512NHNテクノロジーカンファレンスで見たDeNAのMySQL運用の話とAmazon RDSの比較など。 : http://debiancdn.wordpress.com/2012/05/20/nhn%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%E3%81%A7%E8%A6%8B%E3%81%9Fdena%E3%81%AEmysql%E9%81%8B%E7%94%A8%E3%81%AE/

×