elasticsearch優(yōu)化全文搜索經(jīng)驗(yàn)

1示罗、索引層面優(yōu)化配置

默認(rèn)情況下惩猫,6.x及之前的版本中Elasticsearch索引有5個(gè)主分片和1個(gè)副本,7.X及之后版本1主1副蚜点。 這種配置并不適用于所有業(yè)務(wù)場(chǎng)景轧房。 需要正確設(shè)置分片配置,以便維持索引的穩(wěn)定性和有效性绍绘。

1.1奶镶、分片大小

分片大小對(duì)于搜索查詢非常重要。

· 一方面陪拘, 如果分配給索引的分片太多厂镇,則Lucene分段會(huì)很小,從而導(dǎo)致開銷增加藻丢。當(dāng)同時(shí)進(jìn)行多個(gè)查詢時(shí)剪撬,許多小分片也會(huì)降低查詢吞吐量。

· 另一方面悠反,太大的分片會(huì)導(dǎo)致搜索性能下降和故障恢復(fù)時(shí)間更長(zhǎng)残黑。

Elasticsearch官方建議一個(gè)分片的大小應(yīng)該在20到40 GB左右。

例如斋否,如果您計(jì)算出索引將存儲(chǔ)300 GB的數(shù)據(jù)梨水,則可以為該索引分配9到15個(gè)主分片。

根據(jù)集群大小茵臭,假設(shè)群集中有10個(gè)節(jié)點(diǎn)疫诽,您可以選擇為此索引分配10個(gè)主分片,以便在集群節(jié)點(diǎn)之間均勻分配分片旦委。

深入原理推薦:

  1. Elasticsearch之如何合理分配索引分片奇徒?

https://www.elastic.co/cn/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster

  1. Elasticsearch究竟要設(shè)置多少分片數(shù)?

https://qbox.io/blog/optimizing-elasticsearch-how-many-shards-per-index

1.2缨硝、數(shù)據(jù)動(dòng)態(tài)持續(xù)寫入場(chǎng)景

如果存在連續(xù)寫入到Elasticsearch集群的數(shù)據(jù)流摩钙,如:實(shí)時(shí)爬蟲互聯(lián)網(wǎng)數(shù)據(jù)寫入ES集群。則應(yīng)使用基于時(shí)間的索引以便更輕松地維護(hù)索引查辩。

如果寫入數(shù)據(jù)流的吞吐量隨時(shí)間而變化胖笛,則需要適當(dāng)?shù)馗淖兿乱粋€(gè)索引的配置才能實(shí)現(xiàn)數(shù)據(jù)的動(dòng)態(tài)擴(kuò)展网持。

那么,如何查詢分散到不同的基于時(shí)間索引的所有文檔长踊?答案是別名功舀。可以將多個(gè)索引放入別名中身弊,并且對(duì)該別名進(jìn)行搜索會(huì)使查詢就像在單個(gè)索引上一樣辟汰。

當(dāng)然,需要保持好平衡阱佛。注意思考:將多少數(shù)據(jù)寫入別名莉擒?別名上寫入太多小索引會(huì)對(duì)性能產(chǎn)生負(fù)面影響。

例如瘫絮,是以周還是以月為單位為單位建立索引是需要結(jié)合業(yè)務(wù)場(chǎng)景平衡考慮的問題?

如果以月為單位建議索引性能最優(yōu)填硕,那么相同數(shù)據(jù)以周為單位建立索引勢(shì)必會(huì)因?yàn)樗饕鄬?dǎo)致負(fù)面的性能問題麦萤。

深入原理推薦:Elasticsearch索引管理利器——Curator深入詳解

1.3、Index Sorting

注意:索引排序機(jī)制是6.X版本才有的特性扁眯。

在Elasticsearch中創(chuàng)建新索引時(shí)壮莹,可以配置每個(gè)分片中的分段的排序方式。 默認(rèn)情況下姻檀,Lucene不會(huì)應(yīng)用任何排序命满。 index.sort.* 定義應(yīng)使用哪些字段對(duì)每個(gè)Segment內(nèi)的文檔進(jìn)行排序。

使用舉例:

1PUT /twitter 2{ 3 "settings" : { 4 "index" : { 5 "sort.field" : "date", 6 "sort.order" : "desc" 7 } 8 }, 9 "mappings": { 10 "properties": { 11 "date": { 12 "type": "date" 13 } 14 } 15 } 16}

目的:index sorting是優(yōu)化Elasticsearch檢索性能的非常重要的方式之一绣版。

