2015年3月27日金曜日

絶対にロックしたくないMySQLマスターからレプリケーション構築 innobackupex編

brett jordan Follow Slave or Free?  BLAZE 'Slave or Free?' Houseparty, 1993
mysqldumpのダンプデータを使って、レプリケーション用のダンプファイルを作るとします。
このとき、mysqldump に --master-data を付与すると "FLUSH TABLES WITH READ LOCK" が発行され、一瞬のあいだ、全テーブルがロックします。
mysqldump -uroot -pxxxxxxxx --single-transaction --master-data=2 --all-databases | gzip >  20150327.sql.gz

2095627 Query FLUSH TABLES WITH READ LOCK
2095627 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2095627 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
2095627 Query SHOW MASTER STATUS
2095627 Query UNLOCK TABLES
上記のような状況を回避して、MySQLマスターをロックせずレプリケーションを構築するためにXtraBackupを利用します。 
通常、innobackupexを使ってバックアップをするとロックを発行するのですが、 --no-lockで回避します。
 --no-lock オプションを付与すると、binlogのポジションが記述されるはずの xtrabackup_binlog_info ファイルが作成されません 。
しかし、--apply-logコマンドでリカバリ用のファイルを作成すると、ログにbinlogのポジションが出力されます。これを利用してレプリケーションを構築できます。 

下記の資料を参考にしました。

Percona xtrabackup - MySQL Meetup @ Mumbai
http://www.slideshare.net/nilnandan/percona-xtrabackup-mysql-meetup-mumbai/48

Working with Binary Logs — Percona XtraBackup Documentation
http://www.percona.com/doc/percona-xtrabackup/2.1/xtrabackup_bin/working_with_binary_logs.html

漢(オトコ)のコンピュータ道: MySQLバックアップ頂上決戦!! LVMスナップショット vs InnoDB Hot Backup
http://nippondanji.blogspot.jp/2009/12/mysql-lvm-vs-innodb-hot-backup.html

以下、作業ログです。

MySQLマスターサーバ

XtraBackupをインストール
# rpm -Uhv http://www.percona.com/redir/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
# yum -y install xtrabackup
バックアップディレクトリ作成
# mkdir -p /tmp/xtrabackup/
バックアップ実行 --no-lockオプションを付与する
# time innobackupex --user root --password xxxxxxxx /tmp/xtrabackup/ --no-lock
フォルダをスレーブサーバへscp(転送制限を5MB/sに設定)
# scp -r -l 40000 /tmp/xtrabackup/2015-03-25_09-31-50 username@100.100.100.100:/tmp/


MySQLスレーブサーバ

XtraBackupをインストール
# rpm -Uhv http://www.percona.com/redir/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
# yum -y install xtrabackup
MySQLリストア用にデータディレクトリを空にしておく
# /etc/init.d/mysqld stop
# mv /var/lib/mysql /var/lib/mysql.old
# mkdir /var/lib/mysql
バックアップの準備とポジションの確認
$ innobackupex --apply-log /tmp/2015-03-25_09-31-50
[notice (again)]
  If you use binary log and don't use any hack of group commit,
  the binary log position seems to be:
InnoDB: Last MySQL binlog file position 0 431897511, file name mysql-bin.000009
binlogのポジションは、431897511
binlogファイルは、mysql-bin.000009

リストア実行
$ innobackupex --copy-back /tmp/2015-03-25_09-31-50
$ chown -R mysql:mysql /var/lib/mysql
# /etc/init.d/mysqld start 

あとは、 先ほど確認したbinlogのポジションを利用して "CHANGE MASTER TO" コマンドでレプリケーションをスタートさせればOKです。
ちゃんと、レプリケーションされているか確認してみてください。

2015年3月23日月曜日

Cyberduckを使ってSFTPでサーバに接続する Mac編

MiNe MiNe-5DII_103-9570UG https://www.flickr.com/photos/sfmine79/10468588284

