1. 程式人生 > >TiKV 在京東雲物件儲存元資料管理的實踐

TiKV 在京東雲物件儲存元資料管理的實踐

京東雲物件儲存是在 2016 年作為公有云對外公開的,主要特點是可靠、安全、海量、低成本,應用於包括一些常用的業務場景,比如京東內部的京東商城視訊/圖片雲端儲存,面向京東雲公有云外部的開發者的服務,和麵xiang企業的私有云服務,甚至混合雲服務。

本文將介紹京東雲物件儲存服務的架構演進,以及遷移到 TiKV 的經驗。

一、物件儲存簡介

圖 1 什麼是“物件”

首先舉例說明一下這裡的“物件 (Object)”概念。比如我們把一張照片當作一個“物件”,除了照片本身的二進位制資料,它還應該包含一些元資訊(照片資料長度、上次修改時間等)、涉及使用者的資料(拍攝者、拍攝裝置資料等)。物件儲存的特點是這些資料不會頻繁地修改。

如果是數量比較少的圖片儲存,我們可能會用類似 LVM 之類的東西,把一個節點上的多個磁碟使用起來,這種方法一般適用於數量級在 1M ~ 10M 的圖片。隨著業務的增長,圖片會越來越多甚至有視訊儲存,因此我們採用分散式檔案系統來儲存,這種方法是基於 DFS 的架構(如下圖所示)。

圖 2 如何儲存物件(資料量 1B)

這種方法的前提是單機容量受限,必須把資料放在多臺機器上儲存,並且用一個或多個獨立的 node 儲存元資料,並且元資料會維持樹狀目錄的結構,拆分比較困難。但是這個架構一般適合儲存到 10 億級別的物件,同時存在兩個比較大的問題:

  • 資料分散式儲存在不同的節點上,如果存在一箇中心的 master 節點的資料是相對有限的,那麼這個機器就不太可能無限擴張下去。

  • 元資料管理是樹狀結構,它本身並不適合做分散式儲存,並且目錄結構需要多次訪問,不適合把它放到 SSD 上,而更適合放在記憶體裡,然後一般授權一個 master 節點 list。HDFS 基本也是這樣。

圖 3 如何儲存物件(資料量 100PB)

那麼如果要求做千億級的物件儲存,如何實現呢?最容易想到的辦法是將元資料分散式儲存,不再像檔案系統中那樣儲存在單獨的機器上,是一個樹狀結構,而是變成一個平坦結構。

 

二、物件儲存元資料管理系統

回到上面的舉例,針對一個圖片物件我們主要有四類操作:上傳(Put)、下載(Get)、刪除(Delete),Scan。Scan 操作相對比較傳統 ,比如檢視當前有多少圖片物件,獲取所有圖片名稱。

1. 元資料管理系統 v1.0

圖 4 元資料管理系統 v1.0(1/4)

上面是一個最簡單、原始的方案,這裡 Bucket 相當於名字空間(Namespace)。很多人最開始設計的結構也就是這樣的,但後期資料量增長很快的時候會遇到一些問題,如下圖。

圖 5 元資料管理系統 v1.0(2/4)

第一個問題是,在初期資料量比較小的時候,可能只分了 4 個 Bucket 儲存,隨著業務增長,需要重新拆分到 400 個 Bucket 中,資料遷移是一個 Rehash 過程,這是一件非常複雜且麻煩的事情。所以,我們在思考物件儲存連續的、跨數量級的無限擴充套件要怎麼做呢?下圖是一個相對複雜的解決方案,核心思想是把絕大部分資料做靜態處理,因為靜態的儲存,無論是做遷移還是做拆分,都比較簡單。比如每天都把前一天寫入的資料靜態化,合到歷史資料中去。

圖 6 元資料管理系統 v1.0(3/4)

針對第二個問題,如果單個 Bucket 資料量很大,那麼在往 Stable Meta(上圖中黃色部分)做靜態化遷移時需要做深度拆分,單個 Bucket 的物件的數量非常多,在一個數據庫裡面儲存不下來,需要儲存在多個數據庫裡面,再建立一層索引,儲存每個資料庫裡面儲存那個區間的資料。同時,我們在執行的時候其實也會出現一個 Bucket 數量變多的情況,這種是屬於非預期的變多,這種情況下我們的做法是弄了一大堆外部的監控程式,監控 Bucket 的量,在 Bucket 量過大的時候,會主動去觸發表分裂、遷移等一系列流程。

