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;
tcpdumpを使う
パケットモニタの定番「tcpdump」を使ってみた。
tcpdumpの使い方
コマンド
# tcpdump 条件式
# tcpdump -n -vvv udp -n アドレスやポート番号がそのまま表示されます -vvv 詳細出力
例2)tcpプロトコルをキャプチャ
tcpプロトコルをファイルに出力。
出力したファイルを表示。
# tcpdump -n -vvv tcp -w packet.txt # tcpdump -r packet.txt -w ファイル出力 -r 読み込むファイル
その他にもいろんなオプションがあるようです。
rubyでudp送信
ホスト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アプリ作成
ScalaでAndroidアプリを作ってみるということで、手順をまとめてみた。
環境
mac OS X(lion)
eclipse用のscala IDEをインストール
Android用Scalaライブラリを取得
sbazは、rubygemsやCPANみたいなものだそうです。
scalaをインストールしたフォルダのlibにscala-android.jarが作成されました。
Androidプロジェクトをscalaに対応させる
- 作成したプロジェクトを右クリック → Configure → Add Scala Natureを選択。(scalaのクラスが扱えるようになる)
- 作成したプロジェクトを右クリック → Properties → Java Build Pathを選択。
- Librariesタブを選択し、「Add External JARs...」Android用Scalaライブラリ「scala-android.jar」を開く。
- Order and Exportタブを選択し、以下のように並び替えて「OK」。
- 作成したプロジェクトを右クリック → Properties → Java Build Pathを選択し、以下のように並び替えて「OK」。
はじめてのScala
Scalaをはじめてみた。
まずはインストール。
javaの確認
インストールする前に、javaが入っているのかをチェック。
$ java -version $ javac -version
入っていない場合は、javaをインストール。
$ 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.
ようやくできました。