Hadoop系列之HDFS初識(shí)、理論基礎(chǔ)與讀寫流程

1 HDFS初識(shí)

考慮這樣一個(gè)問(wèn)題:文件切成很多小文件塊散列存儲(chǔ)在集群中時(shí)圃阳,是如何知道每個(gè)小文件塊存儲(chǔ)的位置的呢?讓我們舉個(gè)例子來(lái)解釋一下璧帝,假設(shè)現(xiàn)在有100臺(tái)機(jī)器捍岳,如果有10個(gè)人拿著10批數(shù)據(jù)過(guò)來(lái)存儲(chǔ),那么他們可能會(huì)找到不同的人把他們的數(shù)據(jù)各自存儲(chǔ)在不同的機(jī)器上睬隶,過(guò)了10天之后锣夹,這些人想要取回他們的數(shù)據(jù),但是他們忘了自己的數(shù)據(jù)存儲(chǔ)在誰(shuí)那里了苏潜,那么這些數(shù)據(jù)就取不回來(lái)了银萍。那么該如何解決這個(gè)問(wèn)題呢?我們可以單獨(dú)拿出一臺(tái)機(jī)器用于記錄恤左,那么每當(dāng)有人要存儲(chǔ)數(shù)據(jù)的時(shí)候贴唇,都先找到這臺(tái)機(jī)器,然后這臺(tái)機(jī)器會(huì)告訴他將數(shù)據(jù)存儲(chǔ)在哪飞袋,這個(gè)詢問(wèn)的過(guò)程是很快的戳气,每個(gè)人問(wèn)完之后就會(huì)拿著數(shù)據(jù)去存儲(chǔ),然后下一個(gè)人過(guò)來(lái)接著問(wèn)...如果這個(gè)例子你能聽懂巧鸭,那么恭喜你瓶您,HDFS你已經(jīng)學(xué)會(huì)了。上述的過(guò)程其實(shí)就是指的HDFS中的NameNode和DataNode各司其職的過(guò)程蹄皱,DataNode用于存儲(chǔ)數(shù)據(jù)览闰,而NameNode用于存儲(chǔ)文件的元數(shù)據(jù)描述信息。讓我們來(lái)進(jìn)一步思考一下巷折,如果把上述例子中的文件數(shù)據(jù)換成一張一張的一百塊錢压鉴,比如有個(gè)人過(guò)來(lái)要存100塊錢,我說(shuō)你去張三那存吧锻拘,這時(shí)候我應(yīng)該立刻寫下誰(shuí)誰(shuí)誰(shuí)的100塊錢存在張三那了嗎油吭?這是不可能的,因?yàn)橛锌赡芪矣浲曛筮@個(gè)人沒(méi)去張三那存署拟,如果我記下了這筆帳婉宰,那個(gè)人回來(lái)找我取回那100塊錢,我讓他去張三那推穷,那張三就有苦說(shuō)不出了心包,這就是所謂的數(shù)據(jù)一致性問(wèn)題。數(shù)據(jù)的一致性問(wèn)題一定是要非常小心的馒铃,尤其是在分布式蟹腾、多節(jié)點(diǎn)多人協(xié)作的情況下痕惋。因此在上面的例子中,一定是要張三給我發(fā)送一個(gè)確認(rèn)的回報(bào)之后娃殖,我才能把這個(gè)100塊錢給記錄下來(lái)的值戳。HDFS就是這樣一個(gè)用多個(gè)節(jié)點(diǎn)散列未來(lái)要存儲(chǔ)的數(shù)據(jù),然后用一個(gè)主節(jié)點(diǎn)進(jìn)行記賬的分布式文件系統(tǒng)炉爆。此外堕虹,記賬這件事情,一個(gè)人可以做芬首,兩個(gè)人也可以做赴捞,但是兩個(gè)人記賬中面臨的數(shù)據(jù)一致性問(wèn)題會(huì)更加復(fù)雜(兩個(gè)人之間同步信息),因此HDFS采用了一主的架構(gòu)衩辟。

分布式文件系統(tǒng)那么多螟炫,為什么hadoop項(xiàng)目中還要開發(fā)一個(gè)hdfs文件系統(tǒng)波附?
我們知道艺晴,在hadoop項(xiàng)目里面除了hdfs文件系統(tǒng)模塊之外,還有另外一個(gè)很重要的用于計(jì)算的模塊掸屡,因此我們可以推測(cè)出封寞,hdfs一定會(huì)具備一個(gè)特征:它能更好的支持分布式計(jì)算。

