<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:admin="http://webns.net/mvcb/"
 xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel rdf:about="http://blog.hansode.org/">
<title>半袖野郎 blog.hansode.org</title>
<link>http://blog.hansode.org/</link>
<description>ビールをツマミにビールを飲む
</description>
<dc:language>ja</dc:language>
<admin:generatorAgent rdf:resource="http://blog.livedoor.com/?v=2.0" />
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
<items>
 <rdf:Seq>
  <rdf:li rdf:resource="http://blog.hansode.org/archives/52531286.html" />
  <rdf:li rdf:resource="http://blog.hansode.org/archives/52521158.html" />
  <rdf:li rdf:resource="http://blog.hansode.org/archives/52520908.html" />
  <rdf:li rdf:resource="http://blog.hansode.org/archives/52520878.html" />
  <rdf:li rdf:resource="http://blog.hansode.org/archives/52504307.html" />
  <rdf:li rdf:resource="http://blog.hansode.org/archives/52504522.html" />
  <rdf:li rdf:resource="http://blog.hansode.org/archives/52503377.html" />
  <rdf:li rdf:resource="http://blog.hansode.org/archives/52503349.html" />
  <rdf:li rdf:resource="http://blog.hansode.org/archives/52503317.html" />
  <rdf:li rdf:resource="http://blog.hansode.org/archives/52502718.html" />
 </rdf:Seq>
</items>
</channel>
<item rdf:about="http://blog.hansode.org/archives/52531286.html">
<title>[Sphinx][Cygwin] 日本語フォルダ/ファイル名を扱えるようにするパッチを作った #sphinxjp</title>
<link>http://blog.hansode.org/archives/52531286.html</link>
<description>フォルダに日本語が入ってる時に&quot;make html&quot;が失敗する


Sphinxを利用してドキュメントを作成していたら、make htmlに失敗する現象に遭遇した。