圖 7 元資料管理系統 v1.0(4/4)

這個解決方案有兩個明顯的問題,第一資料分佈複雜,管理困難;第二,排程不靈活,給後期維護帶來很大的困難。

圖 8 元資料管理系統改進目標

所以,我們思考了這個事情本質其實是做一個全域性有序 KV,並且需要“足夠大”,能夠彈性擴張。這樣系統架構就會變得非常簡單(如上圖所示)。當然最終我們找到了分散式 KV 資料庫—— TiKV。

2. 基於 TiKV 的元資料管理系統

我們前期調研了很多產品,最終選擇 TiKV 主要原因有以下四點:

  • 全域性有序 KV,可輕鬆⽔平擴充套件,功能上完全能夠滿⾜物件儲存元資料管理的需求。

  • 經過一些測試,效能上很好,能夠滿足要求。

  • 社群活躍,文件和工具相對比較完善。這一點也很重要,TiKV 目前已經是 CNCF(雲原生計算基金會)的孵化專案,很多功能可以快速開發,產品迭代也很迅速。

  • 相對於 TiDB Server 而言,TiKV 的程式碼更加簡單,而且我們後續可以在 TiKV 的基礎上做更多開發工作。

在上線之前,我們主要進行了以下幾方面的測試:

  • 功能測試:測試 TiKV 的基本功能是否滿足業務需求。

  • 效能測試:測試了常規的 QPS、Latency (Avg, TP90, TP99) 等指標。

  • 異常測試:其實我們做資料儲存的同學往往最關注的是各種異常故障的情況,效能倒是其次,而且分散式儲存相比單機儲存更為複雜。所以我們測試了各種機器/磁碟/網路故障,業務異常情況。更進一步的,我們將這些異常情況隨機組合,並在系統內觸發,再驗證系統的正確性。

  • 預釋出環境驗證:在大規模上線之前,我們會在相對不太重要的、實際業務上跑一段時間,收集一些問題和可優化的部分,包括運維上的調優等。

通過上面的測試我們認為 TiKV 無論是從效能還是系統安全性的角度,都能很好的滿足要求,於是我們在 TiKV 基礎之上,實現了物件元資料管理系統 v2.0,如下圖所示。

圖 9 元資料管理系統 v2.0

將 v1.0 中一堆複雜的資料庫和邏輯結構用 TiKV 替代之後,整個系統變得非常簡潔。

 

三、業務遷移

很多使用者可能直接將 MySQL 遷移到 TiDB 上,這個遷移過程已經非常成熟,但是由於遷移到 TiKV 前人的經驗比較少,所以我們在遷移過程中也做了很多探索性的工作。

1. 遷移方案

圖 10 遷移方案

上圖是我們設計的遷移方案,首先線上的資料都必須雙寫,保證資料安全。第二,我們將存量資料設定為只讀之後遷移到 TiKV 中,同時遷移過程中的增量資料直接寫入 TiKV,每天將前一日的增量資料做靜態化處理,然後與 MySQL 中的資料對比,驗證資料正確性。另外,如果雙寫失敗,會啟用 MySQL backup。

下面詳細介紹實際操作過程中的相關細節。

2. 切換

在存量資料切換方面,我們首先將存量資料靜態化,簡化遷移、資料對比、回滾的流程;在增量資料切換方面,首先將增量資料雙寫 TiKV & MySQL,並且保證出現異常情況時快速回滾至 MySQL,不影響線上的業務。值得一提的是,由於 TiKV 在測試環境下的驗證結果非常好,所以我們採用 TiKV 作為雙寫的 Primary。

整個切換 過程分為三個步驟:

  • 存量資料切換到 TiKV,驗證讀。

  • 增量資料切換到 TiKV,驗證讀寫。

  • 驗證 TiKV 中的資料正確性之後,就下線 MySQL。

3. 驗證

資料驗證過程最大的困難在於增量資料的驗證,因為增量資料是每天變化的,所以我們雙寫了 MySQL 和 TiKV,並且每天將增量資料進行靜態化處理,用 MySQL 中的記錄來驗證 TiKV 的資料是否可靠(沒有出現數據丟失和錯誤),如下圖所示。

圖 11 雙寫驗證

因為同時雙寫 MySQL 和 TiKV 可能會出現一種情況是,寫入 TiKV 就成功了,但是寫入 MySQL 失敗了,這兩個寫入不在同一個事務中,所以不能保證一定同時成功或者失敗,尤其是在業務量比較大的情況下。對於這種不一致的情況,我們會通過業務層的操作記錄,來判斷是由於業務層的問題導致的,還是由 TiKV 導致的。

 

