Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
1台から500台までの
   MySQL運用
(YAPC::Asia2012編)
    長野雅広 (kazeburo)
Me
• 長野雅広
• @kazeburo
• CPAN:KAZEBURO
• Operations Engineer
  Site Reliability, 運用系小姑,
  NHN Japan
Me
Me
perlの話
Recent CPAN modules
 •   Apache::BumpyLife

 •   Twiggy::Prefork

 •   Module::Install::ShareFile

 •   App::LoadWatcher

 •   File::RotateLogs

 •   Plack::Middleware::AxsLog

 •   Proclet

 •   DBIx::DSN::Resolver [new!]
Proclet
          minimalistic supervisor

use Proclet::Declare;

env(
   PLACK_ENV => 'development',
   LM_COLOR => 1,
);

service('web', 'plackup -p 9413 app.psgi');
service('memcached', qw!/usr/bin/memcached -p 11211!);
service('worker', sub { MyWorker->run });

worker( worker => 2 );

run;
proclet
           foreman for perl

% cat Procfile
worker: ./bin/worker
web: plackup web.psgi
% proclet start --color
1台から500台までの
  MySQL運用
MySQL Beginners Talks




  http://www.slideshare.net/kazeburo/1500mysql-mysql-beginners   491 users
MySQL Beginners Talks
       振り返り
                  1
MySQL Beginners Talks
       振り返り
                  2
MySQL Beginners Talks
       振り返り
                  3
MySQL Beginners Talks
       振り返り
                  4
MySQL Begineersで話した
 5つのMySQL運用ポイント

• MySQL 5.1 or 5.5 InnoDB Plugin
• my.cnfの共通化
• no-MyISAM
• ログ系テーブルに注意
• モニタリング
今日のお題
livedoor Blog
    since 2003
livedoorBlog
• 来年で10年
• 国内最大級
 • 80億PV/month
 • 1億PV/monthを超えるblog多数
• 総トラフィック: 20+Gbps
• 記事データ: 2+TB
構成

  PC         mobile          PC          mobile
CMS APP     CMS APP          APP          APP
                                                                   Spam
                                                  STF   Analyzer
                                                                   Filter
              Job     Main         Clustered
memcached
             Queue    DB              DB




                      コア                          画像    ログ スパム
Database Sharding
SELECT node
 from blog
   where
  id = 941

                                         App

              ①                                              ②
               Mapping     Cluster   Cluster   Cluster   Cluster   Cluster
              (Main DB)       1         2         3         4         5




                          すごく.. 古典的です..///
dbm           dbm           dbm           dbm           dbm

dbs     dbs   dbs     dbs   dbs     dbs   dbs     dbs   dbs     dbs

  dbm           dbm           dbm           dbm           dbm

dbs     dbs   160cluster
              dbs     dbs   dbs     dbs   dbs     dbs   dbs     dbs

      dbm   dbm*1 dbs*2+
                    dbm           dbm           dbm           dbm

dbs     dbs
            => 500 servers
              dbs     dbs   dbs     dbs   dbs     dbs   dbs     dbs

  dbm           dbm           dbm           dbm           dbm

