黑猴子的家:Hadoop NameNode 的主備切換實(shí)現(xiàn)

NameNode 主備切換主要由 ZKFailoverController闰挡、HealthMonitor 和 ActiveStandbyElector 這 3 個(gè)組件來協(xié)同實(shí)現(xiàn):

ZKFailoverController 作為 NameNode 機(jī)器上一個(gè)獨(dú)立的進(jìn)程啟動(dòng) (在 hdfs 啟動(dòng)腳本之中的進(jìn)程名為 zkfc)腕让,啟動(dòng)的時(shí)候會(huì)創(chuàng)建 HealthMonitor 和 ActiveStandbyElector 這兩個(gè)主要的內(nèi)部組件咐熙,ZKFailoverController 在創(chuàng)建 HealthMonitor 和 ActiveStandbyElector 的同時(shí)喘批,也會(huì)向 HealthMonitor 和 ActiveStandbyElector 注冊(cè)相應(yīng)的回調(diào)方法。

HealthMonitor 主要負(fù)責(zé)檢測(cè) NameNode 的健康狀態(tài)邦鲫,如果檢測(cè)到 NameNode 的狀態(tài)發(fā)生變化例获,會(huì)回調(diào) ZKFailoverController 的相應(yīng)方法進(jìn)行自動(dòng)的主備選舉。

ActiveStandbyElector 主要負(fù)責(zé)完成自動(dòng)的主備選舉印叁,內(nèi)部封裝了 Zookeeper 的處理邏輯被冒,一旦 Zookeeper 主備選舉完成,會(huì)回調(diào) ZKFailoverController 的相應(yīng)方法來進(jìn)行 NameNode 的主備狀態(tài)切換轮蜕。

NameNode 實(shí)現(xiàn)主備切換的流程如圖 2 所示昨悼,有以下幾步:

HealthMonitor 初始化完成之后會(huì)啟動(dòng)內(nèi)部的線程來定時(shí)調(diào)用對(duì)應(yīng) NameNode 的 HAServiceProtocol RPC 接口的方法,對(duì) NameNode 的健康狀態(tài)進(jìn)行檢測(cè)跃洛。

HealthMonitor 如果檢測(cè)到 NameNode 的健康狀態(tài)發(fā)生變化率触,會(huì)回調(diào) ZKFailoverController 注冊(cè)的相應(yīng)方法進(jìn)行處理。
如果 ZKFailoverController 判斷需要進(jìn)行主備切換汇竭,會(huì)首先使用 ActiveStandbyElector 來進(jìn)行自動(dòng)的主備選舉葱蝗。

ActiveStandbyElector 與 Zookeeper 進(jìn)行交互完成自動(dòng)的主備選舉。

ActiveStandbyElector 在主備選舉完成后细燎,會(huì)回調(diào) ZKFailoverController 的相應(yīng)方法來通知當(dāng)前的 NameNode 成為主 NameNode 或備 NameNode两曼。

ZKFailoverController 調(diào)用對(duì)應(yīng) NameNode 的 HAServiceProtocol RPC 接口的方法將 NameNode 轉(zhuǎn)換為 Active 狀態(tài)或 Standby 狀態(tài)。

圖NameNode 的主備切換流程

image.png

下面分別對(duì) HealthMonitor玻驻、ActiveStandbyElector 和 ZKFailoverController 的實(shí)現(xiàn)細(xì)節(jié)進(jìn)行分析

1悼凑、HealthMonitor 實(shí)現(xiàn)分析

ZKFailoverController 在初始化的時(shí)候會(huì)創(chuàng)建 HealthMonitor,HealthMonitor 在內(nèi)部會(huì)啟動(dòng)一個(gè)線程來循環(huán)調(diào)用 NameNode 的 HAServiceProtocol RPC 接口的方法來檢測(cè) NameNode 的狀態(tài),并將狀態(tài)的變化通過回調(diào)的方式來通知 ZKFailoverController户辫。

