my sql casual_in_fukuoka_vol1

50
新しいサイトを作る時 MySQL(大規模風味) 2012/06/27 Wed @Spring_MT

Upload: makoto-haruyama

Post on 29-Jan-2018

4.786 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: My sql casual_in_fukuoka_vol1

新しいサイトを作る時のMySQL(大規模風味)2012/06/27 Wed@Spring_MT

Page 2: My sql casual_in_fukuoka_vol1

自己紹介twitter id : Spring_MT

10xlabという会社で働いています

転職して福岡に来たばっかりです

インフラ、アプリと色々見ています

初心者なので皆様お手柔らかにお願いします

Page 3: My sql casual_in_fukuoka_vol1

まず今やっているプロジェクトのMySQLの構成についてお話します

結構大規模になってくれることを想定しています

Page 4: My sql casual_in_fukuoka_vol1

基本構成

Page 5: My sql casual_in_fukuoka_vol1

基本構成version : 5.5系

Engine : InnoDB(基本的に)

文字コード : UTF8

複数DBかつレプリする

初心者なので黙ってUTF8http://www.slideshare.net/tmtm/mysql-13117441

Page 6: My sql casual_in_fukuoka_vol1

SJISだと5C問題とかが

Shift_JISの2バイト目が0x5C(\)であることに起因する問題。

「表」とか死ぬ。

セキュリティホールにもなりうる。

Page 7: My sql casual_in_fukuoka_vol1

Collation(照合順序、ソート順)

collation details Ex

utf8_general_ci デフォルト ASCII/ラテン文字の大文字小文字を区別しない A=a

utf8_bin 全ての文字を区別する A!=a

utf8_unicode_ci 大文字/小文字/全角/半角/カタカナ/ひらが な/濁音を区別しない

a=A=Aは=ば=ぱ=ハ=バ=パ=ハ

collationは20種類以上あるのでここでは代表的なものを出しています

参照 :http://www.slideshare.net/tmtm/mysql-13117441

Page 8: My sql casual_in_fukuoka_vol1

日付と時刻特殊な振る舞いはともかく、TIMESTAMPはDATATIMEよりもストレージ効率がよいため、TIMESTAMPを使用できる場合は一般にそれを使用すべきである。UNIXのタイムスタンプを整数値として格納することもあるが、通常はそうしたところで何の得もない。その形式は何かと扱いにくいので、お勧めしない。

実践ハイパフォーマンスMySQL 第2版 p94より抜粋

Page 9: My sql casual_in_fukuoka_vol1

日付と時刻TIMESTAMP カラムの値は、ストレージでは現在のタイム ゾーンから UTC へ、読み出しでは UTC からカレントのタイム ゾーンに変換します。

これだと、サーバーのタイムゾーンに依存するのでアプリ側で GMTに揃えて、DATETIME型で保存する予定

Page 10: My sql casual_in_fukuoka_vol1

Join

Page 11: My sql casual_in_fukuoka_vol1

Join

DBをわけることを前提にしているので基本Joinしない(もうRDBじゃないじゃん >_<)

ただし要件による

Page 12: My sql casual_in_fukuoka_vol1

Replication

Page 13: My sql casual_in_fukuoka_vol1

Replication

レプリはします!

master 1 : slave : 4

Page 14: My sql casual_in_fukuoka_vol1

構成DB

master(user)

レプリ

DBslaveDB

slaveDBslaveDB

slave

DBmaster

(user)

DBslaveDB

slaveDBslaveDB

slave

レプリ

Page 15: My sql casual_in_fukuoka_vol1

レプリ遅延masterからslaveにレプリする際、どうしても遅延する

開発の時に気付きにくい

開発では、故意にレプリを遅らせるmaster slaveの接続を意識してアプリを作る

Page 16: My sql casual_in_fukuoka_vol1

pt-slave-delay

Percona Toolkitの中のツールの一つ

STOP SLAVEとSTART SLAVEを定期的に打ってレプリが遅延しているように見せている

