存儲成本降71%,怪獸充電歷史庫遷移OceanBase

怪獸充電作為共享充電寶第一股,業務增長迅速,以至于業務架構不停地增加組件。在驗證 OceanBase 可以簡化架構并帶來更大的業務價值后,首次嘗試在歷史庫中使用 OceanBase 替代 MySQL,存儲成本降低 71%。本文為怪獸充電運維架構部王霖對本次數據升級的經驗總結、思考。

圖片

2017 年,“共享經濟”成為年度熱詞,彼時共享單車 ofo 正紅極一時,共享充電寶也正在市場擴散。就在這一年,怪獸充電成立,并后來者居上于 2021 年在納斯達克上市。早在三年前怪獸充電的累計注冊用戶超 2 億,到今年第二季度,注冊用戶數已經到了 3.625 億,日均單量達 190 萬筆。

持續涌入的用戶帶來了業務的快速增長,業務系統架構逐漸變得復雜。目前采用的是混合云架構,由于系統中微服務和數據組件較多,因此我們開發了維護云+IDC、覆蓋基礎設施/中間件/微服務的 DevOps 平臺 Hydra 進行統一維護管理。下表是目前我們用到的數據庫。

圖片

圖片

在我看來,使用新技術通常有兩種路徑,一種是當前技術無法滿足需求進而尋求解決方案,另一種是新技術能夠提供更高的效率,帶來更大的價值。

而我們屬于后者,之所以會替換現有數據庫方案,源于 OceanBase 的技術分享。當我們聽完產品特性和技術方案的介紹后,認為 OceanBase 是對怪獸充電現有架構和業務比較有利的工具,但也存在一些疑慮。

其一,面向 C 端用戶的業務尤其是關鍵業務,在數據庫選型時需要更加嚴苛的考慮,避免切換數據庫帶來的任何潛在風險;

其二,對于 IDC 中的用戶而言使用開源產品是更合適的,但以過往使用開源產品的經驗來說,來自社區的支持力度較小;

其三,我們對 OceanBase 的底層語言 C++ 不是很熟悉,擔心上手門檻較高。

在深入了解 OceanBase 產品及社區后,上述疑慮都打消了。OceanBase 有很活躍的用戶答疑群、社區論壇,能夠及時解答用戶提出的問題。此外,社區會舉辦豐富的線上、線下交流活動,對于開源用戶的支持力度讓我們對 OceanBase 建立了信心,所以我們決定試試。

在 IDC 中部署 OceanBase 后,我們對比了 OceanBase 與 MySQL 的使用效果,對怪獸充電的業務情況而言,OceanBase 的優勢主要有以下兩方面。

第一,可擴展性強。OceanBase 既可以垂直擴容,也可以水平擴容,擴縮容快速、透明、方便,而 MySQL 水平擴容的方式是分庫分表,維護成本相對更高。

第二,節省存儲資源損耗。此前部署 MySQL 時,我們制定了統一的物理機標準,采購相同標準的 CPU 和內存,在此基礎上做虛擬化及資源的分配。為此我們還自研了一個調度系統,目的是跟不同的 CPU 內存和磁盤的比例做調配,盡量減少資源損耗。由于 IDC 的容量并不大,導致存儲碎片化嚴重:比如創建的某個數據庫存儲用量比較大源,而 CPU 內存占用卻很少,這時候雖然物理機上 CPU、內存使用率低但因為磁盤空間已被占用而無法分配新的數據庫實例,造成極大的資源浪費。我們對單數據庫 OceanBase 和 MySQL 的數據占用:

如果部署單實例,數據占用對比是 1:6.8;如果部署 OceanBase 三副本,MySQL 做主從的話,數據占用對比為 1:4.6。可見,OceanBase 在存儲方面的優勢顯著,可以顯著降低我們 IDC 的存儲用量。

此外,在我們測試性能時,發現了 OceanBase 的另一個特點。在低并發情況下,OceanBase 4.0 版本的性能比 MySQL 5.7 低 ,而在高并發環境下,OceanBase 4.0 表現的性能優于 MySQL 5.7。

綜合上述測試情況和優劣勢分析,我們部署了OceanBase 4.0,接下來介紹當前應用情況。

圖片

怪獸充電的訂單業務主要是充電寶,其特點是客單價較低、單量大,下圖是訂單業務使用的數據庫情況。

圖片

