【轉載】馬蜂窩數據倉庫的架構、模型與應用實踐

馬蜂窩數據倉庫的架構敛腌、模型與應用實踐

(馬蜂窩技術原創(chuàng)內容卧土,公眾號ID:mfwtech)

一惫皱、馬蜂窩數據倉庫與數據中臺

最近幾年,數據中臺概念的熱度一直不減尤莺。2018 年起旅敷,馬蜂窩也開始了自己的數據中臺探索之路。

數據中臺到底是什么颤霎?要不要建媳谁?和數據倉庫有什么本質的區(qū)別?相信很多企業(yè)都在關注這些問題友酱。

我認為數據中臺的概念非常接近傳統(tǒng)數據倉庫+大數據平臺的結合體晴音。它是在企業(yè)的數據建設經歷了數據中心、數據倉庫等積累之后缔杉,借助平臺化的思路锤躁,將數據更好地進行整合與統(tǒng)一,以組件化的方式實現靈活的數據加工與應用或详,以更清晰的數據職能組織應對業(yè)務的快速變化系羞,以服務的方式更好地釋放數據價值的一種方式。

所以霸琴,數據中臺更多的是體現一種管理思路和架構組織上的變革椒振。在這樣的思想下,我們結合自身業(yè)務特點建設了馬蜂窩的數據中臺梧乘,核心架構如下:

在中臺建設之前澎迎,馬蜂窩已經建立了自己的大數據平臺,并積累了一些通用宋下、組件化的工具嗡善,這些可以支撐數據中臺的快速搭建。作為中臺的另一大核心部分学歧,馬蜂窩數據倉庫主要承擔數據統(tǒng)一化建設的工作罩引,包括統(tǒng)一數據模型,統(tǒng)一指標體系等枝笨。下面介紹馬蜂窩在數據倉庫建設方面的具體實踐袁铐。

二、數據倉庫核心架構

馬蜂窩數據倉庫遵循標準的三層架構横浑,對數據分層的定位主要采取維度模型設計剔桨,不會對數據進行抽象打散處理,更多注重業(yè)務過程數據整合♂闳冢現有數倉主要以離線為主洒缀,整體架構如下:

如圖所示,共分為 3 層:業(yè)務數據層、公共數據層與應用數據層树绩,每層定位萨脑、目標以及建設原則各不相同。

(1)業(yè)務數據層:包含 STG(數據緩沖層)與 ODS(操作數據層)兩層饺饭,這兩層數據結構與業(yè)務數據幾乎一致渤早。

STG:也叫數據準備區(qū),定位是緩存來自 DB 抽取瘫俊、消息鹊杖、日志解析落地的臨時數據,結構與業(yè)務系統(tǒng)保持一致扛芽;負責對垃圾數據骂蓖、不規(guī)范數據進行清洗轉換;該層只為 ODS 層服務胸哥;

ODS:操作數據層定位于業(yè)務明細數據保留區(qū)涯竟,負責保留數據接入時點后歷史變更數據,數據原則上全量保留空厌。模型設計依據業(yè)務表數據變更特性采取拉鏈、流水表兩種形式银酬。

(2)公共數據層:細分為 DWD(明細數據層)嘲更、DWS(匯總數據層)、DIM(公共維度層) 三層揩瞪,主要用于加工存放整合后的明細業(yè)務過程數據赋朦,以及經過輕度或重度匯總粒度公共維度指標數據。公共數據層作為倉庫核心層李破,定位于業(yè)務視角宠哄,提煉出對數據倉庫具有共性的數據訪問、統(tǒng)計需求嗤攻,從而構建面向支持應用毛嫉、提供共享數據訪問服務的公共數據。

DWD:這一層是整合后的業(yè)務過程明細數據妇菱,負責各業(yè)務場景垂直與水平數據整合承粤、常用公共維度冗余加工,以及明細業(yè)務標簽信息加工闯团;

DWS:匯總數據層按照主題對共性維度指標數據進行輕度辛臊、高度聚合;

DIM:對維度進行統(tǒng)一標準化定義房交,實現維度信息共享彻舰。

(3)應用數據層:DWA 層,主要用于各產品或各業(yè)務條線個性化的數據加工,例如商業(yè)化產品數據刃唤、搜索推薦隔心,風控等。

三透揣、數據模型設計

3.1 方法選擇

數據模型是對現實世界數據特征的抽象济炎,數據模型的設計方法就是對數據進行歸納和概括的方法。目前業(yè)界主要的模型設計方法論有兩種辐真,一是數據倉庫之父 Bill Inmon 提出的范式建模方法须尚,又叫 ER 建模,主張站在企業(yè)角度自上而下進行數據模型構建侍咱;二是 Ralph Kimball 大師倡導的維度建模方法耐床,主張從業(yè)務需求出發(fā)自下而上構建數據模型。

