基于Docker搭建Redis一主兩從三哨兵

基于Docker搭建Redis一主兩從三哨兵

這段時(shí)間正在學(xué)習(xí)Redis和容器相關(guān)的內(nèi)容,因此想通過(guò)docker搭建一套redis主從系統(tǒng)來(lái)加深理解牛郑《懒睿看這篇文章可能你需要一定的docker基礎(chǔ)吐辙,以及對(duì)redis主從和哨兵機(jī)制有所了解妒蔚。

這次實(shí)驗(yàn)準(zhǔn)備了三臺(tái)云主機(jī),系統(tǒng)為Debian残揉,ip分別為:35.236.172.131 胧后,35.201.200.251,34.80.172.42抱环。

首先分別在這三臺(tái)主機(jī)上安裝docker壳快,然后每臺(tái)主機(jī)上啟動(dòng)一個(gè)redis容器,運(yùn)行redis-server服務(wù)镇草,其中35.236.172.131作為master眶痰,另外兩臺(tái)機(jī)器作為slave,最后在三臺(tái)主機(jī)上再分別啟動(dòng)一個(gè)redis容器梯啤,運(yùn)行redis-sentinel竖伯。為什么還是redis容器呢?因?yàn)閟entinel實(shí)際上還是一個(gè)redis-server因宇,只不過(guò)是以sentinel模式執(zhí)行黔夭,只能處理sentinel需要的一些命令宏胯。

安裝docker

docker的安裝有很多種方法羽嫡,這里就不介紹了本姥。本次使用腳本安裝docker,Debian系統(tǒng)腳本安裝如下杭棵,其他系統(tǒng)可以參考Docker官網(wǎng)的安裝方法:docs.docker.com/install/lin…婚惫。不過(guò)下面的命令在官網(wǎng)命令的基礎(chǔ)上修改鏡像源為阿里云,因?yàn)閲?guó)內(nèi)鏡像往往會(huì)快一些魂爪。

腳本安裝docker

在物理主機(jī)或者云虛擬主機(jī)上運(yùn)行下面的命令就可以完成docker安裝了先舷,當(dāng)然我是在Debian系統(tǒng)上,其他系統(tǒng)相應(yīng)參考官網(wǎng)上的方法滓侍。

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

啟動(dòng)docker CE

docker是以客戶端和服務(wù)器模型運(yùn)行的蒋川,因此需要先運(yùn)行docker的服務(wù)器,服務(wù)器以daemon的形式運(yùn)行撩笆。docker CE是docker的社區(qū)版本捺球。

$ sudo systemctl enable docker
$ sudo systemctl start docker

驗(yàn)證docker是否安裝成功

下面的這條命令是從docker的官方倉(cāng)庫(kù)拉取一個(gè)名為hello-world的鏡像,并通過(guò)這個(gè)鏡像啟動(dòng)一個(gè)容器夕冲。

$ docker run hello-world

如果運(yùn)行結(jié)果如下氮兵,出現(xiàn)了Hello from Docker!,說(shuō)明docker安裝成功了

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:6540fc08ee6e6b7b63468dc3317e3303aae178cb8a45ed3123180328bcc1d20f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1\. The Docker client contacted the Docker daemon.
 2\. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3\. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4\. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

啟動(dòng)容器搭建主從

docker安裝成功后歹鱼,可以開(kāi)始部署redis服務(wù)了泣栈。先從docker官方公共倉(cāng)庫(kù)拉取redis鏡像,然后修改redis服務(wù)的配置文件弥姻,最后啟動(dòng)容器南片,啟動(dòng)redis服務(wù)器。在多臺(tái)機(jī)器上運(yùn)行redis服務(wù)器庭敦,并建立主從關(guān)系疼进。

redis的主從是實(shí)現(xiàn)redis集群和redis哨兵高可用的基礎(chǔ),redis的主從結(jié)構(gòu)使從可以復(fù)制主上的數(shù)據(jù)螺捐,如果從與主之間網(wǎng)絡(luò)斷開(kāi)颠悬,從會(huì)自動(dòng)重連到主上。