四、業務現狀及後續優化工作

目前 TiKV 在京東雲物件儲存業務上是 Primary 資料庫,計劃 2019 年年底會把原資料庫下線。總共部署的叢集數量為 10+,生產環境單叢集 QPS 峰值 4 萬(讀寫 1:1),最大的單叢集資料量 200+億,共有 50 餘萬個 Region,我們元資料管理業務對 Latency 要求比較高,目前 Latency 能保證在 10ms 左右。另外,我們正在測試 TiKV 3.0,預計 2019 年第四季度能夠上線。

針對目前的業務執行情況,我們後續還將做一些優化工作。

第一點是災備,目前我們是在業務層做災備,後續可能會直接在 TiKV 層做災備,也很期待 TiKV 之後的版本中能夠有這方面的功能。

第二點是叢集規模優化,因為物件儲存是儲存密集型的業務,我們希望壓縮硬體成本,比如可以用到 8T 、10T 的磁碟,或者用更廉價的磁碟,這點我們後續可能 PingCAP 研發同學們一起考慮怎麼優化提升。

第三點是 Region 排程優化,目前 TiKV 的排程整體比較複雜,這對於儲存密集型的業務來說就比較麻煩,尤其是資料量特別大的情況下,我們並不希望有一絲的波動就把資料遷移到其他機器上。

本文整理自崔燦老師在 TiDB TechDay 2019 杭州站上的演講。

推薦閱讀

乾貨 | TiDB Operator實踐

乾貨 | DRDS 與TiDB淺析

相關推薦

TiKV京東物件儲存資料管理實踐

京東雲物件儲存是在 2016 年作為公有云對外公開的,主要特點是可靠、安全、海量、低成本,應用於包括一些常用的業務場景,比如京

乾貨 | 基於Go SDK操作京東物件儲存OSS的入門指南

    前言 本文介紹如何使用Go語言對京東雲物件儲存OSS進行基本的操作,幫助客戶快速通過G

餓了麼資料管理實踐之路

一、背景 大資料挑戰 大資料時代,餓了麼面臨資料管理、資料使用、資料問題等多重挑戰。具體可以參考下圖: 資料問題:多種執行、儲存引擎,分鐘、小時、天級的任務排程,怎樣梳理資料的時間線變化? 資料使用:任務、表、列、指標等資料,如何進行檢索、複用、清理、熱度Top計算? 資料管理:怎樣對錶、列、指

react使用阿里物件儲存,ali-oss, antd upload to ali-oss

