【MongoDB】— CentOS76部署mongodb复制集RS(ReplicationSet)

centos7.6部署mongodb复制集RS(ReplicationSet),通过多实例实现,即一台服务器部署4个实例,通过不同的端口区分。
  MongoDB中的复制集(也被称为副本)是一组维护相同数据集的mongod进程。副本集提供冗余性及和高可用,是所有生产部署的基础。简单来说,复制集有多台MongoDB组成的一个集群,集群中有一个主节点(Primary)和N个副本节点(Secondary)等,它们有相同的数据库,假如主MongoDB服务器或者MongoDB实例Down机之后,其它的副本服务器可以继续提供服务,实现数据的高可用及可靠性。

1 mongodb复制集架构

1.1 角色介绍:

术语            类型                          描述
Primary        主节点                  负责整个集群的读写操作,包含了所有改变操作的日志
Secondary      备节点                  同步主服务器所有的数据,负责集群的读取请求,主服务器宕机可以称为主节点
Arbiter        仲裁者                  在主节点宕机后只进行投票,不参与选举,不同步主节点数据

1.2 mongodb的复制集架构主要分为两种,普通复制集和选主复制集。

1、普通复制集架构:

image.png

主节点故障后,复制集变化过程


image.png

2、选主复制集架构(仲裁节点架构)

image.png

主节点故障后,复制集变化过程


image.png

1.3 基本原理

复制集基本架构为1主2从或1主1从1Arbiter 。而且mongodb复制集自带互相监控投票机制,其内部算法为【MongoD(Raft)】和【Paxos(mysql MGR )】算法基本相同。
如果发生主库宕机,复制集内部会根据Raft算法进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知客户端程序,主库已经发生切换了,应用就会连接到新的主库。

2 复制集架构规划

可以使用3个节点或多实例实现。本案例通过多实例实现。

2.1 多实例规划

节点:172.21.209.123
端口:28017-28020(实现多实例)

2.2 多实例目录

登陆到mongod用户并创建多实例目录
[root@mysql-master ~]# su - mongod
[mongod@mysql-master /data]$ mkdir /data/mongodb/mult-mongodb

2.3 创建多实例数据目录

[mongod@mysql-master mult-mongodb]$ for path in {28017..28020}
> do
>  mkdir -vp  /data/mongodb/mult-mongodb/$path/{data,conf,log}
> done

mkdir: created directory ‘/data/mongodb/mult-mongodb/28017’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28017/data’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28017/conf’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28017/log’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28018’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28018/data’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28018/conf’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28018/log’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28019’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28019/data’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28019/conf’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28019/log’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28020’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28020/data’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28020/conf’
mkdir: created directory ‘/data/mongodb/mult-mongodb/28020/log’

查看创建的多实例目录,通过不同的端口区分
[mongod@mysql-master mult-mongodb]$ ll
total 0
drwxrwxr-x 5 mongod mongod 41 Sep 24 04:52 28017
drwxrwxr-x 5 mongod mongod 41 Sep 24 04:52 28018
drwxrwxr-x 5 mongod mongod 41 Sep 24 04:52 28019
drwxrwxr-x 5 mongod mongod 41 Sep 24 04:52 28020

2.4 多实例配置文件

1、配置文件路径
/data/mongodb/mult-mongodb/28017/conf/mongod.conf
/data/mongodb/mult-mongodb/28018/conf/mongod.conf
/data/mongodb/mult-mongodb/28019/conf/mongod.conf
/data/mongodb/mult-mongodb/28020/conf/mongod.conf

2、配置文件内容
cat >/data/mongodb/mult-mongodb/28017/conf/mongod.conf <<EOF
systemLog:
  destination: file
  path: /data/mongodb/mult-mongodb/28017/log/mongodb.log
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /data/mongodb/mult-mongodb/28017/data
  directoryPerDB: true
  #engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
processManagement:
  fork: true
net:
  bindIp: 172.21.209.123,127.0.0.1
  port: 28017
replication:
  oplogSizeMB: 2048
  replSetName: myReplSet
  
EOF

3、复制配置 文件到其他实例的conf目录下,并修改端口

[mongod@mysql-master conf]$ cp  /data/mongodb/mult-mongodb/28017/conf/mongod.conf  /data/mongodb/mult-mongodb/28018/conf/
[mongod@mysql-master conf]$ cp  /data/mongodb/mult-mongodb/28017/conf/mongod.conf  /data/mongodb/mult-mongodb/28019/conf/
[mongod@mysql-master conf]$ cp  /data/mongodb/mult-mongodb/28017/conf/mongod.conf  /data/mongodb/mult-mongodb/28020/conf/