大數據環(huán)境下楔脯,業(yè)務系統(tǒng)數據體系龐雜撩轰,數據結構多樣、變更頻繁昧廷,并且需要快速響應各種復雜的業(yè)務需求堪嫂,以上兩種傳統(tǒng)的理論都已無法滿足互聯(lián)網數倉需求。在此背景下木柬,馬蜂窩數據倉庫采取了「以需求驅動為主皆串、數據驅動為輔」的混合模型設計方式,來根據不同的數據層次選擇模型眉枕。主要從以下四個方面綜合考慮:

1. 面向主題:采用范式模型理論中的主題劃分方法對業(yè)務數據進行分類恶复。

2. 一致性保證:采用維度模型理論中的總線結構思想,建立統(tǒng)一的一致性維度表和一致性事實表來保證一致性速挑。

3. 數據質量保證:無論范式建模還是維度建模都非常重視數據質量問題谤牡,綜合使用兩個理論中的方法保證數據質量。

4. 效率保證:合理采取維度退化姥宝、變化維翅萤、增加冗余等方法,保證數據的計算和查詢效率伶授。

其中断序,ODS 選擇保持貼源的范式模型,不做進一步模型抽象糜烹,只是從節(jié)省存儲角度考慮违诗,對該層采取拉鏈處理。DWD 與 DWS 基于對構建成本疮蹦、性能诸迟,易用性角度的考慮,主要采取維度模型和一些寬表模型。寬表模型的本質是基于維度模型的擴展阵苇,對整個業(yè)務以及全節(jié)點信息進行垂直與水平方式整合壁公;同時采用退化維度的方式,將不同維度的度量放入數據表的不同列中绅项,實現業(yè)務全流程視圖的構建紊册,來提升寬表模型的易用性、查詢效率快耿,且易于模型的擴展囊陡。

水平整合:水平整合就是將同一業(yè)務多數據源的數據整合到一個模型中,如果多數據源業(yè)務數據存在交集掀亥,則需要按照預設的業(yè)務規(guī)則選取一份保留撞反,避免整合后的業(yè)務數據交叉。例如商品數據如果未進行主數據管理搪花,不同業(yè)務線的商品信息就會散落在各業(yè)務系統(tǒng)表中遏片,無法滿足企業(yè)級的數據分析需求,這時就需要將這些商品數據按照業(yè)務主題進行水平整合撮竿。

垂直整合:一次完整的業(yè)務流轉通常要經歷多個環(huán)節(jié)吮便,各節(jié)點信息產生的時點不同、儲存的數據表不同幢踏。垂直整合就是將同一業(yè)務中各關鍵節(jié)點信息整合至業(yè)務全流程寬表模型中线衫。馬蜂窩訂單交易模型的構建就采用了這種方式,下文將進行詳細介紹惑折。

3.2 設計目標

馬蜂窩數據倉庫在模型設計上以準確性、易用性枯跑、及時性為設計目標惨驶,以滿足業(yè)務人員對數據的多樣需求。

準確性:數據質量管控要在建模過程中落地敛助,為數據準確性保駕護航粗卜。

易用性:兼顧模型的可擴展性和可理解性。

及時性:充分考慮模型的使用效率纳击,提供方便快捷的數據查詢和數據計算服務续扔。

3.3 設計流程

馬蜂窩數倉模型設計的整體流程涉及需求調研、模型設計焕数、開發(fā)測試纱昧、模型上線四個主要環(huán)節(jié),且規(guī)范設計了每個階段的輸出與輸入文檔堡赔。

需求調研:收集和理解業(yè)務方需求识脆,就特定需求的口徑達成統(tǒng)一,在對需求中涉及到的業(yè)務系統(tǒng)或系統(tǒng)模塊所承擔的功能進行梳理后進行表字段級分析,并對數據進行驗證灼捂,確崩肜現有數據能夠支持業(yè)務需求。

模型設計:根據需求和業(yè)務調研結果對模型進行初步歸類悉稠,選擇合適的主題域進行模型存放宫蛆;確定主題后進入數據模型的設計階段,邏輯模型設計過程要考慮總線結構構建的猛、模型規(guī)范定義等關鍵問題耀盗;物理模型設計以邏輯模型為基礎,兼顧存儲性能等因素對邏輯模型做的物理化的過程衰絮,是邏輯模型的最終物理實現.物理模型在一般情況下與邏輯模型保持一致袍冷,模型設計完成后需要進入評審與 Mapping 設計。

