使用docker快速部署Ceph集群 arm64 or x86

  • Ceph是一个开源的分布式文件系统。使用Ceph可以轻松地将存储容量扩展到PB以上并拥有不错的性能。Ceph提供对象存储、块存储和文件系统三种存储方式。如果要直接在物理机或者虚拟机上部署Ceph集群,可以使用ceph-deploy工具,也可以使用ceph-ansible。如果不想花时间安装ceph,可以通过ceph-docker来部署Ceph集群。使用Docker部署Ceph集群的一大好处就是不用为升级而烦恼,但是,如果使用yum或者apt-get的方式来升级ceph就需要解决很多依赖包的问题。

  • 一个Ceph存储集群至少需要一个Ceph Monitor和两个OSD守护进程。但是,如果要运行Ceph文件系统客户端,那就还需要部署一个元数据服务器Metadata Server.

  • Ceph OSDs 负责存储数据,处理数据的的复制、恢复、回填、再均衡,并通过检查其他OSD守护进程的心跳来向Ceph Monitors提供一些监控信息。

  • Ceph Monitors 维护者展示集群状态的各种图表

  • MDSs 元数据服务器,为Ceph文件系统存储元数据。Ceph块存储和Ceph对象存储不需要MDS。

Ceph把客户端的数据保存为存储池内的对象,通过CRUSH算法,Ceph可以计算出哪个PG应该持有的对象,然后进一步计算出哪个OSD守护进程持有该PG。CRUSH算法使得Ceph存储集群可以动态地伸缩、再均衡和修复。

线上环境最好不要将多个OSD守护进程部署在同一台服务器上的同一个磁盘上,也不要将Monitor或者MDS与OSD守护进程部署在同一台服务器上的同一个磁盘上。最佳的办法是将操作系统、OSD数据和OSD日志分别放在不同的磁盘上。例如,一台服务器操作系统运行在/dev/sda,OSD数据运行在/dev/sdb, OSD日志运行在/dev/sdc。

二 操作步骤

本文测试环境:

Ubuntu 18.04.1 LTS

Docker version 18.06.1-ce

ceph version 14.2.9 (581f22da52345dba46ee232b73b990f06029a2a0) nautilus (stable)

测试使用三台服务器:

172.30.30.215
172.30.30.217
172.30.30.219

操作系统使用磁盘/dev/sda, Ceph OSD使用磁盘/dev/sdb

在3台服务器上执行:

apt install docker
apt install docker.io
systemctl start docker 
x86: docker pull ceph/daemon:master-22b99b7-nautilus-centos-7-x86_64
arm: docker pull ceph/daemon:master-59450b6-nautilus-centos-7-aarch64

mkdir -p  /etc/ceph/  /var/lib/ceph/

关掉selinux

vi /etc/selinux/config
SELINUX=disabled
重启

部署mon

在215上部署Monitor:

sudo docker run -d --net=host  --name=mon \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-e MON_IP=172.30.30.215 \
-e CEPH_PUBLIC_NETWORK=172.30.30.0/24 \
ceph/daemon mon

验证

[root@node70~]# docker exec mon ceph -s
  cluster:
    id:     f1182348-e4c8-411e-ab4d-96b3e3769c70
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum node70 (age 4m)
    mgr: no daemons active
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:
  • Monitor不能通过NAT网络通信,使用--net=host 暴露Docker主机网络;
  • MON_IP 是Monitor的IP地址, 写宿主机的ip;
  • MON_NAME 是Monitor的名称,默认是主机名;
  • CEPH_PUBLIC_NETWORK 这个是Monitor所在网络的CIDR ,这里也写宿主机的;
  • CEPH_CLUSTER_NETWORK 这个OSD之间复制数据用到的网络,默认和CEPH_PUBLIC_NETWORK相同;
  • ceph/daemon mon 这个ceph/daemon是images;
  • 这些参数都是在镜像内部的variables_entrypoint.sh中定义的
  • 如果要增加同一个集群的Monitor的数量,需要将/etc/ceph/和/var/lib/ceph/bootstrap-* 这些目录下的文件复制到其他主机上,记得不要保留文件的属主权限。使用rsync -r 或者scp -r远程复制就行