HealthMonitor 主要檢測(cè) NameNode 的兩類狀態(tài)渐夸,分別是 HealthMonitor.State 和 HAServiceStatus。HealthMonitor.State 是通過 HAServiceProtocol RPC 接口的 monitorHealth 方法來獲取的寸莫,反映了 NameNode 節(jié)點(diǎn)的健康狀況捺萌,主要是磁盤存儲(chǔ)資源是否充足。HealthMonitor.State 包括下面幾種狀態(tài):

INITIALIZING:HealthMonitor 在初始化過程中膘茎,還沒有開始進(jìn)行健康狀況檢測(cè)桃纯;

SERVICE_HEALTHY:NameNode 狀態(tài)正常;

SERVICE_NOT_RESPONDING:調(diào)用 NameNode 的 monitorHealth 方法調(diào)用無響應(yīng)或響應(yīng)超時(shí)披坏;

SERVICE_UNHEALTHY:NameNode 還在運(yùn)行态坦,但是 monitorHealth 方法返回狀態(tài)不正常,磁盤存儲(chǔ)資源不足棒拂;

HEALTH_MONITOR_FAILED:HealthMonitor 自己在運(yùn)行過程中發(fā)生了異常伞梯,不能繼續(xù)檢測(cè) NameNode 的健康狀況,會(huì)導(dǎo)致 ZKFailoverController 進(jìn)程退出帚屉;

HealthMonitor.State 在狀態(tài)檢測(cè)之中起主要的作用谜诫,在 HealthMonitor.State 發(fā)生變化的時(shí)候,HealthMonitor 會(huì)回調(diào) ZKFailoverController 的相應(yīng)方法來進(jìn)行處理攻旦,具體處理見后文 ZKFailoverController 部分所述喻旷。

而 HAServiceStatus 則是通過 HAServiceProtocol RPC 接口的 getServiceStatus 方法來獲取的,主要反映的是 NameNode 的 HA 狀態(tài)牢屋,包括:

INITIALIZING:NameNode 在初始化過程中且预;

ACTIVE:當(dāng)前 NameNode 為主 NameNode;

STANDBY:當(dāng)前 NameNode 為備 NameNode烙无;

STOPPING:當(dāng)前 NameNode 已停止锋谐;

HAServiceStatus 在狀態(tài)檢測(cè)之中只是起輔助的作用,在 HAServiceStatus 發(fā)生變化時(shí)截酷,HealthMonitor 也會(huì)回調(diào) ZKFailoverController 的相應(yīng)方法來進(jìn)行處理涮拗,具體處理見后文 ZKFailoverController 部分所述。

2合搅、ActiveStandbyElector 實(shí)現(xiàn)分析

Namenode(包括 YARN ResourceManager) 的主備選舉是通過 ActiveStandbyElector 來完成的多搀,ActiveStandbyElector 主要是利用了 Zookeeper 的寫一致性和臨時(shí)節(jié)點(diǎn)機(jī)制,具體的主備選舉實(shí)現(xiàn)如下:

創(chuàng)建鎖節(jié)點(diǎn)

