lvs+keepalived构建高可用集群

lvs+keepalived 构建高可用集群

负载均衡LVS基本介绍

LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上。为了避免不同机器上用户请求得到的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。

LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网是 http://www.linuxvirtualserver.org 现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。

LVS 特点

LVS 是一种预装在 Linux 系统中,基于四层、具有强大性能的反向代理服务器。ipvsadm 是 LVS 的命令行管理工具

  • 首先它是基于 4 层的网络协议的,抗负载能力强,对于服务器的硬件要求除了网卡外,其他没有太多要求;
  • 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,大大减少了人为出错的几率;
  • 应用范围比较广,不仅仅对 web 服务做负载均衡,还可以对其他应用(mysql)做负载均衡;
  • LVS 架构中存在一个虚拟 IP 的概念,需要向 IDC 多申请一个 IP 来做虚拟 IP

LVS组成部分

  1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。

  2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,命令行工具, 用于管理集群服务及集群服务上的RS,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)

LVS相关术语

  1. DS:Director Server。指的是前端负载均衡器节点。
  2. RS:Real Server。后端真实的工作服务器。
  3. VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
  4. DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
  5. RIP:Real Server IP,后端服务器的IP地址。
  6. CIP:Client IP,访问客户端的IP地址

三种工作模式:

1)NAT模式:

NAT(Network Address Translation)网络地址转换,通过修改数据报头,使得内网中的IP可以和外部网络进行通信。LVS负载调度器使用两块不同的网卡配置不同的IP地址,网卡一设置为公网IP负责与外部通信,网卡二设置内网IP负责与内网服务通信。

外部用户通过访问LVS调度器的公网IP发送服务请求,LVS调度器接受请求后,将请求数据进行转换,通过内网IP的网卡设备,根据调度策略将数据转发给内部服务,内部服务处理完成将响应数据再返回给LVS调度器,LVS调度器再将数据转换通过公网IP的网卡设备将响应结果返回给请求用户。

以上描述的就是一个基于NAT工作模式的LVS调度,这种模式的瓶颈在于LVS调度器,因为所有的请求数据和响应数据都需要经过LVS来进行转换处理,当大流量到来时,LVS调度器就成了一个短板,限制整个集群服务性能的上限。

2)TUN模式:

TUN模式与NAT的不同在于,TUN模式下LVS调度器只负责接受请求,而真实服务器进行响应请给用户。LVS调度器与真实服务器建立IP隧道,IP隧道它可以将原始数据包封装并将新的源地址及端口、目标地址及端口添加新的包头中,将封装后的数据通过隧道转发给后端的真实服务器,真实服务器在收到请求数据包后直接给外部用户响应数据,这种模式下要求真实服务器具有直接外部用户通信的能力。

外部用户访问LVS调度器发送服务请求,LVS调度器接收请求后,将请求数据转换,根据调度策略将数据转发给服务集群真实服务器,真实服务器在处理完成后,就直接与外部请求用户通信,直接将响应结果返回给请求用户。

以上描述就是一个基于TUN工作模式的LVS调度,这种模式下LVS调度器就只负责请求的负载均衡转发,而处理数据的响应则全部由真实服务器来直接和用户通信了。在实际环境中,请求的数据量往往是小于响应的数据量,所以仅仅将请求数据让LVS来转发,好处就是LVS调度器的压力减少很多,可以承载更大的流量,同时真实服务器的性能也能得到充分利用,缺点就是真实服务器需要与外部网络用户直接通信,在安全上会存在一定风险。

3)DR模式:

DR模式是在TUN模式的基础上又进行了改造,在DR模式下LVS调度器与真实服务器共享一个虚拟IP,且调度器的虚拟IP对外暴露,而真实服务器的虚拟IP地址将配置在Non-ARP的网络设备上,这种网络设备不会向外广播自己的MAC及对应的IP地址,这样即保证了真实服务器可以接受虚拟IP的网络请求也让真实服务器所绑定的虚拟IP对外部网络部是不可见的。

外部用户通过访问虚拟IP将请求数据包发送到调度器,调度器根据调度策略确定转发的真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实服务器的MAC地址,通过交换机将该数据帧发给真实服务器,之后真实服务器在处理完后进行数据响应时,会将虚拟IP封装在数据包中,再经过路由将数据返回给外部用户,在这整个过程中,真实服务器对外部用户不可见,外部用户只能看到虚拟IP的地址

在DR模式下因为真实服务器给外部用户回应的数据包设置的源IP是虚拟IP地址,又因为真实服务器的虚拟IP不对外暴露,这样外部用户在通过虚拟IP访问时,就访问到了调度器的虚拟IP地址,就实现了整个集群对外部用户透明。

LVS的八种调度算法

1.轮叫调度 rr

这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。

2. 加权轮叫 wrr

这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。

3. 最少链接 lc

这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1

4. 加权最少链接 wlc

这个算法比 lc 多了一个权重的概念。

5. 基于局部性的最少连接调度算法 lblc

这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器