たまに、「FTPアカウントをください」といった依頼を受けることがあるのですが。さすがにFTPは使ってほしくないので、SFTPで接続していただいています。
SSH鍵の生成などは慣れていると簡単ですが。初めての人には若干ハードルが高かったりするので。そのときに、このドキュメントを渡して理解してくれたらいいなと考えて書きました。

FTPではなくて、SFTP?

FTPは危険です。FTPはそのプロトコルの仕組みから、クライアントとサーバが通信する際にパスワードが暗号化されません。
つまり、通信の盗聴にとても弱いと言えます。たとえば、
『スターバックスで Free Wi-Fi に繋ごうとしたら、似たような名前の Wi-Fi があったので接続した。
しかし、それは、盗聴用の Wi-Fi で通信が盗聴され、Webサイトが改ざんされた』
といったように、公衆無線LANのSSID詐称で大きな被害を受けたり、リスクが色々考えられます。
そのため、SSH鍵交換方式による認証を利用したSFTP(SSH File Transfer Protocol)を使って通信内容を暗号化することが必須となります。

SFTPとは?
http://ja.wikipedia.org/wiki/SSH_File_Transfer_Protocol
SSH File Transfer Protocol(略称:SFTP)とは、SSHの仕組みを使用しコンピューター間でファイルを安全に転送するプロトコルである。
sftpは、このプロトコルを利用するコマンドの名前である。
以下、SSH公開鍵と秘密鍵を作成して、SFTPをサポートしたソフト Cyberduck を使ってサーバに接続してみます。

SSH公開鍵と秘密鍵を作成

ターミナルを開きます。
Launchpad -> Other -> Terminal

ターミナルを開いたら、コマンドを入力してSSH公開鍵を作成します。
いくつか設定入力が求められますが、何も入力せずEnterを3回叩くだけでもOKです。
ポリシーによっては、パスフレーズを入力するとよいでしょう。
$ ssh-keygen
Enter file in which to save the key (/Users/yako/.ssh/id_rsa): ファイルを作成する場所は?
Enter passphrase (empty for no passphrase): パスフレーズは?
Enter same passphrase again: 同じパスフレーズを入力

このような記号入りの図が表示されたら、SSH公開鍵の作成が完了しています。
[ RSA 2048]となっているのを確認します。
これは、SSH鍵の種類がRSAで2048bit鍵であることを表しています。もし、1024bitだったら鍵の長さが十分ではありません。鍵の長さを指定して作成しなおしましょう。

SSH公開鍵の内容を確認します。
$ cat $HOME/.ssh/id_rsa.pub
ずらずらっとテキスト文字列が出てきます。
次のコマンドでSSH公開鍵のテキストがクリップボードにコピーされます。
$ pbcopy < ~/.ssh/id_rsa.pub
このテキスト情報をサーバ管理者に渡してサーバアカウントを作ってもらいましょう。
※ 同時に秘密鍵($HOME/.ssh/id_rsa)が作成されています。このファイルは絶対に誰かに渡してはダメです。

Cyberduckでサーバに接続

サーバアカウントができたら、接続してみましょう。
https://cyberduck.io/
上記サイトからCyberduckをダウンロードします。
最新バージョンは、4.6.5でした。

ソフトを起動したら。左上の [Open Connection] を開きます。
サーバへの接続情報を、入力していきます。
プルダウンから [SFTP (SSH File Transfer Protocol)] を選択
Server: サーバのIPアドレス
Username: ユーザ名
Password: パスフレーズを入力(SSH公開鍵を作成したときに、パスフレーズを設定しなかった時は空のまま)
一番下の [Use Public Key Authentication] をチェックして、SSH秘密鍵を選択 [Choose] します。
[Connect]を選択してサーバに接続します。
最初の接続では、fingerprint (SSHサーバーの公開鍵の指紋)が正しいか聞かれます。
[Allow] をクリックして接続します。
ちゃんと接続できたでしょうか?