從圖中可以看到,訂單業務涉及的數據庫包含三部分。

  • 實時數據庫支持用戶下單,涉及高并發場景。為了提升高并發能力,我們按照用戶分了 8 個庫,并使用 ShardingSphere JDBC 接入遷移服務。

  • ElasticSearch 集群是為滿足后臺多字段的聯合查詢需求。在業務數據量不斷擴大的情況下,后臺查詢若是用實時庫查詢,其索引無法覆蓋所有的查詢場景,由此引入 ElasticSearch 集群。遷移服務也寫入 ElasticSearch 集群,通過 Binlog 訂閱實時數據庫的數據。

  • 歷史數據庫在使用 MySQL 時采用分庫分表方案,它的特點就是更新的需求很少。每天會有一個實時的任務,去把實時數據庫中的歷史數據定時寫入歷史數據庫。歷史庫的數據量較大,從 8 個庫分到 64 個庫(schema),放到 8 個實例中,總體數據量約 9.6TB,單庫中最大的表數據超過 2 億行。

基于訂單業務的數據庫情況,我們決定第一步將歷史數據庫遷移至 OceanBase,降低存儲成本與運維成本。原因是:其一,歷史庫的數據量級龐大,OceanBase 的優勢之一就是降存儲成本;其二,從 MySQL 的 64 個庫到 OceanBase 單庫,運維與維護成本會極大降低;其三,歷史庫讀寫場景較少,涉及少量精確的查詢,且不影響用戶下單,遷移的風險較小。

圖片

第一步,我們在 IDC 部署 OceanBase 集群。OBCluster 分了三個 zone 和三個server,分別部署在三組機架中;單主機規格為 40 核 128G,考慮到日常讀寫量和存儲成本,我們僅僅在日志盤上使用了 SSD,數據盤使用的是機械硬盤。由于 OBProxy 是無狀態服務,因此通過 Helm 被部署在 K8S 集群里。

圖片

第二步,使用 OMS 同步數據。首先我們使用 OMS 同步 64 個數據庫到 OceanBase,這里面存在一個多庫匯聚到一個庫的問題,那么,我們需要建 64 個數據同步對象嗎?其實不用,OMS 的配置遷移對象的匹配規則能力,使分庫分表的數據源遷移到 OceanBase 變得非常簡單高效,對于我們 8 個數據庫實例共 64 個庫,建 8 個同步對象就行了,通過簡單的配置可以實現每個實例上多個庫的數據匯聚同一個 OceanBase 庫。

為了確認 OceanBase 的穩定性,我們服務會保持一段時間的雙寫,等驗證完會完全切換到 OceanBase 上。

接入 OceanBase 后,我們的存儲成本節約了 71%,總的存儲量從原來的 9.62TB*2(9.62 為單 MySQL 實例,考慮主從高可用部署所以乘以 2)到現在的 5.6 TB(三副本的總存儲量),短期之內我們不用再考慮數據庫擴容的問題了。

另外,我們在遷移過程中也遇到一些問題,可供大家參考。

第一,OBServer 與 Dell Raid 高速緩存兼容性問題:Dell Raid 卡高速緩存配置中,寫策略為默認“回寫”,改為“直寫“后恢復;

a. 有租戶 clog 滿,擴容之后也會一直上漲;

b. 租戶無法正常合并;

c. OBServer 啟動日志中有大量關鍵字為"ret=\-4070"的 WARN 報錯,有個關鍵信息"failed to fetch and submit single log",就是合并時無法讀取日志,已經可以定位到 OBServer 合并場景中,有 I/O 操作不成功;

d. 后續定位到 Dell 陣列卡高速緩存配置中,寫策略為默認的“回寫”時,會引發單測復現問題,改為“直寫“后恢復,相關問題也已經反饋 Dell。

第二,機械盤部署問題:在 OceanBase 實例上做壓測時,因為磁盤性能不佳,導致日志流同步出現落后,進一步觸發副本 rebuild。OceanBase 社區表示后續會優化一下對機械盤的兼容性。

圖片

目前訂單業務的歷史數據庫遷移已完成,正式用于生產環境。經測試驗證,在查詢場景下 OceanBase 同樣有著優秀的性能表現。接下來我們考慮將查詢場景也遷移至 OceanBase,包括服務后臺查詢和報表查詢。

  • 服務后臺查詢:服務后臺查詢和上文提到的訂單后臺查詢類似,用 MySQL 做相關的 OLTP 的操作,數據通過 Binglog 訂閱同步寫入Elasticsearch,整體成本較高,包括 MySQL 和 Elasticsearch 存儲的重疊、中間鏈路數據同步服務的支撐等。因此,后續計劃通過 OceanBase 替代 MySQL + Elasticsearch 的架構。

  • 報表查詢:報表查詢當前的現狀是,數據存儲在 MySQL,遇到一些數據聚合量比較大的 SQL 查詢時非常慢,影響系統穩定性。因為涉及一些 OLAP 的場景,考慮到 OceanBase 會比 MySQL 更合適,接下來會部署 OceanBase 對應的規格,并做流量回放比對驗證。

