Keepalived高可用

Keepalive:http://www.keepalived.org/
《老男孩Linux運(yùn)維》




Keepalived

Keepalived介紹

Keepalived軟件最初是專為LVS設(shè)計(jì)的,用來管理并監(jiān)控LVS集群系統(tǒng)中的各個(gè)服務(wù)節(jié)點(diǎn)狀態(tài),后來又加入了實(shí)現(xiàn)高可用的 VRRP功能。因此,Keepalived除了能管理LVS外,還可以作為Nginx、Haproxy等的高可用解決軟件。

Keepalived主要是通過VRRP協(xié)議實(shí)現(xiàn)高可用功能。
VRRP(Virtual Router Redundancy Protocol),虛擬路由冗余協(xié)議
VRRP目的是為了解決靜態(tài)路由單點(diǎn)故障問題,它能保證當(dāng)個(gè)別節(jié)點(diǎn)宕機(jī)時(shí),整個(gè)網(wǎng)絡(luò)可以不間斷地運(yùn)行。

所以,Keepalived一方面具有配置管理LVS的功能,同時(shí)還具有對LVS下面節(jié)點(diǎn)進(jìn)行健康檢查的功能,另一方面也可實(shí)現(xiàn)系統(tǒng)網(wǎng)絡(luò)服務(wù)的高可用功能。


Keepalived的三個(gè)重要功能

管理LVS負(fù)載均衡軟件

可以說,Keepalived起初是專為解決LVS的問題而誕生的。因此,Keepalived和LVS的關(guān)系如夫妻一樣,可緊密結(jié)合。

實(shí)現(xiàn)對LVS集群節(jié)點(diǎn)健康檢查

當(dāng)LVS集群中某個(gè)節(jié)點(diǎn)服務(wù)器發(fā)生故障時(shí),Keepalived服務(wù)會自動將失效的節(jié)點(diǎn)從正常隊(duì)列中剔除,并將請求調(diào)度到別的正常的節(jié)點(diǎn)服務(wù)器上,從而保證用戶訪問不受影響。當(dāng)故障節(jié)點(diǎn)被修復(fù)后,Keepalived服務(wù)又會自動把它切換回來。

系統(tǒng)網(wǎng)絡(luò)服務(wù)的高可用功能

Keepalived可以實(shí)現(xiàn)任意兩臺主機(jī)之間,如Master和Backup間的故障轉(zhuǎn)移和自動切換。這個(gè)主機(jī)是不能停機(jī)的業(yè)務(wù)服務(wù)器,如LVS負(fù)載均衡、Nginx反向代理服務(wù)器等。

Keepalived高可用功能的簡單原理。Mater獲得所有資源并對用戶提供服務(wù),Backup主機(jī)為Master的熱備。當(dāng)Master失效或出現(xiàn)故障時(shí),Backup將自動接管Master主機(jī)的所有工作,包括VIP資源;當(dāng)Master恢復(fù)后,自會自動接管回它原來的工作,Backup則同時(shí)釋放它接管的工作。
此時(shí),兩臺主機(jī)將恢復(fù)到最初啟動時(shí)各自的原始角色及工作狀態(tài)。


Keepalived高可用故障切換轉(zhuǎn)移原理

Keepalived高可用服務(wù)的故障切換轉(zhuǎn)移,是通過VRRP來實(shí)現(xiàn)的。

在Keepalived服務(wù)正常運(yùn)行時(shí),主Master節(jié)點(diǎn)會不斷向備用結(jié)點(diǎn)發(fā)送(多播方式)心跳信息,用以告訴Backup節(jié)點(diǎn)自己還活著。
當(dāng)Master節(jié)點(diǎn)發(fā)生故障時(shí),就無法發(fā)送心跳信息,Backup節(jié)點(diǎn)也就無法檢測到來自Master的心跳信息,于是調(diào)用自身的接管程序,接管Master的IP資源和服務(wù);
當(dāng)Master恢復(fù)時(shí),Backup又會釋放Master故障時(shí)自身接管的IP資源和服務(wù),恢復(fù)到原來的備用角色。

