LVS學習筆記1

Linux Cluster:

Cluster:計算機集合,為解決某個特定問題組合起來形成的單個系統;

Linux Cluster類型:
  • LB:Load Balancing Cluster,負載均衡集群
    它是利用一個集群中的多臺機器,完成許多并行的工作。一般情況下,如果一個應用使用的人多了,那么用戶請求的相應時間就會增大,機器的性能也會受到影響,如果是使用LB,那么集群中的每一臺機器都能響應用戶的請求,這樣集群就會在用戶發出請求之后,根據算法選擇機器接收請求并響應,來增加系統的可用性和穩定性。
    負責均衡集群中有一個Director(也叫調度器或分發器),它處在多個服務器的前面,接收客戶請求并根據內部定義的規則或調度方式在后方服務器群中選擇一個來響應用戶發送的請求。

  • HA:High Availablity Cluster,高可用集群
    高可用集群是服務的可用性高,當我們的某臺服務器出現問題不可用時不會造成服務不可用。
    衡量標準:A=MTBF/(MTBF+MTTR)
    A(0,1): 90%,95%,99%,99.9%,99.99%,99.999%

    • MTBF:服務在線時間
    • MTTR:故障處理時間
  • HP:High Performance Cluster。高性能集群
    高性能集群是并行處理集群,將大任務劃分為小任務,分別進行處理的機制;一般用于科學研究與大數據運算等方面的工作。
分布式系統:
  • 分布式存儲
  • 分布式計算
系統擴展方式:
  • Scale UP:向上擴展;當一臺服務器不能滿足需求時,更換更高性能的服務器替換,這種方式為向上擴展
  • Scale Out:向外擴展;當一臺服務器不能滿足需求時,添加新的服務器,組成集群模式來使用,這種方式被稱為向外擴展

lvs:Linux Virtual Server

  • lvs:四層路由器,四層交換機;
    VS根據請求報文的目標ip和目標協議及端口將其調度轉發之某RealServer,根據調度算法來挑選RS;
  • lvs : ipvsadm/ipvs
    • ipvsadm:用戶空間的命令行工具,規則管理器,用于管理集群服務及相關的RealServer;
    • ipvs:工作于內核空間的netfilter的INPUT鉤子之上的框架;
  • lvs集群類型中的術語:
    • VS: Virtual Server,Director, Dispatcher,Balancer
    • RS: Real Server,upstream server , backend server
    • CIP: Client ip,VIP: Virtual server ip,RIP: Real server ip,DIP: Director ip
ipvs scheduler:調度算法(調度方法);

根據其調度時是否考慮各RS當前的負載狀態,可分為靜態方法和動態方法兩種:

  1. 靜態方法:僅根據算法本身進行調度
  • RR: roundrobin, 輪詢;
  • WRR: Weighted RR, 加權輪詢;
  • SH: Source Hashing,實現session sticky,源ip地址哈希;將來自于同一個ip地址的請求始終發往第一次挑中的RS,從而實現回話綁定;
  • DH: Destination Hashing,目標ip地址哈希,將發往同一個目標地址的請求始終發至第一次挑中的RS,典型的使用場景是正向代理緩存場景中的負載均衡;
  1. 動態方法:主要根據每RS當前的負載狀態及調度算法進行調度;Overhead(負載值)、activeconns(活動連接數)、inactiveconns(非活動連接數)
  • LC: least connections,最少連接數
    - Overhead=activeconns*256+inactiveconns
  • WLC: Weighted LC, 加權最少連接;
    - Overhead=(activeconns*256+inactiveconns)/weight
  • SED: Shortest Expection Delay,最短的期望延遲;
    - Overhead=(activeconns+1)*256/weight
  • NQ: Never Queue,增強版SED
  • LBLC: Locality-Based LC,動態的DH算法;
  • LBLCR:LBLC with Replication,帶復制功能的LBLC;

lvs四種集群:nat、dr、tun、fullnat

1. lvs-nat:

多目標的DNAT,通過將請求報文的目標地址和目標端口修改為某挑選出的RS的ip、port實現轉發。
<1>. RIP和DIP必須在同一個ip網絡,且應該使用私網地址;RS的網關要指向DIP
<2>. 請求報文和響應報文都必須經由Director轉發;Director易于稱為系統瓶頸;
<3>. 支持端口映射,可以修改請求報文的目標PORT
<4>. VS必須是Linux系統,RS可以是任意系統

  • 使用場景:小并發的實驗性應用、mysql集群
2. lvs-dr:

Direct Routing,直接路由;
通過為請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變;
Director和各RS都得配置使用VIP;
<1> 確保前段路由器將目標ip為VIP的請求報文發往Director,有以下三種方式:

  • 在前端網關做靜態綁定
  • 在RS上使用arptables;
  • 在RS上修改內核參數以限制arp通告及應答級別;

<2> RS的RIP可以使用私網地址,也可以使用公網地址;RIP和DIP在同一個ip網絡;RIP的網關不能只想DIP,以確保響應報文不會經由Director;
<3> RS跟Director要在同一個物理網絡;
<4> 請求報文要經由Director,但響應報文不能經由Director,而是由RS直接發往Client;
<5> 不支持端口映射

  • 使用場景:大眾方式;
3. lvs-tun:

轉發方式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而是在原IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP是CIP);
<1> DIP VIP RIP 都應該是公網地址;
<2> RS的網關不能,也不可能指向DIP;
<3> 請求報文要經由Director,但響應不能經由Director;
<4> 不支持端口映射
<5> RS的OS得支持隧道功能;

  • 使用場景:廣域網負載;
4. lvs-fullnat:

通過同時修改請求報文的源IP地址和目標IP地址進行轉發
CIP< - - > DIP
VIP< - - > RIP
<1> VIP是公網地址,RIP和DIP是私網地址,且通常不在同一個IP網絡;因此,RIP的網關一般不會指向DIP
<2> RS收到的請求報文源地址是DIP,因此,只能響應給DIP;但是Director還要將其發往Client;
<3> 請求和響應報文都經由Director;
<4> 支持端口映射;

  • 注意: 此類型默認不支持;
總結:
  • lvs-nat,lvs-fullnat:請求和響應報文都經由Director
    • lvs-nat:RIP的網關要指向DIP
    • lvs-fullnat:RIP和DIP未必在同一IP網絡,但要能通信
  • lvs-dr,lvs-tun:請求報文要經由Director,但響應報文由RS直接發往Client
    • lvs-dr:通過封裝新的MAC首部實現,通過MAC網絡轉發
    • lvs-tun:通過在原IP報文之外封裝新的IP首部實現轉發,支持遠距離通信

lvs-nat工作原理及配置實現

