505
王者榮耀
如何同步TableStore數據到OSS
物聯網
場景描述
L公司是一家物聯網解決方案提供商,為不同物聯網設備生產商提供物聯網解決方案,這些物聯網設備涉及眾多產品領域,包括空調,攝像頭,門鎖,位置傳感器,淨化器,掃地機器人,各種工業傳感器等等,這些設備都需要實時上傳數據到存儲係統保存,然後分析係統會實時計算,按照預定義邏輯觸發報警或者生成報表。
物聯網設備信息和產生的時序數據很適合用Table Store存儲,而且能提供非常便捷的通道,用來做分析,具體可以參考這篇文章:如何高效存儲海量GPS數據。
生產的每一個設備都會有一個設備ID,唯一標識這個設備,並且還存在一些屬性值,比如地理位置,屬於哪個生產商,屬於哪個用戶,目前的配置參數等等,這些值相當於這個設備的身份證和戶口本。這些數據非常重要,不能容忍丟失,要有接近100%的數據可靠性保證。
核心數據備份
要保證數據盡量高的可靠性,需要從兩個方麵保證:
存儲係統本身的數據可靠性:Table Store基於共享存儲,提供99.99999999%的數據可靠性保證,在業界屬於非常非常高的標準了。
誤操作後能恢複數據 :誤操作永遠都無法避免,要做的是當誤操作發生的時候能盡快恢複,那麼就需要有備份數據存在。對於備份,有兩種方向,一個是部署同城或異地災備,這種代價高費用高,更多的用於社會基礎信息或金融信息。另一種是將數據備份到另一個價格更低廉的係統,當萬一出現誤操作的時候,可以有辦法恢複就行。一般選擇文件存儲係統,比如阿裏雲OSS。
冷數據保存
物聯網設備產生的數據是一種時序數據,基於時間的一序列數據點,這些數據的價值和時間成絕對正比,越新的數據價值越大,訪問也越大,一般六個月之前的數據的訪問量會非常非常低。如果將六個月之前的老數據和最新的數據存儲在同一個係統上,那麼就不是很劃算。這時候,就需要把早一些的數據(比如六個月之前)的數據保存到更便宜的文件存儲係統上,比如阿裏雲OSS。
目標
基於上述兩個原因,有不少用戶就希望能把Table Store的數據可以備份到OSS上,這樣比較熱,價值高的數據在Table Store上供用戶實時查詢或者實時分析、計算等,然後再拷貝一份數據到OSS,提供備份,以及冷數據存儲。
一般是賬號注冊數據等核心數據用OSS來做備份,時序數據用OSS來做冷數據存儲,有時候也會直接實時拷貝一份Table Store中的數據存儲到OSS,同時提供災備和冷數據存儲功能。
針對上述問題,Table Store團隊聯合數據集成(CDP)團隊上線了近實時的數據同步(備份)方案,用戶隻需要將數據寫入Table Store,Table Store會負責將數據在10分鍾內自動發送給OSS存儲。
相關產品
Table Store:阿裏雲分布式NoSQL數據庫,專注於海量數據的存儲服務,目前單表可支持10PB級,10萬億行以上的數據量,且數據量增大後性能仍然保持穩定。Table Store Stream功能是一種增量實時通道服務,類似於MySQL的binlog,可以通過Stream接口實時讀取到最新的變化數據(Put/Update/Delete)。
數據集成 :阿裏雲數據管理平台,支持數據同步等眾多數據功能。
OSS:阿裏雲對象存儲服務,提供海量、安全、低成本、高可靠的雲存儲服務,提供99.99999999%的數據可靠性。使用RESTful API 可以在互聯網任何位置存儲和訪問,容量和處理能力彈性擴展,多種存儲類型供選擇全麵優化存儲成本。
三種產品在方案中的角色如下:
產品 | Table Store | 數據集成 | OSS |
---|---|---|---|
角色 | 數據存儲 | 數據同步通道 | 備份 |
限製
由於Table Store和OSS不是完全對等的產品,所以如果需要將數據導入OSS,那麼在使用Table Store的時候有一些注意的地方:
- 整行寫入:
- 目前是使用Table Store Stream功能,需要每次寫入Table Store的數據是整行數據,目前類似物聯網數據的時序數據寫入方式都是整行寫入,後續基本無修改。
- 同步延時:
- 目前使用的是周期調度,每隔5分鍾調度一次,再加上插件中有5分鍾延遲,同步總延遲在5~10分鍾。
- OSS的文件數:
- 每次導出任務都會在OSS上生成一個新的文件,為了避免文件數過多,可以將同步周期延長,比如一個小時。具體時間需要根據自己業務特點確定。
使用方式
- 寫:
- 直接寫入Table Store,
- 讀:
- 直接讀取Table Store。
- 備份:
- 自動備份。
- 恢複:
- 使用數據集成(OSSreader + OTSwriter)重新寫會Table Store。
備份
賬號注冊等核心數據 :這類數據的特點是會經查更新,但數據量不大,對於這種類型的數據可以定期打snapshot,就是每天定時把這個表的數據全量導出到OSS保存。當發生誤操作刪除數據後,可以直接從OSS恢複全量。另一種做法就是實時通過Table Store Stream同步到OSS,但是這一種方式目前無法處理刪除。所以,可以兩者結合使用,或者直接使用全量導出。
冷數據保存
傳感器時序數據 : 這類數據的特點是每次都是新寫入,基本無修改,這類數據可以使用Table Store Stream功能實時同步到OSS中。然後對Table Store中的數據設置生命周期,比如半年,等到半年後,Table Store中超過半年的數據會被係統自動銷毀,這時候數據隻會在OSS中存在。
Table Store配置
無須配置
OSS配置
無需配置
數據集成
1. 創建數據源(可選)
- 如果已經創建了Table Store的數據源,則可以跳過這一步。
- 如果不希望創建數據源,也可以在配置頁麵配置相應的endpoint,instanceName,AccessKeyID和AccessKeySecret。如果希望創建,則按照下麵步驟操作。
- 登錄阿裏雲大數據開發套件:數據源地址。
- 單擊左側 離線同步 > 數據源。
- 在數據源配置頁麵,選擇右上角 新增數據源 ,會有一個彈出框。
- 按照說明填寫:
- 數據源名稱:填寫一個數據源標識符,比如車聯網。
- 數據源描述:填入描述符,比如:車聯網GPS數據存儲。
- 數據源類型:選擇 ots ,ots是Table Store曾用名。
- OTS Endpoint:填入TableStore 實例頁麵的實例地址,如果Table Store的實例和目標產品(比如OSS)在同一個region,則可以填入私網地址,否則需要填入公網地址,不能填入VPC地址。
- OTS 實例ID:填入Table Store的實例名稱。
- Access Id:填入阿裏雲網站的AccessKeyID。
- Access Key:填入阿裏雲網站AccessKeyID對應的AccessKeySecret。
- 點擊 測試連通性 ,如果成功則會在右上角提示:測試連接成功。 如果失敗,點擊endpoint是否配置正確,如果仍然無法解決,提工單聯係數據集成。
- 填好後的頁麵類似下麵這樣:
- 單擊確定,數據源創建成功,此時在數據源頁麵會出現一個新的數據源信息;
- 目前Table Store和OSS都支持新增數據源。在創建OSS的數據源的時候要注意:OSS的endpoint地址不包括bucketName,具體參考:OSS endpoint介紹。
2. 創建導出任務
- 單擊數據集成地址,進入數據集成的頁麵,會出現模式選擇:
- 單擊 腳本模式 ,彈出一個 導入模板 配置。
- 在導入模板配置裏麵:
- 單擊確認,則進入配置界麵。
3. 完善配置項
在配置界麵,已經提前嵌入了OTSStreamReader和OSSWriter的模板,每一項配置後麵都做了解釋。這裏我們主要介紹增量同步的配置,會詳細介紹OTSStreamReader的配置,如果是全量導出,則會使用OTSReader,OTSReader的配置可以參考:全量導出的OTSReader配置項。
{
"type": "job",
"version": "1.0",
"configuration": {
"setting": {
"errorLimit": {
"record": "0" # 允許出錯的個數,當錯誤超過這個數目的時候同步任務會失敗。
},
"speed": {
"mbps": "1", # 每次同步任務的最大流量。
"concurrent": "1" # 每次同步任務的並發度。
}
},
"reader": {
"plugin": "otsstream", # Reader插件的名稱。
"parameter": {
"datasource": "", # Table Store的數據源名稱,如果有此項則不再需要配置endpoint,accessId,accessKey和instanceName。
"dataTable": "", # TableStore中的表名。
"statusTable": "TableStoreStreamReaderStatusTable", # 存儲TableStore Stream狀態的表,一般不需要修改。
"startTimestampMillis": "", # 開始導出的時間點,由於是增量導出,需要循環啟動此任務,則這裏每次啟動的時候的時間都不一樣,這裏需要設置一個變量,比如${start_time}。
"endTimestampMillis": "", # 結束導出的時間點。這裏也需要設置一個變量,比如${end_time}。
"date": "yyyyMMdd", # 導出哪一天的數據,功能和startTimestampMillis、endTimestampMillis重複,這一項需要刪除。
"mode": "single_version_and_update_only", # TableStore Stream導出數據的格式,目前需要設置成:single_version_and_update_only。如果配置模板中沒有則需要增加。
"column":[ # 需要導出TableStore中的哪些列到OSS中去,如果配置模板中沒有則需要增加,具體配置個數由用戶自定義設置
{
"name": "uid" # 列名,這個是Table Store中的主鍵
},
{
"name": "name" # 列名,這個是Table Store中的屬性列。
},
],
"isExportSequenceInfo": false, # single_version_and_update_only 模式下隻能是false。
"maxRetries": 30 # 最大重試次數。
}
},
"writer": {
"plugin": "oss", # Writer插件的名稱
"parameter": {
"datasource": "", # OSS的數據源名稱
"object": "", # 最後備份到OSS的文件名的前綴,建議Table Store實例名/表名/date。比如"instance/table/{date}"
"writeMode": "truncate", # 支持truncate|append|nonConflict,truncate會清理已存在的同名文件;append會加到已存在的同名文件內容後麵;nonConflict會報錯當同名文件存在時。
"fileFormat": "csv", # 文件類型
"encoding": "UTF-8", # 編碼類型
"nullFormat": "null", # 當遇到控製時,在文本中如何表示
"dateFormat": "yyyy-MM-dd HH:mm:ss", # # 時間格式
"fieldDelimiter": "," # 每一列的分隔符
}
}
}
}
更詳細的配置項可以參考:
4. 保存任務
5. 運行任務(測試)
- 點擊配置內容上部的 運行。
- 彈出一個配置框,這裏需要設置配置文件裏的變量值:
- 設置完成後,點擊 確定 後就會開始運行任務,運行結束後到OSS控製台檢查是否備份文件成功。
- 如果測試運行沒問題,則可以正式提交任務了。
6. 提交任務
7. 查看任務
- 前往 運維中心 > 任務列表 > 周期任務 ,就可以看到剛剛創建的同步任務。
- 隔一天後,可以前往 運維中心 > 任務運維 > 周期實例 ,就可以看到當天需要運行的每一個實例,同時可以看到每個實例的狀態以及日誌。
8. 驗證結果
- 周期任務是從下一天的00:00點開始執行。
- 等執行完一個任務後,就可以到OSS控製台查看是否生成了新的文件,文件內容是否符合預期。
下一步計劃
至此,TableStore數據通過數據集成同步到OSS的配置完成了,延遲在5分鍾到10分鍾之間。
對於備份場景,這種延遲基本能滿足大部分用戶的需求了,但為了體驗更佳,後麵還會繼續優化,主要會在兩方麵:
- 配置方式上,會使用向導模式,配置更簡單。
- 時效性上,會盡量達到秒級延遲。
- 在使用中有任何問題,可以加入表格存儲釘釘技術交流群:11789671。
- 更多的Table Store使用場景和通道服務,可以參考: Table Store進階之路
最後更新:2017-11-29 14:35:05