2 HDFS理論知識(shí)點(diǎn)

  • 存儲(chǔ)模型
  • 架構(gòu)設(shè)計(jì)
  • 角色功能
  • 元數(shù)據(jù)持久化
  • 安全模式
  • 副本放置策略
  • 讀寫流程
  • 安全策略

2.1 存儲(chǔ)模型

  • 文件線性按字節(jié)切割成塊(block)仅财,具有offset狈究,id
    • offset就是指偏移量,文件的第一個(gè)block塊偏移量為0盏求,后續(xù)block塊的偏移量可以通過(guò)block塊的大小來(lái)計(jì)算抖锥,只要有了offset,就能把所有的block塊拼成一個(gè)完整的文件碎罚。
    • id標(biāo)識(shí)了每個(gè)block塊的名字磅废,用于映射
  • 文件與文件的block大小可以不一樣
  • 一個(gè)文件除最后一個(gè)block,其他block大小一致
    • 比如block大小為4個(gè)字節(jié)荆烈,而最后一個(gè)block塊的大小可能不夠4個(gè)字節(jié)
  • block的大小依據(jù)硬件的I/O特性調(diào)整
  • block被分散存放在集群的節(jié)點(diǎn)中拯勉,具有l(wèi)ocation(block塊所在節(jié)點(diǎn)的位置)
  • Block具有副本(replication),沒(méi)有主從概念憔购,副本不能出現(xiàn)在同一個(gè)節(jié)點(diǎn)中
    • 如果副本放在一個(gè)節(jié)點(diǎn)中宫峦,那么如果這個(gè)節(jié)點(diǎn)掛掉了,所有副本都讀取不到了
  • 副本是滿足可靠性和性能的關(guān)鍵
  • 文件上傳可以指定block大小和副本數(shù)玫鸟,上傳后只能修改副本數(shù)
  • 一次寫入多次讀取导绷,不支持修改
    • 比如在文件中增加一些內(nèi)容,這會(huì)導(dǎo)致修改位置所在的block大小變大屎飘,這時(shí)候會(huì)將這個(gè)block塊中多出來(lái)的內(nèi)容轉(zhuǎn)移到下一個(gè)block塊中妥曲,而這又會(huì)導(dǎo)致下一個(gè)block塊大小變大...這是一個(gè)泛洪的操作账蓉,這會(huì)導(dǎo)致集群中很多的節(jié)點(diǎn),它們的CPU逾一、內(nèi)存铸本、網(wǎng)卡會(huì)參與到因?yàn)橐粋€(gè)修改的事情而造成的資源的高度使用,網(wǎng)絡(luò)一直被瘋狂的傳輸數(shù)據(jù)遵堵,因此hdfs設(shè)計(jì)者做了一個(gè)折中的方案箱玷,就是hdfs作為一個(gè)文件系統(tǒng),它可以存陌宿,可以讀锡足,可以批量計(jì)算,它可以支持很多程序進(jìn)行計(jì)算壳坪,它可以讓每個(gè)程序都跑得很快舶得,但是它不支持修改。
  • 支持追加數(shù)據(jù)
    • 追加數(shù)據(jù)只是在文件的最后一個(gè)block塊中添加內(nèi)容爽蝴,或者是在文件的最后添加block塊沐批,因此是可以支持的。

無(wú)論是什么文件蝎亚,在計(jì)算機(jī)中存儲(chǔ)的都是二進(jìn)制九孩,二進(jìn)制在計(jì)算機(jī)中就是一個(gè)個(gè)二進(jìn)制位,但是在計(jì)算機(jī)中发框,一般很少用二進(jìn)制位去描述文件躺彬,而是會(huì)用字節(jié)去描述,我們看到的文件大小一般都是用字節(jié)作為單位的梅惯,文件本質(zhì)上都是字節(jié)數(shù)組宪拥。

2.2 架構(gòu)設(shè)計(jì)

  • HDFS是一個(gè)主從(Master/Slaves)架構(gòu)
  • 由一個(gè)NameNode(主)和一些DataNode(從)組成
  • 面向文件包含:文件數(shù)據(jù)(data)和文件元數(shù)據(jù)(metadata)
  • NameNode負(fù)責(zé)存儲(chǔ)和管理文件元數(shù)據(jù),并維護(hù)了一個(gè)層次型的文件目錄樹
  • DataNode負(fù)責(zé)存儲(chǔ)文件數(shù)據(jù)(block塊)铣减,并提供block的讀寫
  • DataNode與NameNode維持心跳她君,并匯報(bào)自己持有的block信息
  • Client和NameNode交互文件元數(shù)據(jù)、和DataNode交互文件block數(shù)據(jù)