如果 HealthMonitor 檢測(cè)到對(duì)應(yīng)的 NameNode 的狀態(tài)正常灾部,那么表示這個(gè) NameNode 有資格參加 Zookeeper 的主備選舉康铭。如果目前還沒有進(jìn)行過主備選舉的話,那么相應(yīng)的 ActiveStandbyElector 就會(huì)發(fā)起一次主備選舉赌髓,嘗試在 Zookeeper 上創(chuàng)建一個(gè)路徑為/hadoop-ha/{dfs.nameservices}/ActiveStandbyElectorLock 的臨時(shí)節(jié)點(diǎn) ({dfs.nameservices} 為 Hadoop 的配置參數(shù) dfs.nameservices 的值从藤,下同)催跪,Zookeeper 的寫一致性會(huì)保證最終只會(huì)有一個(gè) ActiveStandbyElector 創(chuàng)建成功,那么創(chuàng)建成功的 ActiveStandbyElector 對(duì)應(yīng)的 NameNode 就會(huì)成為主 NameNode夷野,ActiveStandbyElector 會(huì)回調(diào) ZKFailoverController 的方法進(jìn)一步將對(duì)應(yīng)的 NameNode 切換為 Active 狀態(tài)懊蒸。而創(chuàng)建失敗的 ActiveStandbyElector 對(duì)應(yīng)的 NameNode 成為備 NameNode,ActiveStandbyElector 會(huì)回調(diào) ZKFailoverController 的方法進(jìn)一步將對(duì)應(yīng)的 NameNode 切換為 Standby 狀態(tài)悯搔。

注冊(cè) Watcher 監(jiān)聽

不管創(chuàng)建/hadoop-ha/${dfs.nameservices}/ActiveStandbyElectorLock 節(jié)點(diǎn)是否成功骑丸,ActiveStandbyElector 隨后都會(huì)向 Zookeeper 注冊(cè)一個(gè) Watcher 來監(jiān)聽這個(gè)節(jié)點(diǎn)的狀態(tài)變化事件,ActiveStandbyElector 主要關(guān)注這個(gè)節(jié)點(diǎn)的 NodeDeleted 事件妒貌。

自動(dòng)觸發(fā)主備選舉

如果 Active NameNode 對(duì)應(yīng)的 HealthMonitor 檢測(cè)到 NameNode 的狀態(tài)異常時(shí)通危, 
ZKFailoverController 會(huì)主動(dòng)刪除當(dāng)前在 Zookeeper 上建立的臨時(shí)節(jié)點(diǎn)
/hadoop-ha/${dfs.nameservices}/ActiveStandbyElectorLock,這樣處
于 Standby 狀態(tài)的 NameNode 的 ActiveStandbyElector 注冊(cè)的監(jiān)聽器
就會(huì)收到這個(gè)節(jié)點(diǎn)的 NodeDeleted 事件灌曙。收到這個(gè)事件之后菊碟,會(huì)馬上
再次進(jìn)入到創(chuàng)建/hadoop-ha/${dfs.nameservices}/ActiveStandbyElectorLock
 節(jié)點(diǎn)的流程,如果創(chuàng)建成功在刺,這個(gè)本來處于 Standby 狀態(tài)的 NameNode 
就選舉為主 NameNode 并隨后開始切換為 Active 狀態(tài)逆害。


當(dāng)然,如果是 Active 狀態(tài)的 NameNode 所在的機(jī)器整個(gè)宕掉的話蚣驼,那么根據(jù)
 Zookeeper 的臨時(shí)節(jié)點(diǎn)特性魄幕,/hadoop-ha/${dfs.nameservices}/ActiveStandbyElectorLock
 節(jié)點(diǎn)會(huì)自動(dòng)被刪除,從而也會(huì)自動(dòng)進(jìn)行一次主備切換颖杏。

防止腦裂