[圖片上傳失敗...(image-e6921f-1567675923250)]

<figcaption style="display: block; text-align: center; font-size: 1rem; line-height: 1.6; color: rgb(144, 144, 144); margin-top: 2px;"></figcaption>

獲取Redis鏡像

下面的命令會(huì)拉取最新的官方版本的redis鏡像

$ docker pull redis

查看鏡像

$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              bb0ab8a99fe6        7 days ago          95MB
hello-world         latest              fce289e99eb9        6 months ago        1.84kB

獲取并修改redis配置文件

redis官方提供了一個(gè)配置文件樣例定血,通過(guò)wget工具下載下來(lái)赔癌。我用的root用戶,就直接下載到/root目錄里了澜沟。

$ wget http://download.redis.io/redis-stable/redis.conf

打開(kāi)下載下來(lái)的文件后灾票,可以看到配置有很多。我只是搭建服務(wù)進(jìn)行試驗(yàn)所以只修改必要的幾項(xiàng)茫虽。如果要運(yùn)用到線上刊苍,那必須所有的配置都按需求進(jìn)行修改既们。

其中redis服務(wù)器的master和slave角色使用的配置文件還會(huì)有些不同,下面分別進(jìn)行說(shuō)明正什。

對(duì)于master而言啥纸,配置文件修改以下幾項(xiàng)

# 注釋這一行,表示Redis可以接受任意ip的連接
# bind 127.0.0.1 

# 關(guān)閉保護(hù)模式
protected-mode no 

# 讓redis服務(wù)后臺(tái)運(yùn)行
daemonize yes 

# 設(shè)定密碼(可選婴氮,如果這里開(kāi)啟了密碼要求斯棒,slave的配置里就要加這個(gè)密碼. 只是練習(xí)配置,就不使用密碼認(rèn)證了)
# requirepass masterpassword 

# 配置日志路徑主经,為了便于排查問(wèn)題荣暮,指定redis的日志文件目錄
logfile "/var/log/redis/redis.log"

對(duì)于slave而言,配置文件修改以下幾項(xiàng):

# 注釋這一行罩驻,表示Redis可以接受任意ip的連接
# bind 127.0.0.1 

# 關(guān)閉保護(hù)模式
protected-mode no 

# 讓redis服務(wù)后臺(tái)運(yùn)行
daemonize yes 

# 設(shè)定密碼(可選穗酥,如果這里開(kāi)啟了密碼要求,slave的配置里就要加這個(gè)密碼)
requirepass masterpassword 

# 設(shè)定主庫(kù)的密碼惠遏,用于認(rèn)證砾跃,如果主庫(kù)開(kāi)啟了requirepass選項(xiàng)這里就必須填相應(yīng)的密碼
masterauth <master-password>

# 設(shè)定master的IP和端口號(hào),redis配置文件中的默認(rèn)端口號(hào)是6379
# 低版本的redis這里會(huì)是slaveof爽哎,意思是一樣的蜓席,因?yàn)閟lave是比較敏感的詞匯,所以在redis后面的版本中不在使用slave的概念课锌,取而代之的是replica
# 將35.236.172.131做為主厨内,其余兩臺(tái)機(jī)器做從。ip和端口號(hào)按照機(jī)器和配置做相應(yīng)修改渺贤。
replicaof 35.236.172.131 6379

# 配置日志路徑雏胃,為了便于排查問(wèn)題,指定redis的日志文件目錄
logfile "/var/log/redis/redis.log"

啟動(dòng)容器

分別在主機(jī)和從機(jī)上按照上面的方法建立好配置文件志鞍,檢查無(wú)誤后就可以開(kāi)始啟動(dòng)容器了瞭亮。

我們?cè)谌_(tái)機(jī)器上分別將容器別名指定為redis-1, redis-2, redis-3,這樣便于區(qū)分與說(shuō)明固棚,docker通過(guò)--name參數(shù)來(lái)指定容器的別名统翩。redis-1是master上容器的別名,redis-2和redis-3是兩個(gè)slave上的別名此洲。