HDFS架構(gòu)
塊復(fù)制

Windows和Linux文件系統(tǒng)的差異徙歼。
Windows和Linux上都會(huì)有硬盤犁河,而硬盤上都有分區(qū),在windows上分區(qū)對(duì)應(yīng)的是盤符(c盤魄梯、d盤)桨螺,這個(gè)時(shí)候如果你想要存一些目錄,需要自主去找一個(gè)分區(qū)酿秸,在分區(qū)下去存一級(jí)目錄灭翔、二級(jí)目錄,而linux中雖然也有兩個(gè)分區(qū),但是它的分區(qū)會(huì)掛載到它內(nèi)存的虛擬目錄樹結(jié)構(gòu)上肝箱,它是由一個(gè)虛擬的根起哄褒,根下的A目錄可能是你的第一個(gè)分區(qū),B目錄可能是你的第二個(gè)分區(qū)煌张。因此在你使用linux系統(tǒng)的時(shí)候呐赡,你好像感覺(jué)不到底層到底分了幾個(gè)分區(qū),而在使用windows的時(shí)候骏融,容易混亂链嘀。比如說(shuō),如果你在windows中寫了一個(gè)軟件档玻,這個(gè)軟件必須從G盤加載一個(gè)文件(conf怀泊、xml),那么這個(gè)軟件在其他人的電腦上面可能就跑不起來(lái)了误趴,因?yàn)橛械碾娔X上根本就沒(méi)有G盤霹琼,而如果你使用的是linux系統(tǒng),linux系統(tǒng)除了它的根目錄結(jié)構(gòu)之外凉当,還有它的mount掛載(/g -> disk:G分區(qū)枣申、/b -> disk:B分區(qū)),上述軟件如果是在linux系統(tǒng)上面開發(fā)的纤怒,假如它的文件加載路徑還是寫死的糯而,比如從/g目錄下加載文件,這時(shí)候其他電腦可能也沒(méi)有/g目錄泊窘,但是這時(shí)它可以創(chuàng)建一個(gè)/g目錄(可以掛載在不同的分區(qū)上,它的映射關(guān)系可以隨便換)像寒,因此linux相對(duì)于windows來(lái)說(shuō)使得軟件具備了移動(dòng)性烘豹。

2.3 角色功能

NameNode

  • 完全基于內(nèi)存存儲(chǔ)文件元數(shù)據(jù)、目錄結(jié)構(gòu)诺祸、文件block的映射
  • 需要持久化方案保證數(shù)據(jù)可靠性
  • 提供副本放置策略
    DataNode
  • 基于本地磁盤存儲(chǔ)block(文件的形式)
  • 并保存block的校驗(yàn)和數(shù)據(jù)保證block的可靠性
  • 與NameNode保持心跳携悯,匯報(bào)block列表狀態(tài)

角色即進(jìn)程。
HDFS并沒(méi)有真正存儲(chǔ)數(shù)據(jù)筷笨,只是管理映射憔鬼。

2.4 元數(shù)據(jù)持久化

  • 任何對(duì)文件系統(tǒng)元數(shù)據(jù)產(chǎn)生修改的操作,Namenode都會(huì)使用一種稱為EditsLog的事務(wù)日志記錄下來(lái)
  • 使用FsImage存儲(chǔ)內(nèi)存所有的元數(shù)據(jù)狀態(tài)
  • 使用本地磁盤保存EditsLog和FsImage
  • EditsLog具有完整性胃夏,數(shù)據(jù)丟失少轴或,但恢復(fù)速度慢,并有體積膨脹風(fēng)險(xiǎn)
  • FsImage具有恢復(fù)速度快仰禀,體積與內(nèi)存數(shù)據(jù)相當(dāng)照雁,但不能實(shí)時(shí)保存,數(shù)據(jù)丟失多
  • NameNode使用了FsImage+EditsLog整合的方案:
    • 滾動(dòng)將增量的EditsLog更新到FsImage答恶,以保證更近時(shí)點(diǎn)的FsImage和更小的EditsLog體積