大白話:index sorting機(jī)制通過寫入的時(shí)候指定了某一個(gè)或者多個(gè)字段的排序方式胶台,會(huì)極大提升檢索的性能。

更深原理:推薦閱讀:

https://www.elastic.co/cn/blog/index-sorting-elasticsearch-6-0

2杂抽、分片層面優(yōu)化配置

分片是底層基本的讀寫單元诈唬,分片的目的是分割巨大索引,讓讀寫并行執(zhí)行缩麸。寫入過程先寫入主分片铸磅,主分片寫入成功后再寫入副本分片。

副本分片的出現(xiàn)杭朱,提升了集群的高可用性和讀取吞吐率阅仔。

在優(yōu)化分片時(shí),分片的大小弧械、節(jié)點(diǎn)中有多少分片是主要考慮因素八酒。副本分片對(duì)于擴(kuò)展搜索吞吐量很重要,如果硬件條件允許梦谜,則可以小心增加副本分片的數(shù)量丘跌。

容量規(guī)劃的一個(gè)很好的啟動(dòng)點(diǎn)是分配分片减噪,“《深入理解Elasticsearch》強(qiáng)調(diào):最理想的分片數(shù)量應(yīng)該依賴于節(jié)點(diǎn)的數(shù)量搂鲫。”其數(shù)量是節(jié)點(diǎn)數(shù)量的1.5到3倍。

分配副本分片數(shù)的公式:max(max_failures绰姻,ceil(num_nodes /) num_primaries) - 1)。

原理:如果您的群集具有num_nodes節(jié)點(diǎn)召噩,總共有num_primaries主分片立帖,如果您希望最多能夠同時(shí)處理max_failures節(jié)點(diǎn)故障,那么適合您的副本數(shù)量為如上公式值碍现。

公式來源:

https://www.elastic.co/guide/en/elasticsearch/reference/master/tune-for-search-speed.html

總的來說:節(jié)點(diǎn)數(shù)和分片數(shù)幅疼、副本數(shù)的簡(jiǎn)單計(jì)算公式如下: 所需做大節(jié)點(diǎn)數(shù)=分片數(shù)*(副本數(shù)+1)。

3昼接、Elasticsearch整體層面配置

配置Elasticsearch集群時(shí)爽篷,最主要的考慮因素之一是確保至少有一半的可用內(nèi)存進(jìn)入文件系統(tǒng)緩存,以便Elasticsearch可以將索引的hot regions保留在物理內(nèi)存中慢睡。

在設(shè)計(jì)集群時(shí)還應(yīng)考慮物理可用堆空間逐工。 Elasticsearch建議基于可用堆空間的分片分配最多應(yīng)為20個(gè)分片/ GB,這是一個(gè)很好的經(jīng)驗(yàn)法則漂辐。

例如泪喊,具有30 GB堆的節(jié)點(diǎn)最多應(yīng)有600個(gè)分片,以保持集群的良好狀態(tài)髓涯。

一個(gè)節(jié)點(diǎn)上的存儲(chǔ)可以表述如下:節(jié)點(diǎn)可以支持的磁盤空間= 20 (堆大小單位:GB)(以GB為單位的分片大刑惶洹),由于在高效集群中通常會(huì)看到大小在20到40 GB之間的分片纬纪,因此最大存儲(chǔ)空間可以支持16 GB可用堆空間的節(jié)點(diǎn)蚓再,最多可達(dá)12 TB的磁盤空間(201640=12.8TB)。

邊界意識(shí)有助于為更好的設(shè)計(jì)和未來的擴(kuò)展操作做好準(zhǔn)備育八。

可以在運(yùn)行時(shí)以及初始階段進(jìn)行許多配置設(shè)置对途。

在構(gòu)建Elasticsearch索引和集群本身以獲得更好的搜索性能時(shí),了解在運(yùn)行時(shí)哪些配置可以修改以及哪些配不可以修改是至關(guān)重要的髓棋。

3.1 動(dòng)態(tài)設(shè)置

1实檀、設(shè)置歷史數(shù)據(jù)索引為只讀狀態(tài)。

基于時(shí)間的動(dòng)態(tài)索引的執(zhí)行階段按声,如果存放歷史數(shù)據(jù)的索引沒有寫操作膳犹,可以將月度索引設(shè)置為只讀模式,以提高對(duì)這些索引的搜索性能签则。 6.X之后的只讀索引實(shí)戰(zhàn)設(shè)置方式:

1PUT /twitter/_settings 2{ 3 "index.blocks.read_only_allow_delete": null 4}