rsync -avz /etc/ceph/   root@172.30.30.217:/etc/ceph/
rsync -avz /etc/ceph/   root@172.30.30.219:/etc/ceph/


rsync -r /var/lib/ceph/bootstrap-*  root@172.30.30.217:/var/lib/ceph/
rsync -r /var/lib/ceph/bootstrap-*  root@172.30.30.219:/var/lib/ceph/

在217上部署Monitor:

sudo docker run -d --net=host  --name=mon \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-e MON_IP=172.30.30.217 \
-e CEPH_PUBLIC_NETWORK=172.30.30.0/24 \
ceph/daemon mon

在219上部署Monitor:

sudo docker run -d --net=host  --name=mon \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-e MON_IP=172.30.30.219 \
-e CEPH_PUBLIC_NETWORK=172.30.30.0/24 \
ceph/daemon mon

部署OSD

ceph 10.2 之前版本

按照ceph-docker git 视频中的方法使用osd_ceph_disk作为ceph/daemon参数启动OSD会失败
所以为了解决这个问题,可以先手动磁盘进行格式化并挂载后,使用osd_directory作为ceph/daemon的参数来启动OSD

mkdir -p /ceph-osd/
mkfs.xfs /dev/sdb -f
mount /dev/sdb /ceph-osd/

创建osd

sudo docker run -d --net=host --name=osd \
--privileged=true \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-v /dev/:/dev/ \
-v /ceph-osd:/var/lib/ceph/osd \
ceph/daemon osd_directory

ceph12.2.x之后版本,这里用的是 ceph 13.2

sudo docker run -d --net=host --name=myosd1 \
--privileged=true \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-v /dev/:/dev/ \
-e OSD_DEVICE=/dev/sdb \
ceph/daemon osd_ceph_disk
  • OSD_DEVICE=/dev/sdb 根据实际情况写空磁盘的位置.
    都执行这些操作过后查看Docker进程

Ceph RGW节点安装

说明
RGW为Rados Gateway的缩写,ceph通过RGW为互联网云服务提供商提供对象存储服务。RGW在librados之上向应用提供访问ceph集群的RestAPI, 支持Amazon S3和openstack swift两种接口。对RGW最直接的理解就是一个协议转换层,把从上层应用符合S3或Swift协议的请求转换成rados的请求, 将数据保存在rados集群中。
命令

 docker run \
-d --net=host \
--name=rgw \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph  \
ceph/daemon rgw  
docker exec rgw ss -ntul

[root@node /data]# curl http://127.0.0.1:7480
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>

Ceph Mgr节点安装

说明
ceph-mgr 作为 Ceph 集群的管理进程,未来会负责整个集群的管理操作和监控。现在的部分 Monitor 功能会迁移到 ceph-mgr 中,使得 Monitor 更专注于集群的数据面控制,降低集群对于 Monitor 的要求。
在12.2版本以后的版本,mgr已成为标配,不安装成功的话,集群状态会WARN。

命令
在所有mon安装过的节点上运行以下命令:

docker run \
-d --net=host  \
--name=mgr \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
ceph/daemon mgr

检查Mgr是否成功启动

 docker ps -a|grep mgr

docker exec -it mon ceph -s
  cluster:
    id:     67dac7c2-a620-4e9a-bf06-d0b13a1f2b55
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum node
    mgr: node(active)
    osd: 1 osds: 1 up, 1 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   2.0 GiB used, 17 GiB / 19 GiB avail
    pgs:

注意细节
一,如果这里安装异常,或是7000端口未启用,要启用dashboard组件功能。

docker exec mon ceph mgr dump
 

docker exec mgr ceph mgr module enable dashboard
docker ps |grep ceph
e76f92c38da8        ceph/daemon         "/entrypoint.sh osd_…"   4 minutes ago       Up 4 minutes                            myosd1
77396ce279f3        ceph/daemon         "/entrypoint.sh mon"     About an hour ago   Up 15 minutes

mimic版 (nautilus版) dashboard 安装




1、开启dashboard 功能

docker exec mgr ceph mgr module enable dashboard

2、创建证书

docker exec mgr ceph dashboard create-self-signed-cert

3、创建 web 登录用户密码