數(shù)據(jù)持久化方式

  • 日志文件(文本文件):記錄(append)實(shí)時(shí)發(fā)生的增刪改操作(mkdir /abc)饺蚊,通過(guò)讀取日志文件重放每一行指令來(lái)恢復(fù)數(shù)據(jù)
    優(yōu)點(diǎn):完整性比較好
    缺點(diǎn):加載恢復(fù)數(shù)據(jù)慢萍诱、占空間
  • 鏡像、快照污呼、dump裕坊、db(二進(jìn)制文件):間隔的(小時(shí),天燕酷,10分鐘碍庵,1分鐘,5秒鐘)悟狱,內(nèi)存全量數(shù)據(jù)基于某一時(shí)間點(diǎn)做的向磁盤的溢寫
    優(yōu)點(diǎn):恢復(fù)速度快過(guò)日志文件
    缺點(diǎn):因?yàn)槭情g隔的静浴,容易丟失一部分?jǐn)?shù)據(jù)

HDFS:

  • EditsLog:日志文件
    體積小,記錄少:必然有優(yōu)勢(shì)
  • FsImage:鏡像挤渐、快照
    如果能更快的滾動(dòng)更新時(shí)點(diǎn)苹享,必然有優(yōu)勢(shì)

HDFS采用的是最近時(shí)點(diǎn)的FsImage + 增量的EditsLog的持久化方案。
比如現(xiàn)在10點(diǎn)浴麻,HDFS中記錄了9點(diǎn)的FsImage + 9點(diǎn)到10點(diǎn)的增量的EditsLog得问,那么通過(guò)以下步驟就能得到關(guān)機(jī)前的全量數(shù)據(jù):

  1. 加載FsImage
  2. 加載EditsLog

FsImage時(shí)點(diǎn)是怎么滾動(dòng)更新的?

  • 由NameNode8點(diǎn)溢寫一次软免,9點(diǎn)溢寫一次(每一小時(shí)溢寫一次宫纬,產(chǎn)生大量I/O,耗費(fèi)資源)
  • NameNode第一次開機(jī)的時(shí)候只寫一次FsImage(假設(shè)8點(diǎn))膏萧,到9點(diǎn)的時(shí)候漓骚,EditsLog記錄的是8~9點(diǎn)的日志,只需要將8~9點(diǎn)的日志的記錄榛泛,更新到8點(diǎn)的FsImage中(使用另外一臺(tái)機(jī)器:Secondary NameNode來(lái)做合并)蝌蹂,F(xiàn)sImage的數(shù)據(jù)時(shí)點(diǎn)就變成了9點(diǎn)。

2.5 安全模式

  • HDFS搭建時(shí)會(huì)格式化曹锨,格式化操作會(huì)產(chǎn)生一個(gè)空的FsImage
  • 當(dāng)NameNode啟動(dòng)時(shí)孤个,它從硬盤中讀取EditsLog和FsImage
  • 將所有EditsLog中的事務(wù)作用在內(nèi)存中的FsImage上
  • 并將這個(gè)新版本的FsImage從內(nèi)存中保存到本地磁盤上
  • 然后刪除舊的EditsLog,因?yàn)檫@個(gè)舊的EditsLog的事務(wù)都已經(jīng)作用在FsImage上了
  1. NameNode啟動(dòng)后會(huì)進(jìn)入一個(gè)稱為安全模式的特殊狀態(tài)沛简。
  2. 處于安全模式的NameNode是不會(huì)進(jìn)行數(shù)據(jù)塊的復(fù)制的齐鲤。
  3. NameNode從所有的 DatNnode接收心跳信號(hào)和塊狀態(tài)報(bào)告。
  4. 每當(dāng)NameNode檢測(cè)確認(rèn)某個(gè)數(shù)據(jù)塊的副本數(shù)目達(dá)到這個(gè)最小值椒楣,那么該數(shù)據(jù)塊就會(huì)被認(rèn)為是副本安全(safely replicated)的给郊。
  5. 在一定百分比(這個(gè)參數(shù)可配置)的數(shù)據(jù)塊被NameNode檢測(cè)確認(rèn)是安全之后(加上一個(gè)額外的30秒等待時(shí)間),NameNode將退出安全模式狀態(tài)撒顿。
  6. 接下來(lái)它會(huì)確定還有哪些數(shù)據(jù)塊的副本沒(méi)有達(dá)到指定數(shù)目丑罪,并將這些數(shù)據(jù)塊復(fù)制到其他DataNode上。