下面以運(yùn)行redis-3容器為例說(shuō)明容器的啟動(dòng)過(guò)程厂汗。另外兩臺(tái)機(jī)器上的容器redis-1和redis-2操作是相同的,只是要注意master的配置文件和slave不同呜师。不過(guò)首先要啟動(dòng)主服務(wù)器娶桦,也就是redis-1容器。然后再啟動(dòng)redis-2和redis-3。

# 首先以后臺(tái)模式運(yùn)行容器
$ docker run -it --name redis-3 -v /root/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6379:6379 redis /bin/bash
# 容器成功啟動(dòng)后衷畦,會(huì)打印一個(gè)長(zhǎng)串的容器ID
a3952342094dfd5a56838cb6becb5faa7a34f1dbafb7e8c506e9bd7bb1c2951b
# 通過(guò)ps命令查看容器的狀態(tài)栗涂,可以看到redis-3已經(jīng)啟動(dòng)
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a3952342094d        redis               "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        0.0.0.0:6379->6379/tcp   redis-3

上面已經(jīng)啟動(dòng)了容器,接下來(lái)進(jìn)入容器里啟動(dòng)redis服務(wù)器祈争。

# 以交互模式進(jìn)入容器redis-3
$ docker exec -it redis-3 bash

# 創(chuàng)建日志文件目錄
$ mkdir /var/log/redis/
$ touch /var/log/redis/redis.log

# 啟動(dòng)redis服務(wù)器斤程,如果沒(méi)有任何輸出,就說(shuō)明成功了
$ redis-server /usr/local/etc/redis/redis.conf

# 在容器里啟動(dòng)一個(gè)redis客戶端
$ redis-cli 

# 執(zhí)行info命令铛嘱,查看服務(wù)器狀態(tài)
127.0.0.1:6379> info
...
# 如果是主暖释,這里的role的值會(huì)是master,如果是從墨吓,這里的role的值會(huì)是slave
role:slave
# 對(duì)于slave,還要查看master_link_status這個(gè)屬性值纹磺。slave上這個(gè)屬性值為up就說(shuō)明主從復(fù)制是OK的帖烘,否者就有問(wèn)題。如果從機(jī)狀態(tài)不為up橄杨,首先排查主機(jī)的端口是否被限秘症,然后查看redis日志排查原因
master_link_status:up
...

# 最后退出容器
$ exit

驗(yàn)證主從復(fù)制

主從搭建成功后,可以通過(guò)在master上寫(xiě)入一個(gè)key-value值式矫,查看是否會(huì)同步到slave上乡摹,來(lái)驗(yàn)證主從同步是否能成功。

# 以交互模式進(jìn)入容器redis-1中
$ docker exec -it redis-1 bash

運(yùn)行一個(gè)redis-cli采转,向test_key寫(xiě)入一個(gè)值

$ redis-cli
127.0.0.1:6379> set test_key hello-world
OK

在任意slave機(jī)器上進(jìn)入容器聪廉,也運(yùn)行一個(gè)redis-cli,查詢這個(gè)key的值故慈。如果能查詢到這個(gè)值板熊,且與主機(jī)上的值相同,說(shuō)明主從同步成功察绷。經(jīng)測(cè)試干签,主動(dòng)同步成功。

127.0.0.1:6379> get test_key 
"hello-world"

添加哨兵

主從結(jié)構(gòu)搭建成功了拆撼,系統(tǒng)的可用性變高了容劳,但是如果主發(fā)生故障,需要人工手動(dòng)切換從機(jī)為主機(jī)闸度。這種切換工作不僅浪費(fèi)人力資源竭贩,更大的影響是主從切換期間這段時(shí)間redis是無(wú)法對(duì)外提供服務(wù)的。因此筋岛,哨兵系統(tǒng)被開(kāi)發(fā)出來(lái)了娶视,哨兵可以在主發(fā)生故障后,自動(dòng)進(jìn)行故障轉(zhuǎn)移,從從機(jī)里選出一臺(tái)升級(jí)為主機(jī)肪获,并持續(xù)監(jiān)聽(tīng)著原來(lái)的主機(jī)寝凌,當(dāng)原來(lái)的主機(jī)恢復(fù)后,會(huì)將其作為新主的從機(jī)孝赫。

