2013年11月17日日曜日

L7ロードバランサHaproxyを使う(その3 syslogの設定とコマンドラインツール)

どうも、俺@眠いす。


今日は「L7ロードバランサHaproxyを使う(その2 設定から起動)」の続きです。
前回では、haproxy.cfgを編集してリクエストに応じて
バックエンドサーバを切り替える(Proxyする)ところまでやりました。
※サーバはCentOS6.xです。

今日はその設定にあった
1)ログ出力
2)haproxy状態を確認するコマンドラインツール
の使い方を書きます。


1)ログ出力
前回の説明で、haproxy.cfg設定に
log         127.0.0.1 local6 debug

というのがありました。
これはHaproxyのログを書き出す設定、というところまで説明しましたが、
今回はもう少し具体的に解説します。

syslogにログを出力させるために、まず /etc/syslog.confを開き、
# add haproxy setting
local6.* /var/log/haproxy_log
を追加します。
facility(local6)に設定した出力を/var/log/haproxy_logに書き出す、という意味です。
この書式は
(facility).(priority) (action)
です。
上の場合は、local6ファシリティの全てのpriorityを/var/log/haproxy_logに出力となりますが、
もし出力レベルを変えて「警告以上のみを出力」としたい場合などは
# add haproxy setting
local6.warn /var/log/haproxy_log
とすると良いでしょう。
または、haproxy.cfgの「debug」を「warn」に変えるという方法でも良いです。

次に、/etc/sysconfig/syslogを編集します。
SYSLOGD_OPTIONS="-m 0 -r"
そしてsyslogdを再起動。
service syslogd restart
これでログ出力完了(のはず)です。


2)haproxy状態を確認するコマンドラインツール
これは前回haproxy.cfgに設定した、
  # 統計情報が見れる。※ただし要設定!次回説明します。。
  stats socket /var/run/haproxy/stats.socket uid 105 gid 105 
の部分です。
コマンドラインからhaproxyのステータス情報を確認できるようになります。
まず、socatというツールをインストールします。
yum install --enablerepo=epel socat
haproxyを再起動します。
service haproxy restart

あとは、socatを使い情報を取得します。
// 一般的な情報を出力
echo "show info" | socat unix-connect:/var/run/haproxy/stats.socket stdio

// エラー情報を出力
echo "show errors" | socat unix-connect:/var/run/haproxy/stats.socket stdio

// 統計情報を出力
echo "show stats" | socat unix-connect:/var/run/haproxy/stats.socket stdio
のような感じです。
hastats(ステータスページ)では確認できないような詳細なデータを見ることが出来ます。



以上でぇぇぇぇぇす。

2013年11月7日木曜日

L7ロードバランサHaproxyを使う(その2 設定から起動)

どうも、俺@仕事中です。


L7ロードバランサHaproxyを使う(その1 インストールまで)」の続きです。
前回では、
 Haproxyのインストール
 起動スクリプトの設置
 起動確認
 デフォルトの設定ファイル(ひな形)のコピー
まで行いました。
今回は設定ファイルを編集して、ロードバランサ(またはProxy)として動かしてみます。

では、設定ファイルを開きます。
vim /etc/haproxy/haproxy.cfg
ひな形としてすでに何か書かれていると思います。
設定ファイルは大きく分けて5つのセクションから成っています。

1.globalセクション
 全体の挙動に関する設定を行う。

2.defaultsセクション
 以下の「listen」「frontend」「backend」に関するデフォルトの設定を行う。

3.listenセクション ※必須ではない
 frontendやbackendの設定をこのセクションでまとめて行える。
 または、hastatsというステータス情報を出力するページの設定を行う。

4.frontendセクション
 クライアントからのパケット受け入れに関する設定を行う。

5.backendセクション
 ロードバランス(またはProxy)するサーバ(群)に対する設定を行う。