在使用 OceanBase 的過程中,也讓我們對其產生了一些功能上的期望,主要包括以下四點。

第一,期望 OMS 支持 MySQL 到 Rocket MQ 的數據遷移。在 IDC 側,數據遷移的場景包括兩部分。一部分是 MySQL 到 MySQL 的數據同步使用某其他國產數據庫開源的 DM 工具,包括全量同步和增量同步;另一部分是從 MySQL 到 Rocket MQ 的數據同步使用 canal。我們調研了OceanBase 的 OMS,雖然使用體驗不錯,但發現社區版不支持數據從 MySQL 同步到 Rocket MQ。因此,我們希望能否將 OMS 開源,以共建的方式補全功能。這樣一來,我們就可以將整體的遷移框架統一到 OMS 中。

第二,監控告警,以方便接入開源的監控告警體系。我們希望相關的組件能夠提供 metrics 指標,以便接入我們內部的監控告警,同時提供一些 Grafana 面板,提供建議的告警表達式。

第三,問題排查更加智能化。當前,我們依賴 OCP 中比較完善監控指標和專家知識,而我們希望這部分變成自動化工具,包括自動分析、自動提供解決方案或工具等。

第四,開源或開放流量回放工具。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211811.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker 入門

Docker 入門 基礎 不同操作系統下其安裝包、運行環境是都不相同的!如果是手動安裝,必須手動解決安裝包不同、環境不同的、配置不同的問題 而使用Docker,這些完全不用考慮。就是因為Docker會自動搜索并下載MySQL。注意:這里下載…

【C++】輸入輸出流 ⑥ ( cout 標準輸出流對象 | cout 常用 api 簡介 | cout.put(char c) 函數 )

文章目錄 一、cout 標準輸出流對象1、cout 標準輸出流對象簡介2、cout 常用 api 簡介 二、cout.put(char c) 函數1、cout.put(char c) 函數 簡介2、代碼示例 - cout.put(char c) 函數 一、cout 標準輸出流對象 1、cout 標準輸出流對象簡介 cout 是 標準輸出流 對象 , 是 ostrea…

端口被占用 --- 解決方案

問題描述 加速服務啟動失敗,443端口被magentproc(1576)占用。請關掉占用443端口的程序或者嘗試使用系統代理模式。 問題解決 按下 win R 打開 輸入cmd 輸入命令 netstat -ano | findstr 443 找到 0.0.0.0:443 對應的端口 (1576) 按下 ctrl shift esc, 打開任務管…

綜述 2023-IEEE-TCBB:生物序列聚類方法比較

Wei, Ze-Gang, et al. "Comparison of methods for biological sequence clustering." IEEE/ACM Transactions on Computational Biology and Bioinformatics (2023). https://ieeexplore.ieee.org/document/10066180 被引次數:1;研究背景&am…

力扣題:數字與字符串間轉換-12.13