docker exec mgr ceph dashboard set-login-credentials {user-name} {password}

4 配置端口:mgr dashboard
ceph config set mgr mgr/dashboard/server_addr $IP
ceph config set mgr mgr/dashboard/server_port $PORT

5 关闭https
docker exec mgr ceph config set mgr mgr/dashboard/ssl false

6 重启
docker restart mgr

7、查看服务访问方式

docker exec mgr ceph mgr services

访问:
curl  http://$ip:$prot

查看日志

docker logs -f mon

docker logs -f osd

检查Ceph集群监控状况

在3台服务器上都查看下

 docker exec mon ceph -s
    cluster 96f3568a-4e57-4b5e-bf47-bea1b930dfe3
     health HEALTH_OK
     monmap e4: 3 mons at {ceph-mon215=172.30.30.215:6789/0,ceph-osd217=172.30.30.217:6789/0,ceph-osd219=172.30.30.219:6789/0}
            election epoch 12, quorum 0,1,2 ceph-mon215,ceph-osd217,ceph-osd219
        mgr no daemons active 
     osdmap e18: 3 osds: 3 up, 3 in
            flags sortbitwise,require_jewel_osds,require_kraken_osds
      pgmap v36: 64 pgs, 1 pools, 0 bytes data, 0 objects
            399 MB used, 61010 MB / 61410 MB avail
                  64 active+clean

可以看到整个Ceph集群为HEALTH_OK

部署完成

碰上问题想修改image
我们看下我们运行的docker

[root@lab8106 ceph]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
874d78ccae55        ceph/daemon         "/entrypoint.sh osd_c"   14 hours ago        Up 14 hours                             myosd1
86ed05173432        ceph/daemon         "/entrypoint.sh mon"     15 hours ago        Up 15 hours                             mon

COMMAND这里有个/entrypoint.sh

如果存在ENTRYPOINT和CMD,那么CMD就是ENTRYPOINT的参数,如果没有ENTRYPOINT,则CMD就是默认执行指令
也就是容器启动的时候默认是会去执行/entrypoint.sh 这个了

我们不需要他执行这个,就需要加参数了

[root@lab8106 ceph]# docker run -i -t --entrypoint /bin/bash ceph/daemon

比如我上次做的一个操作,把ceph用户绑定到root的id

root@9b269bf751f9:/# cat /etc/passwd|grep ceph
ceph:x:64045:64045:Ceph storage service:/var/lib/ceph:/bin/false
root@9b269bf751f9:/# sed -i 's/64045/0/g' /etc/passwd
root@9b269bf751f9:/# cat /etc/passwd|grep ceph
ceph:x:0:0:Ceph storage service:/var/lib/ceph:/bin/false

退出容器

root@9b269bf751f9:/# exit

查询我们最后运行的容器,修改回entrypoint我们再把容器修改提交到基础image

[root@lab8106 ceph]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
9b269bf751f9        ceph/daemon         "/bin/bash"         2 minutes ago       Exited (0) 15 seconds ago                       angry_hawking

