ウェブ・技術

2010年1月19日 (火)

kumofsをインストールして遊んでみた。

えとらぼ、分散型ストレージ「kumofs」をオープンソースで公開」の記事を読んで、面白そうだったので遊んで見た。

◯まずはインストール(etolabo / kumofs を参考)

環境:

OS   :CentOS release 5.2 (Final)
GCC  : 4.1.2
Ruby  :1.9.1p378
zlib  :1.2.3-3
OpenSSL :0.9.8e
git  :1.6.6

Tokyo Cabinet

http://1978th.net/tokyocabinet/tokyocabinet-1.4.41.tar.gz をダウンロードしてconfigure/make/make install ・・・インストールは全く問題なし。

MessagePack for C++

# git clone git://git.sourceforge.jp/gitroot/msgpack/msgpack.git
# cd msgpack
# export set CFLAGS=-march=i686     ← この以下3行の実行しました。
# export set CPPFLAGS=-march=i686
# export set CXXFLAGS=-march=i686
# ./bootstrap
# ./configure
# make
# make install

MessagePack for Ruby

# gem install msgpack

kumofs

# git clone git://github.com/etolabo/kumofs.git
# cd kumofs-0.3.0
# export set CFLAGS=-march=i686     ← この以下3行の実行しました。
# export set CPPFLAGS=-march=i686
# export set CXXFLAGS=-march=i686
# ./bootstrap
# ./configure --with-msgpack=/usr/local --with-tokyocabinet=/usr/local
# make
# make install

◯実行と確認
 ※サーバは1台で複数のポートにて実行 ( etolabo / kumofs を参考 )

起動(各コマンドは別ターミナルかscreenにて起動)

# kumo-manager -v -l localhost
# kumo-server  -v -m localhost -l localhost:19801 -L 19901 -s ./kumodb1.tch  ←サーバ0
# kumo-server  -v -m localhost -l localhost:19802 -L 19902 -s ./kumodb2.tch  ←サーバ1 
# kumo-server  -v -m localhost -l localhost:19803 -L 19903 -s ./kumodb3.tch  ←サーバ2
# kumo-gateway -v -m localhost -t 11211

# kumoctl localhost attach       ← kumo-serverを登録する。

確認

# kumoctl localhost status
hash space timestamp:
  2010-01-19 13:58:05 +0900 clock 4297
attached node:
  127.0.0.1:19801  (active)
  127.0.0.1:19802  (active)
  127.0.0.1:19803  (active)
not attached node:

Memcachedのプロトコルで繋げてみる

# telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set blogkid 0 0 4   ← key:blogkid / value:test で格納
test
STORED
get blogkid      ← blogkid の key で検索
VALUE blogkid 0 4
test
END

格納されたデータを確認

# kumohash -m localhost assign "blogkid"
901d3eea20fe3a0a  blogkid
  0: 127.0.0.1:19801
  1: 127.0.0.1:19802
  2: 127.0.0.1:19803

障害を発生させてみる。

※全てのサーバに格納されているので、サーバ1とサーバ2を停止する(サーバ0は停止させない)
(起動したkumo-serverをCTRL+Cなどで停止)

# kumoctl localhost status
hash space timestamp:
  2010-01-19 15:16:29 +0900 clock 446
attached node:
  127.0.0.1:19801  (active)
  127.0.0.1:19803  (fault)
  127.0.0.1:19802  (fault)
not attached node:

※データが取得できるか確認
# telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get blogkid
VALUE blogkid 0 4
test
END

※データを格納する。(サーバ0のみ起動中)
telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set tokyo 0 0 5
japan
STORED

※サーバ0を停止させ、サーバ1と2を起動させる。

※起動させてサーバを登録する。
# kumoctl localhost attach   
nil

# kumoctl localhost status
hash space timestamp:
2010-01-19 15:28:22 +0900 clock 820
attached node:
  127.0.0.1:19801  (fault)
  127.0.0.1:19803  (active)
  127.0.0.1:19802  (active)
not attached node:  

"tokyo"のキーで検索する
telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get tokyo
VALUE tokyo 0 5
japan

こんな感じでなかなか使えます。 http://ficia.com/ にて実績もあるので今後の使う用途があれば十分検討してみようと思います。 

2009年12月 9日 (水)

LVSを使ってMySQLへのロードバランシング

1.なんとなく・・・
 今更なんですが keepalivedは使った事がなかったので、keepalived + ipvsadm でLVSを使ってMySQLサーバのLB環境を作ってみた。

2.環境や前提など
構成は以下のような感じになります。LBのVIPとして172.17.3.11を割り当てます。

Client --> LB(172.17.3.10/VIP:172.17.3.11)  ---> MySQL1(172.17.3.21)
               +-> MySQL2(172.17.3.22)

 ※OSはCentOS 4.4を利用
 ※MySQLサーバは既に起動されていること。
 ※LBサーバからはMySQLコマンドにて接続可能な状態であること。

3.LBサーバのモジュールをインストール
 1.ipvsadmをインストール

# yum install ipvsadm

 2.keepalivedのインストール

# wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz
tar で展開して・・・
# ./configure --with-kernel-dir=/usr/src/kernels/2.6.9-42.0.3.EL-i686
# make してインストール

* symlink の作成
 /etc/sysconfig/keepalived -> /usr/local/etc/sysconfig/keepalived
 /etc/keepalived -> /usr/local/etc/keepalived/

* 起動スクリプトの配置
 ダウンロードしたソースコードにあるファイルをコピーする。
 keepalived-1.1.19]/keepalived/etc/init.d/keepalived.rh.init /etc/init.d/keepalived

 daemon keepalived -D の箇所を以下のように変更する。
 /usr/local/sbin/keepalived -D