力扣題-12.13 [力扣刷題攻略] Re:從零開始的力扣刷題生活 力扣題1:442. 數組中重復的數據 解題思想:直接相除即可 class Solution(object):def optimalDivision(self, nums):""":type nums: List[int]:rtype: str"&qu…

Transformer 簡介

Transformer 是 Google 在 2017 年底發表的論文 Attention Is All You Need 中所提出的 seq2seq 模型。Transformer 模型的核心是 Self-Attention 機制,能夠處理輸入序列中的每個元素,并能計算其與序列中其他元素的交互關系的方法,從而能夠更…

再見了Future,圖解JDK21虛擬線程的結構化并發

Java為我們提供了許多啟動線程和管理線程的方法。在本文中,我們將介紹一些在Java中進行并發編程的選項。我們將介紹結構化并發的概念,然后討論Java 21中一組預覽類——它使將任務拆分為子任務、收集結果并對其進行操作變得非常容易,而且不會不…

Unity中Shader黑白閥值后處理效果

文章目錄 前言一、我們先來PS看一下黑白閥值的效果二、使用step(a,b)函數實現效果三、實現腳本控制黑白閥值1、在Shader屬性面板定義控制閥值變量2、把step的a改為_Value3、在后處理腳本設置公共成員變量,并且設置范圍為(0,1)4、在Graphics.B…

Cocos Creator:創建棋盤

Cocos Creator:創建棋盤 創建地圖三部曲:1. 創建layout組件2. 創建預制體Prefab,做好精靈貼圖:3. 創建腳本LayoutSprite.ts收尾工作: 創建地圖三部曲: 1. 創建layout組件 使用layout進行布局,…

優化瑞芯微rk3566 tf卡速度uhs SDR104

環境 開發板:orangepi3B CPU:rk3566 TF卡速度標識:C10,U3,V30 起因 對于tf卡啟動的系統來說,io會成為一個很關鍵的瓶頸,所以總希望系統能跑得快一點。我手頭用的是一張金士頓的高性能tf卡,開…

四十三、Redis基礎

目錄 一、認識NoSql 1、定義: 2、常見語法 3、與關系型數據庫(SQL)的區別: 二、認識Redis 1、定義: 2、特征: 3、Key的結構: 三、安裝Redis 四、Redis常見命令 1、數據結構介紹 2、…

關于DNS服務器地址總是127.0.0.1且無法解析域名地址

問題 筆者嘗試nslookup解釋域名時,出現服務器變成本地環回口地址,導致無法解析域名 C:\Users\Zsy>nslookup www.baidu.com 服務器: UnKnown Address: 127.0.0.1*** UnKnown 找不到 www.baidu.com: Server failed排查思路 嘗試關閉虛擬網卡&#…

CSS的邏輯組合偽類

CSS 的邏輯組合偽類有 4 種,分別是::not()、:is()、:where()和:has()。 否定偽類:not() :not 偽類選擇器用來匹配不符合一組選擇器的元素。由于它的作用是防止特定的元素被選中,它也被稱為反選偽類(negation pseudo-…

Torch2TRT編譯和使用踩坑

前言 Torch2TRT是英偉達提供的開源Pytorch到TensorRT模型的轉化工具。相對于其他Pytorch模型轉TensorRT的方式,我認為這是最簡單和容易上手的方式。但是該工具并不成熟,在安裝和使用過程中有一些坑。 遇到的問題 1. fatal error: xxxxxx.h: No such f…

自動化測試框架 —— pytest框架入門篇

今天就給大家說一說pytest框架。 今天這篇文章呢,會從以下幾個方面來介紹: 01、pytest框架介紹 pytest 是 python 的第三方單元測試框架,比自帶 unittest 更簡潔和高效,支持非常豐富的插件,同時兼容 unittest 框架。…

【C++】:AVL樹

朋友們、伙計們,我們又見面了,本期來給大家解讀一下有關多態的知識點,如果看完之后對你有一定的啟發,那么請留下你的三連,祝大家心想事成! C 語 言 專 欄:C語言:從入門到精通 數據結…

用python 網絡自動化統計交換機有多少端口UP

用python統計交換機有多少端口UP 用python統計交換機有多少端口UP,可以間接的反饋有多少個用戶在線。我們使用上次的腳本將可達的網絡設備ip統計到reachable_ip.txt中,這次我們使用reachable_ip.txt來登陸設備來統計多少端口是UP的 云配置 拓撲 交換機…

使用fcl庫做碰撞檢測

fcl庫是真難用,導入自己的項目的時候遇到各種坑。 第一個坑就是git clone并build fcl庫后生成的fcl-config.cmake里面有問題,需要在這里進行相應修改 set_and_check(FCL_INCLUDE_DIRS "/home/xxxx/fcl/build/include") set(FCL_LIBRARIES fc…

【Cisco Packet Tracer】VLAN通信 多臂/單臂路由/三層交換機

在進行本文的實驗之前,請確保掌握以下內容: 【Cisco Packet Tracer】交換機 學習/更新/泛洪/VLAN實驗 【Cisco Packet Tracer】路由器實驗 靜態路由/RIP/OSPF/BGP 【Cisco Packet Tracer】路由器 NAT實驗 本文介紹VLAN間的通信方法, 包括…

FreeRTOS的任務優先級、Tick以及狀態講解(尊敬的嵌入式工程師,不妨進來喝杯茶)

任務優先級和Tick 在FreeRTOS中,任務的優先級和Tick是兩個關鍵的概念,它們直接影響任務的調度和執行。 任務優先級 每個任務都被分配一個優先級,用于決定任務在系統中的調度順序。 優先級是一個無符號整數,通常從0開始&#xff0…