帶你自行搭建虛擬機和Redis集群環境,值得收藏!

前言:


我們看到分析 Redis 使用或原理的文章不少,但是完整搭建一套獨立的 redis 集群環境的介紹,并不是很多或者說還不夠詳細。

那么,本文會手把手帶著大家搭建一套 Redis 集群環境,Redis 集群在公司內部生產環境,大都是使用 Linux 操作系統搭建的。

所以,本文也帶領大家搭建一套虛擬機環境,虛擬機中安裝 Linux,常用的 Linux 操作系統如 Ubuntu、CentOS、Redhat等等。

正好我的筆記本上以前下載過 CentOS 鏡像,所以咱們就使用 CentOS 來安裝操作系統,步驟也很簡單,下面會具體介紹。

搭建虛擬機環境:


如果你在公司,也可以使用公司內部現成的虛擬機來安裝,但是如果你不在公司了,因為公司環境本身的限制,可能你得連接公司的VPN才可以訪問公司內的服務器,并不是很方便。

所以,不如自己本機搭建個虛擬機環境,只要有操作系統鏡像,任由你安裝,使用和管理起來都比較方便。

本人使用的 MAC OS,MAC OS 本身就是 Unix 內核的桌面版操作系統,所以如果你的電腦是 MAC,也可以直接搭建 Redis 集群了,但是目前來看大部分同學還是使用 Windows 操作系統的居多,考慮到這一點,還是安裝個虛擬機更為方便。

虛擬機可以選擇 Oracle 開源的免費虛擬機軟件 VirtualBox,我在使用過程中目前暫時沒有發現 MAC OS 上有什么問題。

下面介紹下 VirtualBox 的安裝和配置步驟:

VirtualBox 很傻瓜式,非常簡單的,鑒于有的人并不是都用過,所以這里也一并介紹下。

1)官網下載并安裝

到官網下載對應你電腦操作系統的 VirtualBox 軟件。

下載地址:https://www.virtualbox.org/wiki/Downloads

目前OS X的最新版本:VirtualBox-6.0.14-133895-OSX.dmg

下載后雙擊直接安裝。

2)新建虛擬機

這里選擇的「專家模式」創建,如果選擇「向導模式」(默認),安裝過程會有很多提示信息。

新建虛擬機

內存按照默認選擇 1024M 創建,虛擬硬盤默認 VDI,指使用 VirtualBox 的磁盤鏡像。

新建虛擬機

Linux 鏡像默認虛擬硬盤大小為 8g,如果要安裝 windows 虛擬機,虛擬硬盤大小默認建議申請 32g 的磁盤空間。

點擊「創建」完成虛擬機的創建,此時還沒有提示選擇操作系統鏡像的安裝。

3)配置虛擬機

顯示縮放率調整:

本人的電腦使用默認縮放率 100%,窗口很小,進入到全局設置中,點擊「顯示」調整縮放率如 200% 左右,你可以根據窗口大小自行調整。

顯示縮放率

虛擬機網卡配置:

進入「網絡」,連接方式選擇「橋接網卡」,注意當你換了 wifi 環境,需要重新配置網絡 IP 等。

網絡配置

4)安裝操作系統

新建完虛擬機,右側界面上點擊「啟動」,界面如下所示:

安裝操作系統

選擇本地準備好的 CentOS Linux 操作系統鏡像文件,點擊「創建」開始安裝過程。

安裝過程的注意點,選擇語言,默認 English,時區選擇 Asia Shanghai,選擇 INSTALLATION DESTINATION 默認自動分區。

以上確定后,點擊「Begin Installation」開始安裝,下一步可以設置 root 賬號密碼。

完成安裝后系統會自動重啟,重啟后輸入剛剛設置的 root 密碼登錄,進入到虛擬機中。

5)虛擬機環境配置

編輯 ifcfg-enp0s3 文件:

vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

# 修改ONBOOT為yes
ONBOOT=yes

設置靜態 IP 地址:

# 默認dhcp修改為static
BOOTPROTO=static
# 靜態IP地址
IPADDR=192.168.0.111
# 你的wifi網絡子網掩碼
NETMASK=255.255.255.0 
# 你的wifi網絡網關地址
GATEWAY=192.168.0.1 

重啟網絡:

service network restart

配置 DNS:

# 檢查 NetManager 狀態:
systemctl status NetworkManager.service
# 檢查 NetManager 管理的網絡接口:
nmcli dev status 
# 檢查 NetManager 管理的網絡連接:
nmcli connection show
# 設置 dns:
nmcli con mod enp0s3 ipv4.dns "114.114.114.114 8.8.8.8"
# 讓 dns 配置生效:
nmcli con up enp0s3

