分布式系統(tǒng)中一致性哈希

問(wèn)題場(chǎng)景

近年來(lái)B2C艾恼、O2O等商業(yè)概念的提出和移動(dòng)端的發(fā)展,使得分布式系統(tǒng)流行了起來(lái)战惊。分布式系統(tǒng)相對(duì)于單系統(tǒng),解決了流量大扎即、系統(tǒng)高可用和高容錯(cuò)等問(wèn)題吞获。功能強(qiáng)大也意味著實(shí)現(xiàn)起來(lái)需要更多技術(shù)的支持。例如系統(tǒng)訪問(wèn)層的負(fù)載均衡谚鄙,緩存層的多實(shí)例主從復(fù)制備份各拷,數(shù)據(jù)層的分庫(kù)分表等。

我們以負(fù)載均衡為例闷营,常見(jiàn)的負(fù)載均衡方法有很多烤黍,但是它們的優(yōu)缺點(diǎn)也都很明顯:

  • 隨機(jī)訪問(wèn)策略。 系統(tǒng)隨機(jī)訪問(wèn),缺點(diǎn):可能造成服務(wù)器負(fù)載壓力不均衡速蕊,俗話(huà)講就是撐的撐死嫂丙,餓的餓死。
  • 輪詢(xún)策略互例。 請(qǐng)求均勻分配奢入,如果服務(wù)器有性能差異,則無(wú)法實(shí)現(xiàn)性能好的服務(wù)器能夠多承擔(dān)一部分媳叨。
  • 權(quán)重輪詢(xún)策略腥光。 權(quán)值需要靜態(tài)配置,無(wú)法自動(dòng)調(diào)節(jié)糊秆,不適合對(duì)長(zhǎng)連接和命中率有要求的場(chǎng)景武福。
  • Hash取模策略。 不穩(wěn)定痘番,如果列表中某臺(tái)服務(wù)器宕機(jī)捉片,則會(huì)導(dǎo)致路由算法產(chǎn)生變化,由此導(dǎo)致命中率的急劇下降汞舱。
  • 一致性哈希策略伍纫。

以上幾個(gè)策略,排除本篇介紹的一致性哈希昂芜,可能使用最多的就是 Hash取模策略了莹规。Hash取模策略的缺點(diǎn)也是很明顯的,這種缺點(diǎn)也許在負(fù)載均衡的時(shí)候不是很明顯泌神,但是在涉及數(shù)據(jù)訪問(wèn)的主從備份和分庫(kù)分表中就體現(xiàn)明顯了良漱。

使用Hash取模的問(wèn)題

負(fù)載均衡

負(fù)載均衡時(shí),假設(shè)現(xiàn)有3臺(tái)服務(wù)器(編號(hào)分別為0欢际、1母市、2),使用哈希取模的計(jì)算方式則是:對(duì)訪問(wèn)者的IP损趋,通過(guò)固定算式hash(IP) % N(N為服務(wù)器的個(gè)數(shù))患久,使得每個(gè)IP都可以定位到特定的服務(wù)器。

例如現(xiàn)有IP地址 10.58.34.31浑槽,對(duì)IP哈希取模策時(shí)蒋失,計(jì)算結(jié)果為2,即訪問(wèn)編號(hào)為2的服務(wù)器:

String ip = "10.58.34.31";
int v1 = hash(ip) % 3;
System.out.println("訪問(wèn)服務(wù)器:" + v1);// 訪問(wèn)服務(wù)器:2

如果此時(shí)服務(wù)器2宕機(jī)了括荡,則會(huì)導(dǎo)致所有計(jì)算結(jié)果為2的 IP 對(duì)應(yīng)的用戶(hù)都訪問(wèn)異常(包括上例中的IP)「刃或者你新增了一臺(tái)服務(wù)器3畸冲,這時(shí)不修改N值的話(huà)那么服務(wù)器3永遠(yuǎn)不會(huì)被訪問(wèn)到。

image

