ELK掃盲

簡介

????ELK是Elasticsearch、Logstash鬼譬、Kibana的簡稱,這三者是核心套件逊脯,但并非全部优质。后文的四種基本架構中將逐一介紹應用到的其它套件。

????? Elasticsearch是實時全文搜索和分析引擎,提供搜集巩螃、分析演怎、存儲數(shù)據(jù)三大功能;是一套開放REST和JAVA API等結構提供高效搜索功能避乏,可擴展的分布式系統(tǒng)爷耀。它構建于Apache Lucene搜索引擎庫之上。

????? Logstash是一個用來搜集淑际、分析畏纲、過濾日志的工具。它支持幾乎任何類型的日志春缕,包括系統(tǒng)日志盗胀、錯誤日志和自定義應用程序日志。它可以從許多來源接收日志锄贼,這些來源包括 syslog票灰、消息傳遞(例如 RabbitMQ)和JMX,它能夠以多種方式輸出數(shù)據(jù)宅荤,包括電子郵件屑迂、websockets和Elasticsearch。

????? Kibana是一個基于Web的圖形界面冯键,用于搜索惹盼、分析和可視化存儲在 Elasticsearch指標中的日志數(shù)據(jù)。它利用Elasticsearch的REST接口來檢索數(shù)據(jù)惫确,不僅允許用戶創(chuàng)建他們自己的數(shù)據(jù)的定制儀表板視圖手报,還允許他們以特殊的方式查詢和過濾數(shù)據(jù)。

????? Filebeat隸屬于Beats改化。目前Beats包含四種工具:

????????? Packetbeat(搜集網(wǎng)絡流量數(shù)據(jù))掩蛤;

????????? Topbeat(搜集系統(tǒng)、進程和文件系統(tǒng)級別的 CPU 和內(nèi)存使用情況等數(shù)據(jù))陈肛;

????????? Filebeat(搜集文件數(shù)據(jù))揍鸟;

????????? Winlogbeat(搜集 Windows 事件日志數(shù)據(jù));

官方文檔

????Filebeat:

????????https://www.elastic.co/cn/products/beats/filebeat

????????https://www.elastic.co/guide/en/beats/filebeat/6.2/index.html

? ??Logstash:? ?

? ??????https://www.elastic.co/cn/products/logstash

? ??????https://www.elastic.co/guide/en/logstash/6.2/index.html

? ??Kibana:

? ??????https://www.elastic.co/cn/products/kibana

? ??????https://www.elastic.co/guide/en/kibana/6.2/index.html

????Elasticsearch:

? ??????https://www.elastic.co/cn/products/elasticsearch

? ??????https://www.elastic.co/guide/en/elasticsearch/reference/6.2/index.html

????Elasticsearch中文社區(qū):

????????https://elasticsearch.cn/


Why ELK?

? ??一般我們需要進行日志分析場景:直接在日志文件中 grep句旱、awk 就可以獲得自己想要的信息阳藻。但在規(guī)模較大的場景中,此方法效率低下谈撒,面臨問題包括日志量太大如何歸檔稚配、文本搜索太慢怎么辦、如何多維度查詢港华。需要集中化的日志管理道川,所有服務器上的日志收集匯總。常見解決思路是建立集中式日志收集系統(tǒng),將所有節(jié)點上的日志統(tǒng)一收集冒萄,管理臊岸,訪問。

? ??一般大型系統(tǒng)是一個分布式部署的架構尊流,不同的服務模塊部署在不同的服務器上帅戒,問題出現(xiàn)時,大部分情況需要根據(jù)問題暴露的關鍵信息崖技,定位到具體的服務器和服務模塊逻住,構建一套集中式日志系統(tǒng),可以提高定位問題的效率迎献。

? ??一個完整的集中式日志系統(tǒng)瞎访,需要包含以下幾個主要特點:

????????? 收集-能夠采集多種來源的日志數(shù)據(jù);

????????? 傳輸-能夠穩(wěn)定的把日志數(shù)據(jù)傳輸?shù)街醒胂到y(tǒng)吁恍;

????????? 存儲-如何存儲日志數(shù)據(jù)扒秸;

????????? 分析-可以支持 UI 分析;

????????? 警告-能夠提供錯誤報告冀瓦,監(jiān)控機制伴奥;

? ??ELK提供了一整套解決方案,并且都是開源軟件翼闽,之間互相配合使用拾徙,完美銜接,高效的滿足了很多場合的應用感局。


Filebeat工作原理

