LogHub Shipper for Tablestore(以下簡稱傳送服務)將您在Log Service中的資料經簡單清洗、轉換後寫入您在Table Store中的表。傳送服務由Table Store官方提供,以Docker鏡像的方式發佈於阿里雲容器Hub,並經由Container Service運行於您的雲端服務器上。
服務簡介
在Log Service中,日誌資料以JSON形式進行儲存,並以日誌組作為寫入與讀取的基本單位。這種情況下,無法根據特定條件(例如某個App近12個小時的日誌資料)對日誌做快速的查詢和分析。
日誌資料傳送服務是將Log Service中的日誌資料經過結構化轉換後,即時寫入Table Store中的資料表,以提供準確的、高效能的即時線上服務。
資料樣本
假設在Log Service中有如下格式的日誌資料:
{"__time__":1453809242,"__topic__":"","__source__":"47.100.XX.XX","ip":"47.100.XX.XX","time":"26/Jan/2016:19:54:02 +0800","url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=U0U***45A&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=pD12XYLmGxKQ%2Bmkd6x7hAgQ7b1c%3D HTTP/1.1","status":"200","user-agent":"aliyun-sdk-java"}
將其寫入到Table Store中主鍵為ip和time的資料表中,格式如下:
ip | time | source | status | user-agent | url |
47.100.XX.XX | 26/Jan/2016:19:54:02 +0800 | 47.100.XX.XX | 200 | aliyun-sdk-java | POST /PutData… |
在Table Store中可以對某個IP根據時間對歷史資料進行精確檢索。
日誌資料傳送服務中提供靈活的資料對應規則,使用者可以配置日誌資料中的欄位與資料表中的屬性列的對應關係以及簡單的資料轉換。
基礎概念
相關產品的概念
使用傳輸服務前您需要理解相關產品的概念,詳細資料請參見下表。
產品 | 基本概念 |
Log Service |
|
Table Store | |
雲端服務器 | 隨用隨付、訂用帳戶 |
Container Service | 節點、應用、服務、容器 建議同一個傳送服務的容器數不要超過其日誌庫的分區數。 |
存取控制 | RAM使用者 建議傳送服務所用的RAM使用者僅包含讀取日誌庫的許可權和寫入Table Store的許可權。 |
資料表
目標表用於儲存經清洗、轉換後的使用者日誌資料。
資料表注意事項如下:
- 使用者需要自行建立目標表,傳送服務不會主動建表。
- 在Log Service和Table Store皆可用的條件下,從一條日誌進入Log Service到它被寫入Table Store的延遲在百毫秒級。
- 傳送服務在Table Store停用情況下會主動等待一段時間(不超過500毫秒)重試。
- 傳送服務會定期記錄持久化斷點。
- 如果傳送服務本身不可用,例如升級,則恢複服務後會從最近一個斷點繼續消費日誌。
- 建議同一個日誌庫的不同日誌對應目標表的不同行。在重試的情況下,這樣做可以使目標表最終一致。
- 傳送服務使用Table Store的UpdateRow操作寫入資料,所以多個傳送服務可以共用同一個目標表。這種情況下,建議這些傳送服務寫入的屬性列不要重疊。
狀態表
傳送服務依賴使用者在Table Store中建立的狀態表反饋一些資訊給使用者。
狀態表注意事項如下:
- 多個傳送服務可以共用同一個狀態表。
- 在沒有出錯的情況下,每個傳送服務容器每隔5分鐘在狀態表添加一條記錄。
- 在出錯的情況下(非Table Store不可用),傳送服務容器立即在狀態表添加一條記錄。
- 建議狀態表設定天層級TTL,只保留最近的資料。
狀態表有四列主鍵:
- project_logstore:String類型。使用者的Log Service的專案和日誌庫,以字元豎線(|)分隔。
- shard:Integer類型。使用者Log Service的Shard號。
- target_table:String類型。使用者在Table Store的目標表表名。
- timestamp:Integer類型。狀態表這條記錄添加的時間點。UNIX時間,單位為毫秒。
除此以外,還有以下若干屬性列來記錄本周期的資料匯入情況。對於狀態表上任意具體的一行來說,每個屬性列都有可能不存在。
- shipper_id:String類型。傳送服務容器的ID,目前實現成其容器的主機名稱。
- error_code:String類型。Table Store定義的錯誤碼,如果無錯誤則該屬性列不存在。
- error_message:String類型。Table Store返回的具體出錯資訊,如果無錯誤則該屬性列不存在。
- failed_sample:String類型。出錯的日誌,組織成JSON字串(JSON String)。
- __time__:Integer類型。該傳送服務容器最近一次更新狀態表以來,成功寫入Table Store的日誌的__time__欄位的最大值。
- row_count:Integer類型。該傳送服務容器最近一次更新狀態表以來,成功寫入Table Store的日誌條數。
- cu_count:Integer類型。該傳送服務容器最近一次更新狀態表以來,消耗的寫服務能力單元。
- skip_count:Integer類型。該傳送服務容器最近一次更新狀態表以來,清洗掉的日誌條數。
- skip_sample:String類型。該傳送服務容器最近一次更新狀態表被丟棄掉的日誌之一,組織成JSON字串(JSON String)。容器本身的日誌會記錄每一條丟棄掉的日誌,以及其被丟棄的理由。
配置
傳送服務在建立的時候需要為容器提供一些環境變數:
- access_key_id、access_key_secret:傳送服務所用的阿里雲帳號的AccessKey ID和AccessKey Secret。
- loghub:傳送服務所需Log Service的配置,一個JSON object。包括:
- endpoint
- logstore
- consumer_group
- tablestore:傳送服務所需的Table Store配置,一個JSON object。包括:
- endpoint:服務地址。
- instance:執行個體名。
- target_table:資料表名稱。必須為該執行個體下已有的表。
- status_table:狀態表名稱。必須為該執行個體下已有的表。
- exclusive_columns:屬性列黑名單,一個JSON array,其中元素為JSON String。
如果有該項設定,則其中欄位不會被作為屬性列寫入目標表。例如目標表主鍵A,exclusive_columns設定為[“B”, “C”],某條日誌含有A、B、D三個欄位,則目標表會出現一行,主鍵為A,屬性列為D;C不在日誌中而不被寫入;B雖在日誌中但被exclusive_columns排除,也不被寫入。
- transform:簡單變換,一個JSON object,其中的key為寫入目標表的列名(可以是主鍵列),而value為傳送服務定義的簡單變換運算式:
- 日誌欄位直接是一個運算式。
- 不帶正負號的整數是一個運算式。
- 被一對雙引號包圍起來的字串是一個運算式。字串中可以使用
\"
以及\\\\
轉義。 ( func arg... )
也是一個運算式,括弧前後可以有0個或多個空白(包括空格和tab)。func和其參數之間以及各參數之間有至少一個空白,每個參數都必須是運算式。目前支援如下函數:->int
表示將字串轉換成整數。有兩個參數,第一個參數為進位,支援2-36進位;第二個參數為待轉換的字串,字母(大小寫無關)代表高於十進位下的10-35。->bool
表示將字串轉換成Boolean型。有一個參數,為待轉換的字串,"true"
對應true,"false"
對應false,其餘字串皆出錯。crc32
表示計算字串的crc32,輸出為Integer型。有一個參數,為待計算的字串。
如果日誌缺失或轉換的過程出錯則視為key對應的列缺失。如果出錯,容器的日誌將會記錄詳細的錯誤資訊。
傳送服務的清洗規則只有一條:如果主鍵列缺失,則該條日誌被清洗。