當(dāng)然如果你能動(dòng)態(tài)獲取到當(dāng)前可用服務(wù)器的個(gè)數(shù),亦即N值是根據(jù)當(dāng)前可用服務(wù)器個(gè)數(shù)動(dòng)態(tài)來(lái)變化的邑闲,則可解決此問(wèn)題算行。但是對(duì)于特定地區(qū)或特定IP訪問(wèn)特定服務(wù)器類(lèi)的需求會(huì)造成訪問(wèn)偏差。

分庫(kù)分表

負(fù)載均衡中有這種問(wèn)題苫耸,那么分庫(kù)分表中同樣也有這樣的問(wèn)題州邢。例如隨著業(yè)務(wù)的飛速增長(zhǎng),我們的注冊(cè)用戶(hù)也越來(lái)越多褪子,單個(gè)用戶(hù)表數(shù)量已經(jīng)達(dá)到千萬(wàn)級(jí)甚至更大量淌。由于Mysql的單表建議百萬(wàn)級(jí)數(shù)據(jù)存儲(chǔ),所以這時(shí)為了保證系統(tǒng)查詢(xún)和運(yùn)行效率嫌褪,肯定會(huì)考慮到分庫(kù)分表呀枢。

對(duì)于分庫(kù)分表,數(shù)據(jù)的分配是個(gè)重要的問(wèn)題笼痛,你需要保證數(shù)據(jù)分配在這個(gè)服務(wù)器裙秋,那么在查詢(xún)時(shí)也需要到該服務(wù)器上來(lái)查詢(xún),否則會(huì)造成數(shù)據(jù)查詢(xún)丟失的問(wèn)題缨伊。

通常是根據(jù)用戶(hù)的 ID 哈希取模得到的值然后路由到對(duì)應(yīng)的存儲(chǔ)位置摘刑,計(jì)算公式為:hash(userId) % N,其中N為分庫(kù)或分表的個(gè)數(shù)刻坊。

例如分庫(kù)數(shù)為2時(shí)枷恕,計(jì)算結(jié)果為1,則ID為1010的用戶(hù)存儲(chǔ)在編號(hào)為1對(duì)應(yīng)的庫(kù)中:

String userId = "1010";
int v1 = hash(userId) % 2;
System.out.println("存儲(chǔ):" + v1);// 存儲(chǔ):1
image

之后業(yè)務(wù)數(shù)量持續(xù)增長(zhǎng)紧唱,又新增一臺(tái)用戶(hù)服務(wù)庫(kù)活尊,當(dāng)我們根據(jù)ID=1010去查詢(xún)數(shù)據(jù)時(shí),路由計(jì)算方式為:

int v2 = hash(userId) % 3;
System.out.println("存儲(chǔ):" + v2);// 存儲(chǔ):0

我們得到的路由值是0漏益,最后的結(jié)果就不用說(shuō)了蛹锰,存在編號(hào)1上的數(shù)據(jù)我們?nèi)ゾ幪?hào)為0的庫(kù)上去查詢(xún)肯定是得不到查詢(xún)結(jié)果的。

image

為了數(shù)據(jù)可用绰疤,你需要做數(shù)據(jù)遷移铜犬,按照新的路由規(guī)則對(duì)所有用戶(hù)重新分配存儲(chǔ)地址。每次的庫(kù)或表的數(shù)量改變你都需要做一次全部用戶(hù)信息數(shù)據(jù)的遷移轻庆。不用想這其中的工作量是有多費(fèi)時(shí)費(fèi)力了癣猾。

是否有某種方法,有效解決這種分布式存儲(chǔ)結(jié)構(gòu)下動(dòng)態(tài)增加或刪除節(jié)點(diǎn)所帶來(lái)的問(wèn)題余爆,能保證這種不受實(shí)例數(shù)量變化影響而準(zhǔn)確路由到正確的實(shí)例上的算法或?qū)崿F(xiàn)機(jī)制呢纷宇?解決這些問(wèn)題,一致性哈希算法誕生了蛾方。

基本原理