2须床、對(duì)只讀狀態(tài)索引,進(jìn)行段合并渐裂。

當(dāng)索引設(shè)置為只讀時(shí)豺旬,可以通過強(qiáng)制段合并操作以減少段的數(shù)量钠惩。

優(yōu)化段合并將導(dǎo)致更好的搜索性能,因?yàn)槊總€(gè)分片的開銷取決于段的計(jì)數(shù)和大小族阅。

· 注意1:不要將段合并用于讀寫索引篓跛,因?yàn)樗鼘?dǎo)致產(chǎn)生非常大的段(每段> 5Gb)。

· 注意2:此操作應(yīng)在非高峰時(shí)間進(jìn)行坦刀,因?yàn)檫@是一項(xiàng)非常耗資源的操作愧沟。

段合并操作實(shí)戰(zhàn)方式:

1curl -X POST "localhost:9200/kimchy/_forcemerge?only_expunge_deletes=false&max_num_segments=100&flush=true"

3、使用preference優(yōu)化緩存利用率

有多個(gè)緩存可以幫助提高搜索性能鲤遥,例如文件系統(tǒng)緩存沐寺,請(qǐng)求緩存或查詢緩存。

然而盖奈,所有這些緩存都維護(hù)在節(jié)點(diǎn)級(jí)別混坞,這意味著如果您在擁有1個(gè)或更多副本且基于默認(rèn)路由算法集群上連續(xù)兩次運(yùn)行相同的請(qǐng)求,這兩個(gè)請(qǐng)求將轉(zhuǎn)到不同的分片副本上 钢坦,阻止節(jié)點(diǎn)級(jí)緩存幫助拔第。

由于搜索應(yīng)用程序的用戶一個(gè)接一個(gè)地運(yùn)行類似的請(qǐng)求是常見的,例如為了檢索分析索引的部分較窄子集场钉,使用preference標(biāo)識(shí)當(dāng)前用戶或會(huì)話的偏好值可以幫助優(yōu)化高速緩存的使用。

preference實(shí)戰(zhàn)舉例:

1GET /_search?preference=xyzabc123 2{ 3 "query": { 4 "match": { 5 "title": "elasticsearch" 6 } 7 }

4懈涛、禁止交換

可以在每個(gè)節(jié)點(diǎn)上禁用交換以確保穩(wěn)定性逛万,并且應(yīng)該不惜一切代價(jià)避免交換。它可能導(dǎo)致垃圾收集持續(xù)數(shù)分鐘而不是毫秒批钠,并且可能導(dǎo)致節(jié)點(diǎn)響應(yīng)緩慢甚至斷開與集群的連接宇植。

在Elasticsearch分布式系統(tǒng)中,讓操作系統(tǒng)終止節(jié)點(diǎn)更有效埋心≈赣簦可以通過將bootstrap.memory_lock設(shè)置為True來禁用它。

Linux系統(tǒng)級(jí)配置:

1sudo swapoff -a

Elasticsearch配置文件elasticsearch.yml配置:

1bootstrap.memory_lock: true

5拷呆、增加刷新間隔 refresh_interval

默認(rèn)刷新間隔為1秒闲坎。這迫使Elasticsearch每秒創(chuàng)建一個(gè)分段。實(shí)際業(yè)務(wù)中茬斧,應(yīng)該根據(jù)使用情況增加刷新間隔腰懂,舉例:增加到30秒。

這樣之后项秉,30s產(chǎn)生一個(gè)大的段绣溜,較每秒刷新大大減少未來的段合并壓力。最終會(huì)提升寫入性能并使搜索查詢更加穩(wěn)定娄蔼。

更新刷新間隔實(shí)戰(zhàn):

1PUT /twitter/_settings 2{ 3 "index" : { 4 "refresh_interval" : "1s" 5 } 6}

6怖喻、設(shè)置max_thread_count

index.merge.scheduler.max_thread_count默認(rèn)設(shè)置為

Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2))

但這適用于SSD配置底哗。對(duì)于HDD,應(yīng)將其設(shè)置為1锚沸。

實(shí)戰(zhàn):

1curl -XPUT 'localhost:9200/_settings' -d '{ 2"index.merge.scheduler.max_thread_count" : 1 3} 4

7跋选、禁止動(dòng)態(tài)分配分片

有時(shí),Elasticsearch將重新平衡集群中的分片咒吐。此操作可能會(huì)降低檢索的性能野建。

在生產(chǎn)模式下,需要時(shí)恬叹,可以通過cluster.routing.rebalance.enable設(shè)置將重新平衡設(shè)置為none候生。