では、簡単に見ていきます。
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # ログの出力 ※次回説明します。。
    log         127.0.0.1 local6 debug

    # pidファイルのパス
    pidfile     /var/run/haproxy.pid

    # 1プロセスに対する最大接続数
    maxconn     4096

    # 実行ユーザとグループ
    user        haproxy
    group       haproxy

    # 起動プロセスはバックグラウンドで動作します。。
    daemon

    # 起動するプロセス数。公式には'1'のままで良いとのことですが、16コアCPUだと4くらいが最もパフォーマンスが出た。。
    nbproc 2
 
   # プロセスごとの最大ファイルディスクリプタを設定。書かなくても自動で設定されるらしい。
    ulimit-n 12000

    # 統計情報が見れる。※ただし要設定!次回説明します。。
    stats socket /var/run/haproxy/stats.socket uid 105 gid 105 
次に、defaultsセクション。
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will 
# use if not designated in their block
#---------------------------------------------------------------------
defaults
   # L7でロードバランス。'mode tcp'とすればTCPレベル(L4)でロードバランスするので処理速度の向上が見込める。
    mode        http 

    # globalセクションでの設定が引き継がれる。
    log         global

    # このオプションよう分からん。。NULLなコネクションのログを書き出さない?
    option      dontlognull

    # ヘルスチェックのログを書き出す。
    option      log-health-checks

    # backendサーバに接続できない時のタイムアウト秒数(ミリ秒)
    timeout connect 10000 # default 10 second time out if a backend is not found
    # クライアントサイドでのタイムアウト秒数。' timeout server 'と同じ値が推奨とのこと。
    timeout client  30000
    # サーバサイドのタイムアウト秒数
    timeout server  30000

    # 接続に失敗した際のリトライ回数
    retries     3

次はlistenセクション。僕はhastats(ステータスページ)で使っています。
# 8088ポートで待受ける
listen hastats *:8088
    mode http
    maxconn 64
    contimeout 5000
    clitimeout 10000
    srvtimeout 10000
    stats enable
    stats show-legends
    stats uri /haproxy?hastats

    # IDとパスワード
    stats auth username:yourpassword
これで、http://example.com/haproxy?hastatsを入力するとHaproxyのステータスが表示される

次にfrontendセクション。
# 80番ポートで待ち受ける。
frontend  all 0.0.0.0:80
    # URLの最初に/static /images /javascript /stylesheetsがあれば url_static をTRUEに設定する。
    acl url_static       path_beg       -i /static /images /javascript /stylesheets

    # URLの最後が .jpg .gif .png .css .jsだったら url_static をTRUEに設定する。
    acl url_static       path_end       -i .jpg .gif .png .css .js

    # もし url_staticがTRUEだったら、バックエンドは static を使う。
    use_backend static          if url_static

    # デフォルトのバックエンドは app を使う。
    default_backend             app
このACLがhaproxyの強みで、いろんな条件に応じてバックエンドサーバを振り分けることが可能です。
※ACLについては「HAProxyのACLとCriteria」が詳しかったです。またはここのGoogle Docs。
URLやIPアドレス、ポート、HTTPヘッダなどを見て振り分けられます。

次にbackendセクション
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
# static というバックエンドサーバ
backend static
    # ラウンドロビンでの振り分け(デフォルト)。比重の設定も可能。
    balance     roundrobin

    # 127.0.0.1:4331で起動。IPを変えて他サーバにすることが可能。
    # checkでヘルスチェックを有効にする。
    server      static 127.0.0.1:4331 check

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
# app というバックエンドサーバ群
backend app
    # ラウンドロビンで振り分け。
    balance     roundrobin

    # サーバは以下の4台でラウンドロビン。ちなみに weight '数値' とすることで振り分けの比重を設定できる。
    server  app1 127.0.0.1:5001 check
    server  app2 127.0.0.1:5002 check
    server  app3 127.0.0.1:5003 check
    server  app4 127.0.0.1:5004 check
こんな感じです。


これで起動させてみましょう。
service haproxy start
URLの末尾が xxx.jpg とかだと、きっと127.0.0.1:4331へProxyされるはずです。


ちょっと長くなったのでログ出力と'stats socket'についてはまた次回書きます。


以上でぇぇえっぇぇぇぇす。


※2013.11.16追記
L7ロードバランサHaproxyを使う(その3 syslogの設定とコマンドラインツール)」書きました。

2013年10月24日木曜日

[cocos2d-x] 画面サイズ、ウインドウサイズについて

どうも、俺@昼休みです。