一致性哈希算法在1997年由麻省理工學(xué)院的Karger等人在解決分布式Cache中提出的像捶,設(shè)計(jì)目標(biāo)是為了解決因特網(wǎng)中的熱點(diǎn)(Hot spot)問(wèn)題上陕,初衷和CARP十分類(lèi)似。一致性哈希修正了CARP使用的簡(jiǎn)單哈希算法帶來(lái)的問(wèn)題拓春,使得DHT可以在P2P環(huán)境中真正得到應(yīng)用释簿。

上面說(shuō)的哈希取模方法,它是針對(duì)一個(gè)點(diǎn)的硼莽,業(yè)務(wù)布局嚴(yán)重依賴(lài)于這個(gè)計(jì)算的點(diǎn)值結(jié)果庶溶。你結(jié)算的結(jié)果是2,那么就對(duì)應(yīng)到編號(hào)為2的服務(wù)器上懂鸵。這樣的映射就造成了業(yè)務(wù)容錯(cuò)性和可擴(kuò)展性極低偏螺。

我們思考下,是否可以將這個(gè)計(jì)算結(jié)果的點(diǎn)值賦予范圍的意義矾瑰?我們知道Hash取模之后得到的是一個(gè) int 型的整值砖茸。

//Objects 類(lèi)中默認(rèn)的 hash 方法
 public static int hash(Object... values) {
    return Arrays.hashCode(values);
}

既然 hash的計(jì)算結(jié)果是 int 類(lèi)型,而 java 中 int 的最小值是-2^31殴穴,最大值是2^31-1凉夯。意味著任何通過(guò)哈希取模之后的無(wú)符號(hào)值都會(huì)在 0 ~ 2^31-1范圍之間,共2^32個(gè)數(shù)采幌。那我們是否可以不對(duì)服務(wù)器的數(shù)量進(jìn)行取模而是直接對(duì)2^32取模劲够。這就形成了一致性哈希的基本算法思想,什么意思呢休傍?

這里需要注意一點(diǎn):

默認(rèn)的 hash 方法結(jié)果是有負(fù)值的情況征绎,因此需要我們重寫(xiě)hash方法,保證哈希值的非負(fù)性磨取。

簡(jiǎn)單來(lái)說(shuō)人柿,一致性Hash算法將整個(gè)哈希值空間組織成一個(gè)虛擬的圓環(huán),如假設(shè)某哈希函數(shù) H 的值空間為 0 ~ 2^32-1(即哈希值是一個(gè)32位無(wú)符號(hào)整形)忙厌,整個(gè)哈希環(huán)如下:

image

整個(gè)空間圓按順時(shí)針方向布局凫岖,圓環(huán)的正上方的點(diǎn)代表0,0點(diǎn)右側(cè)的第一個(gè)點(diǎn)代表1逢净。以此類(lèi)推2哥放、3、4爹土、5甥雕、6……直到232-1,也就是說(shuō)0點(diǎn)左側(cè)的第一個(gè)點(diǎn)代表232-1胀茵, 0和2^32-1在零點(diǎn)中方向重合社露,我們把這個(gè)由2^32個(gè)點(diǎn)組成的圓環(huán)稱(chēng)為 Hash環(huán)

那么琼娘,一致性哈希算法與上圖中的圓環(huán)有什么關(guān)系呢峭弟?仍然以之前描述的場(chǎng)景為例赁濒,假設(shè)我們有4臺(tái)服務(wù)器,服務(wù)器0孟害、服務(wù)器1、服務(wù)器2挪拟,服務(wù)器3挨务,那么,在生產(chǎn)環(huán)境中玉组,這4臺(tái)服務(wù)器肯定有自己的 IP 地址或主機(jī)名谎柄,我們使用它們各自的 IP 地址或主機(jī)名作為關(guān)鍵字進(jìn)行哈希計(jì)算,使用哈希后的結(jié)果對(duì)2^32取模惯雳,可以使用如下公式示意:

hash(服務(wù)器的IP地址) %  2^32