配置 hosts:

編輯hosts文件,可以用于 ssh 免密配置。

vi /etc/hosts

# 本機 hosts 配置
192.168.0.111 host01
# 其他主機 hosts 配置
192.168.0.112 host02

關閉防火墻:
默認開啟,啟動一些軟件會導致網絡無法互通

systemctl stop firewalld.service
systemctl disable firewalld.service

配置 yum:

yum 為軟件包管理工具

yum clean all
# 服務器的包下載的本地緩存
yum makecache
yum install -y wget

此時,你登錄到虛擬機中,執行 ifconfig 看不到網卡信息,net-tools 工具包安裝一下。

yum install -y net-tools

安裝 JDK:

安裝方式很多,如果有 rpm 包,可以 wget 下載下來。

執行 rpm 安裝命令:

rpm -ivh jdk-8u131-linux-x64.rpm

配置好 JDK 環境:

vi ~/ .bashrc
export JAVA_HOME=/usr/java/latest
export PATH=$PATH:$JAVA_HOME/bin
source .bashrc

檢查安裝是否成功:java -version 正常顯示JDK版本信息表示安裝正常。

6)其他虛擬機節點安裝

VirtualBox 提供了虛擬機克隆功能,安裝好一臺虛擬機操作系統,通過「復制」快速的創建多臺相同操作系統的虛擬機。

克隆虛擬機

復制后修改下虛擬機名稱,正常啟動后,修改下靜態 IP 地址和 hosts 配置,參考步驟5。

7)ssh 免密互信配置

ssh 互信配置后,可以通過 ssh 后跟 IP 或 主機名無需輸入密碼就能登錄到服務器上去,運維過程中非常常用的一個配置。

執行命令:

# 生成本機的公私秘鑰對
ssh-keygen -t rsa

將公鑰復制為 authorized_keys 文件,此時使用 ssh 連接本機就不需要輸入密碼了。

cd /root/.ssh
cp id_rsa.pub authorized_keys

使用 ssh-copy-id -i hostname 命令將本機的公鑰拷貝到指定機器的 authorized_keys 文件中。

比如你在 host01 機器上,以后就可以直接通過 ssh host02 命令登錄到 host02 機器上了,不需要再次輸入密碼了。

Redis集群環境搭建:

Redis 集群簡介:

Redis 是一個開源的 key-value 分布式存儲系統,由于其出眾的性能,大部分互聯網企業將其用來作為服務端分布式緩存使用。Redis 在 3.0 以前僅支持單實例模式,也支持主從模式、哨兵模式來達到高可用,避免單點故障。在 3.0 版本以后推出了集群模式,更好的滿足業務需求。

Redis 集群采用 P2P 模式,完全去中心化。將所有 Key 分成了 16384 個 slot,每個 Redis 實例負責其中一部分 slot。集群節點之間定期同步數據保持數據一致性。然后,Redis 客戶端可以向任一 Redis 實例發起請求,如果所需數據在該實例中不存在,則會通過重定向命令引導客戶端訪問所需的其他實例。

本文基于 Redis4.0.1 版本搭建集群。

當然,如果你有 Docker 或 K8S 環境,直接從鏡像倉庫拉取現成的 Redis 鏡像后,通過一些參數配置啟動后,就可以很快的搭建一套集群環境。

但這種方式使用對你來說是黑盒的,也就是安裝過程你是了解不到的。

為了大家方便學習了解,我們還是使用原始的,通過安裝包的形式來部署 Redis。

我們準備三臺虛擬機,搭建一個三主三從的 Redis 集群。

Redis集群

Redis 目前最新版本到了 5.0.6,本次安裝使用了 Redis4.0.1 版本,Redis4.0 版本也是目前很多企業在用的,經過生產環境大量驗證的版本,比較穩定。

搭建集群過程如下:

1)下載并安裝

下載安裝包:

# wget下載安裝包
wget http://download.redis.io/releases/redis-4.0.14.tar.gz
# 解壓縮
tar xzf redis-4.0.14.tar.gz
# 重命名為redis,并拷貝到/usr/local目錄
mv redis-4.0.14 redis
cp -r redis /usr/local

安裝依賴包:

yum install -y tcl gcc zlib-devel openssl-devel

編譯:

make MALLOC=libc

將常用命令添加到系統PATH:

cp -a /usr/local/redis/src/redis-server 
/usr/local/redis/src/redis-cli 
/usr/local/redis/src/redis-sentinel 
/usr/local/redis/src/redis-trib.rb 
/usr/local/redis/src/redis-check-aof 
/usr/local/redis/src/redis-check-rdb 
/usr/local/redis/src/redis-benchmark 
/usr/local/bin/

這樣就可以直接在服務器上任意目錄使用命令了。

2)集群目錄創建并添加配置

創建 Redis 集群目錄:

mkdir -p /opt/redis-cluster/nodes-{7001,7002}

執行命令后,在 /opt/redis-cluster 目錄會創建 nodes-7001 和 nodes-7002 兩個目錄。

在上述兩個目錄下新建 redis.conf 文件,添加文件內容:

# 當前機器IP地址綁定設置port
bind 192.168.0.111
# redis 監聽端口
port 7001 
# 使用 yes 啟用守護進程
daemonize yes
# 當 Redis 以守護進程方式運行時,Redis 默認會把 pid
pidfile redis_7001.pid 
# 日志記錄級別,共4個級別:debug、verbose、notice(默認)、warning
loglevel notice
# 日志目錄
logfile "/opt/redis-cluster/nodes-7001/redis_7001.log" 
# 本地數據庫存放目錄
dir /opt/redis-cluster/nodes-7001/ 
# 保存節點配置,自動創建,自動更新
cluster-config-file nodes-7001.conf
# 通過upstart和systemd管理Redis守護進程,與具體的操作系統相關的
supervised no
# 每次更新操作后進行日志記錄,默認:no
appendonly yes
# 開啟集群模式
cluster-enabled yes
# 集群超時時間,節點超過這個時間沒反應就斷定是宕機
cluster-node-timeout 15000
# 多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合
save 900 1
save 300 10
save 60 10000
# 本地數據庫的名字
dbfilename dump.rdb
# 存儲到本地文件開啟壓縮,默認:yes
rdbcompression yes
# 更新日志文件名
appendfilename "appendonly.aof"
# 指定更新日志條件:
# no: 等操作系統進行數據緩存同步到磁盤(快)
# always: 每次更新操作后手動調用 fsync() 將數據寫磁盤(慢,安全)
# everysec: 每秒同步一次(折中,默認值)
appendfsync everysec
# 密碼暫未設置,給出配置
# 當 master 服務設置了密碼保護時,slav 服務連接 master 的密碼
#masterauth 
# 連接密碼,客戶端需使用AUTH <password>命令連接
#requirepass

其他參數可自行查閱官網文檔。

3)下載并安裝 ruby

搭建 Redis 集群會使用到 redis-trib.rb 腳本來協助創建,所以需要依賴 ruby。

當然,三臺虛擬機都可以安裝,或者你選擇其中一臺虛擬機安裝,并記住它,到時就從這臺機器上執行命令來創建 Redis 集群。

我們使用的 Centos 7 操作系統,默認沒有帶 ruby,所以需要單獨下載安裝。

下載并安裝 ruby:

# wget下載ruby安裝包
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.4.tar.gz
# 解壓縮
tar xzf ruby-2.3.4.tar.gz
# 拷貝到/usr/local目錄下,重命名為ruby目錄
mv ruby-2.3.4 /usr/local/ruby
# 編譯
cd /usr/local/ruby/ && ./configure && mark && make install
# 查看下安裝的版本
ruby -v

如果你的 ruby 版本過低,卸載重裝:

ruby -v
rpm -qa | grep ruby
yum erase ruby

安裝 ruby-redis.gem:

# 安裝 ruby-redis.gem
cd /usr/local/redis && gem install redis

安裝過程如果報錯如下:

ERROR: Loading command: install (LoadError) cannot load such file -- zlib ERROR: While executing gem ... (NoMethodError) undefined method invoke_with_build_args for nil:NilClass

解決辦法:

cd /usr/local/ruby/ext/zlib
ruby extconf.rb 
make && make install

再次執行 gem install redis,如果報錯如下:

ERROR: While executing gem ... (Gem::Exception) Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources

解決辦法:

cd /usr/local/ruby/ext/openssl
ruby extconf.rb
將上個步驟生成的MakeFile文件中的${top_srcdir}都替換為../..
make && make install

3)其他兩臺虛擬機上重復上述步驟1和2

請記得修改下 redis.conf 文件的端口:

不需要一個個端口修改,編輯文件

vi redis.conf

直接輸入如下命令:

:%s/7001/7002/g

就可以批量將 7001 修改為 7002,然后輸入 :wq! 退出保存。

4)創建 Redis 集群