dbs    dbs    dbs    dbs    dbs    dbs    dbs    dbs    dbs    dbs
歴史の積み重ね
• CPU: Pen4 ∼ Quad Core Xeon
• Memory: 2GB ∼ 16GB
• OS: FeeBSD・CentOS4.x∼5.x
• サーバによって異なるmy.cnf・
 MyISAMのテーブル・Index不足
      ,,、,、、,,,';i;'i,}、,、
       ヾ、'i,';¦¦i !} 'i, ゙〃
        ゙、';¦i,!  'i i"i,       、__人_从_人__/し、_人_入
         `、¦¦i ¦i i l¦,      、_)
          ',¦¦i }i ¦ ;,〃,,     _) 集約だ∼っ!!
          .}.¦¦¦¦ ¦ ! l-' 、ミ    `)
         ,<.}¦¦¦ il/,-'liヾ;;ミ   '́͡V^'^Y͡V^V͡W^Y͡
        .{/゙'、}¦¦¦//  .i¦ };;;ミ
        Y,;-   ー、  .i¦,];;彡
        iil¦¦¦¦¦liill¦¦¦¦¦¦¦¦li!=H;;;ミミ
        {  く;ァソ  '';;,;'' ゙};;彡ミ
         ゙i [`''' ヾ. '' ¦¦^!,彡ミ   _,,__
          ゙i }  } ';;:;li, ゙iミミミ=三=-;;;;;;;;;''
,,,,---''''''} ̄ フハ, 二゙́ ,;/;;'_,;,7'' ,-''::;;;;;;;;;;;;;'',,=''
 ;;;;;;;;''''/_  / ¦ ¦ `ー--'́_,,,-',,r' `ヽ';;:;;;;;;;, '';;;-'''
'''''  ,r' `V ヽニニニ二、-'{ 十 )__;;;;/
集約化によって目指すもの


• TCO削減
• 安定性
• パフォーマンス向上
集約化方法
    m           m
s       s   s       s    dbm
    m           m       dbs   dbs
s       s   s       s



    (1) 1台のサーバに複数のmysqld
(2) 1つのmysqldに複数のデータベース
集約化方法 (1)
•   Pros                     Cluster
                               1
                                       Cluster
                                         2
                                                 Cluster
                                                   3
                                                           Cluster
                                                             4
    •   レプリケーションを使いなが
        ら、サービスの停止なく移行
        可能

•
                             Cluster   Cluster   Cluster   Cluster
    Cons                       1         2         3         4

    •   元のサーバの性能差やデータ
                             mysqld
                             (3401)
                                       mysqld
                                       (3402)
                                                 mysqld
                                                 (3403)
                                                           mysqld
                                                           (3404)
        量を考慮にいれたbuffer_pool
        サイズの調整が必要                         dbm
    •   複数プロセスの管理
集約化方法(2)
•
                         Cluster   Cluster   Cluster   Cluster
    Pros                   1         2         3         4

    •   細かい buffer_pool
        の調整が必要なく、効率性も
        高い

    •   プロセスが1つなので運用の    Cluster   Cluster   Cluster   Cluster

        手間は少ない             1         2         3         4


•   Cons
                                      mysqld
    •   データベース名を変更するた
        めのメンテナンス時間が必要                 dbm
採用
           集約化方法(2)
•
                         Cluster   Cluster   Cluster   Cluster
    Pros                   1         2         3         4

    •   細かい buffer_pool
        の調整が必要なく、効率性も
        高い

    •   プロセスが1つなので運用の    Cluster   Cluster   Cluster   Cluster

        手間は少ない             1         2         3         4


•   Cons
                                      mysqld
    •   データベース名を変更するた
        めのメンテナンス時間が必要                 dbm
2011-09-14
        未明実施


8/27            10/13-15
手順(前日まで)
Cluster   Cluster   Cluster   Cluster
  1         2         3         4




Cluster   Cluster   Cluster   Cluster   mysqld
  1         2         3         4
                                        dbm
mysqld    mysqld    mysqld    mysqld
(3401)    (3402)    (3403)    (3404)




             仮db                                 mysqld

                                                  dbs
手順(前日まで)
Cluster   Cluster   Cluster   Cluster
  1         2         3         4       レプリケーション
                                            構築と
                                         ALTER TABLE


Cluster   Cluster   Cluster   Cluster                  mysqld
  1         2         3         4
                                                       dbm
mysqld    mysqld    mysqld    mysqld
(3401)    (3402)    (3403)    (3404)




             仮db                                                mysqld

                                                                 dbs
手順(前日まで)
Cluster   Cluster   Cluster   Cluster
  1         2         3         4       レプリケーション
                                            構築と
                                         ALTER TABLE


Cluster   Cluster   Cluster   Cluster                   mysqld
  1         2         3         4
                                                        dbm
mysqld    mysqld    mysqld    mysqld
(3401)    (3402)    (3403)    (3404)


                                                   レプリケーション
             仮db                                                 mysqld

                                                                  dbs
手順(当日)
Cluster   Cluster   Cluster   Cluster
  1         2         3         4




Cluster   Cluster   Cluster   Cluster   mysqld
  1         2         3         4
                                        dbm
mysqld    mysqld    mysqld    mysqld
(3401)    (3402)    (3403)    (3404)




             仮db                                 mysqld

                                                  dbs
手順(当日)
Cluster   Cluster   Cluster   Cluster
  1         2         3         4




Cluster   Cluster   Cluster   Cluster   mysqld
  1         2         3         4
                                        dbm
mysqld    mysqld    mysqld    mysqld
(3401)    (3402)    (3403)    (3404)




             仮db                                 mysqld

                                                  dbs
手順(当日)
Cluster   Cluster   Cluster   Cluster
  1         2         3         4
                                        Cluster   Cluster   Cluster   Cluster
                                          1         2         3         4



Cluster   Cluster   Cluster   Cluster                mysqld
  1         2         3         4
                                                     dbm
mysqld    mysqld    mysqld    mysqld
(3401)    (3402)    (3403)    (3404)



               mysqldump cluster ¦
             仮db                                                  mysqld
          ssh dbm cat ¦ mysql ${n}_cluster
                                                                      dbs
手順(後日)

       Cluster   Cluster   Cluster   Cluster
         1         2         3         4



                    mysqld

                    dbm


                                 mysqld

仮db                                  dbs
手順(後日)

       Cluster   Cluster   Cluster   Cluster
         1         2         3         4



                    mysqld

                    dbm


         mysqld                  mysqld

仮db        dbs                       dbs
集約対象
160 cluster => 20+ cluster


         = 作業対象サーバ
えーマジ
        手作業!?
自動化必須

        手作業が許されるのは
        小学生までだよねー
自動化

• 実行時に外から情報を与える
 (コマンド引数などとして)
自動化

• 実行時に外から情報を与える
 (コマンド引数などとして)

• 事前情報からサーバ自身でなすべきこと
 を知る
Matrix (表)
#cluster id        #work2dbm
#from #to          #id #work         #dbm
1     1            1   10.94.18.30   10.94.14.30
51    1            2   10.94.18.31   10.94.14.31
57    1            3   10.94.18.32   10.94.14.32
65    1            4   10.94.18.33   10.94.14.33
2     2            5   10.94.18.34   10.94.14.34
39    2            6   10.94.19.30   10.94.15.30
77    2            7   10.94.19.31   10.94.15.31
91    2            8   10.94.19.32   10.94.15.32
3     3            9   10.94.19.33   10.94.15.33
29    3            10 10.94.19.34    10.94.15.34
85    3            11 10.94.14.35    10.94.16.35
4     4            12 10.94.14.36    10.94.16.36
52    4            13 10.94.14.37    10.94.16.37
78    4            14 10.94.14.38    10.94.16.38
Matrixからの設定生成
while(my $l=<DATA>){
   my ($cluster, $node) = split /s+/, $l;
   push @{$nodes{$node}}, $cluster;
}
for my $node ( sort { $a <=> $b } keys %nodes ) {
   open( my $fh, '>', sprintf("my_%d.cnf",$node));
   print $fh $tx->render('my.cnf.tx',
       { clusters => $nodes{$node} });
}
#from #to
__DATA__
1      1
51     1
2      2
Matrixからの設定生成
[mysqld]
innodb_buffer_pool_size = 4G
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

: for $clusters -> $cluster {
[mysqld<: $~cluster.count :>]
server-id = <: $cluster + 10000 :>
datadir = /var/lib/mysql_<: $cluster + 13000 :>
socket   = /tmp/mysql_<: $cluster + 13000 :>.sock
pid-file = /var/run/mysql_<: $cluster + 13000 :>.pid
port     = <: $cluster + 13000 :>
: }
Matrixを利用した自動化
set -e
CDIR=$(cd $(dirname $0) && pwd)
#id #work       #dbm
SRV=$(cat <<"EOF"
1   10.94.18.30 10.94.14.30
2   10.94.18.31 10.94.14.31
3   ...
EOF
)
IPADDR=$(ifconfig eth1 |grep inet|
  awk -F: '{print $2}'|awk '{print $1}')
CID=$(echo "$SRV" | grep $IPADDR | awk '{print $1}')

cp $CDIR/my_$CID.cnf /etc/my.cnf
for datadir in $(grep datadir /etc/my.cnf|sed 's/datadir=//')
do
   /mysql_install_db --datadir=$datadir
done
atnodes を使った一括実行

$ cpanm SSH::Batch

$ atnodes ‘git   clone git://./setup.git’ dbs02.[01-20].cluster
==============   dbs02.01.cluster =============
..
==============   dbs02.02.cluster =============
..
$ atnodes -c 4   ‘sh ./setup/setup.sh’ dbs02.[01-20].cluster
==============   dbs02.01.cluster =============
..
==============   dbs02.02.cluster =============
..
当日
コマンド1つ!
$ atnodes -c 10 ‘sh ./setup/copy.sh’ dbs02.[01..20].cluster
============== dbs02.01.cluster =============
..
============== dbs02.02.cluster =============
..
無事に朝を迎える
後作業
Recreate Slave
   Cluster   Cluster   Cluster    Cluster
      1        2         3          4



データ             mysqld

 複製             dbm



                             mysqld

                                 dbs01
Recreate Slave
   Cluster   Cluster   Cluster    Cluster
      1        2         3          4



データ             mysqld

 複製             dbm



   mysqld                    mysqld

    dbs02                        dbs01
$ mysqldump 
--single-transaction 
   --master-data
$ mysqldump 
--single-transaction 
   --master-data

    MySQL 4.0.x の場合
mysqldump (4.0.x)
      “$ mysqldump --master-data”
           blocks update query
       MySQL 5.1.x                         MySQL 4.0.x
FLUSH LOCAL TABLES                  FLUSH TABLES WITH READ LOCK
FLUSH TABLES WITH READ LOCK         BEGIN
SET SESSION TRANSACTION ISOLATION   DB選択
LEVEL REPEATABLE READ               テーブルからデータの読み込み
START TRANSACTION WITH 
CONSISTENT SNAPSHOT                 COMMIT;
SHOW MASTER STATUS                  SHOW MASTER STATUS
UNLOCK TABLES                       UNLOCK TABLES;
DB選択
テーブルからデータの読み込み
mysql40dump
MySQL                                  mysql40dump

   FLUSH TABLES WITH READ LOCK

   SHOW MASTER/SLAVE STATUS

                      pipe my $rh, my $wh;
                                                           mysqldump
                                          fork
                                                        open STDOUT, '>&', $wh

                                                            exec(mysqldump
                                                          --single-transaction)
    BEGIN


                       while(<$rh>) { print }
                                                 pipe
   UNLOCK TABLES
                       m!^CREATE TABLE!                     データ読み込み



    COMMIT



                           wait($child)                           exit


                   print “CHANGE MASTER”
mysql40dump
$dbh->do('FLUSH TABLES WITH READ LOCK');
$dbh->select('SHOW MASTER STATUS');

pipe my $logrh, my $logwh;

my $pid = fork
if ( $pid == 0 ) { #子プロセス
    open STDOUT, '>&', $logwh;
    exec("mysqldump","--single-transaction","--
databases","...");
}

while(<$logrh>){
    print;
    if ( m!^CREATE DATABASE!) {
        $dbh->do('UNLOCK TABLE');
    }
}
mysql40dump
$ mysql40dump --master --repl
-- [2012-09-25T09:00:01] Done "FLUSH TABLES WITH READ LOCK"
-- [2012-09-25T09:00:01] [FROM MASTER STATUS] * CHANGE MASTER TO
MASTER_HOST='10.9.41.3', MASTER_USER='repl', MASTER_PASSWORD='xxx',
MASTER_LOG_FILE='mysql-bin.176', MASTER_LOG_POS=789372555;
-- [2012-09-25T09:00:01] [FROM SLAVE STATUS] CHANGE MASTER TO
MASTER_HOST='10.9.41.4', MASTER_USER='repl', MASTER_PASSWORD='xxx',
MASTER_LOG_FILE='mysql-bin.178', MASTER_LOG_POS=103928719;
-- [2012-09-25T09:00:01] [START] mysqldump --quick --add-locks --
extended-insert --single-transaction --databases tbl1 tbl2 tbl3
set FOREIGN_KEY_CHECKS=0; -- for mysql4.0
-- MySQL dump 9.11

...DUMP DATA...

CHANGE MASTER TO MASTER_HOST='10.9.41.3', MASTER_USER='repl',
MASTER_PASSWORD='xxx', MASTER_LOG_FILE='mysql-bin.176',
MASTER_LOG_POS=789372555;
START SLAVE;
mysql40dumpの利用例

 • slave作成
# masterからslave
$ mysql40dump --master --repl | ssh slave ‘cat | mysql’
# slave から slave
$ mysql40dump --slave --repl | ssh slave2 ‘cat | mysql’



 • 定期的なバックアップ実行
mysql40dump --master | 
  gzip > /backup/mysql-$(date +%Y%m%d%H%M).sql.gz
監視(後処理2)
システム監視


• データホテルの独自システム(DHW)
• Nagios
Nagios MySQL監視

• 死活監視
• レプリケーション遅延
Nagios MySQL監視

• 死活監視
• レプリケーション遅延
• uptime
Uptime監視
   OK∼               OK∼              OK∼

 Nagios           Nagios          Nagios
           5min            5min

                                            t


DOWN                 UP

          MySQL 4.0.xの再起動は速い
Uptime監視
      > 5min              < 5min             > 5min
       OK∼                NG!!1               OK∼
     Nagios             Nagios             Nagios
show status like   show status like   show status like
    'Uptime'           'Uptime'           'Uptime'
             5min                5min

                                                         t


DOWN                       UP
監視としての
スパム対策
 (後処理3)
スパムブログ(splog)
によるシステムへの影響

• レプリケーションの遅延
• buffer_pool の効率性ダウン
• パフォーマンス悪化

     集約化によって影響範囲拡大
Splogの痕跡
Splogの痕跡
Splogの痕跡
    大量の
   記事投稿?
Splogの痕跡
                 バイナリログの調査

% mysqlbinlog --start-datetime ‘2012-09-21 22:50’ --end-
datetime ‘2012-09-21 23:00’ mysql-bin.941 | perl -e
'while(<>){ chomp; next if m!^#!; if ( m{/*!*/;$} ) { $p .=
$_; print "$pn"; $p="" } else { $p .= $_." "} }'|perl -nle
'm!^(DELETE FROM|REPLACE INTO|INSERT INTO|UPDATE)s+([^ ]+)!i
&& print "$1 $2"' | sort | uniq -c | sort -nr | head
43 INSERT INTO entry
 33 UPDATE entry
 19 INSERT INTO tag2entry
 18 UPDATE tag
 17 INSERT INTO category