最后會(huì)得到一個(gè) [0, 2^32-1]之間的一個(gè)無(wú)符號(hào)整形數(shù)朝巫,這個(gè)整數(shù)就代表服務(wù)器的編號(hào)。同時(shí)這個(gè)整數(shù)肯定處于[0, 2^32-1]之間石景,那么劈猿,上圖中的 hash 環(huán)上必定有一個(gè)點(diǎn)與這個(gè)整數(shù)對(duì)應(yīng)。那么這個(gè)服務(wù)器就可以映射到這個(gè)環(huán)上潮孽。

多個(gè)服務(wù)器都通過(guò)這種方式進(jìn)行計(jì)算揪荣,最后都會(huì)各自映射到圓環(huán)上的某個(gè)點(diǎn),這樣每臺(tái)機(jī)器就能確定其在哈希環(huán)上的位置往史,如下圖所示仗颈。

image

容錯(cuò)性和可擴(kuò)展性

那么用戶(hù)訪問(wèn),如何分配訪問(wèn)的服務(wù)器呢椎例?我們根據(jù)用戶(hù)的 IP 使用上面相同的函數(shù) Hash 計(jì)算出哈希值挨决,并確定此數(shù)據(jù)在環(huán)上的位置,從此位置沿環(huán) 順時(shí)針行走订歪,遇到的第一臺(tái)服務(wù)器就是其應(yīng)該定位到的服務(wù)器脖祈。

image

從上圖可以看出 用戶(hù)1 順時(shí)針遇到的第一臺(tái)服務(wù)器是 服務(wù)器3 ,所以該用戶(hù)被分配給服務(wù)器3來(lái)提供服務(wù)陌粹。同理可以看出用戶(hù)2被分配給了服務(wù)器2撒犀。

1. 新增服務(wù)器節(jié)點(diǎn)

如果這時(shí)需要新增一臺(tái)服務(wù)器節(jié)點(diǎn),一致性哈希策略是如何應(yīng)對(duì)的呢掏秩?如下圖所示或舞,我們新增了一臺(tái)服務(wù)器4,通過(guò)上述一致性哈希算法計(jì)算后得出它在哈希環(huán)的位置蒙幻。

image

可以發(fā)現(xiàn)映凳,原來(lái)訪問(wèn)服務(wù)器3的用戶(hù)1現(xiàn)在訪問(wèn)的對(duì)象是服務(wù)器4,用戶(hù)能正常訪問(wèn)且服務(wù)不需要停機(jī)就可以自動(dòng)切換邮破。

2. 刪除服務(wù)器節(jié)點(diǎn)

如果這時(shí)某臺(tái)服務(wù)器異常宕機(jī)或者運(yùn)維撤銷(xiāo)了一臺(tái)服務(wù)器诈豌,那么這時(shí)會(huì)發(fā)生什么情況呢仆救?如下圖所示,假設(shè)我們撤銷(xiāo)了服務(wù)器2矫渔。

image

可以看出彤蔽,我們服務(wù)仍然能正常提供服務(wù),只不過(guò)這時(shí)用戶(hù)2會(huì)被分配到服務(wù)1上了而已庙洼。

通過(guò)一致性哈希的方式顿痪,我們提高了我們系統(tǒng)的容錯(cuò)性和可擴(kuò)展性,分布式節(jié)點(diǎn)的變動(dòng)不會(huì)影響整個(gè)系統(tǒng)的運(yùn)行且不需要我們做一些人為的調(diào)整策略油够。

Hash環(huán)的數(shù)據(jù)傾斜問(wèn)題

一致性哈希雖然為我們提供了穩(wěn)定的切換策略蚁袭,但是它也有一些小缺陷。因?yàn)?hash取模算法得到的結(jié)果是隨機(jī)的石咬,我們并不能保證各個(gè)服務(wù)節(jié)點(diǎn)能均勻的分配到哈希環(huán)上揩悄。

例如當(dāng)有4個(gè)服務(wù)節(jié)點(diǎn)時(shí),我們把哈希環(huán)認(rèn)為是一個(gè)圓盤(pán)時(shí)鐘鬼悠,我們并不能保證4個(gè)服務(wù)節(jié)點(diǎn)剛好均勻的落在時(shí)鐘的 12删性、3、6焕窝、9點(diǎn)上镇匀。