NameNode存的元數(shù)據(jù)主要有兩種:文件屬性、每個(gè)塊存在哪個(gè)DataNode上吩屹。
在持久化的時(shí)候跪另,文件屬性會(huì)持久化,但是文件的每一個(gè)塊不會(huì)持久化煤搜∶饴蹋恢復(fù)的時(shí)候,NameNode會(huì)丟失塊的位置信息擦盾。
那么為什么NameNode不持久化塊的位置信息呢嘲驾?
這就又回到了分布式時(shí)代數(shù)據(jù)一致性的問(wèn)題了,假如NameNode持久化了塊的位置信息迹卢,但是由于集群?jiǎn)?dòng)時(shí)DataNode掛掉了辽故,那么這些塊就取不回來(lái)了,這就會(huì)產(chǎn)生數(shù)據(jù)不一致的問(wèn)題腐碱,因此NameNode寧可不存塊的位置信息誊垢,而是等DataNode和NameNode建立心跳,然后向它匯報(bào)塊的信息症见,這個(gè)過(guò)程就叫安全模式喂走。

2.6 HDFS中的SNN

Secondary NameNode(SNN)

  • 在非Ha模式下,SNN一般是獨(dú)立的節(jié)點(diǎn)谋作,周期完成對(duì)NN的EditsLog向FsImage合并芋肠,減少EditsLog大小荡碾,減少NN啟動(dòng)時(shí)間
  • 根據(jù)配置文件設(shè)置的時(shí)間間隔fs.checkpoint.period 默認(rèn)3600秒
  • 根據(jù)配置文件設(shè)置edits log大小 fs.checkpoint.size 規(guī)定edits文件的最大值默認(rèn)是64MB

SNN存在的意義就是讓EditsLog很小鄙皇、恢復(fù)很快脱货。

SNN合并過(guò)程

2.7 Block的副本放置策略

  • 第一個(gè)副本:放置在上傳文件的DN氛赐;如果是集群外提交,則隨機(jī)挑選一臺(tái)磁盤不太滿袜匿,CPU不太忙的節(jié)點(diǎn)常遂。
  • 第二個(gè)副本:放置在與第一個(gè)副本不同的機(jī)架的節(jié)點(diǎn)上太示。
  • 第三個(gè)副本:與第二個(gè)副本相同機(jī)架的節(jié)點(diǎn)攒钳。
  • 更多副本:隨機(jī)節(jié)點(diǎn)。

在早期的HDFS中雷滋,第一個(gè)副本和第二個(gè)副本會(huì)放在同機(jī)架不撑,第三個(gè)副本才會(huì)出機(jī)架,這樣當(dāng)副本數(shù)設(shè)定為2的時(shí)候晤斩,如果副本所在機(jī)架掛了焕檬,會(huì)導(dǎo)致這個(gè)塊丟失,因此在2.x的時(shí)候修正了這個(gè)問(wèn)題澳泵,第二個(gè)副本放在與第一個(gè)副本不同的機(jī)架上实愚。
第二個(gè)副本和第三個(gè)副本放在同一機(jī)架是為了減少跨交換機(jī)的成本。

數(shù)據(jù)中心

2.8 HDFS讀寫流程

2.8.1 HDFS寫流程
  • Client和NN連接創(chuàng)建文件元數(shù)據(jù)
  • NN判定元數(shù)據(jù)是否有效
  • NN觸發(fā)副本放置策略,返回一個(gè)有序的DN列表
  • Client和DN建立Pipeline連接
  • Client將塊切分成packet(64KB)腊敲,并使用chunk(512B)+chucksum(4B)填充
  • Client將packet放入發(fā)送隊(duì)列dataqueue中击喂,并向第一個(gè)DN發(fā)送
  • 第一個(gè)DN收到packet后本地保存并發(fā)送給第二個(gè)DN
  • 第二個(gè)DN收到packet后本地保存并發(fā)送給第三個(gè)DN
  • 這一個(gè)過(guò)程中,上游節(jié)點(diǎn)同時(shí)發(fā)送下一個(gè)packet
  • 生活中類比工廠的流水線:結(jié)論:流式其實(shí)也是變種的并行計(jì)算
  • Hdfs使用這種傳輸方式碰辅,副本數(shù)對(duì)于client是透明的
  • 當(dāng)block傳輸完成懂昂,DN們各自向NN匯報(bào),同時(shí)client繼續(xù)傳輸下一個(gè)block
  • 所以没宾,client的傳輸和block的匯報(bào)也是并行的
HDFS寫流程