Splogの痕跡MySQL
                 バイナリログの調査                       5.0∼

% mysqlbinlog --start-datetime ‘2012-09-21 22:50’ --end-
datetime ‘2012-09-21 23:00’ mysql-bin.941 | perl -e
'while(<>){ chomp; next if m!^#!; if ( m{/*!*/;$} ) { $p .=
$_; print "$pn"; $p="" } else { $p .= $_." "} }'|perl -nle
'm!^(DELETE FROM|REPLACE INTO|INSERT INTO|UPDATE)s+([^ ]+)!i
&& print "$1 $2"' | sort | uniq -c | sort -nr | head
43 INSERT INTO entry
 33 UPDATE entry
 19 INSERT INTO tag2entry
 18 UPDATE tag
 17 INSERT INTO category
対Splog
• アプリケーションエンジニアによる
 ツールでの監視

• サポート・パトロールチームの目視に
 よる監視

• オペレーションエンジニアによる
 システム監視

  => スパム対策と共に安定稼働を実現
今後のこと
MySQL 5.x?
さらなる集約化
20+ clusters
=> N servers
HDD/SSD
    Performance Test
                   HDD-RAID10        SSD-RAID1
                   Intel SSD 910     某Flush Device
50,000
                                      43,117

37,500


25,000

                            14,153