6. 复杂的基于局部性最少的连接算法 lblcr

记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。

7. 目标地址散列调度算法 dh

该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。

8. 源地址散列调度算法 sh

与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源

lvs构建负载均衡集群

ip
调度器 192.168.126.101
vip 192.168.126.100
rs1 192.168.126.121
rs2 192.168.126.122
# eth0:1表示这个VIP绑定的目标网卡设备,192.168.209.22就是VIP的值,广播地址为192.168.209.255,子网掩码为:255.255.255.0,up表示立即启用这个VIP
# ifconfig eth0:1 192.168.209.22 broadcast 192.168.209.255 netmask 255.255.255.0 up
# 路由表上添加对这个VIP的路由信息
# route add -host 192.168.209.22 dev eth0:1

# LVS101调度器
systemctl stop NetworkManager    # 关闭网卡守护进程 
cp /etc/sysconfig/network-scripts/ifcfg-ens32 ifcfg-ens32:0
# 拷贝 ens32 网卡子接口充当集群入口接口
vim ifcfg-ens32:0
DEVICE=ens32:0
IPADDR=192.168.126.100
NETMASK=255.255.255.0
ifup ens32:0 #启动网卡
yum -y install ipvsadm #安装LVS
modprobe ip_vs #重载 ipvs 模块
ipvsadm -v  #查看当前ipvs版本
ipvsadm -A -t 192.168.126.100:80 -s rr  #添加一个集群并采用轮询算法
ipvsadm -a -t 192.168.126.100:80  -r 192.168.126.121:80  -g 
ipvsadm -a -t 192.168.126.100:80  -r 192.168.126.122:80  -g
#添加ipvsadm集群节点
ipvsadm -Ln #查看当前集群
chkconfig ipvsadm on   #设置为开机自启

# web121
systemctl  stop  NetworkManager 
cp /etc/sysconfig/network-scripts/ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.126.100
NETMASK=255.255.255.255
vim /etc/sysctl.conf   #关闭对应ARP响应及公告功能
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
sysctl -p
 
ifup lo:0   #重启lo:0网卡
route add -host 192.168.126.100  dev lo:0  #添加路由
systemctl start httpd #启动httpd服务

# 查看集群负载状态
ipvsadm -Ln --stats

lvs+keepalived构建高可用集群

Keepalived是什么?

Keepalived是Linux下一个轻量级别的高可用解决方案。可以实现服务的高可用或热备,用来防止单点故障的问题,Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉。而Keepalived的核心是VRRP协议,VRRP(Vritrual Router Redundancy Protocol,虚拟路由冗余协议) 主要实现了在路由器或三层交换机处的冗余,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有HA cluster功能,下面介绍一下VRRP协议实现的过程。

VRRP协议与工作原理

虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP) VRRP是一种路由容错协议,也可以叫做备份路由协议。VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部有多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被设置成为:主路由器(Master角色),一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,而且其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为“BACKUP的角色”,当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,这种选举角色切换非常之快,因而保证了服务的持续可用性。

Keepalvied的工作原理

Keepalived是通过VRRP协议实现高可用性的,Keepalived作为一个高性能集群软件,它还能实现对集群中服务器运行状态的监控以及故障隔离。

Keepalived工作在TCP/IP 参考模型的 三层、四层、五层,也就是分别为:网络层,传输层和应用层,根据TCP、IP参数模型隔层所能实现的功能,Keepalived运行机制如下:

在网络层: Keepalived在网络层采用最常见的工作方式是通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包,如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。

在传输层: Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。

在应用层:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除

相关术语:
  • LB (Load Balancer 负载均衡)
  • HA (High Available 高可用)
  • Failover (失败切换)
  • Cluster (集群)
  • LVS (Linux Virtual Server Linux 虚拟服务器)
  • DS (Director Server),指的是前端负载均衡器节点
  • RS (Real Server),后端真实的工作服务器
  • VIP (Virtual IP),虚拟的 IP 地址,向外部直接面向用户请求,作为用户请求的目标的 IP 地址
  • DIP (Director IP),主要用于和内部主机通讯的 IP 地址
  • RIP (Real Server IP),后端服务器的 IP 地址
  • CIP (Client IP),访问客户端的 IP 地址
名称 IP地址
LVS-Master 10.239.103.51
LVS-Backup 10.239.103.52
Web-A 10.239.103.53
Web-B 10.239.103.54
Web-C 10.239.103.55
VIP 10.239.103.250
LVS-Master/LVS-Backup 安装ipvs
# 安装lvs
yum -y install ipvsadm
# ipvsadm:命令行工具, 用于管理集群服务及集群服务上的RS等

# ipvs: 工作于内核上的程序, 可根据用户定义的集群实现请求转发

modprobe ip_vs #重载 ipvs 模块
lsmod | grep ip_vs