Zookeeper 在工程實(shí)踐的過程中經(jīng)常會(huì)發(fā)生的一個(gè)現(xiàn)象就是 Zookeeper 客戶端“假死”梅垄,所謂的“假死”是指如果 Zookeeper 客戶端機(jī)器負(fù)載過高或者正在進(jìn)行 JVM Full GC,那么可能會(huì)導(dǎo)致 Zookeeper 客戶端到 Zookeeper 服務(wù)端的心跳不能正常發(fā)出输玷,一旦這個(gè)時(shí)間持續(xù)較長(zhǎng),超過了配置的 Zookeeper Session Timeout 參數(shù)的話靡馁,Zookeeper 服務(wù)端就會(huì)認(rèn)為客戶端的 session 已經(jīng)過期從而將客戶端的 Session 關(guān)閉欲鹏。“假死”有可能引起分布式系統(tǒng)常說的雙主或腦裂 (brain-split) 現(xiàn)象臭墨。具體到本文所述的 NameNode赔嚎,假設(shè) NameNode1 當(dāng)前為 Active 狀態(tài),NameNode2 當(dāng)前為 Standby 狀態(tài)胧弛。如果某一時(shí)刻 NameNode1 對(duì)應(yīng)的 ZKFailoverController 進(jìn)程發(fā)生了“假死”現(xiàn)象尤误,那么 Zookeeper 服務(wù)端會(huì)認(rèn)為 NameNode1 掛掉了,根據(jù)前面的主備切換邏輯结缚,NameNode2 會(huì)替代 NameNode1 進(jìn)入 Active 狀態(tài)损晤。但是此時(shí) NameNode1 可能仍然處于 Active 狀態(tài)正常運(yùn)行,即使隨后 NameNode1 對(duì)應(yīng)的 ZKFailoverController 因?yàn)樨?fù)載下降或者 Full GC 結(jié)束而恢復(fù)了正常红竭,感知到自己和 Zookeeper 的 Session 已經(jīng)關(guān)閉尤勋,但是由于網(wǎng)絡(luò)的延遲以及 CPU 線程調(diào)度的不確定性喘落,仍然有可能會(huì)在接下來的一段時(shí)間窗口內(nèi) NameNode1 認(rèn)為自己還是處于 Active 狀態(tài)。這樣 NameNode1 和 NameNode2 都處于 Active 狀態(tài)最冰,都可以對(duì)外提供服務(wù)瘦棋。這種情況對(duì)于 NameNode 這類對(duì)數(shù)據(jù)一致性要求非常高的系統(tǒng)來說是災(zāi)難性的,數(shù)據(jù)會(huì)發(fā)生錯(cuò)亂且無法恢復(fù)暖哨。Zookeeper 社區(qū)對(duì)這種問題的解決方法叫做 fencing赌朋,中文翻譯為隔離,也就是想辦法把舊的 Active NameNode 隔離起來篇裁,使它不能正常對(duì)外提供服務(wù)沛慢。

ActiveStandbyElector 為了實(shí)現(xiàn) fencing,會(huì)在成功創(chuàng)建 Zookeeper 節(jié)點(diǎn) hadoop-ha/{dfs.nameservices}/ActiveStandbyElectorLock 從而成為 Active NameNode 之后茴恰,創(chuàng)建另外一個(gè)路徑為/hadoop-ha/{dfs.nameservices}/ActiveBreadCrumb 的持久節(jié)點(diǎn)颠焦,這個(gè)節(jié)點(diǎn)里面保存了這個(gè) Active NameNode 的地址信息。Active NameNode 的 ActiveStandbyElector 在正常的狀態(tài)下關(guān)閉 Zookeeper Session 的時(shí)候 (注意由于/hadoop-ha/{dfs.nameservices}/ActiveStandbyElectorLock 是臨時(shí)節(jié)點(diǎn)往枣,也會(huì)隨之刪除)伐庭,會(huì)一起刪除節(jié)點(diǎn)/hadoop-ha/{dfs.nameservices}/ActiveBreadCrumb。但是如果 ActiveStandbyElector 在異常的狀態(tài)下 Zookeeper Session 關(guān)閉 (比如前述的 Zookeeper 假死)分冈,那么由于/hadoop-ha/${dfs.nameservices}/ActiveBreadCrumb 是持久節(jié)點(diǎn)圾另,會(huì)一直保留下來。后面當(dāng)另一個(gè) NameNode 選主成功之后雕沉,會(huì)注意到上一個(gè) Active NameNode 遺留下來的這個(gè)節(jié)點(diǎn)集乔,從而會(huì)回調(diào) ZKFailoverController 的方法對(duì)舊的 Active NameNode 進(jìn)行 fencing,具體處理見后文 ZKFailoverController 部分所述坡椒。