哨兵先監(jiān)聽(tīng)主较木,通過(guò)對(duì)主發(fā)送info命令,獲取到從的信息青柄,然后也會(huì)監(jiān)聽(tīng)到從伐债。另外哨兵都會(huì)像主訂閱sentinel:hello頻道,當(dāng)有新的哨兵加入時(shí)致开,會(huì)向這個(gè)頻道發(fā)送一條信息峰锁,這條信息包含了該哨兵的IP和端口等信息,那么其他已經(jīng)訂閱了該頻道的哨兵就會(huì)收到這條信息双戳,就知道有一個(gè)新的哨兵加入虹蒋。這些哨兵會(huì)與新加入和哨兵建立連接,選主是需要通過(guò)這個(gè)連接來(lái)進(jìn)行投票飒货。這個(gè)關(guān)系可以用下面這個(gè)圖來(lái)描述

[圖片上傳失敗...(image-27553a-1567675923250)]

<figcaption style="display: block; text-align: center; font-size: 1rem; line-height: 1.6; color: rgb(144, 144, 144); margin-top: 2px;"></figcaption>

獲取并修改sentinel配置文件

通過(guò)wget命令獲取sentinel的配置文件

wget http://download.redis.io/redis-stable/sentinel.conf

修改配置文件以下幾項(xiàng)

# 讓sentinel服務(wù)后臺(tái)運(yùn)行
daemonize yes 

# 修改日志文件的路徑
logfile "/var/log/redis/sentinel.log"

# 修改監(jiān)控的主redis服務(wù)器
# 最后一個(gè)2表示魄衅,兩臺(tái)機(jī)器判定主被動(dòng)下線后,就進(jìn)行failover(故障轉(zhuǎn)移)
sentinel monitor mymaster 35.236.172.131 6379 2

啟動(dòng)容器

與啟動(dòng)redis容器類(lèi)似塘辅,啟動(dòng)一個(gè)別名為sentinel的容器

$ docker run -it --name sentinel -p 26379:26379 -v /root/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis /bin/bash

運(yùn)行哨兵

# 進(jìn)入容器
$ docker exec -it sentinel bash

# 創(chuàng)建日志目錄和文件
$ mkdir /var/log/redis
$ touch /var/log/redis/sentinel.log

# 啟動(dòng)哨兵
redis-sentinel /usr/local/etc/redis/sentinel.conf 

# 查看日志晃虫,哨兵成功監(jiān)聽(tīng)到一主和兩從的機(jī)器
18:X 11 Jul 2019 13:25:55.416 # +monitor master mymaster 35.236.172.131 6379 quorum 2
18:X 11 Jul 2019 13:25:55.418 * +slave slave 35.201.200.251:6379 35.201.200.251 6379 @ mymaster 35.236.172.131 6379
18:X 11 Jul 2019 13:25:55.421 * +slave slave 34.80.172.42:6379 34.80.172.42 6379 @ mymaster 35.236.172.131 6379

在另外兩臺(tái)機(jī)器上按照同樣的方法在一個(gè)容器中運(yùn)行sentinel,sentinel都使用相同的配置文件扣墩。

驗(yàn)證failover(故障轉(zhuǎn)移)

為了驗(yàn)證哨兵機(jī)制下的自動(dòng)主從切換哲银,我們將主上的redis進(jìn)程kill掉。

稍等幾秒鐘后沮榜,就有另外一臺(tái)從升級(jí)為主機(jī)盘榨,實(shí)驗(yàn)時(shí)是第三臺(tái)機(jī)器,也就是redis-3升級(jí)為了主蟆融,用info命令查詢可以看到redis-3服務(wù)器的角色變成的master草巡。說(shuō)明自動(dòng)主從切換成功。

127.0.0.1:6379> info
...
# Replication
role:master
...