yum -y install gcc
yum -y install openssl-devel
LVS-Master/LVS-Backup 安装keepalived
cd /usr/local/src
tar -zxvf keepalived-1.4.0.tar.gz
cd keepalived-1.4.0
./configure --prefix=/usr/local/keepalived
make && make install
keepalived.conf 配置示例
# /usr/local/keepalived/etc/keepalived/keepalived.conf

global_defs {  #全局配置部分
notification_email {
        acassen@firewall.loc     #设置报警邮件地址,可以设置多个,每行一个。
        failover@firewall.loc    #需开启本机的sendmail服务
        sysadmin@firewall.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc  #设置邮件的发送地址
    smtp_server 127.0.0.1      #设置smtp server地址
    smtp_connect_timeout 30    #设置连接smtp server的超时时间
    router_id LVS_DEVEL        #表示运行keepalived服务器的一个标识。发邮件时显示在邮件主题的信息
    
   vrrp_skip_check_adv_addr  
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {    #vrrp实例定义部分
    state MASTER     #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
    interface eth0    #指定HA监测网络的接口
    virtual_router_id 60  #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
    priority 100    #定义优先级,数字越大优先级越高,在一个vrrp——instance下,master的优先级必须大于backup
    advert_int 1    #设定master与backup负载均衡器之间同步检查的时间间隔,单位是秒
    unicast_src_ip 10.239.103.51
    unicast_peer {
        10.239.103.52
    }
    authentication {  #设置验证类型和密码
        auth_type PASS  #主要有PASS和AH两种
        auth_pass 1111  #验证密码,同一个vrrp_instance下MASTER和BACKUP密码必须相同
    }
    virtual_ipaddress {  #设置虚拟ip地址,可以设置多个,每行一个
        10.239.103.250
    }
}

virtual_server 10.239.103.250 80 {  #设置虚拟服务器,需要指定虚拟ip和服务端口
    delay_loop 3    #健康检查时间间隔
    lb_algo rr     #负载均衡调度算法
    lb_kind DR    #负载均衡转发规则
   net_mask 255.255.255.0
    persistence_timeout 50    #设置会话保持时间,对动态网页非常有用
    protocol TCP    #指定转发协议类型,有TCP和UDP两种

    real_server 10.239.103.53 31080 {  #配置服务器节点1,需要指定real server的真实IP地址和端口
        weight 1    #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
            TCP_CHECK {     #realserver的状态监测设置部分单位秒 TCP_CHECK { :注意TCK_CHECK和 {之间有一个空格,忘记打这个空格的话,可能会出现后面用ipvsadm查看时,某个RS查看不到
            connect_timeout 3    #超时时间
            nb_get_retry 3      #重试次数
            delay_before_retry 3    #重试间隔
            connect_port 31080      #监测端口
        }
    }
    real_server 10.239.103.54 31080 {
        weight 1
        TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
        connect_port 31080
      }
    }
    real_server 10.239.103.55 31080 {
        weight 1
        TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
        connect_port 31080
      }
    }
}
LVS-Master配置keepalived.conf
global_defs {
   router_id keep_101
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 60
    priority 90
    advert_int 1
    unicast_src_ip 10.239.103.51
    unicast_peer {
        10.239.103.52
    }
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
       10.239.103.250
    }
}
virtual_server 10.239.103.250 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    net_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
    real_server 10.239.103.53 31080 {
      weight 1
        TCP_CHECK {
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
          connect_port 31080
        }
    }
   real_server 10.239.103.54 31080 {
        weight 1
        TCP_CHECK {
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
          connect_port 31080
      }
    }
    real_server 10.239.103.55 31080 {
        weight 1
        TCP_CHECK {
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
          connect_port 31080
      }
  }
}
LVS-Backup配置keepalived.conf
global_defs {
   router_id keep_102
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 60
    priority 100
    advert_int 1
    unicast_src_ip 10.239.103.51
    unicast_peer {
        10.239.103.52
    }
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
       10.239.103.250
    }
}
virtual_server 10.239.103.250 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    net_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
    real_server 10.239.103.53 31080 {
      weight 1
        TCP_CHECK {
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
          connect_port 31080
        }
    }
   real_server 10.239.103.54 31080 {
        weight 1
        TCP_CHECK {
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
          connect_port 31080
      }
    }
    real_server 10.239.103.55 31080 {
        weight 1
        TCP_CHECK {
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
          connect_port 31080
      }
  }
}

LVS-Master/LVS-Backup keepalived注册系统服务

mkdir /etc/keepalived  
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/  
# 复制 keepalived 服务脚本到默认的地址
cp /usr/local/src/keepalived-2.2.7/keepalived/etc/init.d/keepalived /etc/init.d/  
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ 

systemctl start keepalived

# 查看VIP映射关系
ipvsadm -L

realserver.sh

#!/bin/bash
#description: Config realserver

VIP=10.239.103.250

/etc/rc.d/init.d/functions

case "$1" in
start)
       /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
       /sbin/route add -host $VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       /sbin/ifconfig lo:0 down
       /sbin/route del $VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac

exit 0

Web-A/Web-B/Web-C执行realserver.sh

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

推荐阅读更多精彩内容