分布不均勻就會(huì)產(chǎn)生一個(gè)問(wèn)題,用戶(hù)的請(qǐng)求訪問(wèn)就會(huì)不均勻袜啃,同時(shí)4個(gè)服務(wù)承受的壓力就會(huì)不均勻汗侵。這種問(wèn)題現(xiàn)象我們稱(chēng)之為,Hash環(huán)的數(shù)據(jù)傾斜問(wèn)題群发。

image

如上圖所示晰韵,服務(wù)器0 到 服務(wù)器1 之間的哈希點(diǎn)值占據(jù)比例最大,大量請(qǐng)求會(huì)集中到 服務(wù)器1 上熟妓,而只有極少量會(huì)定位到 服務(wù)器0 或其他幾個(gè)節(jié)點(diǎn)上雪猪,從而出現(xiàn) hash環(huán)偏斜的情況。

如果想要均衡的將緩存分布到每臺(tái)服務(wù)器上只恨,最好能讓這每臺(tái)服務(wù)器盡量多的、均勻的出現(xiàn)在hash環(huán)上官觅,但是如上圖中所示,真實(shí)的服務(wù)器資源只有4臺(tái)休涤,我們?cè)鯓討{空的讓它們多起來(lái)呢?

既然沒(méi)有多余的真正的物理服務(wù)器節(jié)點(diǎn)功氨,我們就只能將現(xiàn)有的物理節(jié)點(diǎn)通過(guò)虛擬的方法復(fù)制出來(lái)。

這些由實(shí)際節(jié)點(diǎn)虛擬復(fù)制而來(lái)的節(jié)點(diǎn)被稱(chēng)為 "虛擬節(jié)點(diǎn)"捷凄,即對(duì)每一個(gè)服務(wù)節(jié)點(diǎn)計(jì)算多個(gè)哈希,每個(gè)計(jì)算結(jié)果位置都放置一個(gè)此服務(wù)節(jié)點(diǎn)踱阿,稱(chēng)為虛擬節(jié)點(diǎn)。具體做法可以在服務(wù)器IP或主機(jī)名的后面增加編號(hào)來(lái)實(shí)現(xiàn)。

如上圖所示才漆,假如 服務(wù)器1 的 IP 是 192.168.32.132,那么原 服務(wù)器1 節(jié)點(diǎn)在環(huán)形空間的位置就是hash("192.168.32.132") % 2^32醇滥。

我們基于 服務(wù)器1 構(gòu)建兩個(gè)虛擬節(jié)點(diǎn)黎比,Server1-A 和 Server1-B,虛擬節(jié)點(diǎn)在環(huán)形空間的位置可以利用(IP+后綴)計(jì)算鸳玩,例如:

hash("192.168.32.132#A") % 2^32
hash("192.168.32.132#B") % 2^32

此時(shí)阅虫,環(huán)形空間中不再有物理節(jié)點(diǎn) 服務(wù)器1,服務(wù)器2不跟,……颓帝,替代的是只有虛擬節(jié)點(diǎn) Server1-A,Server1-B窝革,Server2-A购城,Server2-B,……虐译。

image

同時(shí)數(shù)據(jù)定位算法不變瘪板,只是多了一步虛擬節(jié)點(diǎn)到實(shí)際節(jié)點(diǎn)的映射,例如定位到 “Server1-A”漆诽、“Server1-B” 兩個(gè)虛擬節(jié)點(diǎn)的數(shù)據(jù)均定位到 服務(wù)器1上侮攀。這樣就解決了服務(wù)節(jié)點(diǎn)少時(shí)數(shù)據(jù)傾斜的問(wèn)題。

在實(shí)際應(yīng)用中厢拭,通常將虛擬節(jié)點(diǎn)數(shù)設(shè)置為32甚至更大兰英,因此即使很少的服務(wù)節(jié)點(diǎn)也能做到相對(duì)均勻的數(shù)據(jù)分布。由于虛擬節(jié)點(diǎn)數(shù)量較多供鸠,與虛擬節(jié)點(diǎn)的映射關(guān)系也變得相對(duì)均衡了箭昵。

總結(jié)

一致性哈希一般在分布式緩存中使用的也比較多,本篇只介紹了服務(wù)的負(fù)載均衡和分布式存儲(chǔ)回季,對(duì)于分布式緩存其實(shí)原理是類(lèi)似的家制,讀者可以自己舉一反三來(lái)思考下正林。

其實(shí),在分布式存儲(chǔ)和分布式緩存中颤殴,當(dāng)服務(wù)節(jié)點(diǎn)發(fā)生變化時(shí)(新增或減少)觅廓,一致性哈希算法并不能杜絕數(shù)據(jù)遷移的問(wèn)題,但是可以避免數(shù)據(jù)的全量遷移涵但,需要遷移的只是更改的節(jié)點(diǎn)和它的上游節(jié)點(diǎn)它們兩個(gè)節(jié)點(diǎn)之間的那部分?jǐn)?shù)據(jù)杈绸。