? ?? Filebeat由兩個主要組件組成:prospectors 和 harvesters锣吼。這兩個組件協(xié)同工作將文件變動發(fā)送到指定的輸出中。

? ??Harvester

? ??????Harvester負責讀取單個文件內(nèi)容蓝厌。每個文件會啟動一個Harvester,每個Harvester會逐行讀取各個文件古徒,并將文件內(nèi)容發(fā)送到制定輸出中拓提。Harvester負責打開和關閉文件,意味在Harvester運行的時候隧膘,文件描述符處于打開狀態(tài)代态,如果文件在收集中被重命名或者被刪除,F(xiàn)ilebeat會繼續(xù)讀取此文件疹吃。所以在Harvester關閉之前蹦疑,磁盤不會被釋放。默認情況filebeat會保持文件打開的狀態(tài)萨驶,直到達到close_inactive(如果此選項開啟歉摧,filebeat會在指定時間內(nèi)將不再更新的文件句柄關閉,時間從harvester讀取最后一行的時間開始計時。若文件句柄被關閉后叁温,文件發(fā)生變化再悼,則會啟動一個新的harvester。關閉文件句柄的時間不取決于文件的修改時間膝但,若此參數(shù)配置不當冲九,則可能發(fā)生日志不實時的情況,由scan_frequency參數(shù)決定跟束,默認10s莺奸。Harvester使用內(nèi)部時間戳來記錄文件最后被收集的時間。例如:設置5m冀宴,則在Harvester讀取文件的最后一行之后灭贷,開始倒計時5分鐘,若5分鐘內(nèi)文件無變化花鹅,則關閉文件句柄氧腰。默認5m)。

? ??Prospector

? ?????? 負責管理Harvester并找到所有讀取源刨肃。