3医瘫、ZKFailoverController 實(shí)現(xiàn)分析

ZKFailoverController 在創(chuàng)建 HealthMonitor 和 ActiveStandbyElector 的同時(shí),會(huì)向 HealthMonitor 和 ActiveStandbyElector 注冊(cè)相應(yīng)的回調(diào)函數(shù)彬向,ZKFailoverController 的處理邏輯主要靠 HealthMonitor 和 ActiveStandbyElector 的回調(diào)函數(shù)來驅(qū)動(dòng)空郊。

對(duì) HealthMonitor 狀態(tài)變化的處理

如前所述,HealthMonitor 會(huì)檢測(cè) NameNode 的兩類狀態(tài)丈攒,HealthMonitor.State 在狀態(tài)檢測(cè)之中起主要的作用哩罪,ZKFailoverController 注冊(cè)到 HealthMonitor 上的處理 HealthMonitor.State 狀態(tài)變化的回調(diào)函數(shù)主要關(guān)注 SERVICE_HEALTHY、SERVICE_NOT_RESPONDING 和 SERVICE_UNHEALTHY 這 3 種狀態(tài):

如果檢測(cè)到狀態(tài)為 SERVICE_HEALTHY巡验,表示當(dāng)前的 NameNode 有資格參加 Zookeeper 的主備選舉际插,如果目前還沒有進(jìn)行過主備選舉的話,ZKFailoverController 會(huì)調(diào)用 ActiveStandbyElector 的 joinElection 方法發(fā)起一次主備選舉显设。

如果檢測(cè)到狀態(tài)為 SERVICE_NOT_RESPONDING 或者是 SERVICE_UNHEALTHY框弛,就表示當(dāng)前的 NameNode 出現(xiàn)問題了,ZKFailoverController 會(huì)調(diào)用 ActiveStandbyElector 的 quitElection 方法刪除當(dāng)前已經(jīng)在 Zookeeper 上建立的臨時(shí)節(jié)點(diǎn)退出主備選舉敷硅,這樣其它的 NameNode 就有機(jī)會(huì)成為主 NameNode功咒。

而 HAServiceStatus 在狀態(tài)檢測(cè)之中僅起輔助的作用愉阎,在 HAServiceStatus 發(fā)生變化時(shí),ZKFailoverController 注冊(cè)到 HealthMonitor 上的處理 HAServiceStatus 狀態(tài)變化的回調(diào)函數(shù)會(huì)判斷 NameNode 返回的 HAServiceStatus 和 ZKFailoverController 所期望的是否一致力奋,如果不一致的話榜旦,ZKFailoverController 也會(huì)調(diào)用 ActiveStandbyElector 的 quitElection 方法刪除當(dāng)前已經(jīng)在 Zookeeper 上建立的臨時(shí)節(jié)點(diǎn)退出主備選舉。

對(duì) ActiveStandbyElector 主備選舉狀態(tài)變化的處理

在 ActiveStandbyElector 的主備選舉狀態(tài)發(fā)生變化時(shí)景殷,會(huì)回調(diào) ZKFailoverController 注冊(cè)的回調(diào)函數(shù)來進(jìn)行相應(yīng)的處理:

如果 ActiveStandbyElector 選主成功溅呢,那么 ActiveStandbyElector 對(duì)應(yīng)的 NameNode 成為主 NameNode,ActiveStandbyElector 會(huì)回調(diào) ZKFailoverController 的 becomeActive 方法猿挚,這個(gè)方法通過調(diào)用對(duì)應(yīng)的 NameNode 的 HAServiceProtocol RPC 接口的 transitionToActive 方法咐旧,將 NameNode 轉(zhuǎn)換為 Active 狀態(tài)。