Page 17: My sql casual_in_fukuoka_vol1

Percona Toolkit

Maatkitを継承してるツール

Maatkitにあって、Perconaにないツールもある

Page 18: My sql casual_in_fukuoka_vol1

$ cpanm DBD::mysql$ brew install percona-toolkit$ pt-slave-delay --delay 1m --interval 1m -u root -p xxxx -h slavehost

2012-06-26T23:09:50 slave running 0 seconds behind2012-06-26T23:09:50 STOP SLAVE until 2012-06-26T23:10:50 at master position mysql-bin.000002/2357102012-06-26T23:10:50 no new binlog events2012-06-26T23:11:50 START SLAVE until master 2012-06-26T23:10:50 mysql-bin.000002/235894

--daemonizeオプションもありますSUPER or REPLICATION CLIENTの権限が必要

Page 19: My sql casual_in_fukuoka_vol1

MASTER_DELAYオプション

MySQL 5.6からは、CHANGE MASTER TOコマンドにおいて、MASTER_DELAYオプションで指定できるようになります(秒単位)

Page 20: My sql casual_in_fukuoka_vol1

Sharding

Page 21: My sql casual_in_fukuoka_vol1

Shardingとは

マスター分割のこと

基本的に、shardすることを前提にしています

shardすると色々と問題が、、、

Page 22: My sql casual_in_fukuoka_vol1

AUTO_INCREMENT

Page 23: My sql casual_in_fukuoka_vol1

AUTO_INCREMENT

基本的にshardすることを考えているので、AUTO_INCREMENTは使わない

AUTO_INCREMENTした場合は、IDの発行にずれがでる

Page 24: My sql casual_in_fukuoka_vol1

User

Shardなしの場合 Shardありの場合

user_id : 1user_id : 2user_id : 3user_id : 4user_id : 5・・

Usershard1

Usershard2

Usershard3

user_id : 1user_id : 2user_id : 3user_id : 4user_id : 5・・

user_id : 1user_id : 2user_id : 3user_id : 4user_id : 5・・

user_id : 1user_id : 2user_id : 3user_id : 4user_id : 5・・

ID発行に重複がでてしまう!

Page 25: My sql casual_in_fukuoka_vol1

sequenceテーブル

SequenceCREATE TABLE `sequence` ( `id` bigint(20) unsigned NOT NULL) ENGINE=MyISAM;

AppUPDATE sequence SET id=LAST_INSERT_ID(id+1);

①ID発行

Usershard1

Usershard2

Usershard3

②発行されたIDを使ってINSERT

SELECT LAST_INSERT_ID();

Page 26: My sql casual_in_fukuoka_vol1

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

Page 27: My sql casual_in_fukuoka_vol1

Index

Page 28: My sql casual_in_fukuoka_vol1

HandlerSocket

Page 29: My sql casual_in_fukuoka_vol1

HandlerSocket

MySQLデータベースへのアクセスを高速化するためのプラグインです。MySQLのSQLパーザをすっ飛ばし、ネットワーク通信とマルチスレッド処理周辺を置き換えることによって、InnoDB等のデータベースエンジンの性能を限界まで引き出します。

http://engineer.dena.jp/2010/08/handlersocket-plugin-for-mysql.html より抜粋

Page 30: My sql casual_in_fukuoka_vol1

MySQLのプラグイン

単純なデータの書き込み、読み出しを高速に処理できる

トランザクションはない

Page 31: My sql casual_in_fukuoka_vol1

HandlerSocket

ストレージエンジン

MySQLクライアント

SQLレイヤー

HandlerSocket

ポート 3306基本はこっちレプリはこっち

ポート9998 or 9999回数が多い or

Page 32: My sql casual_in_fukuoka_vol1

Install Handler Socket@Server

Page 33: My sql casual_in_fukuoka_vol1

# 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): Can't 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

Page 34: My sql casual_in_fukuoka_vol1

