God是一個由Ruby編寫的監控架構,它可以保障你的程序為運作狀态,以及可以對一些特殊情況進行程序的重新開機。拓展可以通過frigga來進行全局god的管理。
最好的安裝方式(通過ruby-gems):
1
<code>gem </code><code>install</code> <code>god</code>
快速啟動
注意:快速啟動需要0.12版本以上的,你可以使用以下指令檢視版本:
<code>god --version</code>
一個簡單的例子:使用god保持一個簡單的程序。
下面是一個簡單的腳本,名字為hello.py
2
3
4
5
6
7
<code>#!/usr/bin/env python</code>
<code>#</code>
<code>import</code> <code>time</code>
<code>while</code> <code>True</code><code>:</code>
<code> </code><code>print</code> <code>"hello"</code>
<code> </code><code>time.sleep(</code><code>1</code><code>)</code>
現在寫一個god的配置檔案來管理上邊的hello.py的程序,simple.god:
<code>God.watch </code><code>do</code> <code>|w|</code>
<code> </code><code>w.name = </code><code>"hello"</code>
<code> </code><code>w.start = </code><code>"python /root/god/hello.py"</code>
<code> </code><code>w.keepalive</code>
<code> </code><code>end</code>
這是一個簡單的god配置,我們首先聲明一個God.watch子產品,它可以監控、控制上邊的程序。每個watch都必須有一個唯一的名字和啟動這個程序的指令。keepalive告訴god保證這個程序的存活,如果這個程序死亡了,god會通過上邊定義的start來啟動程序。
這個simple的例子中,我們将god運作到前端,進而來保證我們可以進行相關的檢視。
要運作god,我們需要指定配置檔案(-C),以及要求他在前端運作(-D)
<code>god -C simple.god -D</code>
8
9
10
11
12
13
14
15
16
17
18
<code>#Events</code>
<code>I [2014-08-11 11:10:10] INFO: Loading simple.god</code>
<code>I [2014-08-11 11:10:10] INFO: Syslog enabled.</code>
<code>I [2014-08-11 11:10:10] INFO: Using pid </code><code>file</code> <code>directory: </code><code>/var/run/god</code>
<code>I [2014-08-11 11:10:10] INFO: Socket already </code><code>in</code> <code>use</code>
<code>I [2014-08-11 11:10:10] INFO: Socket is stale, reopening</code>
<code>I [2014-08-11 11:10:10] INFO: Started on drbunix:</code><code>///tmp/god</code><code>.17165.sock</code>
<code>I [2014-08-11 11:10:10] INFO: hello move </code><code>'unmonitored'</code> <code>to </code><code>'init'</code>
<code>I [2014-08-11 11:10:10] INFO: hello moved </code><code>'unmonitored'</code> <code>to </code><code>'init'</code>
<code>I [2014-08-11 11:10:10] INFO: hello [trigger] process is not running (ProcessRunning)</code>
<code>I [2014-08-11 11:10:10] INFO: hello move </code><code>'init'</code> <code>to </code><code>'start'</code>
<code>I [2014-08-11 11:10:10] INFO: hello start: python </code><code>/root/god/hello</code><code>.py</code>
<code>I [2014-08-11 11:10:10] INFO: hello moved </code><code>'init'</code> <code>to </code><code>'start'</code>
<code>I [2014-08-11 11:10:10] INFO: hello [trigger] process is running (ProcessRunning)</code>
<code>I [2014-08-11 11:10:10] INFO: hello move </code><code>'start'</code> <code>to </code><code>'up'</code>
<code>I [2014-08-11 11:10:10] INFO: hello registered </code><code>'proc_exit'</code> <code>event </code><code>for</code> <code>pid 25779</code>
<code>I [2014-08-11 11:10:10] INFO: hello moved </code><code>'start'</code> <code>to </code><code>'up'</code>
從DEBUG資訊中,你可以看出來,hello這個程序起初是沒有啟動的,而後god将它啟動。PS:如果是基于輪詢模式啟動,你注意觀察,他會5秒鐘檢查一次程序。
為了展現基于事件,我這裡多加了一步操作(在别的終端殺掉hello.py,以驗證基于事件的形式):
<code>[root@master ~]</code><code># ps -ef|grep hello.py</code>
<code>root 25779 1 0 11:10 ? 00:00:00 python </code><code>/root/god/hello</code><code>.py</code>
<code>root 25803 25782 0 11:10 pts</code><code>/1</code> <code>00:00:00 </code><code>grep</code> <code>hello.py</code>
<code>[root@master ~]</code><code># kill -9 25779</code>
<code>#Event 狀态:</code>
<code>I [2014-08-11 11:11:02] INFO: hello [trigger] process 25779 exited {:thread_group_id=>25779, :pid=>25779, :exit_code=>9, :exit_signal=>17} (ProcessExits)</code>
<code>I [2014-08-11 11:11:02] INFO: hello move </code><code>'up'</code> <code>to </code><code>'start'</code>
<code>I [2014-08-11 11:11:02] INFO: hello deregistered </code><code>'proc_exit'</code> <code>event </code><code>for</code> <code>pid 25779</code>
<code>I [2014-08-11 11:11:02] INFO: hello start: python </code><code>/root/god/hello</code><code>.py</code>
<code>I [2014-08-11 11:11:02] INFO: hello moved </code><code>'up'</code> <code>to </code><code>'start'</code>
<code>I [2014-08-11 11:11:02] INFO: hello [trigger] process is running (ProcessRunning)</code>
<code>I [2014-08-11 11:11:02] INFO: hello move </code><code>'start'</code> <code>to </code><code>'up'</code>
<code>I [2014-08-11 11:11:02] INFO: hello registered </code><code>'proc_exit'</code> <code>event </code><code>for</code> <code>pid 25807</code>
<code>I [2014-08-11 11:11:02] INFO: hello moved </code><code>'start'</code> <code>to </code><code>'up'</code>
PS:如果是輪詢(Polls)模式,它不是即刻啟動,而是等到檢查周期的到來。
到這裡,你已經知道god如何來保證程序,還有一些更加有空的管理方式,如cpu達到多少重新開機程序,memory達到多少重新開機程序等等,下面是一個配置的例子:
<code> </code><code>w.keepalive(</code><code>:memory_max</code> <code>=> </code><code>150</code><code>.megabytes,</code>
<code> </code><code>:cpu_max</code> <code>=> </code><code>50</code><code>.percent)</code>
<code> </code><code>end</code>
詳解::memory_max選項屬于keepalive的子指令,:cpu_max同樣也是。上邊的配置中,如果記憶體達到了150M,或CPU達到了50%,god就回重新開機程序。預設情況下,這些程序30秒會被檢查1次,并且會在(5超3次)的時候重新開機,以避免偶爾的超載情況。
<code>I [2014-08-11 13:35:46] INFO: hello [trigger] cpu out of bounds [5.3571428566083%%, *90.3052064640262%%, *94.7069943292977%%, *96.3414634148933%%] (CpuUsage)</code>
<code>I [2014-08-11 13:35:46] INFO: hello move </code><code>'up'</code> <code>to </code><code>'restart'</code>
<code>I [2014-08-11 13:35:46] INFO: hello deregistered </code><code>'proc_exit'</code> <code>event </code><code>for</code> <code>pid 26355</code>
<code>I [2014-08-11 13:35:46] INFO: hello stop: default lambda killer</code>
<code>I [2014-08-11 13:35:46] INFO: hello sent SIGTERM</code>
<code>I [2014-08-11 13:35:47] INFO: hello process stopped</code>
<code>I [2014-08-11 13:35:47] INFO: hello start: python </code><code>/root/god/hello</code><code>.py</code>
另外,你可以使用god對一些程序進行操作:
<code>god start hello </code><code>#hello為程序名.對應simple.god檔案中的w.name</code>
<code>god stop hello</code>
<code>god restart hello</code>
<code>...</code>
是以,當你使用god的管理程序時候,可以自己編寫一些特定的配置檔案來管理相關的程序。例如:http出錯、磁盤io較大等等問題出現時,可以幫助你做一些事。
本文轉自 陳延宗 51CTO部落格,原文連結:http://blog.51cto.com/407711169/1538541,如需轉載請自行聯系原作者