模型開發(fā):就是對模型計算腳本的代碼實現過程猫牡,其中包含了數據映射胡诗、腳本實現、測試驗證等開發(fā)過程淌友。單元測試完成后需要通知業(yè)務方一起對模型數據進行業(yè)務驗證煌恢,對驗證問題做收集,返回驗證模型設計的合理性震庭。

模型上線:完成驗證后的模型就可以在線上生產環(huán)境進行部署瑰抵。上線后需要為模型配置監(jiān)控,及時掌握為業(yè)務提供數據服務的狀況器联。我們還將模型的實體和屬性說明文檔發(fā)布給倉庫數據的使用者二汛,使模型得到更好地應用。

3.4 主題分類

基于對目前各個部門和業(yè)務系統(tǒng)的梳理拨拓,馬蜂窩數據倉庫共設計了 4 個大數據域(交易肴颊、流量、內容渣磷、參與人)婿着,細分為 11 個主題:

以馬蜂窩訂單交易模型的建設為例,基于業(yè)務生產總線的設計是常見的模式醋界,即首先調研訂單交易的完整過程竟宋,定位過程中的關鍵節(jié)點,確認各節(jié)點上發(fā)生的核心事實信息形纺。模型是數據的載體丘侠,我們要做的就是通過模型(或者說模型體系)歸納生產總線中各個節(jié)點發(fā)生的事實信息。

訂單生產總線:

如上圖所示挡篓,我們需要提煉各節(jié)點的核心信息婉陷,為了避免遺漏關鍵信息帚称,一般情況下抽象認為節(jié)點的參與人、發(fā)生時間秽澳、發(fā)生事件闯睹、發(fā)生協(xié)議屬于節(jié)點的核心信息,需要重點獲取担神。以下單節(jié)點為例楼吃,參與人包括下單用戶、服務商家妄讯、平臺運營人員等孩锡;發(fā)生時間包括用戶的下單時間、商家的確認時間等亥贸;發(fā)生的事件即用戶購買了商品躬窜,需要記錄圍繞這一事件產生的相關信息;發(fā)生協(xié)議即產生的訂單炕置,訂單金額荣挨、約定內容等都是我們需要記錄的協(xié)議信息。

在這樣的思路下朴摊,總線架構可以在模型中不斷添加各個節(jié)點的核心信息默垄,使模型支撐的應用范圍逐步擴展、趨于完善甚纲。因此口锭,對業(yè)務流程的理解程度將直接影響產出模型的質量。

涉及的業(yè)務節(jié)點越多介杆,業(yè)務流程也就越復雜鹃操。從數據的角度看,這些業(yè)務過程會產生兩種基本的場景形態(tài)春哨,即數據的拆分和匯聚组民。隨著流程的推進,前一節(jié)點的原子業(yè)務單位在新節(jié)點中可能需要拆分出更多信息悲靴,或者參與到新節(jié)點的多向流程。同樣莫其,也可能發(fā)生數據的匯聚癞尚。以某個訂單為例,下單節(jié)點數據是訂單粒度的乱陡,而到支付節(jié)點就發(fā)生了數據拆分浇揩。數據的拆分、匯聚伴隨著總線的各節(jié)點憨颠,可能會一直發(fā)散下去胳徽。

鑒于上述情況积锅,在模型實現過程中,我們不能把各節(jié)點不同粒度的數據信息都堆砌在一起养盗,那樣會產生大量的冗余信息缚陷,也會使模型本身的定位不清晰,影響使用往核。因此箫爷,需要輸出不同粒度的模型來滿足各類應用需求。例如既會存在訂單粒度的數據模型聂儒,也會存在分析各個訂單在不同時間節(jié)點狀態(tài)信息的數據模型虎锚。

基于維度建模的思路,在模型整合生產總線各節(jié)點核心信息之后衩婚,會根據這些節(jié)點信息進一步擴展常用的分析維度窜护,以減少應用層面頻繁關聯(lián)相關分析維度帶來的資源消耗,模型會反范式冗余相關維度信息非春,以獲取應用層的使用便捷柱徙。最終建立一個整合旅游、交通税娜、酒店等各業(yè)務線與各業(yè)務節(jié)點信息的馬蜂窩全流程訂單模型坐搔。

四、數據倉庫工具鏈建設

為提升數據生產力敬矩,馬蜂窩數據倉庫建立了一套工具鏈概行,來實現采集、研發(fā)弧岳、管理流程的自動化〉拭Γ現階段比較重要的有以下三大工具:

1. 數據同步工具

同步工具主要解決兩個問題:

從源系統(tǒng)同步數據到數據倉庫?

將數據倉庫的數據同步至其他環(huán)境

下面重點介紹從源系統(tǒng)同步數據到數據倉庫。

馬蜂窩的數據同步設計支撐靈活的數據接入方式禽炬,可以選擇抽取方式以及加工方式涧卵。抽取方式主要包括增量抽取或者全量抽取,加工方式面向數據的存儲方式腹尖,是需要對數據進行拉鏈式保存柳恐,或者以流水日志的方式進行存儲。

接入時热幔,只需要填寫數據表信息配置以及具體的字段配置信息乐设,數據就可以自動接入到數據倉庫,形成數倉的 ODS 層數據模型绎巨,如下:

2. 任務調度平臺

我們使用 Airflow 配合自研的任務調度系統(tǒng)近尚,不僅能支持常規(guī)的任務調度,還可以支持任務調度系統(tǒng)各類數據重跑场勤,歷史補數等需求戈锻。

別小看數據重跑歼跟、歷史補數,這兩項功能是在選擇調度工具中重要的參考項格遭。做數據的人都清楚哈街,在實際數據處理過程中會面臨諸多的數據口徑變化、數據異常等如庭,需要進行數據重跑叹卷、刷新、補數等操作坪它。

我們設計的「一鍵重跑」功能骤竹,可以將相關任務依賴的后置任務全部帶出,并支持選擇性地刪除或虛擬執(zhí)行任意節(jié)點的任務:

如果選擇刪除往毡,這該任務之后所依賴的任務均不執(zhí)行

如果選擇虛擬執(zhí)行蒙揣,則會忽略(空跑)掉該任務,后置的所有依賴任務還是會正常執(zhí)行开瞭。

如下是基于某一個任務重跑下游所有任務所列出的關系圖懒震,選中具體的執(zhí)行節(jié)點,就可以執(zhí)行忽略或者刪除嗤详。

3. 元數據管理工具

元數據范疇包括技術元數據个扰、業(yè)務元數據、管理元數據葱色,在概念上不做過多闡述了递宅。元數據管理在數據建設起著舉足輕重的作用,這部分在數倉應用中主要有 2 個點:

(1)血緣管理

血緣管理可以追溯數據加工整體鏈路苍狰,解析表的來龍去脈办龄,用于支撐各類場景,如:

支持上游變更對下游影響的分析與調整

監(jiān)控各節(jié)點淋昭、各鏈路任務運行成本俐填,效率

監(jiān)控數據模型的依賴數量,確認哪些是重點模型

如下是某一個數據模型中的血緣圖翔忽,上下游以不同顏色進行呈現:

(2)數據知識管理

通過對技術英融、業(yè)務元數據進行清晰、詳盡地描述歇式,形成數據知識矢赁,給數據人員提供更好的使用向導。我們的數據知識主要包括實體說明與屬性說明贬丛,具體如下:

當然,數倉工具鏈條中還有非常多工具给涕,例如自動化建模工具豺憔,數據質量管理工具额获,數據開發(fā)工具等,都已經得到了很好地實現恭应。

五抄邀、數倉應用——指標平臺

有了合理的數倉架構、工具鏈條支撐數據研發(fā)昼榛,接下來境肾,就要考慮如何把產出的數據對外賦能。下面以馬蜂窩數據應用利器-指標平臺胆屿,進行簡單介紹奥喻。

幾乎所有的企業(yè)都會構建自己的指標平臺,每個企業(yè)建立的標準都不一樣非迹。在這個過程中會遇到指標繁多环鲤、定義不清楚、查詢緩慢等問題憎兽。為盡量避免這些問題冷离,指標平臺在設計時需要遵循幾大原則:

指標定義標準,清晰纯命,容易理解西剥,且不存在二義性,分類明確

指標生產過程簡單亿汞、透明瞭空、可配置化

指標查詢效率需要滿足快速響應

指標權限管理靈活可控

基于以上原則,馬蜂窩的指標平臺按照精細化的設計進行打造留夜,指標平臺組成架構如下圖:

其中:

數據倉庫是指標數據的來源匙铡,所有指標目前都是通過數據倉庫統(tǒng)一加工的

指標管理包括指標創(chuàng)建與指標元數據管理:數倉負責生產并創(chuàng)建最核心、最基礎的指標碍粥;其他人員可以基于這些指標鳖眼,按照規(guī)則進行指標的派生;元數據管理記錄指標的具體來源路徑嚼摩,說明指標的數據來源是數倉表钦讳,或者是 Kylin,MySQL 或 ES