使用 redis-trib.rb 腳本創建 Redis 集群,執行如下命令后,會自動分配集群中的 3 個 master 和 3 個 slave。

cd /usr/local/redis/src
./redis-trib.rb create --replicas 1 192.168.0.111:7001 192.168.0.111:7002 192.168.0.112:7001 192.168.0.112:7002 192.168.0.113:7001 192.168.0.113:7002

創建集群過程中遇到:

>>>Creating cluster [ERR] Sorry, can't connect to node 192.168.0.111:7001

解決辦法:

關閉防火墻,上文中也已提到過。

安裝集群執行結果示例:

Redis集群安裝

輸入yes,回車,如下示例:

Redis集群安裝

我們從圖中看到了,三個 M(Master)分配了三臺虛擬機的 7001 端口,三個 S(Slave)分配了三臺虛擬機的 7002 端口。

如果虛擬機重啟后,需要再次創建 Redis 集群或者集群中新增節點,可能遇到如下問題:

 ./redis-trib.rb create --replicas 1 192.168.0.111:7001 192.168.0.111:7002 192.168.0.112:7001 192.168.0.112:7002 192.168.0.113:7001 192.168.0.113:7002
>>> Creating cluster
[ERR] Node 192.168.0.111:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

解決方法:

刪除節點下面的 dump.rdb、appendonly.aof、nodes-7001.conf 文件,并重啟 Redis。

cd /opt/redis-cluster/nodes-7001 && rm -rf dump.rdb appendonly.aof nodes-7001.conf 
cd /opt/redis-cluster/nodes-7002 && rm -rf dump.rdb appendonly.aof nodes-7002.conf 
# 重啟redis,開機自啟動,下文中會有詳細描述
service redis restart

如果是新增節點,除執行上述命令外,可能會需要登錄到節點上刪除數據庫。

redis-cli -c -h 192.168.0.114 -p 7001
192.168.0.114:7001> flushall
OK

5)測試 Redis 集群

為了測試方便,暫時沒有設置集群密碼,在上文配置中也有提到了密碼設置參數。

使用 redis-cli 客戶端登錄:

# 直接通過redis-cli命令連接
redis-cli -c -h 192.168.0.111 -p 7001
192.168.0.111:7001> set name zhangsan
-> Redirected to slot [5798] located at 192.168.0.112:7001
OK
192.168.0.112:7001> get name
"zhangsan"

找到其他節點任一 IP 和端口連接查詢這個 key:

redis-cli -c -h 192.168.0.113 -p 7001
192.168.0.113:7001> get name
-> Redirected to slot [5798] located at 192.168.0.112:7001
"zhangsan"

說明我們測試的數據在集群之間同步完成了。

查看下集群配置信息:

# redis-cli命令連接節點
redis-cli -c -h 192.168.0.111 -p 7001
# 執行 CLUSTER nodes,看到了集群節點分配的信息
192.168.0.112:7001> CLUSTER nodes
f3b21c6377853c8da63ac6a55fecb1937715ec3b 192.168.0.111:7002@17002 slave 6e81b09991104bf09129aa2bbd226d94d3fcdbe7 0 1574004839302 3 connected
75dec349e2b7fcbcad4d5f5d7979aadefdf69514 192.168.0.113:7002@17002 slave d32ab53d8f93661b09a3c31513fce8c4ed6cbf2b 0 1574004838284 6 connected
6388d80cd9f0a1fbf03d0ac2a309cfedfdb79dc4 192.168.0.111:7001@17001 master - 0 1574004836251 1 connected 0-5460
59f25e64a8ab1fc3309e15d51ea630f439793a94 192.168.0.112:7002@17002 slave 6388d80cd9f0a1fbf03d0ac2a309cfedfdb79dc4 0 1574004840322 1 connected
d32ab53d8f93661b09a3c31513fce8c4ed6cbf2b 192.168.0.113:7001@17001 master - 0 1574004839000 5 connected 10923-16383
6e81b09991104bf09129aa2bbd226d94d3fcdbe7 192.168.0.112:7001@17001 myself,master - 0 1574004837000 3 connected 5461-10922
# 執行 CLUSTER info,看到集群自身的信息
192.168.0.112:7001> CLUSTER info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:3
cluster_stats_messages_ping_sent:1256
cluster_stats_messages_pong_sent:1275
cluster_stats_messages_meet_sent:3
cluster_stats_messages_sent:2534
cluster_stats_messages_ping_received:1273
cluster_stats_messages_pong_received:1259
cluster_stats_messages_meet_received:2
cluster_stats_messages_received:2534

6)設置開機自啟動

