21 八月

自製 PostgreSQL 2-node HA

前言

現在的雲端很發達, 幾個按鍵就可以產出一台機器, 然後也可以配合廠商的服務來做 HA。不過問題來了, 如果今天就是一個小的自行架設的機房, 兩台電腦要自己搞 HA 那要怎麼辦呢? 自行上網研究了一陣子, 得到的答案就是用 heartbeat 之類的東西。在研究的過程中, 有想過 HAProxy 或是 DNS round robin 之類的 solution, 但這都無法解決一台當掉另外一台備援要起來變成 primary 的問題。於是在看了 How to setup HAProxy with failover? 這篇文章講到 Stack Overflow 就是用 heartbeat 來做 failover 的機制。

不過這整件事情都很困難, 原因是如果搜尋 heartbeat 找到的資料似乎都已經很舊了, Linux-HA 更指出我們應該要去 Cluster Labs 才對。然後在上面出現了更多工具與名詞, 實在是容易混淆。所以這篇文章就是一個簡單的 Tutorial 一步一步在 Ubuntu Server 14.04 LTS 上架設一個 2-node failover 的 PostgreSQL HA。

如果你想要有更多資源的話, Ubuntu 的環境底下, Cluster Labs 的文件要看 Pacemaker 1.1 for CMAN or Corosync 1.x: Clusters from Scratch。然而官方的文件有非常多的錯誤, 因此還是會踩到一大堆雷。Ubuntu 自己也有一些筆記, ClusterStack/Natty, 而 PostgreSQL 的則是 High Availability with PostgreSQL and Pacemaker 這篇文章。基本上就是使用到 corosync 與 pacemaker 這兩個套件做 HA / Failover, 用 DRBD 來做網路磁碟同步, 因此上網搜尋也可以找這幾個關鍵字。

下面的 Tutorial 其實就是根據 High Availability with PostgreSQL and Pacemaker 這篇為基礎的。

Read More

12 十月

antispam: DNSBL

這一陣子廣告信變多, 困擾同事。所以看來讓 postfix 吃一下 DNSBL 還是必要的。所以看了一下, 上了這 xbl.spamhaus.org, sbl.spamhaus.org 跟 bl.spamcop.net。在 postfix 的設定上面極為簡單

smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination,reject_rbl_client xbl.spamhaus.org,reject_rbl_client sbl.spamhaus.org,reject_rbl_client bl.spamcop.net

在 smtpd_recipient_restrictions 用 reject_rbl_client 這個 keyword 即可。

一開始還為了這個把 SPAM 都收集在某個 Maildir 的目錄底下, 用 python 把 last hop sender IP 給揪出來。後來想想, 直接上 DNSBL 好像比較快又簡單。

25 九月

mac, screen, vim

這陣子只要開了 screen, 使用 vim 的時候用滑鼠 copy & paste, 他就會連同後面的空白一起貼上, 造成很大的困擾。Google 又找不太到解答, 不過解的方式很簡單。把 term 從 screen 改成 xterm-color 就可以了。(真是感到慚愧阿)

以下是我的 .screenrc (前頭好像也是從網路上找到的)

# 關閉啟動訊息。
startup_message off

# 加入狀態列。
caption always "%{=u .r} %-w%<%{=ub .Y}%n %t%{=u .r}%+w "
hardstatus alwaysignore
hardstatus alwayslastline "%{= .K} [%l]%<%=%{= .Y}$USER%{= .R}@%H %=%{= .m} %Y/%m/%d%{= .M} %0c "

# 將預設編碼設為 UTF-8。
defutf8 on

term xterm-color
cjkwidth off
18 九月

踩到 ubuntu libjpeg 的 bug

今天花了一些時間, 想要把 gunicorn 的 script 整理一下。於是找了幾個 solution, 最後決定搭配 upstart 以及一支自己寫的 start.sh 讓 gunicorn 跑起來。後來我發現有一個很奇怪的訊息, 每一次跑起來, 有 request 進來, 就會丟

Error opening file for reading: Permission denied

非常奇妙的事情在於, 不同權限執行 gunicorn 會有不同的結果。以上的錯誤發生在我用 root 執行 gunicorn --user=web 才會發生。我如果使用 web 執行 gunicorn, 或是用 root 執行 gunicorn (但是不加上 --user=web) 都不會有這樣的問題。

Trace code 了許久, 最後發現是在 import PIL 的這一行出錯

import Image from PIL

上網查了一下, 是 ubuntu libjpeg 的問題。Reference 第二篇寫得很明確來龍去脈。

 

Reference:

  1. Error opening file for reading: Permission denied
  2. seteuid apps report perror() on trying /proc/self/auxv