如果 ActiveStandbyElector 選主失敗绩蜻,那么 ActiveStandbyElector 對(duì)應(yīng)的 NameNode 成為備 NameNode铣墨,ActiveStandbyElector 會(huì)回調(diào) ZKFailoverController 的 becomeStandby 方法,這個(gè)方法通過調(diào)用對(duì)應(yīng)的 NameNode 的 HAServiceProtocol RPC 接口的 transitionToStandby 方法办绝,將 NameNode 轉(zhuǎn)換為 Standby 狀態(tài)伊约。

如果 ActiveStandbyElector 選主成功之后,發(fā)現(xiàn)了上一個(gè) Active NameNode 遺留下來的/hadoop-ha/${dfs.nameservices}/ActiveBreadCrumb 節(jié)點(diǎn) (見“ActiveStandbyElector 實(shí)現(xiàn)分析”一節(jié)“防止腦裂”部分所述)孕蝉,那么 ActiveStandbyElector 會(huì)首先回調(diào) ZKFailoverController 注冊(cè)的 fenceOldActive 方法屡律,嘗試對(duì)舊的 Active NameNode 進(jìn)行 fencing,在進(jìn)行 fencing 的時(shí)候降淮,會(huì)執(zhí)行以下的操作:

首先嘗試調(diào)用這個(gè)舊 Active NameNode 的 HAServiceProtocol RPC 接口的 transitionToStandby 方法超埋,看能不能把它轉(zhuǎn)換為 Standby 狀態(tài)。

如果 transitionToStandby 方法調(diào)用失敗佳鳖,那么就執(zhí)行 Hadoop 配置文件之中預(yù)定義的隔離措施霍殴,Hadoop 目前主要提供兩種隔離措施,通常會(huì)選擇 sshfence:

sshfence:通過 SSH 登錄到目標(biāo)機(jī)器上系吩,執(zhí)行命令 fuser 將對(duì)應(yīng)的進(jìn)程殺死繁成;

shellfence:執(zhí)行一個(gè)用戶自定義的 shell 腳本來將對(duì)應(yīng)的進(jìn)程隔離;

只有在成功地執(zhí)行完成 fencing 之后淑玫,選主成功的 ActiveStandbyElector 才會(huì)回調(diào) ZKFailoverController 的 becomeActive 方法將對(duì)應(yīng)的 NameNode 轉(zhuǎn)換為 Active 狀態(tài),開始對(duì)外提供服務(wù)面睛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末絮蒿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子叁鉴,更是在濱河造成了極大的恐慌土涝,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幌墓,死亡現(xiàn)場(chǎng)離奇詭異但壮,居然都是意外死亡冀泻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蜡饵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弹渔,“玉大人,你說我怎么就攤上這事溯祸≈ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵焦辅,是天一觀的道長(zhǎng)博杖。 經(jīng)常有香客問我,道長(zhǎng)筷登,這世上最難降的妖魔是什么剃根? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮前方,結(jié)果婚禮上狈醉,老公的妹妹穿的比我還像新娘。我一直安慰自己镣丑,他們只是感情好舔糖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著莺匠,像睡著了一般金吗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上趣竣,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天摇庙,我揣著相機(jī)與錄音,去河邊找鬼遥缕。 笑死卫袒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的单匣。 我是一名探鬼主播夕凝,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼户秤!你這毒婦竟也來了码秉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鸡号,失蹤者是張志新(化名)和其女友劉穎转砖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲸伴,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡府蔗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年晋控,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姓赤。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赡译,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出模捂,到底是詐尸還是另有隱情捶朵,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布狂男,位于F島的核電站综看,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏岖食。R本人自食惡果不足惜红碑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泡垃。 院中可真熱鬧析珊,春花似錦、人聲如沸蔑穴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽存和。三九已至奕剃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捐腿,已是汗流浹背纵朋。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茄袖,地道東北人操软。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宪祥,于是被迫代替她去往敵國和親聂薪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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