由于咱們使用的虛擬機,不用的時候可以直接關機,避免一直占用著系統的資源。

當重啟虛擬機的時候,如果你不嫌繁瑣,可以登錄到虛擬機里,直接運行 redis-server 命令啟動服務。

更為優雅的方式,當然是開機后自動啟動 Redis 服務,這也是生產環境上,研發或運維都必須要關注的,服務器重啟,對應的服務也要跟著自動啟動,而不需要人為手動干預了。

進入 /etc/init.d/ 目錄,創建并編輯 redis 文件:

#!/bin/bash
#chkconfig: 22345 10 90
#description: Start and Stop redis

IP=`ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d '/'`

REDISPORT_1=7001
REDISPORT_2=7002

PIDFILE_1=/opt/redis-cluster/nodes-7001/redis_7001.pid
PIDFILE_2=/opt/redis-cluster/nodes-7002/redis_7002.pid
CONF_1="/opt/redis-cluster/nodes-7001/redis.conf"
CONF_2="/opt/redis-cluster/nodes-7002/redis.conf"

EXEC=/usr/local/redis/src/redis-server 
CLIEXEC=/usr/local/redis/src/redis-cli

case "$1" in
    start)
        if [ -f $PIDFILE_1 ];then
            echo "$PIDFILE_1 exists,process is already running or crashed"
        else
            echo "Starting Redis server... $CONF_1"
            $EXEC $CONF_1
        fi
        if [ -f $PIDFILE_2 ];then
            echo "$PIDFILE_2 exists,process is already running or crashed"
        else
            echo "Starting Redis server... $CONF_2"
            $EXEC $CONF_2
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE_1 ];then
            echo "$PIDFILE_1 does not exist,process is not running"
        else
            PID=$(cat $PIDFILE_1)
            echo "Stopping..."
            $CLIEXEC -h $IP -p $REDISPORT_1 shutdown
            while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown..."
                    sleep 1
                done
                echo "Redis stopped $CONF_1"
        fi

        if [ ! -f $PIDFILE_2 ];then
            echo "$PIDFILE_2 does not exist,process is not running"
        else
            PID=$(cat $PIDFILE_2)
            echo "Stopping..."
            $CLIEXEC -h $IP -p $REDISPORT_2 shutdown
            while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown..."
                    sleep 1
                done
                echo "Redis stopped $CONF_2"
        fi
        ;;
    restart)
        "$0" stop
        sleep 3
        "$0" start
        ;;
    *)
       echo "Please use start or stop or restart as first argument"
        ;;
esac

每臺虛擬機有兩個 Redis 端口 7001 和 7002,所以對上述腳本做了修改,如果一臺機器就一個 Redis 服務就簡單多了,大家可自行拷貝腳本修改。

Redis 文件修改為可執行文件:

chmod +x /etc/init.d/redis

添加到系統服務列表:

# 將 /etc/init.d/redis 添加到系統服務列表
chkconfig --add redis
# 設置開機自啟動
chkconfig redis on
# 查看所有注冊的腳本文件
chkconfig --list   

然后,你就不需要去找 Redis 啟動命令和配置文件了,方便管理和運維。

有點 low 的啟動方式:

/usr/local/redis/src/redis-server /opt/redis-cluster/nodes-7001/redis.conf
/usr/local/redis/src/redis-server /opt/redis-cluster/nodes-7002/redis.conf 

比較優雅的啟動方式:

# 啟動服務
service redis start
# 停止服務
service redis stop
# 重啟服務
service redis restart

另外一種開機自啟動方式:

將啟動命令直接添加到 /etc/rc.d/rc.local 文件中。

修改 rc.local 文件為可執行文件,否則重啟后不執行:

chmod +x /etc/rc.d/rc.local

小結:


本文使用 VirtualBox 免費開源的虛擬機軟件,一步一步來完成虛擬機環境的搭建。

然后基于三臺虛擬機環境,搭建了一套 Redis 集群環境。

通過 redis-trib.rb 腳本來創建 Redis 集群環境,三臺機器,6個通訊端口,自動構建為三主三從的集群架構。

根據執行 redis-trib.rb 腳本日志結果,自動分配IP的 Redis 集群架構如下所示:

redis集群架構

對虛擬機安裝配置和 Redis 集群安裝配置過程中,遇到的問題給出了相應的解決辦法,如果你安裝過程中還遇到一些新的問題,也可以自行查詢相關資料解決。

并且,從上述安裝實踐過程中,也能學習到很多常用的 Linux 命令。

大家自行搭建單機或集群環境時,可以#收藏#本文作為參考!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容