2018年1月12日 星期五

使用Redis之後碰到的一些地雷雷雷...(Orz

最近開始嘗試使用Redis Sentinel建置高可用性服務,在測試的時候碰到一些問題。我在一個由三個Redis實體組成的Master-Slave Cluster倒入約4GB的資料,然後在Master下KEYS *把所有鍵列出來,沒過幾秒在Sentinel出現Master down然後重新推舉Master的訊息。

我在Sentinel裡頭設定Master在5秒內無回應就會判定為down,那也就是說我做了列出所有鍵的操作阻擋了後續所有連線的作業,這是怎麼回事?

回想一下Redis的特性,大概是:
  • 單執行緒、單行程
  • 所有操作是以atomic方式進行,因此確保了資料的一致性
  • 雖然運作時資料是存放於記憶體中,但是可回存為檔案,確保資料的持久性
  • 因為資料是存放於記憶體,所以速度很快
Redis不像一般的RDBMS有實做Transaction Isolation,任何操作都要等到前一個操作執行完才會進行,無法平行處理,Redis才能保證資料的一致性。因此非常不適合使用Redis進行以下操作:
  • 列出所有鍵:KEYS *
    如果存入的鍵很多,就得花很多時間處理。以我測試的情況,4GB的資料有將近1500萬個鍵,列出操作就花了183秒。
  • 搜尋特定鍵:KEYS *name*
    跟前一個是同樣的情況,列出了154個卻花了9秒多來處理。
我本職是系統管理者不是程式開發人員,所以有可能有其他的情況不適合使用Redis。如果要更有效率的使用Redis,那就盡量不要使用KEYS指令來列出或搜尋鍵。

2017年12月13日 星期三

GCE的TCP Health Check不支援換行符號

我打算在Google Compute Engine上建置Redis Slave個體群組,並使用GCP的負載平衡服務來連接,但是碰到一個問題,Health Check永遠都是失敗,導致個體群組裡頭的VM一直被重建。

檢查了許多地方,確認Health Check的IP可以連進VM,從netstat -an也可以看到連線。使用nc -l -p 6379的確也能看到Health Check送進來的要求字串 PING\r\n,但是透過redis-cli下monitor指令卻沒看到。

我在Health Check設置的要求字串是 PING\r\n,檢查字串是 +PONG,用nc的確是看到傳進來的是PING\r\n....等等,換行字元應該不會顯示?然後又用PYTHON參考別人寫的範例做了一個TCP SOCKET SERVER,結果顯示出來的是 PING\\r\\n...... Orz。redis一定要接收到換行符號才算接收到指令,否則就會停在那裡。看起來GCE的Health Check會過濾特殊符號。

Google Groups上的GCE論壇也有人有相同的問題,Google的人回答都指向stackoverflow上的某個連結:
https://stackoverflow.com/questions/43228878/health-check-to-detect-redis-master-from-google-tcp-load-balancer
下面回答得很長,其實結論是在同一台VM裡頭去跑另一隻程式來處理Health Check請求與回傳結果,我最後是用PYTHON寫了一個TCP SOCKET SERVER,當Health Check傳入PING,就使用subprocess去跑redis-cli PING,然後把結果回傳。


2017年12月11日 星期一

在mora.jp買音樂

最近在玩人中之龍 極2的酒店經營部份,在編輯酒店小姐的裝扮時,總是會播放歌曲『As You Like』,還蠻好聽的。這首歌曲有收錄在 人中之龍 零 OST Side A 裡,查了一下只能買CD或者數位檔案,像KKBOX跟Spotify都沒有提供。整張專輯(Side A)要1500日圓,可是我只對這首歌有興趣,搜尋一下發現mora.jp有在賣單一曲目,便想試看看購買,果然一按下結帳就出現不開放日本以外購買的警告。

不過最後我還是購買成功了,我使用了以下的步驟:
  1. 把瀏覽器的語言改成日文優先(這個可能不需要)
  2. 使用日本的IP進入mora.jp(VPN)
  3. 付款方式使用Amazon Pay(需要有日本Amazon帳號)
我就是這樣購買並成功下載,其他的支付方式都需要日本當地的地址,不太可能成功。

2017年11月11日 星期六

UAP接在MikroTik RB750Gr3後無法透過DHCP獲得IP的問題

最近借到一台RB750Gr3,想要取代我原本使用的ASUS RTN-56U。我的無線網路是使用UniFi UAP AC Lite。把RB750設置好之後,把UAP接上去卻發現手機平板都無法連接上,UniFi Controller也顯示adoption failed,而UAP的IP也跟DHCP設置的網段不同。

花了些時間搜尋資訊,發現三月就有人碰到同樣的問題,解法是在RouterOS的橋接設定,把STP改成none。
https://forum.mikrotik.com/viewtopic.php?t=116963&start=50