Install Handler Socket@Client (Ruby)

Page 35: My sql casual_in_fukuoka_vol1

$ 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

Page 36: My sql casual_in_fukuoka_vol1

サンプルコード#!/usr/bin/env ruby# encoding: UTF-8

require 'handler_socket'require '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.close

CREATE DATABASE test_haru;CREATE TABLE `test` ( `id` int(11) NOT NULL, `data` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;

Page 37: My sql casual_in_fukuoka_vol1

パフォーマンス

今回は時間がなく、自分ではベンチとってないです>_<

参照に関してはIndexありInnoDBやmemdよりも約8倍位のパフォーマンスが出ています

NoSQL データベースファーストガイドより

Page 38: My sql casual_in_fukuoka_vol1

MHA

Page 39: My sql casual_in_fukuoka_vol1

MHAMySQL Master High Availabilitymanager and tools (MySQL MHA)

master/slaveのズレを解消して、自動でフェイルオーバーさせる

障害 -> master切替 -> 通知までの一連の処理をしてくれる

手動切替にも対応しています

Page 40: My sql casual_in_fukuoka_vol1

まず、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

Page 41: My sql casual_in_fukuoka_vol1

Q4M

Page 42: My sql casual_in_fukuoka_vol1

Q4Mとは

MySQLのストレージエンジンとして実装されてるMessage Queue

MySQL 5.1系だけが対応

トランザクションはない

レスポンスを期待するのがジョブキュー,レスポンスを必要としないのがメッセージキュー参照 : http://gihyo.jp/dev/serial/01/perl-hackers-hub/001001

Page 43: My sql casual_in_fukuoka_vol1

ちょっとした Tips

Page 44: My sql casual_in_fukuoka_vol1

INSERT ... ON DUPLICATE KEY UPDATE 構文UNIQUE インデックスか PRIMARY KEY 内で重複してる値をINSERTした場合、古い行のUPDATEが実行される

重複しているか確認する必要がないので便利だが、扱いに気をつけないと・・・

複合UNIQUEキーがあっても「複数の固有インデックス」さえなければ「INSERT ... ON DUPLICATE KEY UPDATE」構文は使える

Page 45: My sql casual_in_fukuoka_vol1

YAPC

Page 47: My sql casual_in_fukuoka_vol1

参照HandlerSocket plugin for MySQL : http://www.slideshare.net/akirahiguchi/handlersocket-plugin-for-mysql-4664154

HandlerSocketソースコード公開しました : http://engineer.dena.jp/2010/08/handlersocket-plugin-for-mysql.html

ahiguti / HandlerSocket-Plugin-for-MySQL : https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL

Can't 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/58

HandlerSocket Make MySQLD got signal 11 : https://github.com/DeNADev/HandlerSocket-Plugin-for-MySQL/issues/66

CentOSにMySQLとHandler Socketを入れてみる : http://d.hatena.ne.jp/kotaroito2002/20111213/1323755054

handlersocket(ruby client) : https://github.com/miyucy/handlersocket

HandlerSocket pluginのRubyバインディングを作りました : http://d.hatena.ne.jp/winebarrel/20100828/p1

Page 48: My sql casual_in_fukuoka_vol1

参照

Percona Toolkit Documentation : http://www.percona.com/doc/percona-toolkit/2.1/index.html

mk-slave-delay : http://www.maatkit.org/doc/mk-slave-delay.html

Page 50: My sql casual_in_fukuoka_vol1

参照#mysqlbt : http://topsy.com/s?offset=160&om=aaaaaaaaaaaaaaaa&page=17&q=%23mysqlbt&window=d25

初心者向けMySQLの始め方 : http://www.slideshare.net/tmtm/mysql-13117441

MySQL biginners talk : http://togetter.com/li/311837

NHNテクノロジーカンファレンスでしゃべって来た : http://blog.riywo.com/2012/05/22/033512

NHNテクノロジーカンファレンスで見た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/