????Prospector會找到/apps/logs/*目錄下的所有info.log文件古拴,并為每個文件啟動一個Harvester。Prospector會檢查每個文件真友,看Harvester是否已經(jīng)啟動黄痪,是否需要啟動,或者文件是否可以忽略盔然。若Harvester關閉桅打,只有在文件大小發(fā)生變化的時候Prospector才會執(zhí)行檢查。只能檢測本地的文件愈案。

? ??Filebeat會將文件狀態(tài)記錄在文件中(默認在/var/lib/filebeat/registry)挺尾。此狀態(tài)可以記住Harvester收集文件的偏移量。若連接不上輸出設備站绪,如ES等遭铺,filebeat會記錄發(fā)送前的最后一行,并再可以連接的時候繼續(xù)發(fā)送恢准。Filebeat在運行的時候魂挂,Prospector狀態(tài)會被記錄在內(nèi)存中。Filebeat重啟的時候馁筐,利用registry記錄的狀態(tài)來進行重建涂召,用來還原到重啟之前的狀態(tài)。每個Prospector會為每個找到的文件記錄一個狀態(tài)敏沉,對于每個文件果正,F(xiàn)ilebeat存儲唯一標識符以檢測文件是否先前被收集炎码。

????Filebeat之所以能保證事件至少被傳遞到配置的輸出一次,沒有數(shù)據(jù)丟失舱卡,是因為filebeat將每個事件的傳遞狀態(tài)保存在文件中辅肾。在未得到輸出方確認時,filebeat會嘗試一直發(fā)送轮锥,直到得到回應矫钓。若filebeat在傳輸過程中被關閉,則不會再關閉之前確認所有時事件舍杜。任何在filebeat關閉之前為確認的時間新娜,都會在filebeat重啟之后重新發(fā)送。這可確保至少發(fā)送一次既绩,但有可能會重復概龄。可通過設置shutdown_timeout 參數(shù)來設置關閉之前的等待事件回應的時間(默認禁用)饲握。


Logstash工作原理

? ??Logstash事件處理有三個階段:inputs → filters → outputs私杜。是一個接收,處理救欧,轉(zhuǎn)發(fā)日志的工具衰粹。支持系統(tǒng)日志,webserver日志笆怠,錯誤日志铝耻,應用日志,總之包括所有可以拋出來的日志類型蹬刷。

Input

????輸入數(shù)據(jù)到logstash瓢捉,一些常用的輸入為:

????????? file:從文件系統(tǒng)的文件中讀取,類似于tial -f命令办成;

????????? syslog:在514端口上監(jiān)聽系統(tǒng)日志消息泡态,并根據(jù)RFC3164標準進行解析;

????????? redis:從redis service中讀扔芈某弦;

????????? beats:從filebeat中讀取冷守;

Filters

????數(shù)據(jù)中間處理,對數(shù)據(jù)進行操作惊科,一些常用的過濾器為:

????????? grok:解析任意文本數(shù)據(jù)拍摇,Grok 是 Logstash 最重要的插件。它的主要作用就是將文本格式的字符串馆截,轉(zhuǎn)換成為具體的結構化的數(shù)據(jù)充活,配合正則表達式使用蜂莉。內(nèi)置120多個解析語法。

????????官方提供的grok表達式:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

????????grok在線調(diào)試:https://grokdebug.herokuapp.com/

????????? mutate:對字段進行轉(zhuǎn)換混卵。例如對字段進行刪除映穗、替換、修改幕随、重命名等蚁滋。

????????? drop:丟棄一部分events不進行處理。

????????? clone:拷貝 event赘淮,這個過程中也可以添加或移除字段辕录。

????????? geoip:添加地理信息(為前臺kibana圖形化展示使用)

Outputs

????outputs是logstash處理管道的最末端組件。一個event可以在處理過程中經(jīng)過多重輸出梢卸,但是一旦所有的outputs都執(zhí)行結束走诞,這個event也就完成生命周期。一些常見的outputs為:

????????? elasticsearch:可以高效的保存數(shù)據(jù)蛤高,并且能夠方便和簡單的進行查詢蚣旱。

????????? file:將event數(shù)據(jù)保存到文件中。

????????? graphite:將event數(shù)據(jù)發(fā)送到圖形化組件中戴陡,一個很流行的開源存儲圖形化展示的組件塞绿。

Codecs

????codecs 是基于數(shù)據(jù)流的過濾器,它可以作為input猜欺,output的一部分配置位隶。Codecs可以幫助你輕松的分割發(fā)送過來已經(jīng)被序列化的數(shù)據(jù)。一些常見的codecs:

????????? json:使用json格式對數(shù)據(jù)進行編碼/解碼开皿。

????????? multiline:將匯多個事件中數(shù)據(jù)匯總為一個單一的行涧黄。比如:java異常信息和堆棧信息。


Elasticsearch

????Elasticsearch 是一個分布式的搜索和分析引擎赋荆,可以用于全文檢索笋妥、結構化檢索和分析,并能將這三者結合起來窄潭。Elasticsearch 基于 Lucene 開發(fā)春宣,現(xiàn)在是使用最廣的開源搜索引擎之一。

? ??基本概念

????????? node:即一個 Elasticsearch 的運行實例嫉你,使用多播或單播方式發(fā)現(xiàn) cluster 并加入月帝。

????????? cluster:包含一個或多個擁有相同集群名稱的 node,其中包含一個master node幽污。

????????? index:類比關系型數(shù)據(jù)庫里的DB嚷辅,是一個邏輯命名空間。

????????? alias:可以給 index 添加零個或多個alias距误,通過 alias 使用index 和根據(jù)index name 訪問index一樣簸搞,但是扁位,alias給我們提供了一種切換index的能力,比如重建了index趁俊,取名customer_online_v2域仇,這時,有了alias寺擂,我要訪問新 index暇务,只需要把 alias 添加到新index 即可,并把alias從舊的 index 刪除沽讹。不用修改代碼般卑。

????????? type:類比關系數(shù)據(jù)庫里的Table。其中爽雄,一個index可以定義多個type蝠检,但一般使用習慣僅配一個type。

????????? mapping:類比關系型數(shù)據(jù)庫中的 schema 概念挚瘟,mapping 定義了 index 中的 type叹谁。mapping 可以顯示的定義,也可以在 document 被索引時自動生成乘盖,如果有新的 field焰檩,Elasticsearch 會自動推測出 field 的type并加到mapping中。

????????? document:類比關系數(shù)據(jù)庫里的一行記錄(record)订框,document 是 Elasticsearch 里的一個 JSON 對象析苫,包括零個或多個field。

????????? field:類比關系數(shù)據(jù)庫里的field穿扳,每個field 都有自己的字段類型衩侥。

????????? shard:是一個Lucene 實例。Elasticsearch 基于 Lucene矛物,shard 是一個 Lucene 實例茫死,被 Elasticsearch 自動管理。之前提到履羞,index 是一個邏輯命名空間峦萎,shard 是具體的物理概念,建索引忆首、查詢等都是具體的shard在工作爱榔。shard 包括primary shard 和 replica shard,寫數(shù)據(jù)時糙及,先寫到primary shard详幽,然后,同步到replica shard丁鹉,查詢時妒潭,primary 和 replica 充當相同的作用。replica shard 可以有多份揣钦,也可以沒有雳灾,replica shard的存在有兩個作用,一是容災冯凹,如果primary shard 掛了谎亩,數(shù)據(jù)也不會丟失,集群仍然能正常工作宇姚;二是提高性能匈庭,因為replica 和 primary shard 都能處理查詢。另外浑劳,如上圖右側紅框所示阱持,shard數(shù)和replica數(shù)都可以設置,但是魔熏,shard 數(shù)只能在建立index 時設置衷咽,后期不能更改,但是蒜绽,replica 數(shù)可以隨時更改镶骗。

????ES VS RDB


Kibana

? ??Kibana是一個開源的分析與可視化平臺,設計出來用于和Elasticsearch一起使用的躲雅《︽ⅲ可以用kibana搜索、查看相赁、交互存放在Elasticsearch索引里的數(shù)據(jù)相寇,使用各種不同的圖表、表格噪生、地圖等kibana能夠很輕易地展示高級數(shù)據(jù)分析與可視化裆赵。


ELK 架構

? ??第一種ELK架構,是最簡單的一種ELK架構方式跺嗽。優(yōu)點是搭建簡單战授,易于上手。缺點是Logstash耗資源較大桨嫁,運行占用CPU和內(nèi)存高植兰。另外沒有消息隊列緩存,存在數(shù)據(jù)丟失隱患璃吧。建議供學習者和小規(guī)模集群使用楣导。此架構首先由Logstash分布于各個節(jié)點上搜集相關日志、數(shù)據(jù)畜挨,并經(jīng)過分析筒繁、過濾后發(fā)送給遠端服務器上的Elasticsearch進行存儲噩凹。Elasticsearch將數(shù)據(jù)以分片的形式壓縮存儲并提供多種API供用戶查詢,操作毡咏。用戶亦可以更直觀的通過配置Kibana Web Portal方便的對日志查詢驮宴,并根據(jù)數(shù)據(jù)生成報表。

? ??第二種架構呕缭,引入了消息隊列機制堵泽,位于各個節(jié)點上的Logstash Agent先將數(shù)據(jù)/日志傳遞給Kafka(或者Redis),并將隊列中消息或數(shù)據(jù)間接傳遞給Logstash恢总,Logstash過濾迎罗、分析后將數(shù)據(jù)傳遞給Elasticsearch存儲。最后由Kibana將日志和數(shù)據(jù)呈現(xiàn)給用戶片仿。因為引入了Kafka(或者Redis),所以即使遠端Logstash server因故障停止運行纹安,數(shù)據(jù)將會先被存儲下來,從而避免數(shù)據(jù)丟失砂豌。這種架構適合于較大集群的解決方案钻蔑,但由于Logstash中心節(jié)點和Elasticsearch的負荷會比較重,可將他們配置為集群模式奸鸯,以分擔負荷咪笑,這種架構的優(yōu)點在于引入了消息隊列機制,均衡了網(wǎng)絡傳輸娄涩,從而降低了網(wǎng)絡閉塞尤其是丟失數(shù)據(jù)的可能性窗怒,但依然存在Logstash占用系統(tǒng)資源過多的問題。

????第三種架構蓄拣,引入了Logstash-forwarder扬虚。首先,Logstash-forwarder將日志數(shù)據(jù)搜集并統(tǒng)一發(fā)送給主節(jié)點上的Logstash球恤,Logstash分析辜昵、過濾日志數(shù)據(jù)后發(fā)送至Elasticsearch存儲,并由Kibana最終將數(shù)據(jù)呈現(xiàn)給用戶咽斧。這種架構解決了Logstash在各計算機點上占用系統(tǒng)資源較高的問題堪置。經(jīng)測試得出,相比Logstash张惹,Logstash-forwarder所占用系統(tǒng)CPU和MEM幾乎可以忽略不計舀锨。另外,Logstash-forwarder和Logstash間的通信是通過SSL加密傳輸宛逗,起到了安全保障坎匿。如果是較大集群,用戶亦可以如結構三那樣配置logstash集群和Elasticsearch集群,引入High Available機制替蔬,提高數(shù)據(jù)傳輸和存儲安全告私。更主要的配置多個Elasticsearch服務,有助于搜索和數(shù)據(jù)存儲效率承桥。但在此種架構下發(fā)現(xiàn)Logstash-forwarder和Logstash間通信必須由SSL加密傳輸德挣,這樣便有了一定的限制性。

????第四種架構快毛,將Logstash-forwarder替換為Beats。經(jīng)測試番挺,Beats滿負荷狀態(tài)所耗系統(tǒng)資源和Logstash-forwarder相當唠帝,但其擴展性和靈活性有很大提高。Beats platform目前包含有Packagebeat玄柏、Topbeat和Filebeat三個產(chǎn)品襟衰,均為Apache 2.0 License。同時用戶可根據(jù)需要進行二次開發(fā)粪摘。這種架構原理基于第三種架構瀑晒,但是更靈活,擴展性更強徘意。同時可配置Logstash 和Elasticsearch 集群用于支持大集群系統(tǒng)的運維日志數(shù)據(jù)監(jiān)控和查詢苔悦。

? ??小結:不管采用上面哪種ELK架構,都包含了其核心組件椎咧,即:Logstash玖详、Elasticsearch 和Kibana。當然這三個組件并非不能被替換勤讽,只是就性能和功能性而言蟋座,這三個組件已經(jīng)配合的很完美,是密不可分的脚牍。究竟該采用哪種架構向臀,可根據(jù)現(xiàn)實情況和架構優(yōu)劣而定。


應用

????在海量日志系統(tǒng)的運維中诸狭,以下幾個方面是必不可少的:

????????? 分布式日志數(shù)據(jù)集中式查詢和管理券膀;

????????? 系統(tǒng)監(jiān)控,包含系統(tǒng)硬件和應用各個組件的監(jiān)控驯遇;

????????? 故障排查三娩;

????????? 安全信息和事件管理;

????????? 報表功能妹懒;

????ELK組件各個功能模塊如下圖所示雀监,它運行于分布式系統(tǒng)之上,通過搜集、過濾会前、傳輸好乐、儲存,對海量系統(tǒng)和組件日志進行集中管理和準實時搜索瓦宜、分析蔚万,使用搜索、監(jiān)控临庇、事件消息和報表等簡單易用的功能反璃,幫助運維人員進行線上業(yè)務的準實時監(jiān)控、業(yè)務異常時及時定位原因假夺、排除故障淮蜈、程序研發(fā)時跟蹤分析Bug、業(yè)務趨勢分析已卷、安全與合規(guī)審計梧田,深度挖掘日志的大數(shù)據(jù)價值。同時Elasticsearch提供多種API(REST JAVA PYTHON等API)供用戶擴展開發(fā)侧蘸,以滿足其不同需求裁眯。

????匯總ELK組件在大數(shù)據(jù)運維系統(tǒng)中,主要可解決的問題如下:

????????? 日志查詢讳癌,問題排查穿稳,上線檢查;

????????? 服務器監(jiān)控晌坤,應用監(jiān)控司草,錯誤報警,Bug管理泡仗;

????????? 性能分析埋虹,用戶行為分析,安全漏洞分析娩怎,時間管理搔课;

? ??小結:ELK組件在大數(shù)據(jù)運維中的應用是一套必不可少的且方便、易用的開源解決方案截亦。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爬泥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崩瓤,更是在濱河造成了極大的恐慌袍啡,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件却桶,死亡現(xiàn)場離奇詭異境输,居然都是意外死亡蔗牡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門嗅剖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辩越,“玉大人,你說我怎么就攤上這事信粮∏埽” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵强缘,是天一觀的道長督惰。 經(jīng)常有香客問我,道長旅掂,這世上最難降的妖魔是什么赏胚? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮辞友,結果婚禮上,老公的妹妹穿的比我還像新娘震肮。我一直安慰自己称龙,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布戳晌。 她就那樣靜靜地躺著鲫尊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沦偎。 梳的紋絲不亂的頭發(fā)上疫向,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音豪嚎,去河邊找鬼搔驼。 笑死,一個胖子當著我的面吹牛侈询,可吹牛的內(nèi)容都是我干的舌涨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哥捕?” 一聲冷哼從身側響起洋满,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扶歪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡琢蛤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虐块。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡俩滥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贺奠,到底是詐尸還是另有隱情霜旧,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布儡率,位于F島的核電站挂据,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏儿普。R本人自食惡果不足惜崎逃,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望眉孩。 院中可真熱鬧个绍,春花似錦、人聲如沸浪汪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽死遭。三九已至广恢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呀潭,已是汗流浹背钉迷。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钠署,地道東北人糠聪。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像谐鼎,于是被迫代替她去往敵國和親枷颊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容