Client在與NameNode進(jìn)行交互的時(shí)候凌彬,會(huì)觸發(fā)副本放置策略,NameNode會(huì)根據(jù)副本放置策略循衰,在返回DataNode信息時(shí)做一個(gè)排序(根據(jù)距離)铲敛,Client本機(jī)上的DataNode會(huì)排在第一位。然后Client會(huì)和第一個(gè)DataNode建立tcp連接会钝,第一個(gè)DataNode和第二個(gè)DataNode建立tcp連接伐蒋,第二個(gè)DataNode和第三個(gè)DataNode建立tcp連接,這些連接鏈路被稱為pipline顽素。

DataNode如果掛掉會(huì)怎么辦?

  • 如果是第三個(gè)DataNode掛掉了咽弦,影響最小,因?yàn)榍懊鎯蓚€(gè)DataNode的pipline連接沒(méi)有斷胁出,繼續(xù)傳輸packet即可型型。
  • 如果是第二個(gè)DataNode掛掉了,那么第一個(gè)DataNode直接與第三個(gè)DataNode建立連接全蝶,然后根據(jù)第三個(gè)DataNode已經(jīng)接收的packet來(lái)向它傳輸下一個(gè)packet即可闹蒜。
  • 如果是第一個(gè)DataNode掛掉了,那么Client直接與第二個(gè)DataNode建立連接抑淫,然后把剩余的packet傳輸給第二個(gè)DataNode即可绷落。

DataNode會(huì)向NameNode匯報(bào)狀態(tài),因此在1個(gè)DataNode掛掉之后始苇,由于匯報(bào)時(shí)的DataNode少了一個(gè)砌烁,這時(shí)NameNode會(huì)讓某個(gè)DataNode從自身再?gòu)?fù)制一個(gè)DataNode出來(lái)。

2.8.2 HDFS讀流程
  • 為了降低整體的帶寬消耗和讀取延時(shí)催式,HDFS會(huì)盡量讓讀取程序讀取離它最近的副本函喉。
  • 如果在讀取程序的同一個(gè)機(jī)架上有一個(gè)副本,那么就讀取該副本荣月。
  • 如果一個(gè)HDFS集群跨越多個(gè)數(shù)據(jù)中心管呵,那么客戶端也將首先讀本地?cái)?shù)據(jù)中心的副本。
  • 語(yǔ)義:下載一個(gè)文件:
    • Client和NN交互文件元數(shù)據(jù)獲取fileBlockLocation
    • NN會(huì)按距離策略排序返回
    • Client嘗試下載block并校驗(yàn)數(shù)據(jù)完整性
  • 語(yǔ)義:下載一個(gè)文件其實(shí)是獲取文件的所有的block元數(shù)據(jù)哺窄,那么子集獲取某些block也應(yīng)該成立
    • Hdfs支持client給出文件的offset自定義連接哪些block的DN捐下,自定義獲取數(shù)據(jù)
    • 這個(gè)是支持計(jì)算層的分治账锹、并行計(jì)算的核心
HDFS讀流程
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坷襟,隨后出現(xiàn)的幾起案子奸柬,更是在濱河造成了極大的恐慌,老刑警劉巖啤握,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸟缕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡排抬,警方通過(guò)查閱死者的電腦和手機(jī)懂从,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蹲蒲,“玉大人番甩,你說(shuō)我怎么就攤上這事〗旄椋” “怎么了缘薛?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)卡睦。 經(jīng)常有香客問(wèn)我宴胧,道長(zhǎng),這世上最難降的妖魔是什么表锻? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任恕齐,我火速辦了婚禮,結(jié)果婚禮上瞬逊,老公的妹妹穿的比我還像新娘显歧。我一直安慰自己,他們只是感情好确镊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布士骤。 她就那樣靜靜地躺著,像睡著了一般蕾域。 火紅的嫁衣襯著肌膚如雪拷肌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天旨巷,我揣著相機(jī)與錄音廓块,去河邊找鬼。 笑死契沫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昔汉。 我是一名探鬼主播懈万,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拴清,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了会通?” 一聲冷哼從身側(cè)響起口予,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涕侈,沒(méi)想到半個(gè)月后沪停,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裳涛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年木张,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片端三。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舷礼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出郊闯,到底是詐尸還是另有隱情妻献,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布团赁,位于F島的核電站育拨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏欢摄。R本人自食惡果不足惜熬丧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剧浸。 院中可真熱鬧锹引,春花似錦、人聲如沸唆香。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)躬它。三九已至腾啥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冯吓,已是汗流浹背倘待。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留组贺,地道東北人凸舵。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像失尖,于是被迫代替她去往敵國(guó)和親啊奄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渐苏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354