2017/09/12

使用 datastax/php-driver 對 Cassandra 做 query 需要留意的地方

最近在研究如何把 log 塞到 Cassandra 中,使用的 Datastax 的 php-driver 輕鬆很多,但還是有一些需要留意的地方,免得莫名其妙鬼打牆。

這邊先假設我要記錄一個使用者上傳檔案的記錄,包含 ID、檔案名稱、檔案大小以及上傳日期,建立了一個 table:
CREATE TABLE hermes_log.file (
    id uuid,
    name text,
    size decimal,
    create_time timestamp,
    PRIMARY KEY (id, name, size, create_time)
)

這個時候使用 PHP 塞資料進入,直接建立 CQL 且不使用 prepare/binding,可以成功執行 insertion:
<?php

$cluster = Cassandra::cluster()->build();
$session = $cluster->connect();
$cql = "
    insert into hermes_log.file
    (
        id,
        name,
        size,
        create_time
    ) values (
        uuid(),
        'gavatar.jpg',
        123.4,
        '2017-01-01 10:30:45.678'
    )
";

$session->execute($cql);

cqlsh 看一下資料格式:
cqlsh:zero_test> select name, size, create_time from file;

 name        | size  | create_time
-------------+-------+---------------------------------
 gavatar.jpg | 123.4 | 2017-01-01 02:30:45.678000+0000

(1 rows)

除了日期會自動轉為 UTC+00:00 以外其他都沒什麼太大的問題。

2017/09/05

Garmin 智慧手錶維修心得

先講一下故障情況:
  • 我使用的是 fenix 3 HR
  • 發現有問題的狀況
    • 去爬山時手錶的高度計比官方公佈的海拔高了超過 1000 公尺 (一個莫名其妙上百岳的狀態)
    • 自己壓脈搏時的心律與手錶顯示的差太多 (手量約 160 bpm,但手錶顯示約 90 bpm)
  • 已經心律感應器清洗乾淨

以上步驟做完還是有問題,於是寄信像客服詢問,客服這邊檢查的標準流程是:
  1. 先上官方網站更新韌體
  2. 清潔感應器
  3. 清理手錶右側的孔洞 (好像是氣壓計)

如果以上幾個步驟做完問題還在,再去填寫維修單,並將故障品送回廠內檢修:https://my.garmin.com.tw/myGarmin/rma/onlineNewRma

很意外的,工程師說檢查不出問題 (EMP 作祟),但讓我驚訝的是他們直接換一支新的手錶給我,雖然辦法判斷是新品還是良品,但由錶帶的鬆緊,可以卻認真的不是原有的手錶。

總之,整體服務讓我感到蠻貼心的。

用 Apache Bench (ab) 可能無法模擬高負載的網站實際情況

看到一篇「Why Apache Benchmark Is Not Enough」,這邊提到 Apache Benchmark (以下簡稱 ab) 由於都固定戳同一個 URL,這個情況下有很大的機會讓 HTTP server 或是 DB 用到相同的資並 cache 起來。

這樣子其實 ab 計算出來的 request per second 等數據,就失去了參考價值。

若要模擬真實的情境,像是「使用者看到圖片以後點擊連結開啟令一個網頁」,可以考慮使用 Apache jMeter 來建立不同的網頁 request 流程、隨意點擊,讓測試時更像真人在瀏覽網頁。

2017/09/04

使用 Linux rsyslog 儲存 ASUS Wifi 分享器的 log


因為一些原因,需要保留極度完整的 log,所以研究怎麼把 Wifi AP (router) 的記錄全部倒進 linux  的 rsyslog。

先修改 /etc/rsyslog.conf 裡面的幾個項目:
# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

把「ModLoad」、「UDPServerRun」、「InputTCPServerRun」的註解拿掉,這樣 rsyslog 就會使用 TCP 和 UDP listen port 514。當然在啟動之前要記得先去把防火強的設定弄好。

接下來重新啟動 rsyslog:
$ sudo service rsyslog

啟動完成沒有看到什麼錯誤訊息,表示已經開始運作了。接著「tail -f /var/log/syslog」應該就會看到 remote server 的資料。



但不同機器的訊息方在相同的檔案上實在很難追蹤,所以再多做一個設定,將不同機器傳過來的資料分開存放在不同的檔案。這類的設定檔會放在「/etc/rsyslog.d」,眼尖的話應該已經注意到 ufw、postfix 等服務已經有建立自己的設定了,我們參考著做即可。

假設今天 Wifi AP 的 IP 是「192.168.0.1」,而負責存放所有 log 的 loghost IP 為「192.168.0.101」,設定可以這樣寫:
if $fromhost-ip startswith '192.168.0.1' then /var/log/wifi.log
& ~

這樣 rsyslog 只要遇到從 192.168.0.1 傳過來的資料,就一律丟到「/var/log/wifi.log」。

我自己的 log 比較複雜一些,除了把防火牆以外,還有 kernel 的 log 分開成二個不同的檔案:
if $fromhost-ip startswith '192.168.0.1' and not ($msg contains 'DROP IN') then /var/log/ac3100.log
& ~

if $fromhost-ip startswith '192.168.0.1' and ($msg contains 'DROP IN') then /var/log/ac3100-fw.log
& ~



網路上大部分的資料,都是教別人怎麼把 log 往別台機器丟,只有比較少一部份是處理別台機器的 log,這邊留下一些參考文件:

2017/08/24

尋找適合自己的工作場所 - Coffee Highfive


COFFEE HIGHFIVE 是一個可以讓你搜尋適合自己工作場所的一個服務,可以找到咖啡廳、簡餐店等,也可以自己篩選店家是否有提供 wifi 和電源插座。

雖然現在社群提供的資料還不多,希望大家看到可以幫忙補上去,讓更多人受惠。