mysql レプリケーションのまとめ

mysqlレプリケーションを試してみました。

環境

host A(マスター)
OS:debian
ip_address:192.168.56.100
host B(スレーブ)
OS:debian
ip_address:192.168.56.101

mysql-server のインストール

マスター、スレーブ共に mysql-server を aptitude でインストールします。

# aptitude install mysql-server-5.0

ユーザーの登録

mysql ユーザーを追加します。(password1 は変更してください)

$ mysql --user=root mysql -p
mysql> GRANT ALL PRIVILEGES ON *.* TO mysql@localhost IDENTIFIED BY 'password1' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO mysql@'%' IDENTIFIED BY 'password1' WITH GRANT OPTION;

repl ユーザー(レプリケーション実行ユーザー)を追加します。(password2 は変更してください)

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'localhost' IDENTIFIED BY 'password2';
mysql> GRANT REPLICATION CLIENT ON *.* TO repl@'%' IDENTIFIED BY 'password2';

マスター設定データの修正

マスターでの作業。
my.conf を修正。

# vi /etc/mysql/my.conf
-----------------------------------------
[client]
default-character-set = utf8        ← 追加

[mysqld]
log-bin                                         ← 追加
server-id = 1                                ← 追加
bind-address = 127.0.0.1
bind-address = 192.168.56.100  ← 追加

mysql の再起動

# /etc/init.d/mysql restart

スレーブ設定データの修正

スレーブでの作業。
my.conf を修正。

# vi /etc/mysql/my.conf
-----------------------------------------
[client]
default-character-set = utf8        ← 追加

[mysqld]
log-bin                                         ← 追加
server-id = 2                                ← 追加
master-host = 192.168.56.100    ← 追加    
master-user = repl                       ← 追加    
master-password = password2    ← 追加    
bind-address = 127.0.0.1
bind-address = 192.168.56.101  ← 追加

debian.cnf を修正。(password3 は変更してください)

# vi /etc/mysql/debian.conf
-----------------------------------------
[client]
host = localhost
user = debian-sys-maint
password = password3                ← 変更
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
user = debian-sys-maint
password = password3                ← 変更
socket = /var/run/mysqld/mysqld.sock
basedir = /usr

debian-sys-maint のパスワードを登録。

$ mysql -u mysql -p
mysql> SET PASSWORD FOR 'debian-sys-maint'@localhost = PASSWORD('password3');

mysql の再起動

# /etc/init.d/mysql restart

スナップショットの取得

マスターでの作業。

更新系クエリを停止する為にFLASH文を発行してロックをかける。

$ mysql -u mysql -p

mysql> FLUSH TABLES WITH READ LOCK;

スナップショットの作成。

$ cd /var/lib/mysql
# tar cpf /var/tmp/mysql-snapshot.tar .

マスターステータスの確認。(この情報が重要)

$ mysql -u mysql -p

mysql> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000009 |      223 |              |                  | 
+-------------------+----------+--------------+------------------+

UNLOCK文を発行してロックを外す。

$ mysql -u mysql -p

mysql> UNLOCK TABLES;

スナップショットのデータをスレーブにコピー

$ scp /var/tmp/mysql-snapshot.tar 192.168.56.101:/var/tmp/

スナップショットのデータを展開

スレーブでの作業。

mysql を停止。

# /etc/init.d/mysql stop

マスターのスナップショットデータをスレーブに展開。

$ cd /var/lib/mysql/
# rm -fr *
# tar xpf /var/tmp/mysql-snapshot.tar

mysql を起動。

# /etc/init.d/mysql stop

レプリケーション開始位置の登録

スレーブでの作業。

マスターステータスの確認で記録した情報を登録。

$ mysql -u mysql -p
-----------------------------------------
mysql > change master to master_host='192.168.56.100', master_user='repl', master_password='password2', master_log_file='mysql-bin.000009', master_log_pos=223;

レプリケーションの開始

$ mysql -u mysql -p

mysql> slave start;

レプリケーションがうまく開始できない場合は、レプリケーションを止めます。

mysql> reset slave;
mysql> slave stop;

その後、スナップショットを再度展開してから開始します。(必要があれば、スナップショットを再取得します)

mysql> slave start;

レプリケーションの確認

スレーブでの作業。

show slave status \G

それぞれがyesだとレプリケーションができています。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

スナップショット以降の更新データは、レプリケーションを開始した後、同期されます。

tcpdumpを使う

パケットモニタの定番「tcpdump」を使ってみた。

tcpdumpをインストール

まずは、tcpdumpをインストール。
debianなので、aptitudeでインストールします。

# aptitude install tcpdump

tcpdumpの使い方

コマンド

# tcpdump 条件式


例1)udpプロトコルをモニタ

# tcpdump -n -vvv udp
-n アドレスやポート番号がそのまま表示されます
-vvv 詳細出力


例2)tcpプロトコルをキャプチャ
tcpプロトコルをファイルに出力。
出力したファイルを表示。

# tcpdump -n -vvv tcp -w packet.txt
# tcpdump -r packet.txt
-w ファイル出力
-r 読み込むファイル

その他にもいろんなオプションがあるようです。

rubyudp送信

ホストBから、tcpdumpを実行しているホストAへudp通信をしてみます。
irbを起動して、以下のようなテストを実行してみました。

ホストA
tcpdumpを実行。

# tcpdump -n -vvv udp

ホストB
irbを起動して以下を実行。

require "socket"
s = UDPSocket.new
addr = Socket.sockaddr_in("echo", "tcpdumpを実行しているホストのIPアドレス")
s.sent("test", 0, addr)

ホストA