12,500           9,440

         751
    0
               4並列 2GB Random Read
ソーシャルメディアの
データベースにおける
ストレージデバイスの
   選択基準


バイト単価 > IOPS

   *個人的見解です
Open & Share
mysql40dump
github.com/kazeburo/mysql40dump
my.cnf
github.com/kazeburo/mysetup
おわり

More Related Content

1台から500台までのMySQL運用(YAPC::Asia編)

  • 1. 1台から500台までの MySQL運用 (YAPC::Asia2012編) 長野雅広 (kazeburo)
  • 2. Me • 長野雅広 • @kazeburo • CPAN:KAZEBURO • Operations Engineer Site Reliability, 運用系小姑, NHN Japan
  • 3. Me
  • 4. Me
  • 6. Recent CPAN modules • Apache::BumpyLife • Twiggy::Prefork • Module::Install::ShareFile • App::LoadWatcher • File::RotateLogs • Plack::Middleware::AxsLog • Proclet • DBIx::DSN::Resolver [new!]
  • 7. Proclet minimalistic supervisor use Proclet::Declare; env( PLACK_ENV => 'development', LM_COLOR => 1, ); service('web', 'plackup -p 9413 app.psgi'); service('memcached', qw!/usr/bin/memcached -p 11211!); service('worker', sub { MyWorker->run }); worker( worker => 2 ); run;
  • 8. proclet foreman for perl % cat Procfile worker: ./bin/worker web: plackup web.psgi % proclet start --color
  • 10. MySQL Beginners Talks http://www.slideshare.net/kazeburo/1500mysql-mysql-beginners 491 users
  • 11. MySQL Beginners Talks 振り返り 1
  • 12. MySQL Beginners Talks 振り返り 2
  • 13. MySQL Beginners Talks 振り返り 3
  • 14. MySQL Beginners Talks 振り返り 4
  • 15. MySQL Begineersで話した 5つのMySQL運用ポイント • MySQL 5.1 or 5.5 InnoDB Plugin • my.cnfの共通化 • no-MyISAM • ログ系テーブルに注意 • モニタリング
  • 17. livedoor Blog since 2003
  • 18. livedoorBlog • 来年で10年 • 国内最大級 • 80億PV/month • 1億PV/monthを超えるblog多数 • 総トラフィック: 20+Gbps • 記事データ: 2+TB
  • 19. 構成 PC mobile PC mobile CMS APP CMS APP APP APP Spam STF Analyzer Filter Job Main Clustered memcached Queue DB DB コア 画像 ログ スパム
  • 20. Database Sharding SELECT node from blog where id = 941 App ① ② Mapping Cluster Cluster Cluster Cluster Cluster (Main DB) 1 2 3 4 5 すごく.. 古典的です..///
  • 21. dbm dbm dbm dbm dbm dbs dbs dbs dbs dbs dbs dbs dbs dbs dbs dbm dbm dbm dbm dbm dbs dbs 160cluster dbs dbs dbs dbs dbs dbs dbs dbs dbm dbm*1 dbs*2+ dbm dbm dbm dbm dbs dbs => 500 servers dbs dbs dbs dbs dbs dbs dbs dbs dbm dbm dbm dbm dbm dbs dbs dbs dbs dbs dbs dbs dbs dbs dbs
  • 22. 歴史の積み重ね • CPU: Pen4 ∼ Quad Core Xeon • Memory: 2GB ∼ 16GB • OS: FeeBSD・CentOS4.x∼5.x • サーバによって異なるmy.cnf・ MyISAMのテーブル・Index不足
  • 23.       ,,、,、、,,,';i;'i,}、,、        ヾ、'i,';¦¦i !} 'i, ゙〃         ゙、';¦i,!  'i i"i,       、__人_从_人__/し、_人_入          `、¦¦i ¦i i l¦,      、_)           ',¦¦i }i ¦ ;,〃,,     _) 集約だ∼っ!!           .}.¦¦¦¦ ¦ ! l-' 、ミ    `)          ,<.}¦¦¦ il/,-'liヾ;;ミ   '́͡V^'^Y͡V^V͡W^Y͡         .{/゙'、}¦¦¦//  .i¦ };;;ミ         Y,;-   ー、  .i¦,];;彡         iil¦¦¦¦¦liill¦¦¦¦¦¦¦¦li!=H;;;ミミ         {  く;ァソ  '';;,;'' ゙};;彡ミ          ゙i [`''' ヾ. '' ¦¦^!,彡ミ   _,,__           ゙i }  } ';;:;li, ゙iミミミ=三=-;;;;;;;;;'' ,,,,---''''''} ̄ フハ, 二゙́ ,;/;;'_,;,7'' ,-''::;;;;;;;;;;;;;'',,=''  ;;;;;;;;''''/_  / ¦ ¦ `ー--'́_,,,-',,r' `ヽ';;:;;;;;;;, '';;;-''' '''''  ,r' `V ヽニニニ二、-'{ 十 )__;;;;/
  • 25. 集約化方法 m m s s s s dbm m m dbs dbs s s s s (1) 1台のサーバに複数のmysqld (2) 1つのmysqldに複数のデータベース
  • 26. 集約化方法 (1) • Pros Cluster 1 Cluster 2 Cluster 3 Cluster 4 • レプリケーションを使いなが ら、サービスの停止なく移行 可能 • Cluster Cluster Cluster Cluster Cons 1 2 3 4 • 元のサーバの性能差やデータ mysqld (3401) mysqld (3402) mysqld (3403) mysqld (3404) 量を考慮にいれたbuffer_pool サイズの調整が必要 dbm • 複数プロセスの管理
  • 27. 集約化方法(2) • Cluster Cluster Cluster Cluster Pros 1 2 3 4 • 細かい buffer_pool の調整が必要なく、効率性も 高い • プロセスが1つなので運用の Cluster Cluster Cluster Cluster 手間は少ない 1 2 3 4 • Cons mysqld • データベース名を変更するた めのメンテナンス時間が必要 dbm
  • 28. 採用 集約化方法(2) • Cluster Cluster Cluster Cluster Pros 1 2 3 4 • 細かい buffer_pool の調整が必要なく、効率性も 高い • プロセスが1つなので運用の Cluster Cluster Cluster Cluster 手間は少ない 1 2 3 4 • Cons mysqld • データベース名を変更するた めのメンテナンス時間が必要 dbm
  • 29. 2011-09-14 未明実施 8/27 10/13-15
  • 30. 手順(前日まで) Cluster Cluster Cluster Cluster 1 2 3 4 Cluster Cluster Cluster Cluster mysqld 1 2 3 4 dbm mysqld mysqld mysqld mysqld (3401) (3402) (3403) (3404) 仮db mysqld dbs
  • 31. 手順(前日まで) Cluster Cluster Cluster Cluster 1 2 3 4 レプリケーション 構築と ALTER TABLE Cluster Cluster Cluster Cluster mysqld 1 2 3 4 dbm mysqld mysqld mysqld mysqld (3401) (3402) (3403) (3404) 仮db mysqld dbs
  • 32. 手順(前日まで) Cluster Cluster Cluster Cluster 1 2 3 4 レプリケーション 構築と ALTER TABLE Cluster Cluster Cluster Cluster mysqld 1 2 3 4 dbm mysqld mysqld mysqld mysqld (3401) (3402) (3403) (3404) レプリケーション 仮db mysqld dbs
  • 33. 手順(当日) Cluster Cluster Cluster Cluster 1 2 3 4 Cluster Cluster Cluster Cluster mysqld 1 2 3 4 dbm mysqld mysqld mysqld mysqld (3401) (3402) (3403) (3404) 仮db mysqld dbs
  • 34. 手順(当日) Cluster Cluster Cluster Cluster 1 2 3 4 Cluster Cluster Cluster Cluster mysqld 1 2 3 4 dbm mysqld mysqld mysqld mysqld (3401) (3402) (3403) (3404) 仮db mysqld dbs
  • 35. 手順(当日) Cluster Cluster Cluster Cluster 1 2 3 4 Cluster Cluster Cluster Cluster 1 2 3 4 Cluster Cluster Cluster Cluster mysqld 1 2 3 4 dbm mysqld mysqld mysqld mysqld (3401) (3402) (3403) (3404) mysqldump cluster ¦ 仮db mysqld ssh dbm cat ¦ mysql ${n}_cluster dbs
  • 36. 手順(後日) Cluster Cluster Cluster Cluster 1 2 3 4 mysqld dbm mysqld 仮db dbs
  • 37. 手順(後日) Cluster Cluster Cluster Cluster 1 2 3 4 mysqld dbm mysqld mysqld 仮db dbs dbs
  • 38. 集約対象 160 cluster => 20+ cluster = 作業対象サーバ
  • 39. えーマジ 手作業!? 自動化必須 手作業が許されるのは 小学生までだよねー
  • 41. 自動化 • 実行時に外から情報を与える (コマンド引数などとして) • 事前情報からサーバ自身でなすべきこと を知る
  • 42. Matrix (表) #cluster id #work2dbm #from #to #id #work #dbm 1 1 1 10.94.18.30 10.94.14.30 51 1 2 10.94.18.31 10.94.14.31 57 1 3 10.94.18.32 10.94.14.32 65 1 4 10.94.18.33 10.94.14.33 2 2 5 10.94.18.34 10.94.14.34 39 2 6 10.94.19.30 10.94.15.30 77 2 7 10.94.19.31 10.94.15.31 91 2 8 10.94.19.32 10.94.15.32 3 3 9 10.94.19.33 10.94.15.33 29 3 10 10.94.19.34 10.94.15.34 85 3 11 10.94.14.35 10.94.16.35 4 4 12 10.94.14.36 10.94.16.36 52 4 13 10.94.14.37 10.94.16.37 78 4 14 10.94.14.38 10.94.16.38
  • 43. Matrixからの設定生成 while(my $l=<DATA>){ my ($cluster, $node) = split /s+/, $l; push @{$nodes{$node}}, $cluster; } for my $node ( sort { $a <=> $b } keys %nodes ) { open( my $fh, '>', sprintf("my_%d.cnf",$node)); print $fh $tx->render('my.cnf.tx', { clusters => $nodes{$node} }); } #from #to __DATA__ 1 1 51 1 2 2
  • 44. Matrixからの設定生成 [mysqld] innodb_buffer_pool_size = 4G innodb_flush_log_at_trx_commit = 2 innodb_flush_method = O_DIRECT : for $clusters -> $cluster { [mysqld<: $~cluster.count :>] server-id = <: $cluster + 10000 :> datadir = /var/lib/mysql_<: $cluster + 13000 :> socket = /tmp/mysql_<: $cluster + 13000 :>.sock pid-file = /var/run/mysql_<: $cluster + 13000 :>.pid port = <: $cluster + 13000 :> : }
  • 45. Matrixを利用した自動化 set -e CDIR=$(cd $(dirname $0) && pwd) #id #work #dbm SRV=$(cat <<"EOF" 1 10.94.18.30 10.94.14.30 2 10.94.18.31 10.94.14.31 3 ... EOF ) IPADDR=$(ifconfig eth1 |grep inet| awk -F: '{print $2}'|awk '{print $1}') CID=$(echo "$SRV" | grep $IPADDR | awk '{print $1}') cp $CDIR/my_$CID.cnf /etc/my.cnf for datadir in $(grep datadir /etc/my.cnf|sed 's/datadir=//') do /mysql_install_db --datadir=$datadir done
  • 46. atnodes を使った一括実行 $ cpanm SSH::Batch $ atnodes ‘git clone git://./setup.git’ dbs02.[01-20].cluster ============== dbs02.01.cluster ============= .. ============== dbs02.02.cluster ============= .. $ atnodes -c 4 ‘sh ./setup/setup.sh’ dbs02.[01-20].cluster ============== dbs02.01.cluster ============= .. ============== dbs02.02.cluster ============= ..
  • 48. コマンド1つ! $ atnodes -c 10 ‘sh ./setup/copy.sh’ dbs02.[01..20].cluster ============== dbs02.01.cluster ============= .. ============== dbs02.02.cluster ============= ..
  • 51. Recreate Slave Cluster Cluster Cluster Cluster 1 2 3 4 データ mysqld 複製 dbm mysqld dbs01
  • 52. Recreate Slave Cluster Cluster Cluster Cluster 1 2 3 4 データ mysqld 複製 dbm mysqld mysqld dbs02 dbs01
  • 54. $ mysqldump --single-transaction --master-data MySQL 4.0.x の場合
  • 55. mysqldump (4.0.x) “$ mysqldump --master-data” blocks update query MySQL 5.1.x MySQL 4.0.x FLUSH LOCAL TABLES FLUSH TABLES WITH READ LOCK FLUSH TABLES WITH READ LOCK BEGIN SET SESSION TRANSACTION ISOLATION DB選択 LEVEL REPEATABLE READ テーブルからデータの読み込み START TRANSACTION WITH CONSISTENT SNAPSHOT COMMIT; SHOW MASTER STATUS SHOW MASTER STATUS UNLOCK TABLES UNLOCK TABLES; DB選択 テーブルからデータの読み込み
  • 57. MySQL mysql40dump FLUSH TABLES WITH READ LOCK SHOW MASTER/SLAVE STATUS pipe my $rh, my $wh; mysqldump fork open STDOUT, '>&', $wh exec(mysqldump --single-transaction) BEGIN while(<$rh>) { print } pipe UNLOCK TABLES m!^CREATE TABLE! データ読み込み COMMIT wait($child) exit print “CHANGE MASTER”
  • 58. mysql40dump $dbh->do('FLUSH TABLES WITH READ LOCK'); $dbh->select('SHOW MASTER STATUS'); pipe my $logrh, my $logwh; my $pid = fork if ( $pid == 0 ) { #子プロセス open STDOUT, '>&', $logwh; exec("mysqldump","--single-transaction","-- databases","..."); } while(<$logrh>){ print; if ( m!^CREATE DATABASE!) { $dbh->do('UNLOCK TABLE'); } }
  • 59. mysql40dump $ mysql40dump --master --repl -- [2012-09-25T09:00:01] Done "FLUSH TABLES WITH READ LOCK" -- [2012-09-25T09:00:01] [FROM MASTER STATUS] * CHANGE MASTER TO MASTER_HOST='10.9.41.3', MASTER_USER='repl', MASTER_PASSWORD='xxx', MASTER_LOG_FILE='mysql-bin.176', MASTER_LOG_POS=789372555; -- [2012-09-25T09:00:01] [FROM SLAVE STATUS] CHANGE MASTER TO MASTER_HOST='10.9.41.4', MASTER_USER='repl', MASTER_PASSWORD='xxx', MASTER_LOG_FILE='mysql-bin.178', MASTER_LOG_POS=103928719; -- [2012-09-25T09:00:01] [START] mysqldump --quick --add-locks -- extended-insert --single-transaction --databases tbl1 tbl2 tbl3 set FOREIGN_KEY_CHECKS=0; -- for mysql4.0 -- MySQL dump 9.11 ...DUMP DATA... CHANGE MASTER TO MASTER_HOST='10.9.41.3', MASTER_USER='repl', MASTER_PASSWORD='xxx', MASTER_LOG_FILE='mysql-bin.176', MASTER_LOG_POS=789372555; START SLAVE;
  • 60. mysql40dumpの利用例 • slave作成 # masterからslave $ mysql40dump --master --repl | ssh slave ‘cat | mysql’ # slave から slave $ mysql40dump --slave --repl | ssh slave2 ‘cat | mysql’ • 定期的なバックアップ実行 mysql40dump --master | gzip > /backup/mysql-$(date +%Y%m%d%H%M).sql.gz
  • 63. Nagios MySQL監視 • 死活監視 • レプリケーション遅延
  • 64. Nagios MySQL監視 • 死活監視 • レプリケーション遅延 • uptime
  • 65. Uptime監視 OK∼ OK∼ OK∼ Nagios Nagios Nagios 5min 5min t DOWN UP MySQL 4.0.xの再起動は速い
  • 66. Uptime監視 > 5min < 5min > 5min OK∼ NG!!1 OK∼ Nagios Nagios Nagios show status like show status like show status like 'Uptime' 'Uptime' 'Uptime' 5min 5min t DOWN UP
  • 68. スパムブログ(splog) によるシステムへの影響 • レプリケーションの遅延 • buffer_pool の効率性ダウン • パフォーマンス悪化 集約化によって影響範囲拡大
  • 71. Splogの痕跡 大量の 記事投稿?
  • 72. Splogの痕跡 バイナリログの調査 % mysqlbinlog --start-datetime ‘2012-09-21 22:50’ --end- datetime ‘2012-09-21 23:00’ mysql-bin.941 | perl -e 'while(<>){ chomp; next if m!^#!; if ( m{/*!*/;$} ) { $p .= $_; print "$pn"; $p="" } else { $p .= $_." "} }'|perl -nle 'm!^(DELETE FROM|REPLACE INTO|INSERT INTO|UPDATE)s+([^ ]+)!i && print "$1 $2"' | sort | uniq -c | sort -nr | head 43 INSERT INTO entry 33 UPDATE entry 19 INSERT INTO tag2entry 18 UPDATE tag 17 INSERT INTO category
  • 73. Splogの痕跡MySQL バイナリログの調査 5.0∼ % mysqlbinlog --start-datetime ‘2012-09-21 22:50’ --end- datetime ‘2012-09-21 23:00’ mysql-bin.941 | perl -e 'while(<>){ chomp; next if m!^#!; if ( m{/*!*/;$} ) { $p .= $_; print "$pn"; $p="" } else { $p .= $_." "} }'|perl -nle 'm!^(DELETE FROM|REPLACE INTO|INSERT INTO|UPDATE)s+([^ ]+)!i && print "$1 $2"' | sort | uniq -c | sort -nr | head 43 INSERT INTO entry 33 UPDATE entry 19 INSERT INTO tag2entry 18 UPDATE tag 17 INSERT INTO category
  • 74. 対Splog • アプリケーションエンジニアによる ツールでの監視 • サポート・パトロールチームの目視に よる監視 • オペレーションエンジニアによる システム監視 => スパム対策と共に安定稼働を実現
  • 78. HDD/SSD Performance Test HDD-RAID10 SSD-RAID1 Intel SSD 910 某Flush Device 50,000 43,117 37,500 25,000 14,153 12,500 9,440 751 0 4並列 2GB Random Read
  • 79. ソーシャルメディアの データベースにおける ストレージデバイスの 選択基準 バイト単価 > IOPS *個人的見解です

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n