指標字典對外呈現指標的定義枕面、口徑愿卒、說明等,保證指標的透明化及可解釋性

數據服務接受指標的查詢請求潮秘,針對不同場景判斷查詢的成本琼开,選擇最優(yōu)鏈路進行指標查詢,并返回指標查詢的結果

多維查詢將可以提供查詢服務的指標與維度通過界面呈現枕荞,用戶可以基于維度選擇指標或基于指標選擇維度柜候,查詢具體需要的數據

權限管理貫徹始終搞动,可以支持表級、指標級渣刷、維值級別的權限管理

六鹦肿、總結

企業(yè)的數據建設需要經歷幾個大的步驟:

第一步,業(yè)務數據化:顧名思義辅柴,一切業(yè)務都能通過數據反映箩溃,主要指的是將傳統(tǒng)線下流程線上化;

第二步碌嘀,數據智能化:光有數據還不行涣旨,還需要足夠的智能,如何通過智能化的數據支撐運營筏餐、營銷及各類業(yè)務开泽,這是數據中臺當前解決的主要問題;

第三步魁瞪,數據業(yè)務化:也就是我們常說的數據驅動業(yè)務穆律,數據不能只是數據,數據價值最大化在于可以驅動新的業(yè)務創(chuàng)新导俘,帶動企業(yè)增長峦耘。

目前大部企業(yè)目前都停留在第二個階段,因為這一步需要足夠夯實旅薄,才能為第三步打好基礎辅髓,這也是為什么各大企業(yè)要投入很大成本到大數據平臺、數據倉庫乃至數據中臺的建設中少梁。

馬蜂窩數據中臺的建設才剛剛起步洛口。我們認為,理想的數據中臺需要具備數據標準化凯沪、工具組件化第焰、組織清晰化這三個核心前提。為了向這一目標邁進妨马,我們將建立統(tǒng)一挺举、標準化的數據倉庫作為當下數據中臺的重點工作之一。

數據來源于業(yè)務烘跺,最終也將應用于業(yè)務湘纵。只有對數據足夠重視,與業(yè)務充分銜接滤淳,才能實現數據價值的最大化梧喷。在馬蜂窩,從管理層,到公司研發(fā)铺敌、產品绊困、運營、銷售等各角色适刀,對數據非常重視,數據產品的使用人數占公司員工比例高達 75%煤蹭。

大量用戶的使用笔喉,驅動著我們在數據中臺建設的路上不斷前進。如何將新興技術能力應用到數據倉庫的建設硝皂,如何以有限的成本高效解決企業(yè)在數據建設中面臨的問題常挚,將是馬蜂窩數倉建設一直的思考。

轉載鏈接:https://my.oschina.net/u/4084220/blog/3114236

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末稽物,一起剝皮案震驚了整個濱河市奄毡,隨后出現的幾起案子,更是在濱河造成了極大的恐慌贝或,老刑警劉巖吼过,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異咪奖,居然都是意外死亡盗忱,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門羊赵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趟佃,“玉大人,你說我怎么就攤上這事昧捷∠姓眩” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵靡挥,是天一觀的道長序矩。 經常有香客問我,道長芹血,這世上最難降的妖魔是什么贮泞? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮幔烛,結果婚禮上啃擦,老公的妹妹穿的比我還像新娘。我一直安慰自己饿悬,他們只是感情好令蛉,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般珠叔。 火紅的嫁衣襯著肌膚如雪蝎宇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天祷安,我揣著相機與錄音姥芥,去河邊找鬼。 笑死汇鞭,一個胖子當著我的面吹牛凉唐,可吹牛的內容都是我干的。 我是一名探鬼主播霍骄,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼台囱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了读整?” 一聲冷哼從身側響起簿训,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎米间,沒想到半個月后强品,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡车伞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年择懂,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片另玖。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡困曙,死狀恐怖,靈堂內的尸體忽然破棺而出谦去,到底是詐尸還是另有隱情慷丽,我是刑警寧澤霎奢,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布称杨,位于F島的核電站檬寂,受9級特大地震影響凶杖,放射性物質發(fā)生泄漏。R本人自食惡果不足惜鲜漩,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一浇坐、第九天 我趴在偏房一處隱蔽的房頂上張望冰肴。 院中可真熱鬧勺拣,春花似錦奶赠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苹丸。三九已至,卻和暖如春苇经,著一層夾襖步出監(jiān)牢的瞬間赘理,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工扇单, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留商模,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓蜘澜,卻偏偏與公主長得像阻桅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子兼都,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容