Browse Month: October 2012

MySQL でオンラインで binlog_format を変更する方法

MySQL でオンラインで binlog_format を変更したかったので、その方法を紹介します。

  1. すべてのスレーブに対して STOP SLAVE する
  2. マスターに対して、FLUSH TABLES WITH READ LOCK; して更新系のクエリを止める
  3. マスターに対して、FLUSH LOG する
  4. マスターに対して、SET GLOBAL binlog_format = ‘ROW’; する、または MIXED
  5. マスターに対して、FLUSH LOG する
  6. マスターに対して、UNLOCK TABLES; する
  7. すべてのスレーブに対して START SLAVE する

あとは、my.cnf を忘れずに変更しておいしまい。

vagrant + veewee を試してみた

Vagrant の box を簡単に作成できる veewee を試してみました。
環境は、OSX 10.8.2 + RVM 1.9.3 です。

veewee は、gem でさくっとインストールすることができます。

$ gem install veewee

veewee は、VirtualBox を使って仮想マシンを作成してくれるため、VirtualBox をダウンロードしてインストールします。なお、最新のバージョン 4.2 系だとうまく動作しなかったので、バージョン 4.11 を使うといいと思います。

まず、veewee のテンプレートから、作成したい仮想マシンの種類を選択します。次の例は、CentOS 6.2 minimal を選択する例です。veewee のテンプレートは、vagrant basebox templates コマンドで確認することができます。なぜか、github 上のコードには、CentOS 6.3 テンプレートはありますが、使えなかったので CentOS 6.2 テンプレートを使っています。

$ vagrant basebox define 'mybox' 'CentOS-6.2-x86_64-minimal'

そうすると、definitions/mybox ディレクトリ以下に、仮想マシンの定義ファイルが作成されます。definition.rb には設定、ks.cfg はキックスタートファイル、postinstall.sh はインストール後の設定をするシェルスクリプト、になっています。
まず、defnition.rb を、次のように修正します。

Veewee::Session.declare({
:cpu_count => '1', :memory_size=> '512',
:disk_size => '10140', :disk_format => 'VDI', :hostiocache => 'off',
: os_type_id => 'RedHat_64',
:iso_file => "CentOS-6.3-x86_64-minimal.iso", :iso_src => "http://ftp.iij.ad.jp/pub/linux/centos/6/isos/x86_64/CentOS-6.3-x86_64-minimal.iso", :iso_md5 => "087713752fa88c03a5e8471c661ad1a2", :iso_download_timeout => 1000,
:boot_wait => "10", :boot_cmd_sequence => [
' text ks=http://%IP%:%PORT%/ks.cfg'
],
:kickstart_port => "7122", :kickstart_timeout => 10000, :kickstart_file => "ks.cfg",
:ssh_login_timeout => "100", :ssh_user => "vagrant", :ssh_password => "vagrant", :ssh_key => "",
:ssh_host_port => "7222", :ssh_guest_port => "22",
:sudo_cmd => "echo '%p'|sudo -S sh '%f'",
:shutdown_cmd => "/sbin/halt -h -p",
:postinstall_files => [ "postinstall.sh"], :postinstall_timeout => 10000
})

変更したのは、ISO のダウンロード先の URL です。

次に、postinstall.sh に、自分の好きな設定を記述します。
僕の場合は、次の設定を追加しました。

  • 自分独自の Yum リポジトリの追加
  • vagrant ユーザのデフォルトシェルを ZSH に変更
  • その他、必要なパッケージのインストール
  • バージョン 4.1.23 用の VBoxGuestAdditions はないため、VBOX_VERSION=4.2.0(4.1.22 でも動作します)に変更
  • iscsi(d)、vboxadd-x11 などの不要なサービスの無効化

設定が完了したら、次のコマンドで仮想マシンを作成します。

$ veewee vbox build 'mybox'

上のコマンドで VirtualBox の API 経由で、VirtualBox が起動して自動的に仮想マシンが構築されます。構築完了後、上のコマンドが返ってきたあと、VitualBox 上の VM にて NIC のリセットがかかり、仮想マシンが操作できなくなります。そうなった場合、VirtualBox 上の Machine – Reset メニューを選択して仮想マシンを再起動しましょう。そのあと、仮想マシンが操作できるようになったところで、次のコマンドで vagrant で使える用の box ファイルとしてエクスポートします。