修改配置文件
[mongod@mysql-master conf]$ sed 's#28017#28018#g' /data/mongodb/mult-mongodb/28018/conf/mongod.conf -i
[mongod@mysql-master conf]$ sed 's#28017#28019#g' /data/mongodb/mult-mongodb/28019/conf/mongod.conf -i
[mongod@mysql-master conf]$ sed 's#28017#28020#g' /data/mongodb/mult-mongodb/28020/conf/mongod.conf -i

2.5 启动多实例

mongod -f /data/mongodb/mult-mongodb/28017/conf/mongod.conf
mongod -f /data/mongodb/mult-mongodb/28018/conf/mongod.conf
mongod -f /data/mongodb/mult-mongodb/28019/conf/mongod.conf
mongod -f /data/mongodb/mult-mongodb/28020/conf/mongod.conf

启动过程:
[mongod@mysql-master conf]$ mongod -f /data/mongodb/mult-mongodb/28017/conf/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 29035
child process started successfully, parent exiting
[mongod@mysql-master conf]$ mongod -f /data/mongodb/mult-mongodb/28018/conf/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 29073
child process started successfully, parent exiting
[mongod@mysql-master conf]$ mongod -f /data/mongodb/mult-mongodb/28019/conf/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 29111
child process started successfully, parent exiting
[mongod@mysql-master conf]$ mongod -f /data/mongodb/mult-mongodb/28020/conf/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 29149
child process started successfully, parent exiting

2.6 查看进程和端口

[mongod@mysql-master conf]$ ps -ef|grep mongodb
[mongod@mysql-master conf]$ netstat  -lntp|grep 280

