天天看點

如何将日志服務的資料秒級同步到表格存儲

最近在容器服務的官方鏡像中,新增了loghub-shipper的鏡像,使用該鏡像,可以訂閱日志服務中的日志庫,以秒級的延時将日志資料從日志服務中讀出并轉換成結構化資料存儲在表格存儲中,以滿足實時線上服務的精确查詢需求。

假設日志資料格式如下:

···

将其寫入到表格存儲中主鍵為”ip”、”time”的資料表中,其格式如下:

ip

time

source

status

user-agent

url

10.200.98.220

26/jan/2016:19:54:02 +0800

10.170.148.237

200

aliyun-sdk-java

post /putdata…

在表格存儲中,很容易對某個ip根據時間對曆史資料進行精确的檢索。

日志資料結構化到表格存儲之後,可以充分利用表格存儲的高并發、低延時、按量計費的特點提供精确查詢的線上服務:

電商、資訊類網站的最近浏覽記錄展示。

推薦引擎的資料源,基于使用者曆史行為習慣進行分析。

實時推薦計算,根據使用者最近浏覽實時調整推薦政策。

對某個時間點的日志資訊的精确查詢,比如某台出故障的機器最近24小時的運作情況。

應用程式api基于時間段的延時統計、分析。

在表格存儲上建好兩張表:資料表和狀态表。

資料表用來存儲從日志服務中同步過來的日志資料。教程裡我們假設這張表有三個主鍵列,分别是

rename,類型是 string。

trans-pkey,類型是 integer。

keep,類型是 string。

狀态表用來存儲每個日志服務project以及各個shard上日志資料的同步進度,該表的主鍵需要按照如下方式設定。 您的服務于多個 project 和 log store 的傳送服務可以複用同一張狀态表。 我們建議您将這張表的資料生命周期設定為一天或二天,這樣可以降低使用成本。 狀态表的主鍵有四列,分别為:

project_logstore,類型為 string。

shard,類型為 integer。

target_table,類型為 string。

timestamp,類型為 integer。

如何将日志服務的資料秒級同步到表格存儲

您需要對預設設定根據實際情況做一些改動。

如何将日志服務的資料秒級同步到表格存儲

低于盡可能和日志服務與表格存儲選在同一個區域,這樣可以使用私網位址避免公網流量以及公網帶來的不确定性。

傳送服務并不是一個http服務,不需要暴露任何端口。是以也無需負載均衡。

本教程選擇“新增節點”以友善示範。 生産上我們建議您選擇“不建立節點”,随後按照添加已有雲伺服器步驟添加現有的雲伺服器。

傳送服務并不需要高配置的單機。一般情況下,“1核1gb”也足夠用了。

傳送服務可以完全動态的水準擴容縮容。 這裡可以選擇任意多台ecs。

叢集初始化需要一些時間,請您稍待。您可以點選左側“叢集”進入叢集清單界面檢視叢集的狀态。

如何将日志服務的資料秒級同步到表格存儲
如何将日志服務的資料秒級同步到表格存儲

進行基本的應用設定

如何将日志服務的資料秒級同步到表格存儲

按照下圖的參數填入一些應用環境參數資訊,點選頁面最後的“建立并部署”來部署傳送服務。

如何将日志服務的資料秒級同步到表格存儲

選擇傳送服務的鏡像。點選“選擇鏡像”之後會彈出如上圖的選擇視窗。搜尋"loghub-shipper"來快速找到傳送服務的鏡像,選中該鏡像(左上角藍底白色的勾),然後“确定”。

為鏡像添加配置資訊:

如何将日志服務的資料秒級同步到表格存儲

部署服務需要一些時間。您可以通過服務清單來檢視。就緒的服務如下圖。

如何将日志服務的資料秒級同步到表格存儲

到目前為止,傳送服務已經搭建好啦,讓我們想日志服務中寫入一條日志試試看效果吧。

這是一條有兩個使用者字段的日志,其中original字段的值為 "12345",keep字段的值為 "hoho"。除此以外還有三個日志服務添加的字段,其中 topic 為 "smile",而 __source__ 和 __time__ 字段随環境變化而變化。

使用工具馬上可以看到表格存儲中資料表已經有了一條資料(轉成json格式友善描述)

其中,rename、trans-pkey、keep為主鍵列,__topic__與original為屬性列。

根據環境變量中的配置:

在 transform 中定義 "rename": "original",日志資料中original 的值為"12345",故表格存儲中該行的rename的值也為 "12345"

在 transform 中定義 "trans-pkey": "(->int 10 original)",傳送服務将original的值以十進制的方式轉成整數寫入表格存儲中的trans-pkey列

keep沒有任何轉換規則,在表格存儲中,屬性類keep的值與日志資料中的保持一緻

日志資料中的 __source__ 和 __time__ 字段由于在exclusive_columns 中配置了["__source__", "__time__" ],這兩個字段的資料不會寫入資料表中

topic和original兩個字段以屬性列的方式寫入資料表

同時,我們也從狀态表中看到了如下資料(轉成json格式友善描述):

其涵義為傳送服務的某個worker("shipper_id": "fb0d62cacc94-loghub-shipper-loghub-shipper-1"), 在2016-07-21t11:31:45.202000z添加了這條狀态("timestamp": 1469100705202)

在之前的五分鐘裡,該worker從名為 lhshipper-test 的日志 project中的 test-store 這個 log store ( "project_logstore": "lhshipper-test|test-store" ) 0号 shard ( "shard": 0 )消費了一條日志, 其中跳過日志0條( "skip_count": 0 ), 寫入資料表的日志1條( "row_count": 1 ),消耗了1個cu( "cu_count": 1 )。

好啦,概耗時15分鐘就把日志服務的資料秒級同步到表格存儲的傳送服務已經搭建好啦,日志類資料就可以使用日志服務的logtail友善的采集到雲上,才通過傳送服務友善的将資料同步到表格存儲中,支援了不同的業務需要,簡直是神器啊~