$ vagrant basebox export 'mybox'

そうすると、カレントディレクトリに mybox.box というファイルが生成されるはずです。
あとは、vagrant に追加すれば、自分でカスタマイズした仮想マシンで vagrant を使うことができます。

$ vagrant box add 'mybox' 'mybox.box'

仮想マシンを作成するとき、次のようなメッセージが表示されたら、VirtualBox の設定ファイルを削除する必要があります。具体的には、$HOME/VirtualBox VMs 以下の仮想マシン名のディレクトリを削除します。

we tried to create a box or a box was here before
but now it’s gone

vagrant を使うと、Chef / Puppet の設定をすぐにテストできるので、とても重宝しています。
vagrant destroy すると仮想マシンが消えてくれるので、何度も OS の初期状態からレシピ・マニフェストを適応してテストして試すことができます。
vagant、かなり便利ですね!!!

veewee については、先月発売の Software Design の Chef 入門の記事にあったので、とても参考にしました。銀河さん、詳しい解説記事ありがとうございました!

Yum の変数を追加する方法

CentOS 5/6 系で、/etc/yum.repos.d/ の yum リポジトリの設定をみてみると、$releasever や $basearch という変数名が使われていて、リリースバージョンにあうようになっていて便利ですよね。ですが、$releasever は、CentOS 6.3 なら 6 としか入らないので、多少不便です。毎回、バージョンアップすることに /etc/yum.repos.d/ の設定を固定値で書き換えても当然いいのですが、めんどくさいということで、Yum の変数をカスタマイズする方法を調べてみました。

まず、定義されている Yum の変数をチェックするには、次のワンライナーで確認することができます。

$ sudo python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
for CentOS 5.8
{'arch': 'ia32e',
'basearch': 'x86_64',
'releasever': '5'}

for CentOS 6.3
{'arch': 'ia32e',
'basearch': 'x86_64',
'releasever': '6',
'uuid': 'xxx'}

5系と6系で多少違うようです。

まず、6系の方で Yum の変数を増やすには、/etc/yum/vars ディレクトリ以下に、ファイルを作成するだけで Yum の変数を追加することができます。

$ sudo vi /etc/yum/vars/full_releasever
6.3
$ udo python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
Loaded plugins: fastestmirror, presto
{'arch': 'ia32e',
'basearch': 'x86_64',
'full_releasever': '6.3',
'releasever': '6',
'uuid': 'xxx'}

おぉ、簡単に Yum の変数を追加することができました。ファイル名が変数名、ファイルの書かれている値がその変数の値となります。
CentOS の場合、X.Y のみを取得したい場合、次のコマンドで取得できます。

$ rpm -q --queryformat '%{VERSION}.%{RELEASE}' centos-release | cut -c 1-3

その他の方法として、/etc/redhat-release を参照する方法もありますが、このファイルが書き換えられている可能性もあるため、上のコマンドの方がよいでしょう。ただし、上のコマンドだと X.Y のパターンしか調整できないので注意して下さい。

5 系の場合、残念ながら 6 系と同じ方法が使えません。$YUM[0-9] という環境変数を定義することで増やすことができますが、任意の変数名を追加することができないようです。

$ export YUM0=hoge

これはちょっとばかり不便ですね。

ということで、6 系なら、SRPM をダウンロードする Yum リポジトリの設定を次のように書くことができるので便利です。

$ sudo vi /etc/yum.repos.d/sources.repo
[base-source]
name=CentOS-$full_releasever - Base source
baseurl=http://vault.centos.org/$full_releasever/os/Source/
gpgcheck=1
gpgkey=http://vault.centos.org//RPM-GPG-KEY-CentOS-6
priority=1
enabled=1

[updates-source]
name=CentOS-$full_releasever - Updates Source
baseurl=http://vault.centos.org/$full_releasever/updates/Source/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
priority=1
enabled=1

かなり便利になりましたね!

この状態で、例えば、kernel の SPRM をダウンロードするには、yum-utils パッケージをインストールして、次のコマンドを実行するだけです。

$ sudo yumdownloader --source kernel-`uname -r`