(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 172.21.209.123:28017    0.0.0.0:*               LISTEN      29035/mongod        
tcp        0      0 127.0.0.1:28017         0.0.0.0:*               LISTEN      29035/mongod        
tcp        0      0 172.21.209.123:28018    0.0.0.0:*               LISTEN      29073/mongod        
tcp        0      0 127.0.0.1:28018         0.0.0.0:*               LISTEN      29073/mongod        
tcp        0      0 172.21.209.123:28019    0.0.0.0:*               LISTEN      29111/mongod        
tcp        0      0 127.0.0.1:28019         0.0.0.0:*               LISTEN      29111/mongod        
tcp        0      0 172.21.209.123:28020    0.0.0.0:*               LISTEN      29149/mongod        
tcp        0      0 127.0.0.1:28020         0.0.0.0:*               LISTEN      29149/mongod      

3 配置复制集

3.1 配置普通复制集【1主2从】

1、登陆到mongodb数据库
[mongod@mysql-master data]$ mongo --port 28017 admin

2、配置mongodb复制集
config = {_id: 'myReplSet', members: [
                          {_id: 0, host: '172.21.209.123:28017'},
                          {_id: 1, host: '172.21.209.123:28018'},
                          {_id: 2, host: '172.21.209.123:28019'}]
          }                   
rs.initiate(config) 

注:
admin为验证库。
集群过程中会出现两种角色PRIMARY和SECONDARY,为配置成功。
myReplSet:SECONDARY> 
myReplSet:PRIMARY> 

3、查看复制集集群的状态
myReplSet:PRIMARY> rs.status()

3.2、配置选择复制集【1主1从1个arbiter】

[mongod@mysql-master data]$ mongo --port 28017 admin
config = {_id: 'myReplSet', members: [
                          {_id: 0, host: '172.21.209.123:28017'},
                          {_id: 1, host: '172.21.209.123:28018'},
                          {_id: 2, host: '172.21.209.123:28019',"arbiterOnly":true}]
          }                
rs.initiate(config) 

注:myReplSet要和配置文件中的复制集模块一致。
        arbiterOnly设置为true.

3.3、复制集常用管理操作

rs.status();        //查看复制集状态
rs.isMaster();      // 查看当前是否为主节点
rs.conf();        //查看复制集配置信息

1、查看复制集状态
myReplSet:PRIMARY> rs.status()
{
    "set" : "myReplSet",
    "date" : ISODate("2021-09-24T09:35:30.813Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "syncingTo" : "",
    "syncSourceHost" : "",
    "syncSourceId" : -1,
    "heartbeatIntervalMillis" : NumberLong(2000),
    "majorityVoteCount" : 2,
    "writeMajorityCount" : 2,
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1632476127, 1),
            "t" : NumberLong(1)
        },
        "lastCommittedWallTime" : ISODate("2021-09-24T09:35:27.923Z"),
        "readConcernMajorityOpTime" : {
            "ts" : Timestamp(1632476127, 1),
            "t" : NumberLong(1)
        },
        "readConcernMajorityWallTime" : ISODate("2021-09-24T09:35:27.923Z"),
        "appliedOpTime" : {
            "ts" : Timestamp(1632476127, 1),
            "t" : NumberLong(1)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1632476127, 1),
            "t" : NumberLong(1)
        },
        "lastAppliedWallTime" : ISODate("2021-09-24T09:35:27.923Z"),
        "lastDurableWallTime" : ISODate("2021-09-24T09:35:27.923Z")
    },
    "lastStableRecoveryTimestamp" : Timestamp(1632476117, 1),
    "lastStableCheckpointTimestamp" : Timestamp(1632476117, 1),
    "electionCandidateMetrics" : {
        "lastElectionReason" : "electionTimeout",
        "lastElectionDate" : ISODate("2021-09-24T09:21:17.879Z"),
        "electionTerm" : NumberLong(1),
        "lastCommittedOpTimeAtElection" : {
            "ts" : Timestamp(0, 0),
            "t" : NumberLong(-1)
        },
        "lastSeenOpTimeAtElection" : {
            "ts" : Timestamp(1632475267, 1),
            "t" : NumberLong(-1)
        },
        "numVotesNeeded" : 2,
        "priorityAtElection" : 1,
        "electionTimeoutMillis" : NumberLong(10000),
        "numCatchUpOps" : NumberLong(0),
        "newTermStartDate" : ISODate("2021-09-24T09:21:17.905Z"),
        "wMajorityWriteAvailabilityDate" : ISODate("2021-09-24T09:21:18.701Z")
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "172.21.209.123:28017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 1645,
            "optime" : {
                "ts" : Timestamp(1632476127, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2021-09-24T09:35:27Z"),
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "infoMessage" : "",
            "electionTime" : Timestamp(1632475277, 1),
            "electionDate" : ISODate("2021-09-24T09:21:17Z"),
            "configVersion" : 1,
            "self" : true,
            "lastHeartbeatMessage" : ""
        },
        {
            "_id" : 1,
            "name" : "172.21.209.123:28018",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 863,
            "optime" : {
                "ts" : Timestamp(1632476127, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1632476127, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2021-09-24T09:35:27Z"),
            "optimeDurableDate" : ISODate("2021-09-24T09:35:27Z"),
            "lastHeartbeat" : ISODate("2021-09-24T09:35:29.897Z"),
            "lastHeartbeatRecv" : ISODate("2021-09-24T09:35:29.171Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncingTo" : "172.21.209.123:28017",
            "syncSourceHost" : "172.21.209.123:28017",
            "syncSourceId" : 0,
            "infoMessage" : "",
            "configVersion" : 1
        },
        {
            "_id" : 2,
            "name" : "172.21.209.123:28019",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 863,
            "optime" : {
                "ts" : Timestamp(1632476127, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1632476127, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2021-09-24T09:35:27Z"),
            "optimeDurableDate" : ISODate("2021-09-24T09:35:27Z"),
            "lastHeartbeat" : ISODate("2021-09-24T09:35:29.896Z"),
            "lastHeartbeatRecv" : ISODate("2021-09-24T09:35:30.673Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncingTo" : "172.21.209.123:28017",
            "syncSourceHost" : "172.21.209.123:28017",
            "syncSourceId" : 0,
            "infoMessage" : "",
            "configVersion" : 1
        }
    ],
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1632476127, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1632476127, 1)
}
myReplSet:PRIMARY> 


2、查看当前节点是否为主节点
myReplSet:PRIMARY> rs.isMaster()
{
    "hosts" : [
        "172.21.209.123:28017",
        "172.21.209.123:28018",
        "172.21.209.123:28019"
    ],
    "setName" : "myReplSet",
    "setVersion" : 1,
    "ismaster" : true,
    "secondary" : false,
    "primary" : "172.21.209.123:28017",
    "me" : "172.21.209.123:28017",
    "electionId" : ObjectId("7fffffff0000000000000001"),
    "lastWrite" : {
        "opTime" : {
            "ts" : Timestamp(1632476167, 1),
            "t" : NumberLong(1)
        },
        "lastWriteDate" : ISODate("2021-09-24T09:36:07Z"),
        "majorityOpTime" : {
            "ts" : Timestamp(1632476167, 1),
            "t" : NumberLong(1)
        },
        "majorityWriteDate" : ISODate("2021-09-24T09:36:07Z")
    },
    "maxBsonObjectSize" : 16777216,
    "maxMessageSizeBytes" : 48000000,
    "maxWriteBatchSize" : 100000,
    "localTime" : ISODate("2021-09-24T09:36:10.629Z"),
    "logicalSessionTimeoutMinutes" : 30,
    "connectionId" : 6,
    "minWireVersion" : 0,
    "maxWireVersion" : 8,
    "readOnly" : false,
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1632476167, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1632476167, 1)
}
myReplSet:PRIMARY> 


3、查看复制集配置信息
myReplSet:PRIMARY> rs.conf()
{
    "_id" : "myReplSet",
    "version" : 1,
    "protocolVersion" : NumberLong(1),
    "writeConcernMajorityJournalDefault" : true,
    "members" : [
        {
            "_id" : 0,
            "host" : "172.21.209.123:28017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 1,
            "host" : "172.21.209.123:28018",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 2,
            "host" : "172.21.209.123:28019",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        }
    ],
    "settings" : {
        "chainingAllowed" : true,
        "heartbeatIntervalMillis" : 2000,
        "heartbeatTimeoutSecs" : 10,
        "electionTimeoutMillis" : 10000,
        "catchUpTimeoutMillis" : -1,
        "catchUpTakeoverDelayMillis" : 30000,
        "getLastErrorModes" : {
            
        },
        "getLastErrorDefaults" : {
            "w" : 1,
            "wtimeout" : 0
        },
        "replicaSetId" : ObjectId("614d98833680adfa6bcd2c0e")
    }
}
myReplSet:PRIMARY> 

4 复制集节点的添加和删除

1、添加删除常用操作
rs.remove("节点ip:port"); // 删除一个节点
rs.add("节点ip:port"); // 新增从节点
rs.addArb("节点ip:port"); // 新增仲裁节点

2、案例操作
连接到主节点
[mongod@mysql-master data]$   mongo --port 28017 admin

2.1 添加仲裁节点
myReplSet:PRIMARY> rs.addArb("172.21.209.123:28020")
{
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1632476954, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1632476954, 1)
}

添加后查看状态:myReplSet:PRIMARY> rs.isMaster()

2.2 删除一个节点
myReplSet:PRIMARY> rs.remove("172.21.209.123:28019");
{
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1632477110, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1632477110, 1)
}

删除后查看状态:myReplSet:PRIMARY> rs.isMaster()

2.3 新增加从节点
myReplSet:PRIMARY> rs.add("1172.21.209.123:28019")
{
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1632477186, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1632477186, 1)
}

新增后查看状态:myReplSet:PRIMARY> rs.isMaster()

5 复制集的特殊节点

5.1 介绍和架构

  • arbiter节点:主要负责选主过程投票,但不存储任何数据,也不向客户端提供任何服务
  • hidden节点:隐藏节点,不参与选主,也不向客户端提供任何服务。
  • delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)
    一般情况下会将delay+hidden一起配置使用