1PUT /_cluster/settings 2{ 3 "transient" : { 4 "cluster.routing.allocation.enable" : "none" 5 } 6}

其中典型的應(yīng)用場(chǎng)景之包括:

  1. 集群中臨時(shí)重啟、剔除一個(gè)節(jié)點(diǎn)绽昼;

  2. 集群逐個(gè)升級(jí)節(jié)點(diǎn)唯鸭;當(dāng)您關(guān)閉節(jié)點(diǎn)時(shí),分配過程將立即嘗試將該節(jié)點(diǎn)上的分片復(fù)制到集群中的其他節(jié)點(diǎn)硅确,從而導(dǎo)致大量浪費(fèi)的IO. 在關(guān)閉節(jié)點(diǎn)之前禁用分配可以避免這種情況目溉。

更多實(shí)踐,推薦閱讀:

https://www.elastic.co/guide/en/elasticsearch/reference/5.5/restart-upgrade.html

8菱农、充分利用近似日期緩存效果

現(xiàn)在使用的日期字段上的查詢通常不可緩存缭付,因?yàn)槠ヅ涞姆秶恢痹谧兓?/p>

然而,就用戶體驗(yàn)而言循未,切換到近似日期通常是可接受的陷猫,并且能更好地使用查詢高速緩存帶來的益處。

實(shí)戰(zhàn)如下:

1GET index/_search 2{ 3 "query": { 4 "constant_score": { 5 "filter": { 6 "range": { 7 "my_date": { 8 "gte": "now-1h/m", 9 "lte": "now/m" 10 } 11 } 12 } 13 } 14 } 15}

這里可能不大好理解的妖,推薦深入閱讀:

https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-search-speed.html

3.2 初始設(shè)置

1绣檬、合并多字段提升檢索性能

query_string或multi_match查詢所針對(duì)的字段越多,檢索越慢嫂粟。

提高多個(gè)字段的搜索速度的常用技術(shù)是在索引時(shí)將其值復(fù)制到單個(gè)字段中娇未。

對(duì)于經(jīng)常查詢的某些字段,請(qǐng)使用Elasticsearch的copy-to功能星虹。

例如零抬,汽車的品牌名稱,發(fā)動(dòng)機(jī)版本宽涌,型號(hào)名稱和顏色字段可以與復(fù)制到指令合并媚值。它將改善在這些字段上進(jìn)行的搜索查詢性能。

1PUT movies 2{ 3 "mappings": { 4 "properties": { 5 "cars_infos": { 6 "type": "text" 7 }, 8 "brand_name": { 9 "type": "text", 10 "copy_to": "cars_infos" 11 }, 12 "engine_version": { 13 "type": "text", 14 "copy_to": "cars_infos" 15 }, 16 "model ": { 17 "type": "text", 18 "copy_to": "cars_infos" 19 }, 20 "color": { 21 "type": "text", 22 "copy_to": "cars_infos" 23 } 24 } 25 } 26}

2护糖、設(shè)置分片分配到指定節(jié)點(diǎn)

實(shí)戰(zhàn)業(yè)務(wù)中經(jīng)常遇到的業(yè)務(wù)場(chǎng)景問題:如何將分片設(shè)置非均衡分配褥芒,有新節(jié)點(diǎn)配置極高,能否多分片點(diǎn)過去?

某個(gè) shard 分配在哪個(gè)節(jié)點(diǎn)上锰扶,一般來說献酗,是由 ES 自動(dòng)決定的。以下幾種情況會(huì)觸發(fā)分配動(dòng)作:

· 1)新索引生成

· 2)索引的刪除

· 3)新增副本分片

· 4)節(jié)點(diǎn)增減引發(fā)的數(shù)據(jù)均衡

ES 提供了一系列參數(shù)詳細(xì)控制這部分邏輯坷牛,其中之一是:在異構(gòu)集群的情為具有更好硬件的節(jié)點(diǎn)的分片分配分配權(quán)重罕偎。

為了分配權(quán)重,

需要設(shè)置cluster.routing.allocation.balance.shard值京闰,默認(rèn)值為0.45f颜及。

數(shù)值越大越傾向于在節(jié)點(diǎn)層面均衡分片

實(shí)戰(zhàn):

1PUT _cluster/settings 2{ 3“transient” : { 4“cluster.routing.allocation.balance.shard” : 0.60 5} 6}

3蹂楣、調(diào)整熔斷內(nèi)存比例大小