$ make html
sphinx-build -b html -d _build/doctrees   . _build/html
Running Sphinx v1.1.2
WARNING: the config value '...</description>
<dc:creator>sigalrm</dc:creator>
<dc:date>2012-03-06T13:00:11+09:00</dc:date>
<dc:subject>hacks/lang/Python</dc:subject>
<content:encoded><![CDATA[<h4>フォルダに日本語が入ってる時に"make html"が失敗する</h4>

<p>
Sphinxを利用してドキュメントを作成していたら、make htmlに失敗する現象に遭遇した。
</p>
<pre class="hogeri">
$ make html
sphinx-build -b html -d _build/doctrees   . _build/html
Running Sphinx v1.1.2
WARNING: the config value '__file__' is set to a string with non-ASCII characters; this can lead to Unicode errors occurring. Please use Unicode strings, e.g. u'Content'.
loading pickled environment... not yet created
building [html]: targets for 4 source files that are out of date
updating environment: 4 added, 0 changed, 0 removed
reading sources... [ 25%] cloud-client
Exception occurred:
  File "/usr/lib/python2.6/site-packages/Sphinx-1.1.2-py2.6.egg/sphinx/environment.py", line 758, in read_doc
    pub.set_source(None, src_path.encode(fs_encoding))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 73: ordinal not in range(128)
The full traceback has been saved in /tmp/sphinx-err-Cg4EMC.log, if you want to report the issue to the developers.
Please also report this if it was a user error, so that a better error message can be provided next time.
Either send bugs to the mailing list at <http://groups.google.com/group/sphinx-dev/>,
or report them in the tracker at <http://bitbucket.org/birkenfeld/sphinx/issues/>. Thanks!
make: *** [html] Error 1
</pre>


<p>
幾つか試してみると、失敗する時は、フォルダ名に日本語が入っている。
この辺を検索してみると、同じように日本語フォルダ/ファイル名問題に失敗してる事例を発見。
</p>

<p><a href="http://sphinx-users.jp/event/20110319_translating_hackathon/">Sphinx翻訳ハッカソン(2011/3/19)</a></p>
<blockquote>
<ul>
<li>清水川
<ul>
<li>日本語ファイル名を使うとmake htmlできない問題をちょっと追ってみたい。 元ネタ: <br /><a href="http://twitter.com/kotakanbe/statuses/48632925364826113">http://twitter.com/kotakanbe/statuses/48632925364826113</a></li>
<li>Sphinxで日本語ファイル名／ディレクトリ名を扱えるようにするパッチが 出来ました <br /><a href="http://paste.pocoo.org/show/355901/">http://paste.pocoo.org/show/355901/</a> 人柱とコードレビューアを募集中です。</li>
</ul>
</li>
</ul>
</blockquote>

<p>
手元の環境に<a href="http://paste.pocoo.org/show/355901/">http://paste.pocoo.org/show/355901/</a>を適用してみると動かない。これはSphinxのバージョン差異が問題だった。
</p>

<ul>
 <li>Sphinx 1.0.7</li>
</ul>

<p>
上記パッチを参考に書いたのが、下記検証環境において動作確認したパッチ。
</p>

<h5>検証環境</h5>

<ul>
 <li>CYGWIN_NT-6.1</li>
 <li>Python 2.6.5</li>
 <li>Sphinx 1.1.2</li>
</ul>

<h5>Sphinx-1.1.2-py2.6.patch(日本語フォルダ/ファイル名を扱えるようにするパッチ)</h5>
<script src="https://gist.github.com/1868055.js?file=Sphinx-1.1.2-py2.6.patch"></script>

<h5>あとがき</h5>

<p>本パッチのベースとなるパッチを作成・公開して下さった  <a href="https://twitter.com/#!/shimizukawa">@shimizukawa</a> 様、ありがとうございます。</p>
<br />

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4048686291/kialpi-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51wSTTIQtgL._SL160_.jpg" alt="エキスパートPythonプログラミング" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4048686291/kialpi-22/ref=nosim/" name="amazletlink" target="_blank">エキスパートPythonプログラミング</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4048686291/kialpi-22/ref=nosim/" title="エキスパートPythonプログラミング" target="_blank">amazlet</a> at 12.03.06</div></div><div class="amazlet-detail">Tarek Ziade <br />アスキー・メディアワークス <br />売り上げランキング: 7179<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4048686291/kialpi-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=331650&name=sigalrm&pid=52531286" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.hansode.org/archives/52521158.html">
<title>[RHEL][Upstart] Upstartにおけるulimit設定とcore dump</title>
<link>http://blog.hansode.org/archives/52521158.html</link>
<description>原因調査の行き着く先か・・・


原因調査の為、core dumpさせたい時がある。
ulimitを設定すれば良い訳だが、サービス管理はUpstartを利用している。
SysVinitではなく、Upstartでulimitを設定するには、どうしたものか。


検証環境


 RHEL 6.0 / CentOS 6.0 (x86_64)
 Up...</description>
<dc:creator>sigalrm</dc:creator>
<dc:date>2012-01-27T20:30:21+09:00</dc:date>
<dc:subject>hacks/linux/RHEL</dc:subject>
<content:encoded><![CDATA[<h4>原因調査の行き着く先か・・・</h4>

<p>
原因調査の為、core dumpさせたい時がある。
ulimitを設定すれば良い訳だが、サービス管理はUpstartを利用している。
SysVinitではなく、Upstartでulimitを設定するには、どうしたものか。
</p>

<h4>検証環境</h4>

<ul>
 <li>RHEL 6.0 / CentOS 6.0 (x86_64)</li>
 <li>Upstart 0.6.5</li>
</ul>

<h4>要件定義</h4>

<ul>
 <li>SysVinitとUpstartで同じ設定ファイルを使いたい</li>
 <li>ジョブ単位で設定したい</li>
</ul>

<h4>作業概要</h4>

<p>
下記の事前調査を元に作業概要をまとめると、下記の通り。
</p>

<ol>
 <li>/etc/sysctl.confによるカーネルパラメータ設定</li>
 <li>/etc/sysconfig/(ジョブ名) を追記(or作成)し、変数DAEMON_COREFILE_LIMITを定義</li>
 <li>/etc/init/(ジョブ名).conf を修正し、
  <ol>
   <li>/etc/sysconfig/init を読み込む</li>
   <li>/etc/sysconfig/(ジョブ名) を読み込む</li>
  </ol>
 </li>
 <li>強制core dumpさせてcore dumpファイルを作成してみる</li>
</ol>

<h4>事前調査</h4>

<p>SysVinitの起動スクリプトがulimitを設定する流れを追ってみる。</p>
<ol>
 <li>サンプルとして/etc/init.d/ssh を確認。
 <li>/etc/init.d/sshの30行目で /etc/rc.d/init.d/functions を読み込んでる
<pre class="hogeri">
29  # source function library
30  . /etc/rc.d/init.d/functions
</pre>
</li>
 <li>/etc/rc.d/init.d/functionsの239行目でulimit設定してるのが分かる
  <pre class="hogeri">
239        corelimit="ulimit -S -c ${DAEMON_COREFILE_LIMIT:-0}"
</pre>
 </li>
 <li>変数 DAEMON_CORE_LIMIT を定義してるのはどこか？</li>
 <li>/etc/rc.d/init.d/functionsの29行目のコメントにより、構成定義してるのは、30行目で読み込んでる/etc/sysconfig/initだと分かる。
<pre class="hogeri">
28 # Read in our configuration
29    if [ -f /etc/sysconfig/init ]; then
30        . /etc/sysconfig/init
31    else
</pre>
</li>
<li>/etc/sysconfig/init の内容を確認してみると、
<pre class="hogeri">
 1  # color =&gt; new RH6.0 bootup
 2  # verbose =&gt; old-style bootup
 3  # anything else =&gt; new style bootup without ANSI colors or positioning
 4  BOOTUP=color
 5  # column to start "[  OK  ]" label in
 6  RES_COL=60
 7  # terminal sequence to move to that column. You could change this
 8  # to something like "tput hpa ${RES_COL}" if your terminal supports it
 9  MOVE_TO_COL="echo -en \\033[${RES_COL}G"
10  # terminal sequence to set color to a 'success' color (currently: green)
11  SETCOLOR_SUCCESS="echo -en \\033[0;32m"
12  # terminal sequence to set color to a 'failure' color (currently: red)
13  SETCOLOR_FAILURE="echo -en \\033[0;31m"
14  # terminal sequence to set color to a 'warning' color (currently: yellow)
15  SETCOLOR_WARNING="echo -en \\033[0;33m"
16  # terminal sequence to reset to the default color.
17  SETCOLOR_NORMAL="echo -en \\033[0;39m"
18  # Set to anything other than 'no' to allow hotkey interactive startup...
19  PROMPT=yes
20  # Set to 'yes' to allow probing for devices with swap signatures
21  AUTOSWAP=no
22  # What ttys should gettys be started on?
23  ACTIVE_CONSOLES=/dev/tty[1-6]
24  # Set to '/sbin/sulogin' to prompt for password on single-user mode
25  # Set to '/sbin/sushell' otherwise
26  SINGLE=/sbin/sushell
</pre>
DAEMON_COREFILE_LIMIT は存在しない。
</li>
<li>/etc/sysconfig/sshd の33行目
<pre class="hogeri">
32  # pull in sysconfig settings
33  [ -f /etc/sysconfig/sshd ] && . /etc/sysconfig/sshd
</pre>
/etc/sysconfig/sshd を読み込んでるのが分かる。ここでもDAEMON_COREFILE_LIMITは可能だ。
<li>/etc/sysconfig/sshdは存在しない。
<pre class="hogeri">
# ls -l /etc/sysconfig/sshd
ls: cannot access /etc/sysconfig/sshd: No such file or directory
</pre>
</li>
<li>${DAEMON_COREFILE_LIMIT:-0} は、変数値が無い場合 0。設定しない場合は、 0 だと分かる。</li>
</ol>

<p>sshの場合は、下記2ファイルのうちどちらかで定義すれば良い。</p>
<ul>
 <li>/etc/sysconfig/init</li>
 <li>/etc/sysconfig/sshd</li>
</ul>

<p>
前者はSysVinit全体に対する設定ファイルで、後者はサービス個別の設定ファイル。
どちらで設定するかは、利用環境に依存する。
</p>

<h4>環境定義</h4>

<p>検証用に fake-service を作成する。</p>

<table border="1">
<tr><td>ジョブ名</td><td>fake-service</td></tr>
<tr><td>sys config</td><td>/etc/sysconfig/fake-service</td></tr>
<tr><td>upstart config</td><td>/etc/init/fake-service.conf</td></tr>
</table>


<h4>作業内容</h4>

<h5>core dump取得設定</h5>

<p>core dumpファイルを取得する為の準備作業として、カーネルパラメータ設定。</p>
<dl>
<dt>/etc/sysctl.conf (追記)</dt>
<dd>
<pre class="hogeri">
kernel.core_pattern = /tmp/core
kernel.core_uses_pid = 1
</pre>
</dd>
</dl>

<p>/etc/sysctl.confを反映</p>
<pre class="hogeri">
# sysctl -p
</pre>
<p>これにより、 /tmp/core.PID としてcore dumpファイルが作成される。</p>


<h5>fake-service設定</h5>

<dl>
<dt>/etc/sysconfig/fake-service</dt>
<dd>
<pre class="hogeri">
DAEMON_COREFILE_LIMIT=unlimited
</pre>
<ul>
 <li>/etc/sysconfig/init に設定すると、SysVinit全体設定となるので、今回はfake-service限定としておく。</li>
</ul>
</dd>

<dt>/etc/init/fake-service.conf</dt>
<dd>
<pre class="hogeri">
respawn

script
    # system global
    [ -f /etc/sysconfig/init ] && {
      . /etc/sysconfig/init
    }
    # job local
    [ -f /etc/sysconfig/fake-service ] && {
      . /etc/sysconfig/fake-service
    }

    # /etc/rc.d/init.d/functions line#239&gt; corelimit="ulimit -S -c ${DAEMON_COREFILE_LIMIT:-0}"
    ulimit -c ${DAEMON_COREFILE_LIMIT:-0}

    exec sleep 3600
end script
</pre>
<ol>
 <li>/etc/sysconfig/initを先に読み込む。</li>
 <li>/etc/sysconfig/fake-serviceを次に読み込む。</li>
 <li>DAEMON_COREFILE_LIMIT が定義済みであれば、 DAEMON_COREFILE_LIMITの値。未定義であれば、0。</li>
</ol>
</dd>
</dl>

<h5>Upstartのジョブ操作</h5>

<p>ジョブが起動してない事を確認。</p>
<pre class="hogeri">
# initctl status fake-service
fake-service stop/waiting
</pre>

<p>ジョブを起動。</p>
<pre class="hogeri">
# initctl start fake-service
fake-service start/running, process <strong>3500</strong>
</pre>
<p>プロセスIDが 3500 である事が分かる。</p>

<p>プロセスID指定でプロセスを確認。</p>
<pre class="hogeri">
# ps -p 3500
  PID TTY          TIME CMD
 3500 ?        00:00:00 sleep
</pre>
<p>Upstartによってexecしてるsleepである事が分かる。</p>

<p>QUITシグナルを送り、強制的にcore dumpさせる。</p>
<pre class="hogeri">
# kill -QUIT 3500
</pre>

<p>QUITシグナル送信後のジョブ状態を確認。</p>
<pre class="hogeri">
# initctl status fake-service
fake-service start/running, process <strong>3595</strong>
</pre>
<p>QUITシグナル送信により、プロセスIDが変化してる。3500 → 3595。</p>

<h5>core dumpファイルを確認</h5>

<p>core dumpファイルが作成されてる事を確認出来る。</p>
<pre class="hogeri">
# ls -la /tmp/core.3500
-rw-------. 1 root root 319488 Jan 27 19:02 /tmp/core.3500
</pre>
<p>gdbによる調査・デバッグへと進むのであった・・・。</p>

<h4>あと書き</h4>
<p>/etc/sysconfig/を使わず、/etc/init/fake-service.conf内でulimitの設定値をハードコードしてしまっても良いのでは無いか？</p>

<br />
<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774145017/kialpi-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/61JA5nOamIL._SL160_.jpg" alt="プロのための Linuxシステム構築・運用技術 (Software Design plus)" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774145017/kialpi-22/ref=nosim/" name="amazletlink" target="_blank">プロのための Linuxシステム構築・運用技術 (Software Design plus)</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4774145017/kialpi-22/ref=nosim/" title="プロのための Linuxシステム構築・運用技術 (Software Design plus)" target="_blank">amazlet</a> at 12.01.27</div></div><div class="amazlet-detail">中井 悦司 <br />技術評論社 <br />売り上げランキング: 6581<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774145017/kialpi-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=331650&name=sigalrm&pid=52521158" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.hansode.org/archives/52520908.html">
<title>[RHEL][flog] ログローテートを考慮してないプログラムのログを安全にローテートする</title>
<link>http://blog.hansode.org/archives/52520908.html</link>
<description>v.s. ログローテート未対応プログラム


 標準出力しかしないプログラムがあったとする。
 プログラムの出力をログファイルとして保存する為に、標準出力をリダイレクトしてログファイルを作成して対応したとする。


こんな状況。

$ program &gt; /path/to/command.log



こ...</description>
<dc:creator>sigalrm</dc:creator>
<dc:date>2012-01-26T20:40:16+09:00</dc:date>
<dc:subject>hacks/linux/RHEL</dc:subject>
<content:encoded><![CDATA[<h4>v.s. ログローテート未対応プログラム</h4>

<ol>
 <li>標準出力しかしないプログラムがあったとする。</li>
 <li>プログラムの出力をログファイルとして保存する為に、標準出力をリダイレクトしてログファイルを作成して対応したとする。</li>
</ol>

<p>こんな状況。</p>
<pre class="hogeri">
$ program &gt; /path/to/command.log
</pre>

<p>
このログファイルを、どうにかしてをローテートしたい。さて、どうする？
</p>

<h4>flog(file logger)と言う選択肢</h4>

<p>
いくつかあるであろう解決策の１つとして、今回は<a href="http://oss.ezic.com/flog/README">flog</a>を使って解決した。
</p>

<pre class="hogeri">
WHAT IS IT?
===========

flog (file logger) is a program that reads input from STDIN
and writes to a file. if a SIGHUP is received, the file will be
reopened, allowing for log rotation [see logrotate(8) on RH.]
The log file will only be reopened if flog detects that
rotation has occurred (ie, old file gone or inode changed).
flog is very small (less than 500 bytes memory footprint.)
</pre>

<p>コマンドで説明すると下記の通り。</p>

<pre class="hogeri">
$ program | flog /path/to/log

$ mv -i /path/to/log /path/to/log.1
$ kill -HUP "flog's PID"
</pre>

<p>
後はHUPシグナル送信をlogrotate(8)内で行えば良いだけの事。
flogへのシグナル送信である所がミソ。
</p>


<h4>検証環境</h4>
<ul>
 <li>RHEL 6.0 / CentOS 6.0 (x86_64)</li>
 <li>alien 8.81</li>
 <li>flog 1.8</li>
 <li>upstart 0.6.5</li>
 <li>logrotate 3.7.8</li>
</ul>

<h4>要件定義</h4>
<ul>
 <li>サービス監視プログラムは修正しない</li>
 <li>標準出力をログファイルへ出力・保存</li>
 <li>サービスを再起動する事無く、ログファイルを安全にローテート</li>
</ul>

<h4>作業概要</h4>

<ol>
 <li>flog環境構築
  <ol>
   <li>残念ながらflogのrpmは無く、<a href="http://packages.ubuntu.com/search?keywords=flog">debは存在</a>するので、debからrpmを作成する。</li>
   <li>flogのdebパッケージをダウンロード</li>
   <li>alienを使ってdebからrpmへ変換</li>
   <li>flogをインストール</li>
  </ol>
 </li>
 <li>upstart configを作成</li>
 <li>logrotate configを作成</li>
 <li>ログローテート確認</li>
</ol>

<h4>環境定義</h4>

<table border="1">
<tr><td>サービスプログラム</td><td>/tmp/fake-service.sh</td></tr>
<tr><td>ログファイル</td><td>/var/log/fake-service.log</td></tr>
<tr><td>upstart</td><td>/etc/init/fake-service.conf</td></tr>
<tr><td>logrotate</td><td>/etc/logrotate.d/fake-service</td></tr>
</table>

<h4>事前作業</h4>

<ul>
 <li><a href="http://blog.hansode.org/archives/52520878.html">alienでパッケージ変換(deb→rpm)</a>により、alienがインストールされている事</li>
</ul>

<h4>作業内容</h4>

<h5>flog環境構築</h5>

<p>fakerootをインストール</p>
<pre class="hogeri">
$ sudo yum install -y fakeroot
</pre>

<p>flogのdebパッケージを取得</p>
<pre class="hogeri">
$ curl -O http://ftp.jaist.ac.jp/pub/Linux/ubuntu//pool/universe/f/flog/flog_1.8-3_amd64.deb
</pre>

<p>alienでdebをrpmへ変換</p>
<pre class="hogeri">
$ fakeroot alien --to-rpm ./flog_1.8-3_amd64.deb
flog-1.8-4.x86_64.rpm generated
find: `flog-1.8': No such file or directory

$ ls -l flog-1.8-4.x86_64.rpm
-rw-r--r-- 1 hansode hansode 9801 Jan 25 18:34 flog-1.8-4.x86_64.rpm
</pre>

<p>変換したrpmをインストール</p>
<pre class="hogeri">
$ sudo rpm -ivh flog-1.8-4.x86_64.rpm
</pre>

<p>インストールされている事を確認</p>
<pre class="hogeri">
$ which flog
/usr/bin/flog

$ rpm -qf `which flog`
flog-1.8-4.x86_64
</pre>


<h5>ダミーのfake-service</h5>

<p>実際に何か出力するだけのダミースクリプトを配置。</p>
<dl>
<dt>/tmp/fake-service.sh</dt>
<dd>
<pre class="hogeri">
#!/bin/sh

while date; do sleep 1; done
</pre>
</dd>
</dl>

<p>実行権限付与。</p>
<pre class="hogeri">
$ chmod +x /tmp/fake-service.sh
</pre>

<h5>upstart設定とlogrotate設定</h5>
<dd>
<dt>/etc/init/fake-service.conf</dt>
<dd>
<pre class="hogeri">
start on runlevel [2345]
stop on runlevel [016]

respawn

exec /tmp/fake-service.sh \
  | /usr/bin/flog \
 -p /var/run/fake-service.pid \
    /var/log/fake-service.log
</pre>
<ul>
 <li>fake-serviceの標準出力をflogが受け取り、/var/log/fake-service.logとして出力</li>
 <li>-pオプションでflogのPIDを  /var/log/fake-service.log として記録</li>
</ul>
</dd>

<dt>/etc/logrotate.d/fake-service</dt>
<dd>
<pre class="hogeri">
/var/log/fake-service.log {
    rotate 10
    compress
    missingok
    sharedscripts
    create 0644 root root
    postrotate
      pid_file=/var/run/fake-service.pid
      [ -f ${pid_file} ] || exit 0
      pid=`cat ${pid_file}`
      ps -p ${pid} &gt;/dev/null || exit 0
      kill -HUP ${pid}
    endscript
}
</pre>
<ul>
 <li>postrotateで、ローテート後の処理を定義可能。</li>
 <li>flogプロセスにHUPシグナルを送信</li>
 <li>flogのPIDは、PIDファイルから取得可能</li>
</ul>
</dd>
</dl>

<h5>ログローテート準備</h5>

<p>サービスを起動。</p>
<pre class="hogeri">
$ sudo initctl start fake-service
fake-service start/running, process <strong>28692</strong>
</pre>
<p>この例ではPIDが 28692。ログローテート確認時にも利用するのでメモ。</p>

<p>pidファイルを確認。</p>
<pre class="hogeri">
$ ls -la /var/run/fake-service.pid
-rw-r--r-- 1 root root 6 Jan 26 19:19 /var/run/fake-service.pid
$ cat /var/run/fake-service.pid
<strong>28694</strong>
</pre>

<p>flogのPIDが 28694 である事が分かる。</p>
<pre class="hogeri">
$ ps -fp `cat /var/run/fake-service.pid`
UID        PID  PPID  C STIME TTY          TIME CMD
root     <strong>28694</strong> <strong>28692</strong>  0 19:19 ?        00:00:00 /usr/bin/flog -p /var/run/fake-service.pid /var/log/fake-service.log
</pre>
<p>プロセスID指定で確認してみると、flogである事が分かる。親PIDはupstartのPIDである事も分かる。</p>

<table border="1">
<tr><th>プロセス</th><th>PID</th></tr>
<tr><td>fake-service</td><td>28692</td></tr>
<tr><td>flog</td><td>28694</td></tr>
</table>

<p>ローテート前のログ状態を確認。</p>
<pre class="hogeri">
$ ls -l /var/log/fake-service.log*
-rw-r--r-- 1 root root 12758 Jan 26 19:21 /var/log/fake-service.log
</pre>
<p>ローテート前なので、ログファイルが１つ。</p>

<h5>ログローテート実行</h5>

<p>ログローテートしてみる。</p>
<pre class="hogeri">
$ sudo logrotate -f /etc/logrotate.d/fake-service
</pre>

<h5>ログローテート後の確認</h5>

<p>サービスのPIDに変化が無い事を確認。</p>
<pre class="hogeri">
$ sudo initctl status fake-service
fake-service start/running, process <strong>28692</strong>
</pre>

<p>pidファイルを確認。</p>
<pre class="hogeri">
$ ls -la /var/run/fake-service.pid
-rw-r--r-- 1 root root 6 Jan 26 19:19 /var/run/fake-service.pid
$ cat /var/run/fake-service.pid
<strong>28694</strong>
</pre>

<p>pidファイルのPIDでプロセスを確認。</p>
<pre class="hogeri">
$ ps -fp `cat /var/run/fake-service.pid`
UID        PID  PPID  C STIME TTY          TIME CMD
root     <strong>28694</strong> <strong>28692</strong>  0 19:19 ?        00:00:00 /usr/bin/flog -p /var/run/fake-service.pid /var/log/fake-service.log
</pre>
<p>flogである事が分かる。</p>

<p>ローテート後のログ状態を確認。</p>
<pre class="hogeri">
$ ls -la /var/log/fake-service.log*
-rw-r--r-- 1 root root 3599 Jan 26 19:34 /var/log/fake-service.log
-rw-r--r-- 1 root root  485 Jan 26 19:32 /var/log/fake-service.log.1.gz
</pre>
<p>ローテートされている事が分かる。</p>

<pre class="hogeri">
$ sudo initctl status fake-service
fake-service start/running, process <strong>28692</strong>
</pre>

<table border="1">
<tr><th>プロセス</th><th>PID</th></tr>
<tr><td>fake-service</td><td>28692</td></tr>
<tr><td>flog</td><td>28694</td></tr>
</table>

<p>PIDは変化してない。</p>

<h5>もう一度ログローテート</h5>

<p>ローテートを実行。</p>
<pre class="hogeri">
$ sudo logrotate -f /etc/logrotate.d/fake-service
</pre>

<p>ログファイルを確認。</p>
<pre class="hogeri">
$ ls -la /var/log/fake-service.log*
-rw-r--r-- 1 root root 235 Jan 26 19:37 /var/log/fake-service.log
-rw-r--r-- 1 root root 787 Jan 26 19:37 /var/log/fake-service.log.1.gz
-rw-r--r-- 1 root root 485 Jan 26 19:32 /var/log/fake-service.log.2.gz
</pre>
<p>ローテートされている事を確認。</p>


<h4>あと書き</h4>

<p>
ログローテートを考慮しないプログラムに遭遇して困ったら、flogが悩みを解決してくれるだろう。
</p>

<br />

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774145017/kialpi-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/61JA5nOamIL._SL160_.jpg" alt="プロのための Linuxシステム構築・運用技術 (Software Design plus)" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774145017/kialpi-22/ref=nosim/" name="amazletlink" target="_blank">プロのための Linuxシステム構築・運用技術 (Software Design plus)</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4774145017/kialpi-22/ref=nosim/" title="プロのための Linuxシステム構築・運用技術 (Software Design plus)" target="_blank">amazlet</a> at 12.01.26</div></div><div class="amazlet-detail">中井 悦司 <br />技術評論社 <br />売り上げランキング: 6253<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774145017/kialpi-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=331650&name=sigalrm&pid=52520908" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.hansode.org/archives/52520878.html">
<title>[RHEL] alienでパッケージ変換(deb→rpm)</title>
<link>http://blog.hansode.org/archives/52520878.html</link>
<description>debをrpmへ変換したい


rpmは無いけどもdebには存在する場合に時々使える。
小さいパッケージであればalienで変換すれば手軽にrpmへ変換が可能。



検証環境

 RHEL 6.0 / CentOS 6.0 (x86_64)
 alien 8.81


作業概要


 alianのtarballをダウンロード
 tarballからrpmを...</description>
<dc:creator>sigalrm</dc:creator>
<dc:date>2012-01-25T18:10:24+09:00</dc:date>
<dc:subject>hacks/linux/RHEL</dc:subject>
<content:encoded><![CDATA[<h4>debをrpmへ変換したい</h4>

<p>
rpmは無いけどもdebには存在する場合に時々使える。
小さいパッケージであればalienで変換すれば手軽にrpmへ変換が可能。
</p>


<h4>検証環境</h4>
<ul>
 <li>RHEL 6.0 / CentOS 6.0 (x86_64)</li>
 <li>alien 8.81</li>
</ul>

<h4>作業概要</h4>

<ol>
 <li>alianのtarballをダウンロード</li>
 <li>tarballからrpmを作成</li>
</ol>

<h4>作業内容</h4>

<p>依存パッケージをインストール</p>
<pre class="hogeri">
$ sudo yum install -y rpm-build perl-ExtUtils-MakeMaker
</pre>

<p>tarballを取得</p>
<pre class="hogeri">
$ curl -O http://ftp.debian.org/debian/pool/main/a/alien/alien_8.81.tar.gz
</pre>

<p>tarballからrpmをビルド</p>
<pre class="hogeri">
$ rpmbuild -ta alien_8.81.tar.gz
</pre>

<p>ビルドしたrpmをインストール</p>
<pre class="hogeri">
$ sudo rpm -ivh ~/rpmbuild/RPMS/noarch/alien-8.81-1.noarch.rpm
</pre>

<p>インストールされてる事を確認</p>
<pre class="hogeri">
$ which alien
/usr/bin/alien
$ rpm -qf `which alien`
alien-8.81-1.noarch
</pre>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=331650&name=sigalrm&pid=52520878" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.hansode.org/archives/52504307.html">
<title>[RHEL][DRBD] Linux+DRBDで作るサーバ冗長構成</title>
<link>http://blog.hansode.org/archives/52504307.html</link>
<description>名前は聞いた事があるのに、構築しなかった環境の１つ


DRBD環境構築が必要だったので、DRBD環境を構築。



構築完了したのは1ヶ月半も前の事。作業記録のタイムスタンプを見ると、11/08。
アウトプットするまでに随分と時間がかかってしまった事に反省。


検証環境

 RHE...</description>
<dc:creator>sigalrm</dc:creator>
<dc:date>2011-12-19T20:30:13+09:00</dc:date>
<dc:subject>hacks/linux/RHEL</dc:subject>
<content:encoded><![CDATA[<h4>名前は聞いた事があるのに、構築しなかった環境の１つ</h4>

<p>
DRBD環境構築が必要だったので、DRBD環境を構築。
</p>

<p>
構築完了したのは1ヶ月半も前の事。作業記録のタイムスタンプを見ると、11/08。
アウトプットするまでに随分と時間がかかってしまった事に反省。
</p>

<h5>検証環境</h5>
<ul>
 <li>RHEL 6.0 / CentOS 6.0 (i686)</li>
 <li>drbd 8.4.0</li>
</ul>

<h5>要件定義</h5>
<ul>
 <li><a href="http://www.drbd.jp/users-guide/ch-features.html#s-single-primary-mode">単一プライマリモード</a></li>
</ul>

<h5>作業概要</h5>
<ol>
 <li>DRBDをインストール</li>
 <li>DRBDの設定ファイルを作成</li>
 <li>DRBDを起動</li>
 <li>データ同期確認</li>
</ol>

<h6>サーバ構成</h6>
<table border="1">
<thead>
<tr><th>ノード名</th><th>用途</th><th>IPアドレス</th><th>NIC</th></tr>
</thead>
<tbody>
<tr><td>node1</td><td>master</td><td>192.0.2.2</td><td rowspan="3">eth0</td></tr>
<tr><td>node2</td><td>backup</td><td>192.0.2.3</td></tr>
<tr><td>-</td><td>Virtual IP</td><td>192.0.2.254</td></tr>
</tbody>
</table>

<h5>作業内容</h5>

<h6>事前作業</h6>

<p>DRBDをビルドするに辺り必要なパッケージをインストール。</p>
<pre class="hogeri">
$ sudo yum install -y gcc make automake autoconf flex rpm-build kernel-devel libxslt fakeroot
</pre>

<p>rpmbuildで必要となるディレクトリ構造を作成。く</p>
<pre class="hogeri">
$ mkdir -p /home/centos/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
</pre>

<p>ソースをダウンロード</p>
<pre class="hogeri">
$ curl -O http://oss.linbit.com/drbd/8.4/drbd-8.4.0.tar.gz
</pre>

<p>ダウンロードしたソースを伸長。</p>
<pre class="hogeri">
$ tar zxvf drbd-8.4.0.tar.gz
</pre>

<p>configureスクリプトを実行。</p>
<pre class="hogeri">
$ cd drbd-8.4.0
$ ./configure
</pre>

<p>
fakerootを経由してmakeを実行。fakerootを使う理由は、rpmをビルドするにはroot権限であるから。fakerootがroot権限であるかのような振る舞いをしてくれる。
</p>
<pre class="hogeri">
$ fakeroot make rpm km-rpm
</pre>

<p>無事にビルドが完了すると、下記rpmが作成される。</p>
<pre class="hogeri">
$ ls -1 /home/centos/rpmbuild/RPMS/i386/
drbd-8.4.0-1.el6.i386.rpm
drbd-bash-completion-8.4.0-1.el6.i386.rpm
drbd-heartbeat-8.4.0-1.el6.i386.rpm
drbd-km-2.6.32_71.el6.i686-8.4.0-1.el6.i386.rpm
drbd-pacemaker-8.4.0-1.el6.i386.rpm
drbd-udev-8.4.0-1.el6.i386.rpm
drbd-utils-8.4.0-1.el6.i386.rpm
drbd-xen-8.4.0-1.el6.i386.rpm
</pre>

<p>ビルド済みrpmで必要なのは drbd-utilsとdrbd-km。これらをインストール。</p>
<pre class="hogeri">
$ sudo rpm -ivh \
 /home/centos/rpmbuild/RPMS/i386/drbd-utils-8.4.0-1.el6.i386.rpm \
 /home/centos/rpmbuild/RPMS/i386/drbd-km-2.6.32_71.el6.i686-8.4.0-1.el6.i386.rpm
</pre>

<p>カーネルモジュールをロードしてみる。</p>
<pre class="hogeri">
$ lsmod | grep drbd
$ sudo modprobe drbd
$ lsmod | grep drbd
drbd                  274063  0
libcrc32c                815  1 drbd
</pre>

<p>"/etc/init.d/drbd start "実行にmodprobe drbdが実行されるので、ここではmodprobeコマンドでカーネルモジュールを正常にロード出来る事を確認するだけで良い。</p>

<p>起動対象サービスに入ってるのを確認しておく。</p>
<pre class="hogeri">
$ chkconfig --list drbd
drbd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
</pre>

<h6>デバイスファイル用意</h6>
<p>今回はrawファイルを作成しループバックマウントしてDRBD用デバイスファイルを調達する。</p>

<pre class="hogeri">
$ sudo dd if=/dev/zero of=/var/tmp/drbd.img bs=1M count=128
$ sudo losetup -f
/dev/loop0
</pre>

<p>作ったrawファイルを空きデバイス/dev/loop0にマッピングさせる。</p>
<pre class="hogeri">
$ sudo losetup /dev/loop0 /var/tmp/drbd.img
$ sudo losetup -a
/dev/loop0: [fd00]:266486 (/var/tmp/drbd.img)
</pre>
<p>これでDRBD用の同期対象デバイスが出来上がった。</p>

<h6>DRBD設定</h6>

<p>
必要に応じて/etc/hostsにホスト登録しておく。
理由は、configでIPアドレス指定するにも関わらず、名前解決に失敗すると起動しない為。
</p>
<pre class="hogeri">
$ sudo vi /etc/hosts
&gt; 192.0.2.2  drbd-primary
&gt; 192.0.2.3  drbd-secondary
</pre>

<p>configを追加。ドキュメントで拡張子は「.res」が推奨されているので、sandbox.resとして作成。</p>
<dl>
<dt>/etc/drbd.d/sandbox.res</dt>
<dd>
<pre class="hogeri">
resource sandbox {
  protocol C;
  device /dev/drbd0;
  disk   /dev/loop0;
  meta-disk internal;

  on drbd-primary {
    address 192.0.2.2:7801;
  }
  on drbd-secondary {
    address 192.0.2.3:7801;
  }
}
</pre>
</dd>
</dl>

<p>DRBDデバイスを初期化</p>
<pre class="hogeri">
$ sudo drbdadm create-md sandbox
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
success
</pre>
<p>※注意: iptablesが有効になってるとDRBD通信が行われない場合がある</p>

<p>DRBDを起動。</p>
<pre class="hogeri">
$ sudo /etc/init.d/drbd start
Starting DRBD resources: [
     create res: sandbox
   prepare disk: sandbox
    adjust disk: sandbox
     adjust net: sandbox
]
.....
</pre>

<p>DRBDが起動すると/proc/drbdが作成される。</p>
<pre class="hogeri">
$ cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by centos@centos, 2011-11-08 16:16:36
 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:131032
</pre>
<p>この時、どちらもsecondaryになっているのが分かる。</p>


<h5>データ同期確認</h5>
<p>primary側でファイルを作成し、secondaryへデータ同期が行われるのを確認する。</p>

<h6>ndoe1: (secondary→primary)</h6>

<p>node1をprimaryに昇格させる。</p>
<pre class="hogeri">
$ sudo drbdadm primary --force sandbox
</pre>

<p>primaryからsecondaryへの同期処理が開始され、しばらくすると同期完了する。</p>
<pre class="hogeri">
$ cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by centos@centos, 2011-11-08 16:16:36
 0: cs:SyncSource ro:<strong>Primary/Secondary</strong> ds:UpToDate/Inconsistent C r-----
    ns:2664 nr:0 dw:0 dr:3476 al:0 bm:0 lo:0 pe:3 ua:3 ap:0 ep:1 wo:b oos:128600
        [>....................] sync'ed:  3.2% (128600/131032)K
        finish: 0:00:45 speed: 2,432 (2,432) K/sec

$ cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by centos@centos, 2011-11-08 16:16:36
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:131032 nr:0 dw:0 dr:131696 al:0 bm:8 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
</pre class="hogeri">

<p>DRBDデバイスを確認。設定通り/dev/drbd0が作成されているのが分かる。</p>
<pre class="hogeri">
$ ls -la /dev/drbd0
brw-rw---- 1 root disk 147, 0 Nov  8 17:19 /dev/drbd0
</pre>

<p>通常のディスクデバイスファイルと同様にDRBDデバイスをフォーマットし、マウントすれば利用可能となる。</p>
<pre class="hogeri">
$ sudo mkfs -t ext4 /dev/drbd0
$ sudo mkdir /mnt/drbd0
$ sudo mount -t ext4 /dev/drbd0 /mnt/drbd0
</pre>

<p>マウント後の内容確認。</p>
<pre class="hogeri">
$ ls -la /mnt/drbd0/
total 17
drwxr-xr-x  3 root root  1024 Nov  8 17:22 .
drwxr-xr-x. 3 root root  4096 Nov  8 17:23 ..
drwx------  2 root root 12288 Nov  8 17:22 lost+found
</pre>

<p>primary・secondary間でデータ同期されるのを確認するため、ファイルを作成してみる。</p>
<pre class="hogeri">
$ sudo touch /mnt/drbd0/test.txt
$ ls -la /mnt/drbd0/
total 17
drwxr-xr-x  3 root root  1024 Nov  8 17:23 .
drwxr-xr-x. 3 root root  4096 Nov  8 17:23 ..
drwx------  2 root root 12288 Nov  8 17:22 lost+found
-rw-r--r--  1 root root     0 Nov  8 17:23 test.txt
</pre>


<h6>node1:(primary→secondary)</h6>

<p>DRBDが使用中だとsecondaryへ降格出来ないので、デバイスをumountする。</p>
<pre class="hogeri">
$ sudo umount /mnt/drbd0
</pre>

<p>secondaryへ降格させる。</p>
<pre class="hogeri">
$ sudo drbdadm secondary sandbox
$ cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by centos@centos, 2011-11-08 16:16:36
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:139687 nr:0 dw:8655 dr:132451 al:10 bm:8 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
</pre>
<p>これにより、他のsecondaryがprimaryへ昇格可能状態となる。</p>

<h6>node2: (secondary→primary)</h6>

<p>node2をprimaryへ昇格させる。</p>
<pre class="hogeri">
$ sudo drbdadm primary sandbox
</pre>

<p>/proc/drbdでprimaryになっているのが分かる。</p>
<pre class="hogeri">
$ cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by centos@centos, 2011-11-08 16:16:36
 0: cs:Connected ro:<strong>Primary/Secondary</strong> ds:UpToDate/UpToDate C r-----
    ns:0 nr:139687 dw:139687 dr:664 al:0 bm:8 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
</pre>

<p>DRBDデバイスの内容を確認する為、マウントする。</p>
<pre class="hogeri">
$ sudo mkdir /mnt/drbd0
$ sudo mount -t ext4 /dev/drbd0 /mnt/drbd0/
</pre>

<p>マウントポイントの内容を確認。node1で作成した test.txt が存在しているのが分かる。</p>
<pre class="hogeri">
$ ls -la /mnt/drbd0/
total 17
drwxr-xr-x  3 root root  1024 Nov  8 17:23 .
drwxr-xr-x. 3 root root  4096 Nov  8 17:25 ..
drwx------  2 root root 12288 Nov  8 17:22 lost+found
-rw-r--r--  1 root root     0 Nov  8 17:23 test.txt
</pre>

<h6>node2: (primary→secondary)</h6>

<p>umountし、secondaryへ降格させる。</p>
<pre class="hogeri">
$ sudo umount /mnt/drbd0
$ sudo drbdadm secondary sandbox
</pre>

<p>/dev/drbdでsecondaryに降格している事を確認。</p>
<pre class="hogeri">
$ cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by centos@centos, 2011-11-08 16:16:36
 0: cs:Connected ro:<strong>Secondary/Secondary</strong> ds:UpToDate/UpToDate C r-----
    ns:18 nr:139687 dw:139705 dr:671 al:3 bm:8 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
</pre>

<p>
これでnode1, node2がどちらもsecondaryになってる状態。
後はnode1をprimaryに昇格させて、同期させるだけ。
</p>

<h4>あと書き</h4>

<p>
DRBDのバージョンによってコマンド名、引数に違いがあるので、よく確認すべし。
</p>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=331650&name=sigalrm&pid=52504307" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.hansode.org/archives/52504522.html">
<title>[RHEL][ucarp] Linux + ucarpによるサーバ冗長化 (複数VIP編)</title>
<link>http://blog.hansode.org/archives/52504522.html</link>
<description>複数NICと複数IPアドレス、複数VIP


本エントリは、前エントリ 『Linux + ucarpによるサーバ冗長化』 の続編。前エントリでは、単一ネットワークにおける冗長化。それに対し、本エントリでは複数ネットワークを扱う。


検証環境

 RHEL 6.0 / CentOS 6.0
 ucarp 1.5.2-1.el...</description>
<dc:creator>sigalrm</dc:creator>
<dc:date>2011-11-10T17:30:52+09:00</dc:date>
<dc:subject>hacks/linux/RHEL</dc:subject>
<content:encoded><![CDATA[<h4>複数NICと複数IPアドレス、複数VIP</h4>

<p>
本エントリは、前エントリ 『<a href="http://blog.hansode.org/archives/52502718.html">Linux + ucarpによるサーバ冗長化</a>』 の続編。前エントリでは、単一ネットワークにおける冗長化。それに対し、本エントリでは複数ネットワークを扱う。</a>
</p>

<h5>検証環境</h5>
<ul>
 <li>RHEL 6.0 / CentOS 6.0</li>
 <li>ucarp 1.5.2-1.el6</li>
</ul>

<h5>要件定義</h5>
<ul>
 <li>障害が発生したネットワークのVIPのみfailover</li>
 <li>正常ネットワークのVIPはfailoverしなくて良い</li>
</ul>

<h5>作業概要</h5>
<ol>
 <li>VIPの数だけconfigを作成</li>
 <li>ucarpを起動</li>
 <li>サービスの状態を確認</li>
</ol>

<h6>サーバ構成</h6>
<table border="1">
<thead>
<tr><th>&nbsp;</th><th>node1</th><th>node2</th><th>vip</th></tr>
</thead>
<tbody>
<tr><td>役割</td><td>master</td><td>backup</td><td>&nbsp;</td></tr>
<tr><th>eth2</th><td>192.0.2.2/25</td><td>192.0.2.3/25</td><td>192.0.2.126/25</td></tr>
<tr><th>eth3</th><td>192.0.2.130/25</td><td>192.0.2.131/25</td><td>192.0.2.254/25</td></tr>
</tbody>
</table>

<h6>事前作業</h6>
<ul>
 <li><a href="http://blog.hansode.org/archives/52502718.html">Linux + ucarpによるサーバ冗長化</a>により、ucarp環境が構築されている事</li>
 <li>前エントリで作成した /etc/ucarp/vip-001.conf が存在する場合は、/etc/ucarp/vip-001.conf.saved など、 suffixが .conf にならないようにしておく事。.savedにしておけば、include対象外となる。
<pre class="hogeri"># mv -i /etc/ucarp/vip-001.conf /etc/ucarp/vip-001.conf.saved</pre> </li>
</ul>

<h5>作業内容</h5>
<p>
設定値に従い、ucarpの設定ファイルを作成。
今回はVIP数が2つなので、confファイルとIDが2つ用意する必要がある。
</p>

<h6>ucarp設定: node1編</h6>

<dl>
<dt>node1:/etc/ucarp/vip-002.conf</dt>
<dd>
<pre class="hogeri">
SOURCE_ADDRESS=192.0.2.2

ID=002
BIND_INTERFACE=eth2
VIP_ADDRESS=192.0.2.126
OPTIONS="--shutdown --preempt"
</pre>
</dd>

<dt>node1:/etc/ucarp/vip-003.conf</dt>
<dd>
<pre class="hogeri">
SOURCE_ADDRESS=192.0.2.130

ID=003
BIND_INTERFACE=eth3
VIP_ADDRESS=192.0.2.254
OPTIONS="--shutdown --preempt"
</pre>
</dd>
</dl>

<h6>ucarp設定: node2編</h6>

<dl>
<dt>node2:/etc/ucarp/vip-002.conf</dt>
<dd>
<pre class="hogeri">
SOURCE_ADDRESS=192.0.2.3

ID=002
BIND_INTERFACE=eth2
VIP_ADDRESS=192.0.2.126
OPTIONS="--shutdown --preempt"
</pre>
</dd>

<dt>node2:/etc/ucarp/vip-003.conf</dt>
<dd>
<pre class="hogeri">
SOURCE_ADDRESS=192.0.2.131

ID=003
BIND_INTERFACE=eth3
VIP_ADDRESS=192.0.2.254
OPTIONS="--shutdown --preempt"
</pre>
</dd>
</dl>


<h6>ucarp起動</h6>
<p>
前エントリ同様に、今回の設定でも重要なのは、ucarpの起動順番。
これは、先にucarpを起動させたノードがucarp-masterとなる為である。
</p>
<ol>
 <li>master(今回はnode1)</li>
 <li>backup(今回はnode2)</li>
</ol>
<p>起動順番は十分気をつける。</p>

<pre class="hogeri">
node1# /etc/init.d/ucarp start
</pre>

<pre class="hogeri">
node2# /etc/init.d/ucarp start
</pre>

<h6>正常時(ucarp起動後)</h6>

<p>
各ノードで "ip addr show" を実行すると、どちらにVIPが割り当てられているかを確認出来る。
ucarp起動順番やネットワークに問題がなければ、下記のようにmasterノードにVIPが割り当てられる。
</p>

<dl>
<dt>node1</dt>
<dd>
<pre class="hogeri">
# ip addr show eth2 | grep -w inet
    inet 192.0.2.2/25 brd 192.0.2.127 scope global eth2
    inet <strong>192.0.2.126/32</strong> scope global eth2
</pre>
<pre class="hogeri">
# ip addr show eth3 | grep -w inet
    inet 192.0.2.130/25 brd 192.0.2.255 scope global eth3
    inet <strong>192.0.2.254/32</strong> scope global eth3
</pre>
</dd>
<dt>node2</dt>
<dd>
<pre class="hogeri">
# ip addr show eth2 | grep -w inet
    inet 192.0.2.3/25 brd 192.0.2.127 scope global eth2
</pre>
<pre class="hogeri">
# ip addr show eth3 | grep -w inet
    inet 192.0.2.131/25 brd 192.0.2.255 scope global eth3
</pre>
</dd>
</dl>

<h6>ノード単位でfailover/failback</h6>

<p>
<a href="http://blog.hansode.org/archives/52502718.html">前エントリ</a>と同様に、ucarpプロセスを起動・停止させる事により、failoverを確認出来る。
</p>

<dl>
<dt>node1</dt>
<dd>
<pre class="hogeri">
# /etc/init.d/ucarp stop
# /etc/init.d/ucarp start
</pre>
</dd>
<dt>node2</dt>
<dd>
<pre class="hogeri">
# /etc/init.d/ucarp stop
# /etc/init.d/ucarp start
</pre>
</dd>
<dt>切り替わる途中経過は、/var/log/messageで確認可能</dt>
<dd>
<pre class="hogeri">
# tail -F /var/log/message
</pre>
</dd>
</dl>

<h6>failover時の状態</h6>

<p>
MASTERがnode1からnode2へ切り替わった時の/var/log/message出力例。
node2のstateがMASTERへ遷移しているのが分かる。
</p>

<dl>
<dt>node1(master⇒backup):/var/log/message</dt>
<dd>
<pre class="hogeri">
Nov 10 02:53:01 centos ucarp[1437]: [WARNING] Spawning [/usr/libexec/ucarp/vip-down eth2 192.0.2.126]
Nov 10 02:53:01 centos ucarp[1446]: [WARNING] Spawning [/usr/libexec/ucarp/vip-down eth3 192.0.2.254]
Nov 10 02:53:01 centos ucarp: all ucarp daemons stopped and IP addresses unassigned
</pre>
</dd>
<dt>node2(backup⇒master):/var/log/message</dt>
<dd>
<pre class="hogeri">
Nov 10 02:53:02 centos ucarp[1426]: [WARNING] Switching to state: MASTER
Nov 10 02:53:02 centos ucarp[1435]: [WARNING] Switching to state: MASTER
Nov 10 02:53:02 centos ucarp[1435]: [WARNING] Spawning [/usr/libexec/ucarp/vip-up eth3 192.0.2.254]
Nov 10 02:53:02 centos ucarp[1426]: [WARNING] Spawning [/usr/libexec/ucarp/vip-up eth2 192.0.2.126]
</pre>
</dd>
</dl>

<h6>VIPの数だけucarpプロセスが起動</h6>

<p>
Q. 下記状態では、ucarpはどんな動きをするのだろうか？
</p>

<ul>
 <li>VIP#1 一方のネットワークに障害発生</li>
 <li>VIP#2 もう一方のネットワークは正常</li>
</ul>

<p>
A. 障害発生中のVIPのみ切り替わる。
</p>
<ul>
 <li>VIP#1 MASTERからBACKUPへ切り替わる</li>
 <li>VIP#2 MASTERのまま</li>
</ul>

<p>
ucarpは、VIPの数と同等のプロセスが起動し、masterとbackupが通信し合って監視する。
VIPが2つある場合、ucarpプロセスも2つ。下記の通り、VIPが2の場合のucarpプロセスは、2つあるのが分かる。</p>
<pre class="hogeri">
# ps -ef | egrep '[u]carp'
root      1756     1  0 05:08 ?        00:00:00 /usr/sbin/ucarp --daemonize --interface=eth2 --pass=love --srcip=192.0.2.2 --vhid=002 --addr=192.0.2.126 --shutdown --preempt --upscript=/usr/libexec/ucarp/vip-up --downscript=/usr/libexec/ucarp/vip-down
root      1764     1  0 05:08 ?        00:00:00 /usr/sbin/ucarp --daemonize --interface=eth3 --pass=love --srcip=192.0.2.130 --vhid=003 --addr=192.0.2.254 --shutdown --preempt --upscript=/usr/libexec/ucarp/vip-up --downscript=/usr/libexec/ucarp/vip-down
</pre>

<h6>2本ある監視ラインのうち、1本をdownさせてみるとどうなるのか</h6>

<p>監視ライン1本をdownさせ、ucarpプロセスが独立して動作するのを観察してみる。</p>

<p>【方法】node1のeth1をdownさせる </p>
<dl>
<dt>node1</dt>
<dd>
<pre class="hogeri">
# ifdown eth3
</pre>
</dd>
<dl>

<p>【確認】 down後のucarp状態</p>
<dl>
<dt>node1:/var/log/message</dt>
<dd>
<pre class="hogeri">
Nov 10 05:29:24 centos ucarp[1764]: [ERROR] exiting: pfds[0].revents = 8
</pre>
⇒ eth3を監視していたucarpが異常終了
</dd>
<dt>node2:/var/log/message</dt>
<dd>
<pre class="hogeri">
Nov 10 05:29:25 centos ucarp[1811]: [WARNING] Switching to state: MASTER
Nov 10 05:29:25 centos ucarp[1811]: [WARNING] Spawning [/usr/libexec/ucarp/vip-up eth3 192.0.2.254]
</pre>
⇒ eth3側のvipがupしている
</dd>
</dl>

<p>【確認】 ucarpプロセスはどうなっているのか</p>
<dl>
<dt>node1</dt>
<dd>
<pre class="hogeri">
# ps -ef | egrep '[u]carp'
root      1756     1  0 05:08 ?        00:00:00 /usr/sbin/ucarp --daemonize --interface=eth2 --pass=love --srcip=192.0.2.2 --vhid=002 --addr=192.0.2.126 --shutdown --preempt --upscript=/usr/libexec/ucarp/vip-up --downscript=/usr/libexec/ucarp/vip-down
</pre>
⇒ ucarpプロセスは1つ
</dd>
<dt>node1</dt>
<dd>
<pre class="hogeri">
# ps -ef | egrep '[u]carp'
root      1803     1  0 05:29 ?        00:00:00 /usr/sbin/ucarp --daemonize --interface=eth2 --pass=love --srcip=192.0.2.3 --vhid=002 --addr=192.0.2.126 --shutdown --preempt --upscript=/usr/libexec/ucarp/vip-up --downscript=/usr/libexec/ucarp/vip-down
root      1811     1  0 05:29 ?        00:00:00 /usr/sbin/ucarp --daemonize --interface=eth3 --pass=love --srcip=192.0.2.131 --vhid=003 --addr=192.0.2.254 --shutdown --preempt --upscript=/usr/libexec/ucarp/vip-up --downscript=/usr/libexec/ucarp/vip-down
</pre>
⇒ ucarpプロセスは2つ
</dd>
</dl>

<p>
この結果により、eth3側のみfailoverしている事が分かる。
VIPを更に1つ2つ追加しても、問題なく動作してくれるだろう。
</p>

<h5>あとがき</h5>

<p>
/etc/ucarp/vip-*.conf を追加した後は、upscript/downscriptを充実させれば良いだけか。
</p>
<br />

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=331650&name=sigalrm&pid=52504522" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.hansode.org/archives/52503377.html">
<title>[RHEL][ucarp][mysql] Linux+ucarpで作るMySQL冗長化構成</title>
<link>http://blog.hansode.org/archives/52503377.html</link>
<description>環境構築する為の準備運動


ここ数日のエントリは、本エントリの環境を構築する為の検証作業。



 mysql datadir on nfs
  ファイルサーバ構築
 Linux + ucarpによるサーバ冗長化



準備運動が終わったので、いよいよ結合する時が来た。
この構成で環境構築する事が本エン...</description>
<dc:creator>sigalrm</dc:creator>
<dc:date>2011-11-04T18:30:39+09:00</dc:date>
<dc:subject>hacks/linux/RHEL</dc:subject>
<content:encoded><![CDATA[<h4>環境構築する為の準備運動</h4>

<p>
ここ数日のエントリは、本エントリの環境を構築する為の検証作業。
</p>

<ul>
 <li><a href="http://blog.hansode.org/archives/52503349.html">mysql datadir on nfs</a></li>
 <li><a href="http://blog.hansode.org/archives/52503317.html"> ファイルサーバ構築</a></li>
 <li><a href="http://blog.hansode.org/archives/52502718.html">Linux + ucarpによるサーバ冗長化</a></li>
</ul>

<p>
準備運動が終わったので、いよいよ結合する時が来た。
この構成で環境構築する事が本エントリの主目的であって、信頼性を問うのは議論の対象外である。
</p>

<h5>検証環境</h5>
<ul>
 <li>RHEL 6.0 / CentOS 6.0</li>
 <li>ucarp 1.5.2-1.el6</li>
 <li>nfs-utils 1.2.2-7.el6</li>
 <li>mysql-server 5.1.52-1.el6_0.1</li>
</ul>

<h5>要件定義</h5>
<ul>
 <li>mysql + nfs
  <ul>
   <li>隣のノードの/var/lib/mysqlをdatadirとしてMySQLを起動</li>
   <li>mysqlクライアントはVIP指定でmysqlサーバへ接続</li>
  </ul>
 <li>ucarp
  <ul>
   <li>failoverによりVIPが切り替わる</li>
   <li>自動failbackは不要</li>
   <li>手動failbackで良い</li>
  </ul>
 </li>
</ul>

<h5>前提条件</h5>
<ul>
 <li><a href="http://blog.hansode.org/archives/52503349.html">mysql datadir on nfs</a>まで作業が完了している事</li>
</ul>

<h5>作業概要</h5>
<ol>
 <li>ucarpの設定ファイルを作成</li>
 <li>upscript, downscriptを配置</li>
 <li>ucarpを起動</li>
 <li>サービスの状態を確認</li>
</ol>

<h6>環境定義</h6>

<table border="1">
<thead>
 <tr><th>用途</th><th>IPアドレス</th><th>nfsディレクトリ</th><th>NIC</th><th>ucarp状態</th></tr>
</thead>
<tbody>
 <tr><td>nfsクライアント</td><td>192.0.2.12/24</td><td>export: /var/lib/mysql/</td><td rowspan="3">eth0</td><td>master</td></tr>
 <tr><td>nfsサーバ</td><td>192.0.2.13/24</td><td>mount: /var/lib/mysql/</td><td>backup</td></tr>
 <tr><td>mysqlサーバ</td><td>192.0.2.254/24</td><td>-</td><td>-</td></tr>
</tbody>
</table>

<h5>事前作業</h5>
<p>
作業前にucarpを停止しておく。
これは後の作業で更新する設定により、ucarp停止時の振る舞いが変化するのを避ける為。
必ず、<strong>backup側のucarpを停止してから、master側のucarpを停止</strong>する事。
</p>
<dl>
<dt>ucarp-backup</dt>
<dd><pre class="hogeri"># /etc/init.d/ucarp stop</pre></dd>
<dt>ucarp-master</dt>
<dd><pre class="hogeri"># /etc/init.d/ucarp stop</pre></dd>
</dl>

<p>ucarpがmysqlのサービス起動・停止を行うので、mysqldがSysV initやupstartによって管理され無い事を確認しておく事。</p>
<pre class="hogeri">
# chkconfig --list mysqld
mysqld          0:off   1:off   2:off   <strong>3:off</strong>   4:off   5:off   6:off
</pre>

<h5>作業内容</h5>

<p>
<a href="http://blog.hansode.org/archives/52502718.html">Linux + ucarpによるサーバ冗長化</a>で触れた様に、upscript/downscriptに冗長化したいアプリケーションの起動停止処理を記述出来る。nfsマウントとmysqlの起動停止を記述しておけば今回の要件を満たせる。
</p>


<h6>ucarp共通</h6>
<p>upscriptとdownscriptを配置するディレクトリを作成。推奨されている配置先ディレクトリが定められてないので、今回は/etc/ucarp/vip-{up,down}.d/ に配置する。</p>
<pre class="hogeri">
# mkdir /etc/ucarp/vip-up.d
# mkdir /etc/ucarp/vip-down.d
</pre>


<h6>ucarp-masterに設定ファイルとupscript/downscriptを配置</h6>
<p>master側にはnfsマウントに関する処理が入る。</p>

<dl>
<dt>/etc/ucarp/vip-001.conf</dt>
<dd><pre class="hogeri">
SOURCE_ADDRESS=<strong>192.0.2.12</strong>

ID=001
BIND_INTERFACE=eth0
VIP_ADDRESS=192.0.2.254

OPTIONS="--shutdown --preempt"

UPSCRIPT=<strong>/etc/ucarp/vip-up.d/mysql-master</strong>
DOWNSCRIPT=<strong>/etc/ucarp/vip-down.d/mysql-master</strong>
</pre></dd>
<dt>/etc/ucarp/vip-up.d/mysql-master</dt>
<dd><pre class="hogeri">
#!/bin/sh
exec 2&gt;/dev/null

/sbin/ip address add "$2"/32 dev "$1"

/bin/mount -t nfs 192.0.2.13:/var/lib/mysql/ /var/lib/mysql/
/etc/init.d/mysqld start
</pre></dd>

<dt>/etc/ucarp/vip-down.d/mysql-master</dt>
<dd><pre class="hogeri">
#!/bin/sh
exec 2&gt;/dev/null

/sbin/ip address del "$2"/32 dev "$1"

/etc/init.d/mysqld stop
/bin/umount /var/lib/mysql/
</pre></dd>
</dl>

<h6>ucarp-backupに設定ファイルとupscript/downscriptを配置</h6>
<p>backup側はmysql datadirがローカルディスクであるため、mount処理が無い。</p>
<dl>
<dt>/etc/ucarp/vip-001.conf</dt>
<dd><pre class="hogeri">
SOURCE_ADDRESS=<strong>192.0.2.13</strong>

ID=001
BIND_INTERFACE=eth0
VIP_ADDRESS=192.0.2.254
OPTIONS="--shutdown --preempt"

UPSCRIPT=<strong>/etc/ucarp/vip-up.d/mysql-backup</strong>
DOWNSCRIPT=<strong>/etc/ucarp/vip-down.d/mysql-backup</strong>
</pre></dd>

<dt>/etc/ucarp/vip-up.d/mysql-backup</dt>
<dd><pre class="hogeri">
#!/bin/sh
exec 2>/dev/null

/sbin/ip address add "$2"/32 dev "$1"
/etc/init.d/mysqld start
</pre></dd>

<dt>/etc/ucarp/vip-down.d/mysql-backup</dt>
<dd><pre class="hogeri">
#!/bin/sh
exec 2&gt;/dev/null

/sbin/ip address del "$2"/32 dev "$1"
/etc/init.d/mysqld stop
</pre></dd>
</dl>

<h6>ucarpを起動</h6>
<p>
ucarp停止処理の順番とは逆で、master側ucarpを起動してから、backup側ucarpを起動する事。
</p>

<dl>
<dt>ucarp-master</dt>
<dd><pre class="hogeri"># /etc/init.d/ucarp start</pre></dd>
<dt>ucarp-backup</dt>
<dd><pre class="hogeri"># /etc/init.d/ucarp start</pre></dd>
</dl>


<h6>ucarp起動後の状態確認</h6>
<p>master側でmysqlがサービスされていれば良い。大まかに確認するには、下記内容で問題ないはずだ。</p>

<p>ucarp-master</p>
<ul>
  <li>VIPが割り当てられている事<pre class="hogeri">
# ip addr show eth0 | grep -w inet
    inet 192.0.2.12/24 brd 192.0.2.255 scope global eth0
    inet 192.0.2.254/32 scope global eth0
</pre></li>
  <li>/var/lib/mysqlにnfsマウントされている事<pre class="hogeri">
# mount -t nfs
192.0.2.13:/var/lib/mysql/ on /var/lib/mysql type nfs (rw,vers=4,addr=192.0.2.13,clientaddr=192.0.2.12)
</pre></li>
  <li>mysqlが起動している事<pre class="hogeri">
# /etc/init.d/mysqld status
mysqld (pid  XXX) is running...
</pre></li>
</ul>
<p>ucarp-backup</p>
<ul>
 <li>VIPが割り当てられてない事<pre class="hogeri">
# ip addr show eth0 | grep -w inet
    inet 192.0.2.13/24 brd 192.0.2.255 scope global eth0
</pre></li>
 <li>mysqlが起動してない事<pre class="hogeri">
# /etc/init.d/mysqld status
mysqld is stopped
</pre></li>
</ul>

<h6>failoverとfailbackを確認</h6>

<p>
ucarp-master, ucarp-backupのucarpを起動・停止させればmysqlとVIPが切り替わる。
failover/failbackの手順は<a href="http://blog.hansode.org/archives/52502718.html">Linux + ucarpによるサーバ冗長化</a>を参照の事。手元の環境ではfailover/failbackする事を確認出来ている。
</p>

<h6>必要に応じて接続許可設定</h6>
<p>追加設定無しではVIP指定で接続出来ないはずなので、GRANTで許可を付与しておく。</p>
<pre class="hogeri">
# mysql -uroot
mysql&gt; GRANT ALL PRIVILEGES ON *.* TO root@'%' WITH GRANT OPTION;
mysql&gt; FLUSH PRIVILEGES;
</pre>

<h4>あとがき</h4>
<p>
ucarpを使えば簡単に冗長化させる事が可能だ。
</p>
<br />

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798024546/kialpi-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51vhzmoHTnL._SL160_.jpg" alt="Linuxで作るアドバンストシステム構築ガイド (18Network Server Construction Guide)" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798024546/kialpi-22/ref=nosim/" name="amazletlink" target="_blank">Linuxで作るアドバンストシステム構築ガイド (18Network Server Construction Guide)</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4798024546/kialpi-22/ref=nosim/" title="Linuxで作るアドバンストシステム構築ガイド (18Network Server Construction Guide)" target="_blank">amazlet</a> at 11.11.04</div></div><div class="amazlet-detail">デージーネット <br />秀和システム <br />売り上げランキング: 190665<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798024546/kialpi-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=331650&name=sigalrm&pid=52503377" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.hansode.org/archives/52503349.html">
<title>[RHEL][Linux][NFS][MySQL] mysql datadir on nfs</title>
<link>http://blog.hansode.org/archives/52503349.html</link>
<description>信頼性はどうであれ、共有ディスクを使ったMySQL


nfsマウント領域にmysql datadirを配置し、mysqlを起動させる。


検証環境

 RHEL 6.0 / CentOS 6.0
 nfs-utils 1.2.2-7.el6
 mysql-server 5.1.52-1.el6_0.1


要件定義

 隣のノードの/var/lib/mysqlをdatadirとしてMySQ...</description>
<dc:creator>sigalrm</dc:creator>
<dc:date>2011-11-04T16:00:54+09:00</dc:date>
<dc:subject>hacks/linux/RHEL</dc:subject>
<content:encoded><![CDATA[<h4>信頼性はどうであれ、共有ディスクを使ったMySQL</h4>

<p>
nfsマウント領域にmysql datadirを配置し、mysqlを起動させる。
</p>

<h5>検証環境</h5>
<ul>
 <li>RHEL 6.0 / CentOS 6.0</li>
 <li>nfs-utils 1.2.2-7.el6</li>
 <li>mysql-server 5.1.52-1.el6_0.1</li>
</ul>

<h5>要件定義</h5>
<ul>
 <li>隣のノードの/var/lib/mysqlをdatadirとしてMySQLを起動</li>
</ul>

<h5>作業概要</h5>
<ol>
 <li>nfsサーバ
  <ol>
   <li>/var/lib/mysql を公開領域として設定</li>
  </ol>
 </li>
 <li>nfsクライアント, mysqld
  <ol>
   <li>nfsサーバの/var/lib/mysqlを、自身の/var/lib/mysqlにnfsマウント</li>
   <li>mysqlを起動</li>
  </ol>
 </li>
</ol>

<h6>環境定義</h6>

<table border="1">
<thead>
 <tr><th>用途</th><th>IPアドレス</th><th>nfsディレクトリ</th></tr>
</thead>
<tbody>
 <tr><td>nfsクライアント</td><td>192.0.2.12/24</td><td>/var/lib/mysql/</td></tr>
 <tr><td>nfsサーバ</td><td>192.0.2.13/24</td><td>/var/lib/mysql/</td></tr>
</tbody>
</table>

<h5>事前作業</h5>

<p>NFSの設定作業は <a href="http://blog.hansode.org/archives/52503317.html">ファイルサーバ構築</a> を参照の事。公開ディレクトリとマウントポイントを、それぞれ /var/lib/mysql に置き換えれば良い。</p>

<dl>
<dt>共通</dt>
<dd>
<pre class="hogeri">
# yum -y install mysql-server
</pre>
</dd>
<dt>nfsサーバ</dt>
<dd>
<pre class="hogeri">
# echo '/var/lib/mysql 192.0.2.0/24(rw)' >> /etc/exports
# exportfs -ra
</pre>
</dd>
</dl>


<h5>作業内容</h5>

<p>
事前作業にて、nfsサーバの設定が終わってるものとする。
</p>

<h6>SELinuxを無効化</h6>

<p>mysql datadirがnfsマウントされているとmysqldが起動しない。</p>
<pre class="hogeri">
# /etc/init.d/mysqld start
chown: changing ownership of `/var/lib/mysql': Operation not permitted
chmod: changing permissions of `/var/lib/mysql': Operation not permitted
MySQL Daemon failed to start.
Starting mysqld:                                           [FAILED]
</pre>

<p>nfsマウントしたmysql datadir領域でもmysqlが起動する様にSELinuxを設定するのが良いのだろうが、本題はmysqlを起動させる事なのでSELinux無効化で済ませる。</p>
<pre class="hogeri">
# cp -pi /etc/sysconfig/selinux /etc/sysconfig/selinux.0
# diff /etc/sysconfig/selinux.0 /etc/sysconfig/selinux
7c7
&lt; SELINUX=enforcing
---
&gt; SELINUX=disabled
</pre>

<p>システム再起動</p>
<pre class="hogeri">
# reboot
</pre>
<p>SELinuxが無効化さていればmysqlが起動するはず。</p>

<h6>mysql datadirをnfsマウント</h6>

<p>mountコマンドでnfsマウント。</p>
<pre class="hogeri">
# mount -t nfs 192.0.2.13:/var/lib/mysql /var/lib/mysql
</pre>
<p>必要に応じて/etc/fstabにマウントエントリを追加しておく事。</p>

<h6>mysql起動</h6>

<p>mysqlを起動</p>
<pre class="hogeri">
# /etc/init.d/mysqld start
</pre>

<p>mysqlが起動してる事を確認</p>
<pre class="hogeri">
# mysqladmin -uroot ping
mysqld is alive
</pre>

<p>mysql接続して内容を確認</p>
<pre class="hogeri">
# mysql -uroot

mysql&gt; show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.06 sec)
</pre>

<p>必要に応じてmysqlをサービス起動対象に追加しておくこと。</p>
<pre class="hogeri">
# chkconfig --list mysqld
mysqld          0:off   1:off   2:off   <strong>3:off</strong>   4:off   5:off   6:off
</pre>

<h4>あとがき</h4>
<p>疑わしい挙動をする時はSELinuxを無効化か</p>
<br />

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798024546/kialpi-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51vhzmoHTnL._SL160_.jpg" alt="Linuxで作るアドバンストシステム構築ガイド (18Network Server Construction Guide)" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798024546/kialpi-22/ref=nosim/" name="amazletlink" target="_blank">Linuxで作るアドバンストシステム構築ガイド (18Network Server Construction Guide)</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4798024546/kialpi-22/ref=nosim/" title="Linuxで作るアドバンストシステム構築ガイド (18Network Server Construction Guide)" target="_blank">amazlet</a> at 11.11.04</div></div><div class="amazlet-detail">デージーネット <br />秀和システム <br />売り上げランキング: 190665<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798024546/kialpi-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=331650&name=sigalrm&pid=52503349" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.hansode.org/archives/52503317.html">
<title>[RHEL][NFS][Linux] ファイルサーバ構築</title>
<link>http://blog.hansode.org/archives/52503317.html</link>
<description>稀に発生する作業なので、次に次に作業する時には忘れている


RHEL6系でNFS環境を構築した事がなかったので、本エントリに作業メモを残しておく。


検証環境

 RHEL 6.0 / CentOS 6.0
 nfs-utils 1.2.2-7.el6


要件定義

 プライベートネットワークでnfsマウント
 nfs公開...</description>
<dc:creator>sigalrm</dc:creator>
<dc:date>2011-11-04T11:00:10+09:00</dc:date>
<dc:subject>hacks/linux/RHEL</dc:subject>
<content:encoded><![CDATA[<h4>稀に発生する作業なので、次に次に作業する時には忘れている</h4>

<p>
RHEL6系でNFS環境を構築した事がなかったので、本エントリに作業メモを残しておく。
</p>

<h5>検証環境</h5>
<ul>
 <li>RHEL 6.0 / CentOS 6.0</li>
 <li>nfs-utils 1.2.2-7.el6</li>
</ul>

<h5>要件定義</h5>
<ul>
 <li>プライベートネットワークでnfsマウント</li>
 <li>nfs公開領域はread/write許可</li>
</ul>

<h5>作業概要</h5>
<ol>
 <li>共通
  <ul>
   <li>nfs関連パッケージをインストール</li>
   <li>rpcbind起動</li>
  </ul>
 </li>
 <li>nfs-server
  <ul>
   <li>公開ディレクトリ設定</li>
   <li>nfsd起動</li>
  </ul>
 </li>
 <li>nfs-client
  <ul>
   <li>nfsマウント</li>
  </ul>
 </li>
</ol>

<h5>作業内容</h5>

<h6>環境定義</h6>

<table border="1">
<thead>
 <tr><th>用途</th><th>IPアドレス</th><th>nfsディレクトリ</th></tr>
</thead>
<tbody>
 <tr><td>nfsクライアント</td><td>192.0.2.12/24</td><td>/path/to/export/</td></tr>
 <tr><td>nfsサーバ</td><td>192.0.2.13/24</td><td>/mnt/nfs/</td></tr>
</tbody>
</table>

<h6>共通作業</h6>

<p>nfs-utilsをインストール</p>
<pre class="hogeri">
# yum -y install nfs-utils
</pre>

<p>インストール直後のサービス状態を確認</p>
<pre class="hogeri">
# chkconfig --list | grep nfs
nfs             0:off   1:off   2:off   <strong>3:off</strong>   4:off   5:off   6:off
nfslock         0:off   1:off   2:off   <strong>3:on</strong>    4:on    5:on    6:off

# chkconfig --list | grep rpcbind
rpcbind         0:off   1:off   2:on    <strong>3:on</strong>    4:on    5:on    6:off
</pre>

<p>nfs-server/nfs-client共に必要なrpcbindを起動。インストールしただけではrpcbindが起動してない為。</p>
<pre class="hogeri">
# /etc/init.d/rpcbind start
</pre>

<h6>nfsサーバ</h6>
<p>必要に応じてiptablesの設定変更</p>
<pre class="hogeri">
# chkconfig --list iptables
iptables    0:off   1:off   2:on    <strong>3:on</strong>    4:on    5:on    6:off
</pre>

<p>iptablesが有効の場合はtcp/2049を許可する</p>
<pre class="hogeri">
# cp -pi /etc/sysconfig/iptables /etc/sysconfig/iptables.0
# vi /etc/sysconfig/iptables
</pre>
<pre class="hogeri">
# diff /etc/sysconfig/iptables.0 /etc/sysconfig/iptables
10a11,14
&gt;
&gt; -A INPUT -s 192.0.2.0/24 -p tcp --dport 2049 -j ACCEPT
&gt; -A INPUT -s 192.0.2.0/24 -p tcp --sport 2049 -j ACCEPT
&gt;
</pre>

<p>iptablesのruleを反映</p>
<pre class="hogeri">
# /etc/init.d/iptables restart
</pre>

<p>nfsサービスを起動</p>
<pre class="hogeri">
# /etc/init.d/nfs start
</pre>

<p>nfsを起動対象サービスに追加</p>
<pre class="hogeri">
# chkconfig nfs on
# chkconfig --list nfs
nfs             0:off   1:off   2:on    3:on    4:on    5:on    6:off
</pre>

<p>公開ディレクトリ設定。</p>
<pre class="hogeri">
# echo '/path/to/export/ 192.0.2.0/24(rw)' >> /etc/exports
</pre>

<p>/etc/exportsの内容を反映し、公開状態を確認</p>
<pre class="hogeri">
# exportfs -ra
# exportfs -v
/path/to/export  192.0.2.0/24(rw,wdelay,root_squash,no_subtree_check)
</pre>
<p>公開可能状態になった。</p>

<h6>nfsクライアント</h6>

<p>nfsマウント</p>
<pre class="hogeri">
# mkdir /mnt/nfs
# mount -t nfs 192.0.2.13:/path/to/export/ /mnt/nfs
</pre>

<p>マウント状態を確認</p>
<pre class="hogeri">
# mount -t nfs
192.0.2.13:/path/to/export/ on /mnt/nfs type nfs (rw,vers=4,addr=192.0.2.13,clientaddr=192.0.2.12)
</pre>

<p>nfsマウント完了。後は必要に応じて/etc/fstabにマウントエントリを追加する。</p>

<h4>あとがき</h4>
<p>最初、iptablesが有効になっててnfsマウント出来なかった。</p>
<br />

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798024546/kialpi-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51vhzmoHTnL._SL160_.jpg" alt="Linuxで作るアドバンストシステム構築ガイド (18Network Server Construction Guide)" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798024546/kialpi-22/ref=nosim/" name="amazletlink" target="_blank">Linuxで作るアドバンストシステム構築ガイド (18Network Server Construction Guide)</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4798024546/kialpi-22/ref=nosim/" title="Linuxで作るアドバンストシステム構築ガイド (18Network Server Construction Guide)" target="_blank">amazlet</a> at 11.11.04</div></div><div class="amazlet-detail">デージーネット <br />秀和システム <br />売り上げランキング: 190665<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798024546/kialpi-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=331650&name=sigalrm&pid=52503317" width="1" height="1" />
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.hansode.org/archives/52502718.html">
<title>[RHEL][ucarp] Linux + ucarpによるサーバ冗長化</title>
<link>http://blog.hansode.org/archives/52502718.html</link>
<description>『ucarpは設定が簡単』


keepalivedでもなくheartbeatでもなく、ucarp。
ucarpを選択した理由の1つは、『何となく設定が簡単そう』だったから。
実際に設定してみると、簡単だった。



本エントリは、failoverによりVIPが切り替わる設定手順をまとめた物である。
もう少し...</description>
<dc:creator>sigalrm</dc:creator>
<dc:date>2011-11-02T18:30:28+09:00</dc:date>
<dc:subject>hacks/linux/RHEL</dc:subject>
<content:encoded><![CDATA[<h4>『ucarpは設定が簡単』</h4>

<p>
keepalivedでもなくheartbeatでもなく、ucarp。
ucarpを選択した理由の1つは、『何となく設定が簡単そう』だったから。
実際に設定してみると、簡単だった。
</p>

<p>
本エントリは、failoverによりVIPが切り替わる設定手順をまとめた物である。
もう少し踏み込んだサーバ冗長化構成は、別エントリにまとめるかも知れない。
</p>

<h5>検証環境</h5>
<ul>
 <li>RHEL 6.0 / CentOS 6.0</li>
 <li>ucarp 1.5.2-1.el6</li>
</ul>

<h5>要件定義</h5>
<ul>
 <li>failoverによりVIPが切り替わる</li>
 <li>自動failbackは不要</li>
 <li>手動failbackで良い</li>
</ul>

<h5>作業概要</h5>
<ol>
 <li>ucarpをインストール</li>
 <li>ucarpの設定ファイルを作成</li>
 <li>ucarpを起動</li>
 <li>failoverによるVIP切り替え</li>
</ol>

<h6>サーバ構成</h6>
<table border="1">
<thead>
<tr><th>ノード名</th><th>用途</th><th>IPアドレス</th><th>NIC</th></tr>
</thead>
<tbody>
<tr><td>node1</td><td>master</td><td>192.0.2.2</td><td rowspan="3">eth0</td></tr>
<tr><td>node2</td><td>backup</td><td>192.0.2.3</td></tr>
<tr><td>-</td><td>Virtual IP</td><td>192.0.2.254</td></tr>
</tbody>
</table>

<h5>作業内容</h5>

<h6>ucarpをインストール</h6>

<p>ucarpはepelリポジトリを利用する為、必要に応じてepelリポジトリを利用する準備をしておく。</p>
<pre class="hogeri">
# rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
</pre>

<p>ucarpをインストール</p>
<pre class="hogeri">
# yum -y install ucarp
</pre>

<h6>ucarp設定</h6>
<p>設定ファイル名は、 『/etc/ucarp/vip-*.conf』であれば、読み込まれる。今回は設定ファイル /etc/ucarp/vip-001.conf を対象ノードに新規作成する。ノード間の差分は、SOURCE_ADDRESSのみ。</p>

<dl>
<dt>node1:/etc/ucarp/vip-001.conf</dt>
<dd>
<pre class="hogeri">
SOURCE_ADDRESS=<strong>192.0.2.2</strong>

ID=001
BIND_INTERFACE=eth0
VIP_ADDRESS=<strong>192.0.2.254</strong>
OPTIONS="--shutdown --preempt"
</pre>
</dd>

<dt>node2:/etc/ucarp/vip-001.conf</dt>
<dd>
<pre class="hogeri">
SOURCE_ADDRESS=<strong>192.0.2.3</strong>

ID=001
BIND_INTERFACE=eth0
VIP_ADDRESS=<strong>192.0.2.254</strong>
OPTIONS="--shutdown --preempt"
</pre>
</dd>
</dl>

<dl>
<dt>※backupノードに、「--advskew」を指定する設定例が多い</dt>
<dd>
<p>「--advskew」を指定すると、masterノードとbackupノードが明確になる。しかし、failoverによりbackupノードがmasterに昇格後、masterノードが復旧して来ると、自動failbackしてしまう。今回の要件では、<strong>自動failback不要</strong>であるため、「--advskew」を指定してない。</p>
</dd>
</dl>

<h6>ucarpを起動対象サービスに追加</h6>

<p>ucarpをインストールしただけでは、システム起動時の起動サービス対象には入ってない。</p>
<pre class="hogeri">
# chkconfig --list ucarp
ucarp           0:off   1:off   2:off   3:off   4:off   5:off   6:off
</pre>

<p>システム起動時のサービス起動対象に追加する。</p>
<pre class="hogeri">
# chkconfig ucarp on
</pre>

<p>起動対象になってるのを確認。</p>
<pre class="hogeri">
# chkconfig --list ucarp
ucarp           0:off   1:off   2:on    3:on    4:on    5:on    6:off
</pre>
<p>システム起動時にucarpが起動する。</p>

<h6>ucarp起動</h6>
<p>
今回の設定で重要なのは、ucarpの起動順番。
先にucarpを起動させたノードがucarp-masterとなる。
</p>
<ol>
 <li>master(今回はnode1)</li>
 <li>backup(今回はnode2)</li>
</ol>
<p>起動順番は十分気をつける。</p>

<pre class="hogeri">
node1# /etc/init.d/ucarp start
</pre>

<pre class="hogeri">
node2# /etc/init.d/ucarp start
</pre>

<h6>正常時(ucarp起動後)</h6>

<p>
各ノードでip addr showを実行すると、どちらにVIPが割り当てられているかを確認出来る。
ucarp起動順番やネットワークに問題がなければ、下記のようにmasterノードにVIPが割り当てられる。
</p>

<dl>
<dt>node1</dt>
<dd>
<pre class="hogeri">
# ip addr show eth0 | grep -w inet
    inet 192.0.2.2/24 brd 192.0.2.255 scope global eth0
    inet <strong>192.0.2.254/32</strong> scope global eth0
</pre>
</dd>
<dt>node2</dt>
<dd>
<pre class="hogeri">
# ip addr show eth0 | grep -w inet
    inet 192.0.2.3/24 brd 192.0.2.255 scope global eth0
</pre>
</dd>
</dl>

<h5>failover検証(VIPとucarp状態)</h5>
<p>異常を検知させ、failoverによる状態遷移を確認しておく。</p>

<ol>
 <li>正常時</li>
  <ul>
   <li>node1, node2の順にucarpを起動(前述作業でucarp起動済み)</li>
  </ul>
 </li>
 <li>障害時
  <ul>
   <li>node1のucarpを停止</li>
   <li>failoverした事を確認(VIPが切り替わる)</li>
  </ul>
 </li>
 <li>復旧時
  <ul>
   <li>node1のucarpを起動</li>
   <li>failbackしない事を確認(VIPが切り替わらない)</li>
  </ul>
 </li>
</ol>

<p>failover検証時に期待するucarpの状態遷移</p>
<table border="1">
<tr><td>ノード</td><td>正常時</td><td>障害時</td><td>復旧時</td></tr>
<tr><td>node1</td><td>master</td><td>backup</td><td>backup</td></tr>
<tr><td>node2</td><td>backup</td><td>master</td><td>master</td></tr>
</table>

<h6>障害時(意図的にfailoverさせる)</h6>

<p>node1(master)のucarpを停止してみると、failoverしてnode2(backup)にVIPが割り当てられる事を観察出来る。</p>

<pre class="hogeri">
node1# /etc/init.d/ucarp stop
</pre>

<dl>
<dt>node1(master⇒backup)</dt>
<dd>
<pre class="hogeri">
# ip addr show eth0 | grep -w inet
    inet 192.0.2.2/24 brd 192.0.2.255 scope global eth0
</pre>
</dd>
<dt>node2(backup⇒master)</dt>
<dd>
<pre class="hogeri">
# ip addr show eth0 | grep -w inet
    inet 192.0.2.3/24 brd 192.0.2.255 scope global eth0
    inet <strong>192.0.2.254/32</strong> scope global eth0
</pre>
</dd>
</dl>

<h6>復旧時(意図的にfailoverさせたまま)</h6>
<p>failover確認後、node1のucarpを起動。</p>

<pre class="hogeri">
node1# /etc/init.d/ucarp start
</pre>

<dl>
<dt>node1(backup⇒backup)</dt>
<dd>
<pre class="hogeri">
# ip addr show eth0 | grep -w inet
    inet 192.0.2.2/24 brd 192.0.2.255 scope global eth0
</pre>
</dd>
<dt>node2(master⇒master)</dt>
<dd>
<pre class="hogeri">
# ip addr show eth0 | grep -w inet
    inet 192.0.2.3/24 brd 192.0.2.255 scope global eth0
    inet <strong>192.0.2.254/32</strong> scope global eth0
</pre>
</dd>
</dl>

<p>
node1のucarpを起動した後も、VIPはnode2に割り当てられたままである事が確認出来れば良い。
今回の要件では、これが正しい動き。
</p>

<h5>failbackさせるには?</h5>
<p>failbackは、意図的にfailoverを行えば良い。ただし、実行対象ノードは反対となる。</p>
<ol>
 <li>node2のucarpを停止</li>
 <li>failback(node2からnode1へfailover)させる</li>
 <li>node2のucarpを起動</li>
</ol>

<h5>upscriptとdownscript(状態遷移時の実行スクリプト)</h5>
<p>
特に指定がない場合は、/etc/init.d/ucarpでvipのup/down用スクリプトが指定されている。
</p>

<dl>
<dt>/etc/init.d/ucarpの該当箇所</dt>
<dd>
<pre class="hogeri">
34行目 UPSCRIPT=/usr/libexec/ucarp/vip-up
35行目 DOWNSCRIPT=/usr/libexec/ucarp/vip-down
</pre>
</dd>
<dt>/usr/libexec/ucarp/vip-up</dt>
<dd>
<pre class="hogeri">
#!/bin/sh
exec 2&gt;/dev/null

/sbin/ip address add "$2"/32 dev "$1"
</pre>
</dd>
<dt>/usr/libexec/ucarp/vip-down</dt>
<dd>
<pre class="hogeri">
#!/bin/sh
exec 2&gt;/dev/null

/sbin/ip address del "$2"/32 dev "$1"
</pre>
</dd>

<p>
UPSCRIPTとDOWNSCRIPTは、設定ファイル毎(VIP毎)に上書き指定が可能となっていて、
例えば今回の設定ファイル/etc/ucarp/vip-001.confにも追記可能。
</p>

<dl>
<dt>/etc/ucarp/vip-001.conf への追記例</dt>
<dd>
<pre class="hogeri">
UPSCRIPT=/path/to/ucarp/vip-001-up
DOWNSCRIPT=/path/to/ucarp/vip-001-down
</pre>
</dd>
</dl>

<p>
upscript/downscriptには、冗長化したいアプリケーションの起動停止処理を書いておけば良い。
そうすれば、ucarpがVIPの切り替えと共にアプリケーションの起動・停止まで面倒を見てくれる。
</p>

<h5>参考ページ</h5>
<ul>
 <li><a href="http://www.ucarp.org/project/ucarp">UCARP</a></li>
 <li><a href="http://www.maido3.com/server/zousan/nikki69.html">69日目 - 【ぷろじぇくと ぞうさん】 ～E-Bananaサーバ 構築日記～</a></li>
</ul>

<h5>あとがき</h5>
<p>あとは実戦投入して、どうなるか。</p>

<br />
<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798024546/kialpi-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51vhzmoHTnL._SL160_.jpg" alt="Linuxで作るアドバンストシステム構築ガイド (18Network Server Construction Guide)" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798024546/kialpi-22/ref=nosim/" name="amazletlink" target="_blank">Linuxで作るアドバンストシステム構築ガイド (18Network Server Construction Guide)</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4798024546/kialpi-22/ref=nosim/" title="Linuxで作るアドバンストシステム構築ガイド (18Network Server Construction Guide)" target="_blank">amazlet</a> at 11.11.02</div></div><div class="amazlet-detail">デージーネット <br />秀和システム <br />売り上げランキング: 98150<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798024546/kialpi-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>
<img src="http://counter2.blog.livedoor.com/c?ro=1&act=rss&output=no&id=331650&name=sigalrm&pid=52502718" width="1" height="1" />
]]>
</content:encoded>
</item>

</rdf:RDF>