cocos2d-xでは画面の表示領域を取得するメソッドがいくつかありますが、
いつも混乱するのでまとめておきます。

・端末の解像度ごとのサイズを取得する(フレームサイズ)

// 幅
float width = CCEGLView::sharedOpenGLView()->getFrameSize().width;
// 高さ
float height = CCEGLView::sharedOpenGLView()->getFrameSize().height;
これで、実際の端末解像度の値が取得できます。
例えば縦型(ポートレイト)の場合、heightはそれぞれ、、
iPhone4S...960
iPhone5...1136
iPhone5S...1136
iPad(非retina)...1024
iPad(retina)...2048
となります。
Android端末の場合は、それぞれの端末ごとの解像度になります。


・setDesignResolutionSize()している時の表示サイズを取得する(ウインドウサイズ)

// 幅
float width = CCDirector::sharedDirector()->getWinSize().width;
// 高さ
float height = CCDirector::sharedDirector()->getWinSize().height;

// または
// 幅
float width = CCEGLView::sharedOpenGLView()->getDesignResolutionSize().width
// 高さ
float height = CCEGLView::sharedOpenGLView()->getDesignResolutionSize().height;
これで、解像度に合わせて画面サイズを設定している場合の幅、高さが取得できます。



以上でぇぇぇぇぇえす。

2013年10月21日月曜日

Linuxカーネルが32bitか64bitか、またCPUが64bit対応か32bit対応かを確認する

どうも、俺@帰る前です。

L7ロードバランサHaproxyを使う(その1 インストールまで)を書いてて、調べる機会があったのでまとめておきます。

・Linuxが32bitカーネルか64bitカーネルかを調べる

uname -a
Linux centos 2.6.18-238.9.1.el5 #1 SMP Tue Apr 12 18:10:13 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux
のように、x84_64が出てくると64bitカーネルです。
32bitカーネルの場合は

uname -a
Linux centos 2.6.18.8-xenU #4 SMP Fri Sep 26 11:41:46 JST 2008 i686 unknown
のように、i686やi386が出ます。


・CPUが32bitアーキテクチャか64bitアーキテクチャかを調べる

cat /proc/cpuinfo | grep lm
flags           : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm up pni vmx cx16 popcnt lahf_lm
のように、flagsに「lm」が出てくれば64bitアーキテクチャ。
ちなみにlmは「ロングモード(x86_64)」の略のようです。
32bitのCPUでは「lm」が出てきません。

※参考「/proc/cpuinfo 再調査編 - ぴろにっき


以上でぇぇぇぇぇえす。

L7ロードバランサHaproxyを使う(その1 インストールまで)

どうも、俺@仕事中です。

今日はオープンソースのロードバランサの1つの「Haproxy」について紹介します。
L7なのでアプリケーション層レベルでのロードバランシングが可能です。
※httpのURLパラメータを見てアクセスするサーバを振り分ける、など可能です。
※もちろんL4で稼働させることも可能です。

開発環境はCentOS5.6(64bit)です。

2013.10.21時点での安定版の最新はv1.4.24です。
上記のURLからtarballを落としてからインストールします。


tar zxvf haproxy-1.4.24.tar.gz
cd haproxy-1.4.24
make TARGET=linux26 ARCH=x86_64
sudo make install
# make時のフラグは同梱されているREADMEに書いているので、参考に!

これでデフォルトの/usr/local以下にインストールされます。
インストール先などのオプションを指定するには、同梱されているMakefileを変更すればOKです。

次に起動スクリプトを/etc/init.d以下へ

cp examples/haproxy.init /etc/init.d/haproxy
chmod +x /etc/init.d/haproxy
こうしておくことで
/sbin/service haproxy start
で起動したり出来ます。

つぎに設定ファイルです。

mkdir /etc/haproxy
cp examples/example.cfg /etc/haproxy/haproxy.cfg
すでにひな形があるので、それを元に設定できます。
設定については細かいオプションも用意されており、柔軟に設定可能です。

ちょっと長くなりそうなので、近いうちに"その2"書きます。

以上でぇぇぇぇぇえす。


※2013.11.07追記
L7ロードバランサHaproxyを使う(その2 設定から起動)書きました。