查詢本身也會(huì)對(duì)響應(yīng)的延遲產(chǎn)生重大影響俏站。為了在查詢時(shí)不觸發(fā)熔斷并導(dǎo)致Elasticsearch集群處于不穩(wěn)定狀態(tài),

可以根據(jù)查詢的復(fù)雜性將indices.breaker.total.limit設(shè)置為適合您的JVM堆大小痊土。此設(shè)置的默認(rèn)值是JVM堆的70%肄扎。

1PUT /_cluster/settings 2{ 3 "persistent" : { 4 "indices.breaker.fielddata.limit" : "60%" 5 } 6}

最好為斷路器設(shè)置一個(gè)相對(duì)保守點(diǎn)的值。更深原理推薦閱讀:

https://www.elastic.co/guide/cn/elasticsearch/guide/current/_limiting_memory_usage.html赁酝。

《Elastic源碼分析》作者張超指出:“Elasticsearch 7.0 增加了 indices.breaker.total.use_real_memory 配置項(xiàng)犯祠,可以更加精準(zhǔn)的分析當(dāng)前的內(nèi)存情況,及時(shí)防止 OOM 出現(xiàn)酌呆。雖然該配置會(huì)增加一點(diǎn)性能損耗衡载,但是可以提高 JVM 的內(nèi)存使用率,增強(qiáng)了節(jié)點(diǎn)的保護(hù)機(jī)制隙袁≡屡”

4、特定搜索場(chǎng)景藤乙,增加搜索線程池配置

默認(rèn)情況下,Elasticsearch將主要用例是搜索惭墓。在需要增加檢索并發(fā)性的情況下坛梁,可以增加用于搜索設(shè)置的線程池,與此同時(shí)腊凶,可以根據(jù)節(jié)點(diǎn)上的CPU中的核心數(shù)量多少斟酌減少用于索引的線程池划咐。

舉例:更改配置文件elasticsearch.yml增加如下內(nèi)容:

1thread_pool.search.queue_size: 500 2#queue_size允許控制沒有線程執(zhí)行它們的掛起請(qǐng)求隊(duì)列的初始大小。

官方:

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-threadpool.html

5钧萍、打開自適應(yīng)副本選擇

應(yīng)打開自適應(yīng)副本選擇褐缠。該請(qǐng)求將被重定向到響應(yīng)最快的節(jié)點(diǎn)。

當(dāng)存在多個(gè)數(shù)據(jù)副本時(shí)风瘦,elasticsearch可以使用一組稱為自適應(yīng)副本選擇的標(biāo)準(zhǔn)队魏,根據(jù)包含每個(gè)分片副本的節(jié)點(diǎn)的響應(yīng)時(shí)間,服務(wù)時(shí)間和隊(duì)列大小來選擇數(shù)據(jù)的最佳副本。

這樣可以提高查詢吞吐量并減少搜索量大的應(yīng)用程序的延遲胡桨。

這個(gè)配置默認(rèn)是關(guān)閉的官帘,實(shí)戰(zhàn)打開方法:

1PUT /_cluster/settings 2{ 3 "transient": { 4 "cluster.routing.use_adaptive_replica_selection": true 5 } 6}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市昧谊,隨后出現(xiàn)的幾起案子刽虹,更是在濱河造成了極大的恐慌,老刑警劉巖呢诬,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涌哲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡尚镰,警方通過查閱死者的電腦和手機(jī)阀圾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钓猬,“玉大人稍刀,你說我怎么就攤上這事〕ú埽” “怎么了账月?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)澳迫。 經(jīng)常有香客問我局齿,道長(zhǎng),這世上最難降的妖魔是什么橄登? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮拢锹,結(jié)果婚禮上谣妻,老公的妹妹穿的比我還像新娘。我一直安慰自己卒稳,他們只是感情好充坑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巡莹,像睡著了一般榕莺。 火紅的嫁衣襯著肌膚如雪吧史。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天岩睁,我揣著相機(jī)與錄音捕儒,去河邊找鬼。 笑死阎毅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播熬芜,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼略板!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赂韵,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤谴古,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毡代,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窜觉,死狀恐怖旬陡,靈堂內(nèi)的尸體忽然破棺而出驶睦,到底是詐尸還是另有隱情场航,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布捣辆,位于F島的核電站耸序,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嘁酿。R本人自食惡果不足惜沐飘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一借卧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間械荷,已是汗流浹背关拒。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留归露,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓一铅,卻偏偏與公主長(zhǎng)得像掉缺,于是被迫代替她去往敵國(guó)和親搜囱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子犬辰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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