然后重新啟動(dòng)之前被kill掉的master服務(wù)器型酥,啟動(dòng)后用info命令查看山憨,可以發(fā)現(xiàn)其變成了redis-3的從服務(wù)器。

下面這段日志弥喉,描述了35.236.172.131作為主啟動(dòng)郁竟,執(zhí)行故障轉(zhuǎn)移的master sentinel選舉,執(zhí)行故障轉(zhuǎn)移由境,建立新的主從關(guān)系棚亩。

root@4355ca3260c5:/var/log/redis# cat sentinel.log 
17:X 11 Jul 2019 13:25:55.395 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
17:X 11 Jul 2019 13:25:55.395 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=17, just started
17:X 11 Jul 2019 13:25:55.395 # Configuration loaded
18:X 11 Jul 2019 13:25:55.398 * Running mode=sentinel, port=26379.
18:X 11 Jul 2019 13:25:55.398 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
18:X 11 Jul 2019 13:25:55.416 # Sentinel ID is 7d9a7877d4cffb6fec5877f605b975e00e7953c1
18:X 11 Jul 2019 13:25:55.416 # +monitor master mymaster 35.236.172.131 6379 quorum 2
18:X 11 Jul 2019 13:25:55.418 * +slave slave 35.201.200.251:6379 35.201.200.251 6379 @ mymaster 35.236.172.131 6379
18:X 11 Jul 2019 13:25:55.421 * +slave slave 34.80.172.42:6379 34.80.172.42 6379 @ mymaster 35.236.172.131 6379
18:X 11 Jul 2019 13:26:25.460 # +sdown slave 35.201.200.251:6379 35.201.200.251 6379 @ mymaster 35.236.172.131 6379
18:X 11 Jul 2019 14:04:23.390 * +sentinel sentinel 09aa7d2098ad2dc52e6e07d7bc6670f00f5ff3e3 172.17.0.3 26379 @ mymaster 35.236.172.131 6379
18:X 11 Jul 2019 14:04:25.418 * +sentinel-invalid-addr sentinel 09aa7d2098ad2dc52e6e07d7bc6670f00f5ff3e3 172.17.0.3 26379 @ mymaster 35.236.172.131 6379
18:X 11 Jul 2019 14:04:25.418 * +sentinel sentinel 7d9a7877d4cffb6fec5877f605b975e00e7953c1 172.17.0.3 26379 @ mymaster 35.236.172.131 6379
18:X 11 Jul 2019 14:04:25.456 * +sentinel-address-switch master mymaster 35.236.172.131 6379 ip 172.17.0.3 port 26379 for 09aa7d2098ad2dc52e6e07d7bc6670f00f5ff3e3
18:X 11 Jul 2019 14:08:34.338 * +sentinel-invalid-addr sentinel 09aa7d2098ad2dc52e6e07d7bc6670f00f5ff3e3 172.17.0.3 26379 @ mymaster 35.236.172.131 6379
18:X 11 Jul 2019 14:08:34.338 * +sentinel sentinel 28d3c0e636fa29ac9fb5c3cc2be00432c1b0ead9 172.17.0.3 26379 @ mymaster 35.236.172.131 6379
18:X 11 Jul 2019 14:08:36.236 * +sentinel-address-switch master mymaster 35.236.172.131 6379 ip 172.17.0.3 port 26379 for 09aa7d2098ad2dc52e6e07d7bc6670f00f5ff3e3
18:X 11 Jul 2019 14:11:12.151 # +sdown master mymaster 35.236.172.131 6379
18:X 11 Jul 2019 14:11:12.214 # +odown master mymaster 35.236.172.131 6379 #quorum 4/2
18:X 11 Jul 2019 14:11:12.214 # +new-epoch 1
18:X 11 Jul 2019 14:11:12.214 # +try-failover master mymaster 35.236.172.131 6379
18:X 11 Jul 2019 14:11:12.235 # +vote-for-leader 7d9a7877d4cffb6fec5877f605b975e00e7953c1 1
18:X 11 Jul 2019 14:11:12.235 # 7d9a7877d4cffb6fec5877f605b975e00e7953c1 voted for 7d9a7877d4cffb6fec5877f605b975e00e7953c1 1
18:X 11 Jul 2019 14:11:12.235 # 28d3c0e636fa29ac9fb5c3cc2be00432c1b0ead9 voted for 7d9a7877d4cffb6fec5877f605b975e00e7953c1 1
18:X 11 Jul 2019 14:11:12.235 # 09aa7d2098ad2dc52e6e07d7bc6670f00f5ff3e3 voted for 7d9a7877d4cffb6fec5877f605b975e00e7953c1 1
18:X 11 Jul 2019 14:11:12.294 # +elected-leader master mymaster 35.236.172.131 6379
18:X 11 Jul 2019 14:11:12.294 # +failover-state-select-slave master mymaster 35.236.172.131 6379
18:X 11 Jul 2019 14:11:12.394 # -failover-abort-no-good-slave master mymaster 35.236.172.131 6379
18:X 11 Jul 2019 14:11:12.453 # Next failover delay: I will not start a failover before Thu Jul 11 14:17:12 2019
18:X 11 Jul 2019 14:11:13.050 # +config-update-from sentinel 28d3c0e636fa29ac9fb5c3cc2be00432c1b0ead9 172.17.0.3 26379 @ mymaster 35.236.172.131 6379
18:X 11 Jul 2019 14:11:13.050 # +switch-master mymaster 35.236.172.131 6379 34.80.172.42 6379
18:X 11 Jul 2019 14:11:13.050 * +slave slave 35.201.200.251:6379 35.201.200.251 6379 @ mymaster 34.80.172.42 6379
18:X 11 Jul 2019 14:11:13.050 * +slave slave 35.236.172.131:6379 35.236.172.131 6379 @ mymaster 34.80.172.42 6379
18:X 11 Jul 2019 14:11:43.077 # +sdown slave 35.236.172.131:6379 35.236.172.131 6379 @ mymaster 34.80.172.42 6379
18:X 11 Jul 2019 14:11:43.077 # +sdown slave 35.201.200.251:6379 35.201.200.251 6379 @ mymaster 34.80.172.42 6379
18:X 12 Jul 2019 01:54:05.142 # -sdown slave 35.236.172.131:6379 35.236.172.131 6379 @ mymaster 34.80.172.42 6379
18:X 12 Jul 2019 01:54:15.087 * +convert-to-slave slave 35.236.172.131:6379 35.236.172.131 6379 @ mymaster 34.80.172.42 6379