另外,我們都知道 hash算法 有一個(gè)避免不了的問(wèn)題矮瘟,就是哈希沖突瞳脓。對(duì)于用戶(hù)請(qǐng)求IP的哈希沖突,其實(shí)只是不同用戶(hù)被分配到了同一臺(tái)服務(wù)器上澈侠,這個(gè)沒(méi)什么影響哨啃。但是如果是服務(wù)節(jié)點(diǎn)有哈希沖突呢拳球?這會(huì)導(dǎo)致兩個(gè)服務(wù)節(jié)點(diǎn)在哈希環(huán)上對(duì)應(yīng)同一個(gè)點(diǎn)祝峻,其實(shí)我感覺(jué)這個(gè)問(wèn)題也不大莱找,因?yàn)橐环矫婀_突的概率比較低宋距,另一方面我們可以通過(guò)虛擬節(jié)點(diǎn)也可減少這種情況谚赎。

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雳灵,一起剝皮案震驚了整個(gè)濱河市悯辙,隨后出現(xiàn)的幾起案子躲撰,更是在濱河造成了極大的恐慌拢蛋,老刑警劉巖谆棱,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔫劣,死亡現(xiàn)場(chǎng)離奇詭異个从,居然都是意外死亡信姓,警方通過(guò)查閱死者的電腦和手機(jī)意推,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)腻窒,“玉大人磅崭,你說(shuō)我怎么就攤上這事砸喻「畹海” “怎么了癣漆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵癌蓖,是天一觀的道長(zhǎng)费坊。 經(jīng)常有香客問(wèn)我附井,道長(zhǎng)永毅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮意蛀,結(jié)果婚禮上县钥,老公的妹妹穿的比我還像新娘。我一直安慰自己省有,他們只是感情好蠢沿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布舷蟀。 她就那樣靜靜地躺著雪侥,像睡著了一般速缨。 火紅的嫁衣襯著肌膚如雪代乃。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天吭历,我揣著相機(jī)與錄音晌区,去河邊找鬼通贞。 笑死昌罩,一個(gè)胖子當(dāng)著我的面吹牛茎用,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旭斥,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼圆米!你這毒婦竟也來(lái)了卒暂?” 一聲冷哼從身側(cè)響起昙楚,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤堪旧,失蹤者是張志新(化名)和其女友劉穎淳梦,沒(méi)想到半個(gè)月后爆袍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年蜘醋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啸罢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片无蜂。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡训桶,死狀恐怖酣倾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情午绳,我是刑警寧澤拦焚,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布赎败,位于F島的核電站僵刮,受9級(jí)特大地震影響鹦牛,放射性物質(zhì)發(fā)生泄漏曼追。R本人自食惡果不足惜礼殊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悟民。 院中可真熱鬧射亏,春花似錦智润、人聲如沸窟绷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辐棒。三九已至漾根,卻和暖如春辐怕,著一層夾襖步出監(jiān)牢的瞬間贡茅,已是汗流浹背秘蛇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工其做, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顶考,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓妖泄,卻偏偏與公主長(zhǎng)得像驹沿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蹈胡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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