image.png
image.png

5.2 配置延时节点(组合使用:delay+hidden)

1、配置延时
cfg=rs.conf() 
cfg.members[1].priority=0
cfg.members[1].hidden=true
cfg.members[1].slaveDelay=120
rs.reconfig(cfg)    


2、恢复延时配置
cfg=rs.conf() 
cfg.members[1].priority=1
cfg.members[1].hidden=false
cfg.members[1].slaveDelay=0
rs.reconfig(cfg)    

3、配置成功后,通过以下命令查询配置后的属性
rs.conf(); 

注:通过rs.status()可以查看到members[1]是一个数组,下标从0开始,选择需要配置的节点,members[1]表示第三个节点。

6 复制集其他命令

1、查看副本集的配置信息
myReplSet:PRIMARY> rs.conf()

2、查看副本集各成员的状态
myReplSet:PRIMARY> rs.status()


3、副本集角色切换(不要人为随便操作)
myReplSet:PRIMARY> rs.stepDown()
注:
myReplSet:PRIMARY> rs.freeze(300)  //锁定从,使其不会转变成主库
freeze()和stepDown单位都是秒。

4、设置副本节点可读:在副本节点执行
登陆从节点
[mongod@mysql-master data]$  mongo --port 28018 admin

myReplSet:SECONDARY> rs.slaveOk()
eg:
myReplSet:SECONDARY> use student;
switched to db student
myReplSet:SECONDARY> db.createCollection('a')
{
    "operationTime" : Timestamp(1632478227, 1),
    "ok" : 0,
    "errmsg" : "not master",
    "code" : 10107,
    "codeName" : "NotWritablePrimary",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1632478227, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}


5、查看副本节点(监控主从延时)
myReplSet:SECONDARY> rs.printSlaveReplicationInfo()
WARNING: printSlaveReplicationInfo is deprecated and may be removed in the next major release. Please use printSecondaryReplicationInfo instead.
source: 172.21.209.123:28018
    syncedTo: Fri Sep 24 2021 06:13:08 GMT-0400 (EDT)
    0 secs (0 hrs) behind the primary 
source: 1172.21.209.123:28019
    syncedTo: Wed Dec 31 1969 19:00:00 GMT-0500 (EST)
    1632478388 secs (453466.22 hrs) behind the primary 

至此:mongodb的复制集部署完成,通过多实例实现部署。

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

推荐阅读更多精彩内容