總結(jié)

redis通過(guò)主從復(fù)制來(lái)實(shí)現(xiàn)高可用蓖议,但是發(fā)生故障時(shí)需要人工進(jìn)行主從切換,效率低下讥蟆。哨兵機(jī)制實(shí)現(xiàn)了redis主從的自動(dòng)切換勒虾,提高了redis集群的可用性,提高了redis集群的故障轉(zhuǎn)移效率瘸彤。

?著作權(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)離奇詭異中贝,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)潭陪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)雄妥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人依溯,你說(shuō)我怎么就攤上這事∥猎颍” “怎么了黎炉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)醋拧。 經(jīng)常有香客問(wèn)我慷嗜,道長(zhǎng),這世上最難降的妖魔是什么丹壕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任庆械,我火速辦了婚禮,結(jié)果婚禮上菌赖,老公的妹妹穿的比我還像新娘缭乘。我一直安慰自己,他們只是感情好琉用,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布堕绩。 她就那樣靜靜地躺著,像睡著了一般邑时。 火紅的嫁衣襯著肌膚如雪奴紧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天晶丘,我揣著相機(jī)與錄音黍氮,去河邊找鬼唐含。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沫浆,可吹牛的內(nèi)容都是我干的捷枯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼件缸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铜靶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起他炊,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤争剿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后痊末,有當(dāng)?shù)厝嗽跇?shù)林里發(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
  • 文/蒙蒙 一渤闷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脖镀,春花似錦飒箭、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至卷员,卻和暖如春盈匾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毕骡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工削饵, 沒(méi)想到剛下飛機(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)容