VRRP(Virtual Router Redundancy Protocol)虛擬路由協(xié)議,為了解決靜態(tài)路由的單點(diǎn)故障問題,VRRP通過一種競選機(jī)制來將路由的任務(wù)交給某臺VRRP路由器。
VRRP早期是用來解決交換機(jī)、路由器等設(shè)備單點(diǎn)故障。交互、路由的Master和Backup的切換原理同樣適用于Keepalived的工作原理。
在一組VRRP路由器集群中,有多臺物理VRRP路由器,但并不是同時(shí)工作,而是由一臺Master的機(jī)器負(fù)責(zé)路由工作,其他機(jī)器都是Backup。Master并不是一成不變,VRRP會讓每個(gè)VRRP路由參與競選,最終獲勝的就是Master。獲勝的Master有一些特權(quán),比如擁有虛擬路由器的IP地址等。
擁有系統(tǒng)資源的Master負(fù)責(zé)轉(zhuǎn)發(fā)發(fā)送給網(wǎng)關(guān)地址的包和響應(yīng)ARP請求。

VRRP通過競選機(jī)制來實(shí)現(xiàn)虛擬路由器的功能,所有的協(xié)議報(bào)文都是通過IP多播(Multicast)包形式來發(fā)送,默認(rèn)多播地址224.0.0.18。在一組虛擬路由器中,不管誰是 Master,對外都是相同的MAC和IP,稱之為VIP。客戶端主機(jī)并不需要因Master的改變而修改自己的路由配置。對他們來說,這種切換時(shí)透明的。

在一組虛擬路由器中,只有作為Master的VRRP路由器會一直發(fā)送VRRP廣播包,此時(shí)Backup不會搶占Master。當(dāng)Master不可用時(shí),Backup就收不到來自Master的廣播包了,此時(shí)多臺Backup中優(yōu)先級最高的路由器會搶占為Master。
這種搶占非常快速,以保證服務(wù)的連續(xù)性。處于安全性考慮,VRRP數(shù)據(jù)報(bào)使用了加密協(xié)議進(jìn)行加密。


Keepalived高可用服務(wù)

安裝Keepalived軟件

可以通過官方下載源碼來編譯安裝,也可以使用yum來安裝。

yum search keepalived
yum install -y keepalived
rpm -q keepalived

Keepalived配置文件

利用yum安裝,Keepalived的配置文件默認(rèn)為:/etc/keepalived/keepalived.conf



全局定義(Global Definitions)部分:

! Configuration File for keepalived
#號 和 !號 都是注釋

global_defs {  #全局定義
   notification_email {  #定義報(bào)警郵件地址,當(dāng)服務(wù)切換或RS節(jié)點(diǎn)有故障時(shí),發(fā)送報(bào)警郵件
     acassen@firewall.loc  #收件人1
     failover@firewall.loc  #收件人2
     sysadmin@firewall.loc  #收件人3
   }
   notification_email_from Alexandre.Cassen@firewall.loc  #發(fā)件人
   smtp_server 192.168.200.1  #發(fā)送郵件的smtp服務(wù)器
   smtp_connect_timeout 30  #連接smtp的超時(shí)時(shí)間
    #所有郵件報(bào)警相關(guān)參數(shù)均可以不配,可以交由監(jiān)控軟件(如Nagios、Zabbix)實(shí)現(xiàn)
   router_id LVS_DEVEL  #Keepalived服務(wù)器的路由標(biāo)識。在一個(gè)局域網(wǎng)內(nèi),此標(biāo)識應(yīng)該唯一
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}



VRRP實(shí)例定義區(qū)塊(VRRP instance)部分:
這部分主要用來定義具體服務(wù)的實(shí)例配置,包括Keepalived主備狀態(tài)、接口、優(yōu)先級、認(rèn)證方式和IP信息等。