工作原理:

  • 客戶端通過Internet訪問本地的服務,發送請求報文(源地址CIP:目標地址VIP:端口號)通過路由和Director的公網ip地址(VIP)到達Director,Director收到請求報文后,通過INPUT鏈上的規則發現是訪問RealServer的服務,就把請求報文的目標地址和端口改為通過算法挑選出RS的ip地址和端口(源地址CIP:目標地址RIP:端口),并通過DIP網卡發送給RS;此處要求Director開啟核心轉發功能;
  • RS收到請求報文,解封裝后發送響應報文(源端口RIP:目標端口:CIP)給Director(此處RS的網關必須指向Director的DIP才行),Director收到報文后看到目標地址是CIP,因此就通過本地VIP網卡發送給Client; 流程如下圖:


    LVS-NAT.png
  • 配置實現:
    根據上圖的網絡拓撲圖,配置lvs-nat實驗機

    #把主機192.168.1.108配置成Director,先檢查看內核是否支持lvs
    [root@localhost ~]# grep -i "ipvs" -C 10 /boot/config-3.10.0-693.el7.x86_64
    #在192.168.1.108上在添加一塊網卡,配置僅主機模式并配置ip
    [root@localhost ~]# ifconfig ens33 192.168.18.254/24
    #開啟核心轉發功能
    [root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
    [root@localhost ~]# hostnamectl set-hostname www.ilinux.com
    
    #在RS1和RS2兩臺主機上先安裝httpd、telnet-server兩個服務以便后面測試
    [root@localhost ~]# yum -y install httpd telnet-server
    #分別給R1和R2配置兩個不同的測試頁
    [root@localhost ~]# vim /var/www/html/test1.html
      R1: <h1>R1,192.168.18.11</h1>
      R2: <h1>R2,192.168.18.12</h1>
    #修改RS1和RS2的主機名
    [root@localhost ~]# hostnamectl set-hostname rs1.ilinux.com
    [root@localhost ~]# hostnamectl set-hostname rs2.ilinux.com
    #配置RS1和RS2的ip地址,并且網關指向192.168.18.254
    [root@localhost ~]# ifconfig ens33 192.168.18.11/24 
    [root@localhost ~]# route add default gw 192.168.18.254
    [root@localhost ~]# ifconfig ens33 192.168.18.12/24 
    [root@localhost ~]# route add default gw 192.168.18.254
    #至此網絡配置完成,下面配置lvs規則定義集群
    [root@www ~]# yum -y install ipvsadm
    [root@www ~]# ipvsadm -A -t 192.168.1.108:80 -s rr
    [root@www ~]# ipvsadm -a -t 192.168.1.108:80 -r 192.168.18.11 -m
    [root@www ~]# ipvsadm -a -t 192.168.1.108:80 -r 192.168.18.12 -m
    [root@www ~]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.1.108:80 rr
      -> 192.168.18.11:80             Masq    1      0          9         
      -> 192.168.18.12:80             Masq    1      0          8  
    #使用192.168.1.105的主機訪問測試:
    [root@localhost ~]# for i in {1..10}; do curl http://192.168.1.108/test1.html;done
    <h1>RS2,192.168.18.12</h1>
    <h1>RS1,192.168.18.11</h1>
    <h1>RS2,192.168.18.12</h1>
    <h1>RS1,192.168.18.11</h1>
    <h1>RS2,192.168.18.12</h1>
    <h1>RS1,192.168.18.11</h1>
    <h1>RS2,192.168.18.12</h1>
    <h1>RS1,192.168.18.11</h1>
    <h1>RS2,192.168.18.12</h1>
    <h1>RS1,192.168.18.11</h1>
    
    
    #加權輪詢測試
    [root@www ~]# ipvsadm -E -t 192.168.1.108:80 -s wrr
    [root@www ~]# ipvsadm -e -t 192.168.1.108:80 -r 192.168.18.11 -m -w 2
    [root@www ~]# ipvsadm -e -t 192.168.1.108:80 -r 192.168.18.12 -m -w 3
    [root@www ~]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.1.108:80 rr
      -> 192.168.18.11:80             Masq    2      0          0         
      -> 192.168.18.12:80             Masq    3      0          0   
     #訪問測試
     [root@localhost ~]# for i in {1..10}; do curl http://192.168.1.108/test1.html;done
    <h1>RS2,192.168.18.12</h1>
    <h1>RS2,192.168.18.12</h1>
    <h1>RS1,192.168.18.11</h1>
    <h1>RS2,192.168.18.12</h1>
    <h1>RS1,192.168.18.11</h1>
    <h1>RS2,192.168.18.12</h1>
    <h1>RS2,192.168.18.12</h1>
    <h1>RS1,192.168.18.11</h1>
    <h1>RS2,192.168.18.12</h1>
    <h1>RS1,192.168.18.11</h1>
    
    
    #假如后端的RS2掛了,lvs還會繼續調度,因此需要手動刪除或者修改權重為0
    [root@localhost ~]# for i in {1..10}; do curl http://192.168.1.108/test1.html;done
      curl: (7) Failed connect to 192.168.1.108:80; 拒絕連接
      curl: (7) Failed connect to 192.168.1.108:80; 拒絕連接
      <h1>RS1,192.168.18.11</h1>
      curl: (7) Failed connect to 192.168.1.108:80; 拒絕連接
      <h1>RS1,192.168.18.11</h1>
      curl: (7) Failed connect to 192.168.1.108:80; 拒絕連接
      curl: (7) Failed connect to 192.168.1.108:80; 拒絕連接
      <h1>RS1,192.168.18.11</h1>
      curl: (7) Failed connect to 192.168.1.108:80; 拒絕連接
    [root@www ~]# ipvsadm -d -t 192.168.1.108:80 -r 192.168.18.12
    [root@www ~]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.1.108:80 wrr
      -> 192.168.18.11:80             Masq    2      0          4 
      #修改權重為0
    [root@www ~]# ipvsadm -e -t 192.168.1.108:80 -r 192.168.18.12 -m -w 0
    [root@www ~]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.1.108:80 wrr
      -> 192.168.18.11:80             Masq    2      0          14        
      -> 192.168.18.12:80             Masq    0      0          0    
    

假如RS1,RS2都掛了,可以把director當做一個服務,把RS1,RS2權重改為0

    [root@www ~]# yum istall nginx -y
    [root@www ~]# cd /usr/share/nginx/html/
    [root@www html]# vim test1.html              
        <h1>SORRY</h1>
    [root@www html]# systemctl start nginx

    [root@www html]# ipvsadm -a -t 192.168.1.108:80 -r 127.0.0.1 -g
    [root@www html]# ipvsadm -e -t 192.168.1.108:80 -r 192.168.18.11 -m -w 0
    [root@www html]# ipvsadm -e -t 192.168.1.108:80 -r 192.168.18.12 -m -w 0
#使用主機測試
    [root@localhost ~]# for i in {1..5}; do curl http://192.168.1.108/test1.html;done
    <h1>SORRY</h1>
    <h1>SORRY</h1>
    <h1>SORRY</h1>
    <h1>SORRY</h1>
    <h1>SORRY</h1>

...

[root@www html]# ipvsadm -ln --stats  #統計信息
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.1.108:80                  253     1351      652    90948    78005
  -> 127.0.0.1:80                       63      373        0    24983        0
  -> 192.168.18.11:80                  108      545      368    36789    43865
  -> 192.168.18.12:80                   82      433      284    29176    34140
[root@www html]# ipvsadm -ln --rate   #統計速率
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  192.168.1.108:80                    0        0        0        0        0
  -> 127.0.0.1:80                        0        0        0        0        0
  -> 192.168.18.11:80                    0        0        0        0        0
  -> 192.168.18.12:80                    0        0        0        0        0

lvs-dr工作原理及配置實現

工作原理:

  • Client發送請求報文(源地址CIP:目標地址VIP)經過層層路由到達離我們最近的末梢路由后,末梢路由會通過ARP廣播,得到Director的MAC地址,然后在請求報文外封裝一層mac首部(源mac地址末梢路由網卡的mac:目標地址為Director網卡mac),然后發送給Director;
  • Director收到請求報文后,發現目標地址的mac是自己,就拆除mac首部封裝,給請求報文重新封裝一個mac首部(源mac為DIP:目標mac為RIP)發送給挑選出的RS;流程如下圖;
  • 注意:此處RS與Director在同一物理網絡,都有VIP,因此要確保RS不響應末梢路由的ARP廣播才行;有兩種方法
    • 在RS上使用arptables
    • 在RS上修改內核參數以限制ARP通告及應答級別(arp_announce和arp_ignore)


      LVS-DR.png

實驗配置:
按上圖網絡拓補圖配置試驗機,Director和RS全部一塊網卡,并橋接,設置DIP:192.168.43.245,RIP:192.168.43.11和192.168.43.12
把VIP地址192.168.43.99設置在DIP網卡別名上,RS的lo網卡別名上

#通過腳本修改內核參數以現在RS的ARP通告和應答級別
[root@rs1 ~]# vim setparam.sh 
    #!/bin/bash
    #
    case $1 in
    start)
            echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
            echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
            echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
            echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
            ;;
    stop)
            echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
            echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
            echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
            echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
            ;;
    *)
            echo "Usage $(basename $0) start|stop"
            exit 1
            ;;
    esac
    #分別在RS1和RS2上運行此腳本
    [root@rs1 ~]# bash -x setparam.sh start
    [root@rs2 ~]# bash -x setparam.sh start
    #在RS1和RS2上配置VIP
    [root@rs1 ~]# ifconfig lo:0 192.168.43.99 netmask 255.255.255.255 broadcast 192.168.43.99 up
    [root@rs2 ~]# ifconfig lo:0 192.168.43.99 netmask 255.255.255.255 broadcast 192.168.43.99 up
    #添加路由條目由哪個設備進來就由哪個設備出去
    [root@rs1 ~]# route add -host 192.168.43.99 dev lo:0
    [root@rs2 ~]# route add -host 192.168.43.99 dev lo:0
    #配置Director的VIP
    [root@www ~]# ifconfig ens33:0 192.168.43.99 netmask 255.255.255.255 broadcast 192.168.43.99 up

    #在Director上安裝ipvs并定義集群
    [root@www ~]# ipvsadm -A -t 192.168.43.99:80 -s rr
    [root@www ~]# ipvsadm -a -t 192.168.43.99:80 -r 192.168.43.11 -g
    [root@www ~]# ipvsadm -a -t 192.168.43.99:80 -r 192.168.43.12 -g
    [root@www ~]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.43.99:80 rr
      -> 192.168.43.11:80             Route   1      0          9         
      -> 192.168.43.12:80             Route   1      0          8  