セキュアにサーバへ接続する事ができるようになりました。

2015年3月18日水曜日

動画変換ソフトFFmpegをCentOS6.6にインストール

動画や音声をエンコードしてくれるソフトである FFmpeg(https://www.ffmpeg.org/)をCentOS6で扱えるようにします。
ついでに、ImageMagickも使ってアニメーションGIFを作ってみます。

この動画を。

アニメーションGIFに変換します。



動画ファイル -> 1コマづつのPNGファイル生成 -> アニメーションGIF
という流れです。以下、作業ログです。

yumライブラリをインストール
# yum -y install autoconf automake make gcc gcc-c++ pkgconfig wget libtool zlib-devel
# yum -y install git
# yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum -y install --enablerepo=epel yasm
x264 をインストール
# cd /usr/local/src
# git clone git://git.videolan.org/x264
# cd x264
# ./configure --enable-shared
# make
# make install
fdk-aac をインストール
# cd /usr/local/src
# git clone --depth 1 git://github.com/mstorsjo/fdk-aac.git
# cd fdk-aac
# autoreconf -fiv
# ./configure
# make
# make install
ライブラリ設定
$ export LD_LIBRARY_PATH=/usr/local/lib/
$ echo /usr/local/lib > /etc/ld.so.conf.d/custom-libs.conf
$ ldconfig
ffmpeg のインストール
# cd /usr/local/src
# git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
# cd ffmpeg
# ./configure --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libx264 --enable-shared --arch=x86_64 --enable-pthreads
# make
# make install
# ffmpeg -version
ffmpeg version N-70803-g0f16dfd Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-11)
configuration: --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libx264 --enable-shared --arch=x86_64 --enable-pthreads
libavutil      54. 20.100 / 54. 20.100
libavcodec     56. 28.100 / 56. 28.100
libavformat    56. 25.101 / 56. 25.101
libavdevice    56.  4.100 / 56.  4.100
libavfilter     5. 12.100 /  5. 12.100
libswscale      3.  1.101 /  3.  1.101
libswresample   1.  1.100 /  1.  1.100
libpostproc    53.  3.100 / 53.  3.100
ffmpegの動作確認として、動画サイズを変更するようにエンコードを実行してみます。
# ffmpeg -i /tmp/sample.mp4 -s 200x150 \
  -vcodec libx264 -profile:v baseline -preset:v slower \
  -b:v 300k -maxrate 300k -minrate 300k -bufsize 1000k \
  -ac 2 -c:a libfdk_aac -b:a 64k /tmp/encoded_sample.mp4
ffmpegがエンコードしたファイルを確認してみてください。指定したとおりにエンコードされているでしょうか?

ImageMagickをインストール
# yum -y install ImageMagick ImageMagick-devel

やっと準備が出来ました。
アニメーションGIFを作ってみましょう。

動画ファイルをPNGファイルに変換
# ffmpeg -i /tmp/sample.mp4 -an -r 15 -s 160x90 /tmp/%05d.png
PNGファイルをアニメーションGIFに変換
# convert /tmp/*.png sample.gif
うまく変換できたでしょうか?
FFmpeg + ImageMagickさえインストールしてしまえば、2コマンドで処理が済みました。かなりお手軽な感じがしていいですね。


参考資料)

CompilationGuide/Centos – FFmpeg
https://trac.ffmpeg.org/wiki/CompilationGuide/Centos

Encode/H.264 – FFmpeg
https://trac.ffmpeg.org/wiki/Encode/H.264

CentOS6.xにFFmpegをインストールする - Code Life
http://blog.code-life.net/blog/2013/04/14/how-to-install-ffmpeg-on-centos6-x86-64/

どーもくん ギターを弾きまくる 白バック素材:素材をさがす:NHKクリエイティブ・ライブラリー
http://www1.nhk.or.jp/creative/material/dd/D0002040236_00000.html