最近寫阿里雲圖片上傳,碰到一些小問題,在此總結一下. 專案環境: create-react-app antd node6.1.0 看了阿里雲oss物件儲存sdk 直接採用node 的安裝方式. 在使用的時候碰到了問題. yield client.put('file',

副文字編輯器 KindEditor 實現圖片上傳到騰訊物件儲存 COS

目錄   一、主要功能實現 二、效果圖 三、需要匯入的包 四、前端程式設計 五、後臺程式設計 六、github 下載 附加內容: 一、主要功能實現 1、配置 KindEditor  2、在 KindEditor 中實現圖片上傳

阿里-物件儲存OSS

文件地址 https://help.aliyun.com/document_detail/32099.html?spm=a2c4g.11186623.6.766.74cdc839H0RSId 安裝(此處為composer安裝) 1、PHP 5.3+ 2、擴

【教程】使用S3fs讓KEC主機直接掛載KS3 金山物件儲存bucket

 S3fs是一款基於FUSE的檔案系統介面卡,通過S3fs能夠使物件儲存直接掛載到雲平臺虛擬機器,如雲硬碟一般使用,非常的方便。本教程教你如何在Linux系統上使用S3fs 對於Ubuntu 14.04,執行: sudo apt-get install automake autotools

資料管理】Atlas術語(Glossary)

Atlas的術語表(Glossary)提供了一些適當的“單詞”,這些“單詞”能彼此進行關連和分類,以便業務使用者在使用的時候,即使在不同的上下文中也能很好的理解它們。此外,這些術語也是可以對映到資料資產中的,比如:資料庫,表,列等。 術語表抽象出了和資料相關的專業術語,使得使用者能以他們更熟悉的方式去查詢和

使用Atlas進行資料管理之Atlas簡介

背景:筆者和團隊的小夥伴近期在進行資料治理/元資料管理方向的探索, 在接下來的系列文章中, 會陸續與讀者們進行分享在此過程中踩過的坑和收穫。 元資料管理系列文章: [0] - 使用Atlas進行元資料管理之Atlas簡介 [1] - 使用Atlas進行元資料管理之Glossary(術語) [2]

阿里伺服器 物件儲存OOS(二) ---圖片上傳與讀取demo

上一篇講解了無需程式碼操作的阿里OOS雲物件儲存 http://blog.csdn.net/u014520797/article/details/53945912 1、SDK下載,不下載也可以,文章最後有demo,demo裡面有jar包 https://help.aliyun.com/d

使用Atlas進行資料管理之Glossary

背景:筆者和團隊的小夥伴近期在進行資料治理/元資料管理方向的探索,在接下來的系列文章中,會將經驗與收穫和讀者們進行分享。 0. 當我們談論資料治理/元資料管理的時候,我們究竟在討論什麼? 談到資料治理,自然離不開元資料。元資料(Metadata),用一句話定義就是:描述資料的資料。元資料打通了資

使用Atlas進行資料管理之容錯和高可用

1. 介紹 Apache Atlas使用各種系統並與之互動,為資料管理員提供元資料管理和資料血緣資訊。通過適當地選擇和配置這些依賴關係,可以使用Atlas實現高度的服務可用性。本文件介紹了Atlas中的高可用性支援狀態,包括其功能和當前限制,以及實現此高級別可用性所需的配置。 在高階架構章節(請參閱我翻譯

利用python爬蟲技術動態爬取地理空間資料中的資料(selenium)

python爬取地理空間資料雲selenium動態點選 爬取的網址秀一下: 爬取的資訊是什麼呢? 這個資訊的爬取涉及到右邊按鈕的點選,這屬於動態爬取的範疇,需要用到selenium 好了,那麼開始寫程式碼吧 首先匯入selenium from seleni

阿里物件儲存(OSS)使用小結

本文為使用OSS物件儲存小結,無廣告之嫌。 一.建立javaOSS上傳工具類 需要匯入的jar包在網站有,需要注意的是,httpclient.jar和httpcore.jar的版本需要保持一致,不然會上傳出錯。slf4j.jar 系列的也需要保持一致,上程式碼。 i

阿里物件儲存OSS使用記錄: 如何把oss中Bucket的檔案URL連線設定成永久有效

一、OSS本身的許可權控制 1.許可權型別 Bucket目前有三種訪問許可權:public-read-write,public-read和private; 2.許可權設定與獲取 通過控制檯設定Bucket級別和object級別的操作; 控制檯: Bucket:

基於TableStore的海量電商訂單資料管理

摘要: # 一、背景 訂單系統存在於各行各業,如電商訂單、銀行流水、運營商話費賬單等,是一個非常廣泛、通用的系統。對於這類系統,在過去十幾年發展中已經形成了經典的做法。但是隨著網際網路的發展,以及各企業對資料的重視,需要儲存和持久化的訂單量越來越大。 一、背景 訂單系統存

HDFS資料管理機制

### 1.元資料管理概述 > HDFS分類-型別分包括以下幾部分 檔案、目錄自身的屬性資訊,例如檔名,目錄名,修改資訊等 檔案記錄的資訊的儲存相關的資訊,例如儲存塊資訊,分塊情況,副本個數等 記錄 HDFS 的 Datanode 的資訊,用於 DataNod

上傳圖片,視訊等檔案到七牛物件儲存

上傳圖片: 需要用到的引數: 1、AccessKey (在“個人中心”–>“祕鑰管理”中) 2、SecretKey (在“個人中心”–>“祕鑰管理”中) 3、儲存空間名字(自己建立的) 1、建立一個Maven專案 pom.xml &l

hadoop學習筆記肆--資料管理機制

1、首先,認識幾個名詞     (1)、NameNode中讀、寫、以及DataNode對映等資訊叫做“元資料” ,NameNode元資料存放位置有、記憶體、fsimage、edits log三個位置。     (2)、edits log:記錄當前最新的元資料。        (3)、

php用最簡單的方式實現7牛物件儲存檔案上傳

今天看了一下七牛雲的物件儲存 簡單看了一下開發文件實現了七牛雲的檔案上傳 七牛雲檔案有免費的空間 所以還是挺有用的 只需要改三個配置就行 設定 <?php require 'qiniuy/autoload.php'; use Qiniu\Auth