ipvsadm命令

  • 程序包:ipvsadm

  • Unit File: ipvsadm.service

  • 主程序:/usr/sbin/ipvsadm

  • 規則保存工具:/usr/sbin/ipvsadm-save

  • 規則重載工具:/usr/sbin/ipvsadm-restore

  • 配置文件:/etc/sysconfig/ipvsadm-config

  • 核心功能:

    • 集群服務管理:增、刪、改;
    • 集群服務的RS管理:增、刪、改;
    • 查看:
  • 語法格式:
    ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]

              ipvsadm -D -t|u|f service-address
              ipvsadm -C
              ipvsadm -R
              ipvsadm -S [-n]
              ipvsadm -a|e -t|u|f service-address -r server-address [options]
              ipvsadm -d -t|u|f service-address -r server-address
              ipvsadm -L|l [options]
              ipvsadm -Z [-t|u|f service-address]
    

-管理集群服務:增、改、刪;
增、改:ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
刪:ipvsadm -D -t|u|f service-address

    service-address:
            t|u|f:
                -t: TCP協議的端口,VIP:TCP_PORT
                -u: UDP協議的端口,VIP:UDP_PORT
                -f:firewall MARK,是一個數字;
    [-s scheduler]:指定集群的調度算法,默認為wlc;
    管理集群上的RS:增、改、刪;
            增、改:
                ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
            刪:
                ipvsadm -d -t|u|f service-address -r server-address
    server-address:
                rip[:port]
        選項:
            lvs類型:
                -g: gateway, dr類型
                -i: ipip, tun類型
                -m: masquerade, nat類型
                        
                -w weight:權重;
            
    清空定義的所有內容:
                ipvsadm -C
            
    查看:
                ipvsadm -L|l [options]
                    --numeric, -n:numeric output of addresses and ports 
                    --exact:expand numbers (display exact values)
                    
                    --connection, -c:output of current IPVS connections
                    --stats:output of statistics information
                    --rate :output of rate information
                
    保存和重載:
                ipvsadm -S = ipvsadm-save
                ipvsadm -R = ipvsadm-restore 
負載均衡集群設計時要注意的問題:

(1) 是否需要會話保持;
(2) 是否需要共享存儲;

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