17:26:35.878940 IP (tos 0x0, ttl 60, id 0, offset 0, flags [DF], proto UDP (17), length 32) <ホストBのIP> > <ホストAのIP>: [udp sum ok] UDP, length 4

無事にホストAでudpが確認できました。

ScalaでAndroidアプリ作成

ScalaAndroidアプリを作ってみるということで、手順をまとめてみた。

前提条件

eclipseandroidの開発が可能な環境がある状態。
scalaがインストールされている。(インストールの手順は、ここを参照)

環境

mac OS X(lion)

eclipse用のscala IDEをインストール

  • ここへ移動し、赤い「Copy update site URL to clipboard」をクリックして、URLをコピー。
  • eclipseを起動し、「Help → Install New Software...」 を選択。
  • 「Add...」を選択して、Name:Scala IDE、Location:に先ほどコピーしたURLを貼付け、「OK」。
  • チェックボックスを全てチェックして「Next」。
  • 「Select All」をクリックして「Finish」。

これでeclipsescala IDEがインストールされました。

AndroidScalaライブラリを取得

sbazは、rubygemsCPANみたいなものだそうです。
scalaをインストールしたフォルダのlibにscala-android.jarが作成されました。

eclipseAndroidプロジェクトの作成

  • 「File → New → Project」で「Android Project」を選択。
  • 必要な情報を入力。

Androidプロジェクトをscalaに対応させる

  • 作成したプロジェクトを右クリック → Configure → Add Scala Natureを選択。(scalaのクラスが扱えるようになる)
  • 作成したプロジェクトを右クリック → Properties → Java Build Pathを選択。
  • Librariesタブを選択し、「Add External JARs...」AndroidScalaライブラリ「scala-android.jar」を開く。
  • Order and Exportタブを選択し、以下のように並び替えて「OK」。

  • 作成したプロジェクトを右クリック → Properties → Java Build Pathを選択し、以下のように並び替えて「OK」。

scalaファイルの追加と編集

  • プロジェクトのsrcを開いて、ファイルを追加。名前は「Person.scala」とします。

  • Person.scalaを以下のように編集

  • HelloScalaActivity.javaも以下のように編集


プロジェクトを実行

  • プロジェクトを実行するとこうなりました。

はじめてのScala

Scalaをはじめてみた。

まずはインストール。

javaの確認

インストールする前に、javaが入っているのかをチェック。

$ java -version
$ javac -version

入っていない場合は、javaをインストール。

次に、JAVA_HOME環境変数を確認。

$ echo $JAVA_HOME

設定されていない場合は、環境変数を設定。

$ export JAVA_HOME=/Library/Java/Home
$ export PATH=$JAVA_HOME/bin:$PATH

.bash_profileに記述すると尚よい。

Scalaのインストール

準備ができたらScalaのインストール。

ここから対応するパッケージをダウンロード。
http://www.scala-lang.org/node/211

私は、Macなので、Mac OSXを選択。

ダウンロードしたパッケージを展開し、任意の場所に移動させる。

Scala環境変数の設定

先ほど任意の場所に移動したScalaのbinを環境変数に追加する。

export PATH=~/src/scala-2.9.0.2/bin:$PATH

これでscalaを実行できる環境が整いました。

対話型実行環境(REPL)の起動

$ scala
scala > ここに記述

ここに詳しく書かれています。
Scalaプログラミング入門 http://bach.istc.kobe-u.ac.jp/lect/ProLang/org/scala.html

sqllite3のコマンド

railsとかでよく使用するsqlite3。
コマンドをまとめておきます。

データベースへ接続

sqlite3 db/users_development.db 
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> 

テーブル一覧表示

sqlite> .table

データベースをdump
引数なしでデータベースのdump。
引数にテーブル名をつけると指定したテーブルのdumpができます。

sqlite> .dump table_name

dumpデータをファイルへ書き出し。
出力先を指定してから、dumpを行います。
まずは、.showコマンドで現在の出力先を確認。

sqlite> .show
     echo: off
  explain: off
  headers: off
     mode: list
nullvalue: ""
   output: stdout <--------------ここ
separator: "|"
    stats: off
    width: 

stdoutになっているので、出力先を変更します。
変更した後、dumpを実行。

sqlite> .output ./file_name.txt
sqlite> .dump table_name

終わったらoutputを変更しておきましょう。

sqlite> .output stdout

dumpファイルのインポート
引数にファイル名を指定します。

sqlite> .read ./file_name.txt

sqlite3の終了

sqlite> .quit

brew update fails on Lion

Homebrewインストールメモ。

マシン:MacBookPro Snow LeopardをLionにアップデートした状態。

GitHub - Homebrew/legacy-homebrew: 💀 The former home of Homebrew/homebrew (deprecated) を参考にして

/usr/bin/ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"

簡単にインストールできました。

で、brewのupdateをしてみると、

brew update

error: unable to unlink old '.gitignore' (Permission denied)
error: unable to unlink old 'README.md' (Permission denied)
fatal: Could not reset index file to revision 'FETCH_HEAD'.
rm: .git: Permission denied
Error: Failure while executing: rm -rf .git 

何かがおかしい。
調べてみると、こんなページを発見。
brew update fails on new Hombrew install on Lion · Issue #6913 · Homebrew/legacy-homebrew · GitHub
Xcodeが原因のよう。

もう少し調べるとこんな記述が。
brew update fails 'unable to unlink old '.gitignore' · Issue #6886 · Homebrew/legacy-homebrew · GitHub
この通りにやってみる。

/usr/bin/ruby18 -e "$(curl -fsSL https://raw.github.com/gist/1140207)"

で、brewのupdateは

brew update

From http://github.com/mxcl/homebrew
 * branch            master     -> FETCH_HEAD
Already up-to-date.

ようやくできました。