[root@lab8106 ~]# docker run -i -t --entrypoint /entrypoint.sh ceph/daemon
[root@lab8106 ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
c2ea602c18ac        ceph/daemon         "/entrypoint.sh"    10 seconds ago      Exited (1) 7 seconds ago                       ecstatic_bartik

[root@lab8106 ceph]# docker commit c2ea602c18ac ceph/daemon

再次启动容器,并且检查内容,可以看到已经修改好了

[root@lab8106 ceph]# docker run -i -t --entrypoint /bin/bash ceph/daemon
root@65b538fdc61e:/# cat /etc/passwd|grep ceph
ceph:x:0:0:Ceph storage service:/var/lib/ceph:/bin/false

如果需要做其他的改动,这样改下就行

三 Ceph常用操作

检查集群监控状况

 docker exec mon ceph health
HEALTH_OK

观察集群内正发生的事件

 docker exec mon  ceph -w

检查集群的使用情况

 docker exec mon  ceph df 
GLOBAL:
    SIZE       AVAIL      RAW USED     %RAW USED 
    61410M     61010M         399M          0.65 
POOLS:
    NAME     ID     USED     %USED     MAX AVAIL     OBJECTS 
    rbd      0         0         0        20336M           0

检查OSD状态

 docker exec mon  ceph  osd stat
     osdmap e18: 3 osds: 3 up, 3 in
            flags sortbitwise,require_jewel_osds,require_kraken_osds

或者

 docker exec mon  ceph  osd dump


  

 docker exec mon  ceph  osd tree
ID WEIGHT  TYPE NAME            UP/DOWN REWEIGHT PRIMARY-AFFINITY 
-1 0.05997 root default                                           
-2 0.01999     host ceph-mon215                                   
 0 0.01999         osd.0             up  1.00000          1.00000 
-3 0.01999     host ceph-osd217                                   
 1 0.01999         osd.1             up  1.00000          1.00000 
-4 0.01999     host ceph-osd219                                   
 2 0.01999         osd.2             up  1.00000          1.00000
 

查看PG

 docker exec mon  ceph  pg dump
docker exec mon  ceph  pg stat
v190: 64 pgs: 64 active+clean; 0 bytes data, 399 MB used, 61010 MB / 61410 MB avail

列出存储池

 docker exec mon  ceph osd lspools
0 rbd,

创建存储池

 docker exec mon  ceph osd pool create data 200
pool 'data' created
   data 是存储池的名称

   200 是设置的PG数量

设置PG值:

少于5个OSD可把pg_num设置为128

OSD数量在5到10,可以设置pg_num为512

OSD数量在10到50,可以设置pg_num为4096

OSD数量大于50,需要计算pg_num的值

设置存储池最大对象数

 docker exec mon  ceph osd pool set-quota data max_objects 10000
set-quota max_objects = 10000 for pool data

删除存储池

 docker exec mon  ceph osd pool delete data data  --yes-i-really-really-mean-it
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool

如果确定要删除存储,需要将pg_name 输入两次,然后写上--yes-i-really-really-mean-it

这里有个提示,修改当前的Monitor配置文件/etc/ceph/ceph.conf

添加参数: mon_allow_pool_delete = true

然后执行 docker restart mon

 docker exec mon  ceph osd pool delete data data  --yes-i-really-really-mean-it
pool 'data' removed

重命名存储池

 docker exec mon  ceph osd pool rename data datanew
pool 'data' renamed to 'datanew'

查看存储池统计信息

 docker exec mon  rados df 
POOL_NAME USED OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRAED RD_OPS RD WR_OPS WR 
datanew      0       0      0      0                  0       0       0      0  0      0  0 
rbd          0       0      0      0                  0       0       0      0  0      0  0 

total_objects    0
total_used       420M
total_avail      60989M
total_space      61410M

拍下存储池快照

 docker exec mon  ceph osd pool mksnap datanew data_snap2017
created pool datanew snap data_snap2017

删除存储池快照

 docker exec mon  ceph osd pool rmsnap datanew data_snap2017
removed pool datanew snap data_snap2017

设置对象副本数

 docker exec mon  ceph osd pool set datanew size  5

需要注意一下,一个处于降级模式的对象其副本数小于规定值的pool_size, 仍然可以接收I/O请求。为了保证I/O正常,可以设置min_size, 确保数据存储池里任何对象的副本数小于min_size都不接收I/O

 docker exec mon  ceph osd pool set datanew min_size 2

获取对象副本数

 docker exec mon  ceph osd dump|grep 'replicated size'
pool 0 'rbd' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 1 flags hashpspool stripe_width 0
pool 4 'datanew' replicated size 5 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 200 pgp_num 200 last_change 36 flags hashpspool stripe_width 0

四 Ceph块设备

ditaa-dc9f80d771b55f2daa5cbbfdb2dd0d3e6d

块设备命令

创建块设备映像

rbd create --size {megabytes} {pool-name}/{image-name}
    ```

  创建块设备映射之前需要创建对应的存储池

docker exec mon ceph osd pool create swimmingpool 128
pool 'swimmingpool' created


  在swimmingpool这个存储池中创建一个名为bar,大小为1G的映像

  docker exec mon  rbd create --size 1024 swimmingpool/bar
  如果创建映像时不指定存储池,它将使用默认的rbd存储池

  

docker exec mon rbd create --size 1024 foo


 使用rbd ls列出块设备映像

 

docker exec mon rbd ls swimmingpool
bar

docker exec mon rbd ls
foo


  使用rbd info检索映像信息

docker exec mon rbd info foo

docker exec mon rbd info swimmingpool/bar




调整块设备映像大小


rbd resize --size 2048 foo (to increase)
rbd resize --size 2048 foo --allow-shrink (to decrease)
```

删除块设备映像
 docker exec mon  rbd rm foo
 docker exec mon  rbd rm swimmingpool/bar

映射块设备

sudo rbd map {pool-name}/{image-name} --id {user-name}
   

 rbd map foo --id admin
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".
In some cases useful info is found in syslog - try "dmesg | tail" or so.
rbd: map failed: (6) No such device or address
    ```

  在215上映射foo出现报错,查看日志

  

[8961646.895022] rbd: image foo: image uses unsupported features: 0x3c
[8961670.609930] libceph: mon0 172.30.30.215:6789 session established
[8961670.610894] libceph: client34098 fsid 96f3568a-4e57-4b5e-bf47-bea1b930dfe3
[8961670.633265] rbd: image foo: image uses unsupported features: 0x3c


   出现这个报错的原因是和Linux内核版本和rbd映像格式有关

   rbd支持两种镜像格式 --image-format

   format 1      已经弃用, 为一个新的镜像使用原始的格式。这个格式可以被所有的librbd版本和内核rbd模块所理解,但是不支持最新的特性

   format 2       rbd格式第二版,被librbd和3.1内核版本以上支持。这个格式支持克隆,在将来更容易扩展支持更多的特性



   --image-feature   可以指定rbd format2特性启用或者禁用

   

     rbd  format2 支持的属性有

     layering           BIT码为1

     striping            BIT码为2

     exclusive-lock   BIT码为4

     object-map      BIT码为8

      fast-diff           BIT码为16

      deep-flatten    BIT码为32



   查看当前ceph集群版本支持的rbd 的属性

ceph --show-config|grep rbd|grep features
rbd_default_features = 61

   61=32+16+8+4+1 即默认支持layering,exclusive-lock,object-map,fast-diff,deep-flatten



   前面的报错中显示不支持的代号是0x3c, 这是十六进制,换算成10进制就是60。也就是不支持后面4种特性

   查看当前使用的镜像属性

   

rbd info foo
rbd image 'foo':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.855f2ae8944a
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:


    可以关闭后面4个特性

    

rbd feature disable rbd/foo exclusive-lock, object-map, fast-diff, deep-flatten
```
再挂载试试

 rbd map rbd/foo 
/dev/rbd0

挂载成功

再查看foo的特性


 rbd info foo
rbd image 'foo':
    size 1024 MB in 256 objects
    order 22 (4096 kB objects)
    block_name_prefix: rbd_data.855f2ae8944a
    format: 2
    features: layering
    flags:

发现只有一个laytering特性了。

这样每次创建一个镜像都这样启动和关闭特性比较麻烦,可以修改ceph.conf文件

  rbd_default_features = 3

不用重启Monitor或者OSD

参考文档:

http://blog.51cto.com/john88wang/1947672

https://github.com/ceph/ceph-docker

https://github.com/ceph/ceph-ansible

https://github.com/ceph/ceph-deploy

http://www.sebastien-han.fr/blog/2013/09/19/how-I-barely-got-my-first-ceph-mon-running-in-docker/

http://ceph.org.cn/2016/05/02/%E5%9C%A8docker%E9%87%8C%E8%BF%90%E8%A1%8Cceph%E9%9B%86%E7%BE%A4/

http://docs.ceph.org.cn/rados/operations/crush-map/?highlight=crush

http://www.dockerinfo.net/445.html

http://www.dockerinfo.net/4440.html

https://www.youtube.com/embed/FUSTjTBA8f8

http://docs.ceph.org.cn/rados/operations/placement-groups/

http://www.zphj1987.com/2016/06/07/rbd%E6%97%A0%E6%B3%95map-rbd-feature-disable/

https://www.ibm.com/support/knowledgecenter/en/SSNW54_1.1.2/com.ibm.kvm.v112.admin/cephbasictasks.htm:x

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容