vrrp_instance VI_1 {
  #定義一個(gè)vrrp實(shí)例,名字是 VI_1
  #每個(gè)vrrp實(shí)例可以認(rèn)為是Keepalived服務(wù)的一個(gè)實(shí)例或作為一個(gè)業(yè)務(wù)服務(wù),在Keepalived服務(wù)配置中,vrrp實(shí)例可以有多個(gè)
  #注意,存在于主節(jié)點(diǎn)中的vrrp實(shí)例在備節(jié)點(diǎn)中也要存在,這樣才能實(shí)現(xiàn)故障切換轉(zhuǎn)移
    state MASTER
       #當(dāng)前vrrp實(shí)例狀態(tài),MASTER|BACKUP,大寫
    interface eth0
      #網(wǎng)絡(luò)通信接口,注意服務(wù)器的接口名稱
    virtual_router_id 51
      #虛擬路由ID標(biāo)識,這個(gè)標(biāo)識最好是一個(gè)數(shù)字,并在keepalived.conf配置中唯一
      #MASTER和BACKUP配置中相同vrrp實(shí)例的virtual_router_id必須一致,否則將出現(xiàn)腦裂問題
    priority 100
      #優(yōu)先級,數(shù)字越大,表示實(shí)例優(yōu)先級越高
      #在同一個(gè)vrrp實(shí)例里,MASTER的優(yōu)先級要高于BACKUP才行
    advert_int 1
      #同步通知間隔,MASTER和BACKUP之間通信檢查的時(shí)間間隔,單位是秒
    authentication { 
      #權(quán)限認(rèn)證配置
        auth_type PASS
          #認(rèn)證類型,有PASS(Simple Passwd)和 AH(IPSEC),官方推薦PASS
          #驗(yàn)證密碼為明文方式,最好長度不要超過8個(gè)字符,建議使用4位的數(shù)字。同一個(gè)vrrp實(shí)例的MASTER和BACKUP使用相同的密碼才能正常通信
        auth_pass 1111  #通信密碼
    }
    virtual_ipaddress {
      #虛擬ip,可以配置多個(gè)虛擬ip,配置是最好指定子網(wǎng)掩碼和虛擬IP綁定的網(wǎng)絡(luò)接口。否則子網(wǎng)掩碼默認(rèn)是32位,綁定的接口和前面的interface參數(shù)配置一致
      #虛擬IP就是工作中需要和域名綁定的IP,和配置高可用服務(wù)監(jiān)聽的IP要保持一致
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
虛擬IP


配置Keepalived高可用

Keepalived高可用服務(wù)器節(jié)點(diǎn),MASTER 和 BACKUP 。兩臺的配置如下:

Ip:

MASTER:192.168.1.9
BACKUP:192.168.1.7

Virtual_ip:192.168.3.88

upstream.conf:

upstream zhang {
    server 192.168.0.99:5678;
}

Nginx.conf:

http {
    xxx;
    include /xxx/nginx/conf.d/*.conf;
    server {
        listen 80;
        server_name localhost;
        
        proxy_pass http://zhang;        
}

訪問效果:

192.168.1.7
192.168.1.9



MASTER端Keepalived.conf:

! Configuration File for keepalived

global_defs {
   router_id zhang  #路由器ID主備可同可不同
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.3.88/22 dev ens33 label ens33:1
    }
}
MASTER



BACKUP端Keepalived.conf:
BACKUP在MASTER沒有掛的情況下是沒有VIP的哦!VIP同一時(shí)刻只能出現(xiàn)在同一臺機(jī)器上。

! Configuration File for keepalived

global_defs {
   router_id zhang  #路由器ID主備可同可不同
 }

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.3.88/22 dev eth0 label eth0:1
        }
}

注意:

state 不一樣;
priority 不一樣;



修改hosts:

192.168.3.88 www.zhang.com

實(shí)際效果:

www.zhang.com

切換MASTER:

192.168.1.9上
service keepalived stop
IP自動漂移

這里1.9主機(jī)的Keepalived掛掉后,VIP實(shí)現(xiàn)了自動漂移切換。因此,僅適合兩臺服務(wù)器提供的服務(wù)均開啟的應(yīng)用場景,這也是工作中常用的高可用解決方案。

關(guān)于腦裂問題:
如果MASTER 和 BACKUP都出現(xiàn)了VIP,那說明兩者高可用裂腦了,裂腦是兩臺服務(wù)器爭搶同一資源導(dǎo)致的。

如出現(xiàn)兩節(jié)點(diǎn)搶奪同一IP資源問題,可考慮排查:

主備服務(wù)器間通信是否正常,是否有防火墻阻擋;
主備對應(yīng)的keepalived.conf配置文件是否有錯(cuò)?




Keepalived高可用服務(wù)的裂腦問題

什么是裂腦

由于某些原因,導(dǎo)致兩臺高可用服務(wù)器在指定時(shí)間內(nèi),無法檢測到對方的心跳消息,各自取得資源及服務(wù)的所有權(quán),而此時(shí)的兩臺高可用服務(wù)器對都還活著并正常運(yùn)行,這樣就會導(dǎo)致同一個(gè)ip或服務(wù)在兩端同時(shí)存在而發(fā)生沖突。
最嚴(yán)重的是兩臺主機(jī)占用同一個(gè)VIP地址,當(dāng)用戶寫入數(shù)據(jù)時(shí)可能會分別寫入到兩端,這可能會導(dǎo)致服務(wù)器兩端的數(shù)據(jù)不一致或造成數(shù)據(jù)丟失,這種情況被稱為裂腦。

裂腦發(fā)生的原因

一般來說,有以下幾種原因:

  1. 高可用服務(wù)器對之間心跳線路發(fā)生故障,導(dǎo)致無法正常通信;
  2. 高可用服務(wù)器上開啟了防火墻阻擋了心跳信息傳輸;
  3. 高可用服務(wù)器網(wǎng)卡等信息配置不正確,導(dǎo)致心跳信息發(fā)送失敗;
  4. 其他服務(wù)配置不當(dāng),如vrrp實(shí)例的virtual_router_id不一致;

解決裂腦常見方案

  1. 保證通信線路完整;
  2. 當(dāng)檢測到裂腦時(shí)強(qiáng)行關(guān)閉一個(gè)心跳節(jié)點(diǎn);
  3. 做好多裂腦的監(jiān)控報(bào)警,發(fā)生問題時(shí)及時(shí)解決;
  4. 如果有防火墻,要讓心跳信息通過;




Keepalived雙實(shí)例雙主模式

前面的Keepalived栗子是單實(shí)例主備模式,但Keepalived還支持雙實(shí)例多業(yè)務(wù)雙向主備模式。需要創(chuàng)建新實(shí)例。

雙實(shí)例主備環(huán)境:

192.168.1.7 instance VI_1-BACKUP, instance VI_2-MASTER;
192.168.1.9 instance VI_1-MASTER, instance VI_2-BACKUP;

instance 1-VIP:192.168.3.88-www.zhang.com;
instance 2-VIP:192.168.3.99-www.zhang.cn;
#記得添加hosts

192.168.1.9-keepalived.conf:

! Configuration File for keepalived

global_defs {
   router_id zhang
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.3.88/22 dev ens33 label ens33:1
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }

    virtual_ipaddress {
        192.168.3.99/22 dev ens 33 label ens33:2
    }
}

192.168.1.7-keepalived.conf:

! Configuration File for keepalived

global_defs {
   router_id zhang
 }

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.3.88/22 dev eth0 label eth0:1
        }
}

vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }

    virtual_ipaddress {
        192.168.3.99/22 dev eth0 label eth0:2
    }
}

效果:

192.168.1.7
192.168.1.9

VIP漂移:

192.168.1.9
service keepalived stop
192.168.1.7

訪問圖:

www.zhang.com
www.zhang.cn




解決高可用服務(wù)只針對物理服務(wù)器的問題

默認(rèn)情況下,Keepalived軟件僅僅在另外一臺機(jī)器宕機(jī)或Keepalived停掉的時(shí)候才會接管業(yè)務(wù)。
但在實(shí)際工作中,有業(yè)務(wù)服務(wù)停止而Keepalived服務(wù)還存在的情況,這就會導(dǎo)致用戶訪問的VIP無法找到對應(yīng)的服務(wù)。那么,如果讓ip漂移到對端節(jié)點(diǎn)呢?

第一個(gè)方法:可以寫守護(hù)進(jìn)程腳本來處理
當(dāng)Nginx業(yè)務(wù)有問題時(shí),就停掉本地的Keepalived服務(wù),實(shí)現(xiàn)IP漂移到對端繼續(xù)提供服務(wù)。

舉個(gè)栗子:

vim check_nginx.sh

#!/bin/bash
while true
do
  if [ `netstat -nltup | grep nginx | wc -l` -ne 1 ];then
    /sbin/service keepalived stop
  fi
  sleep 2
done



第二個(gè)方法:使用Keepalived配置文件觸發(fā)寫好的監(jiān)測腳本

監(jiān)測腳本:

vim chk_nginx.sh

#!/bin/bash
while true
do
  if [ `netstat -nltup | grep nginx | wc -l` -ne 1 ];then
    /sbin/service keepalived stop
  fi
  sleep 3
done

修改keepalived.conf:

! Configuration File for keepalived

global_defs {
    xxx
}

vrrp_script chk_nginx {   #定義vrrp腳本
    script "/etc/keepalived/chk_nginx.sh"
    interval 2    #間隔2s
    weight 2
}

vrrp_instancd xxx {
    xxx
    virtual_ipaddress {
        xxx
    }
    track_script {   #觸發(fā)檢查
        chk_nginx
    }
}




解決多組Keepalived服務(wù)器在同一個(gè)局域網(wǎng)的沖突問題

當(dāng)在同一個(gè)局域網(wǎng)內(nèi)部部署了多組Keepalived服務(wù)器對,而又未使用專門的心跳線通信時(shí),可能會發(fā)生高可用接管的嚴(yán)重故障問題。
Keepalived高可用是通過VRRP協(xié)議來實(shí)現(xiàn)的,VRRP協(xié)議默認(rèn)通過IP多播的形式實(shí)現(xiàn)高可用對之間的通信。多組Keepalived服務(wù)器對會造成IP多播地址沖突問題,導(dǎo)致接管錯(cuò)亂,不同組的Keepalived都是使用默認(rèn)的 224.0.0.18 作為多播地址。
此時(shí)解決辦法是,在同組的Keepalived服務(wù)器所有的配置文件里指定獨(dú)一無二的多播地址。

global_defs {
    router_id zhang
    vrrp_mcast_group4 224.0.0.19    #指定多播地址

不同實(shí)例的通信認(rèn)證密碼也最好不同,以確保接管正確。




指定Keepalived日志

默認(rèn)情況下,Keepalived服務(wù)的日志會輸出到 /var/log/messages ,和其他日志混雜在一起,很不方便。

操作如下:

vim /etc/sysconfig/keepalived

將 KEEPALIVED_OPTIONS="-D"
修改為 KEEPALIVED_OPTIONS="-D -d -S 0"
vim /etc/rsyslog.conf

#在末尾加入
#keepalived
local0.*    /var/log/keepalived.log

#然后找到 *.info;mail.none;authpriv.none;cron.none  /var/log/messages
#加上local0
*.info;mail.none;authpriv.none;cron.none;local0.none  /var/log/messages

#重啟rsyslog服務(wù)
service rsyslog restart




開發(fā)檢查Keepalived腦裂的腳本

思路:在備節(jié)點(diǎn)上執(zhí)行腳本,如果可以ping通主節(jié)點(diǎn),并且備節(jié)點(diǎn)有VIP就報(bào)警,讓人員介入檢查。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,667評論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 茶點(diǎn)故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內(nèi)容