* パーミッション付与
 # chmod 755 /etc/init.d/keepalived

4.keepalivedの設定
 1.起動オプションの変更
   ファイル:/etc/sysconfig/keepalived

KEEPALIVED_OPTIONS="-D -P -C"

 2.設定ファイルの記述
   ファイル:/etc/keepalived/keepalived.conf

vrrp_instance vip_mysqld {
    state BACKUP
    interface eth0
    grap_master_delay 5
    virtual_router_id 1
    priority 100
    nopreempt 
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass secret
    }
    virtual_ipaddress {
        172.17.3.11/24 dev eth0
    }
}
virtual_server 172.17.3.11 3306 {
    delay_loop  3
    lvs_sched   rr
    lvs_method  DR
    protocol    TCP
    real_server 172.17.3.21 3306 {
        TCP_CHECK {
            connect_port 3306
            connect_timeout 30
        }
    }
    real_server 172.17.3.22 3306 {
        TCP_CHECK {
            connect_port 3306
            connect_timeout 30
        }
    }
}

5.keepalivedの起動と確認

# /etc/init.d/keepalived start
Starting Keepalived for LVS:

  確認
  # ip show addr

eth0: <BROADCAST,MULTICAST,UP> mtu 1500 **********
link/ether ******
inet 172.17.3.10/24 brd 172.17.3.255 scope global eth0
inet 172.17.3.11/24 scope global secondary eth0    ←登録されている

  # /etc/init.d/keepalived stop    (一応停止)

6.MySQLサーバ側の設定(2台共に同一内容)
  ◯ループバックデバイスにVIPを登録する。

  ファイル:/etc/sysconfig/network-scripts/ifcfg-lo:0
  内容:

DEVICE=lo:0
IPADDR=172.17.3.11
NETMASK=255.255.255.255
NETWORK=172.17.3.0
BROADCAST=172.17.3.255
ONBOOT=yes
NAME=loopback

  ※lo:0 を有効
      # ifup lo:0

  確認
  # ip show addr

1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
    inet 172.17.3.11/32 brd 172.17.3.255 scope global lo:0  ← 登録されている。

  ◯ARPの問題を解決する。

   ファイル:/etc/sysctl.conf
   以下の2行を追加

net.ipv4.conf.eth0.arp_ignore=1
net.ipv4.conf.eth0.arp_announce=2

   設定を有効にする。
   # sysctl -p

7.起動と確認(LB側にて)
  起動
  # /etc/init.d/keepalived start
  確認
  # ipvsadm -Ln

IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.17.3.11:3306 rr
  -> 172.17.3.21:3306             Route   1      0          0         
  -> 172.17.3.22:3306             Route   1      0          0 

8.クライアント側から確認
   %  mysql -h 172.17.3.11 -u testid --password=testpass
   ・・・
   mysql>

この時にLBにて以下のコマンドにて接続している状況が確認できます。
        # ipvsadm -Ln

IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.17.3.11:3306 rr
  -> 172.17.3.21:3306             Route   1      1          0         
  -> 172.17.3.22:3306             Route   1      0          0    

以上非常に簡単にできましたが以下のサイトを見ないと苦戦したかもです。

http://viz.is-a-geek.com/~viz/cw/index.php?LVS#r3ce30ce
http://blog.technology-knowledge.jp/2008/05/12/158/
http://d.hatena.ne.jp/yoshifumi1975/20070731/p1

 

 

2009年11月18日 (水)

Google GoをMac OSで動かしてみた。

Google Go を Mac OSへインストール&動かしてみた。

      
Go Home Page               
The Go Programming Language
      
 

事前に Xcodeをインストールし以下の手順でインストールします。

  1. Goコマンドのインストールディレクトリを作成
    % cd $HOME
    % mkdir bin
  2. .bash_profile に以下の行を追加
    export GOROOT=$HOME/go
    export GOOS=darwin
    export GOARCH=386
    export PATH=$PATH:$HOME/bin
  3. mercurial(クロスプラットフォームの分散型バージョン管理システム)をインストール
    % sudo easy_install mercurial
  4. Goをダウンロード
    % hg clone -r release https://go.googlecode.com/hg/ $GOROOT

  5. コンパイル
    % cd $GOROOT/src
    % ./all.bash
    <少々時間がかかります>
  6. テストコードを各
    % vi hello.go
    package main
    import "fmt"
    func main() {
      fmt.Printf("hello, go. こんにちは go\n")
    }
  7. コンパイル
    % 8g hello.go
  8. リンケージ
    % 8l hello.o
  9. 実行(リンケージの時に名前をきめられないけど実行ファイル名は8.out)
    % ./8.out
    hello, go. こんにちは go
  10. サンプルのコピペですが echo アプリケーションになります。
    % vi echo.go
    package main
    import (
      "os";
      "flag"; // command line option parser 10
    )
    var omitNewline = flag.Bool("n", false, "don't print final newline")
    const (
      Space = " ";
      Newline = "\n";
    )
    func main() {
      flag.Parse(); // Scans the arg list and sets up flags
      var s string = "";
      for i := 0; i < flag.NArg(); i++ {
        if i > 0 {
          s += Space
        }
        s += flag.Arg(i);
      }
      if !*omitNewline {
        s += Newline
      }
      os.Stdout.WriteString(s);
    }
  11. 実行(コンパイルとリンケージは省略)
    %  ./8.out Hello World
    Hello World

実行ファイルのサイズが大きいように感じられますが、これからの言語なので注視していこうと思います。