LVS+KeepAlived高可用部署實戰(zhàn)應用

LVS+KeepAlived高可用部署實戰(zhàn)

1. 構建高可用集群

1.1 什么是高可用集群
高可用集群(High Availability Cluster,簡稱HA Cluster)沈撞,是指以減少服務中斷時間為目的得服務器集群技術微渠。它通過保護用戶得業(yè)務程序?qū)ν獠块g斷提供的服務,把因為軟件掀淘,硬件沛贪,認為造成的故障對業(yè)務得影響降低到最小程度褒墨。總而言之就是保證公司業(yè)務7*24小時不宕機
1.2 高可用衡量標準
衡量集群的可用性(HA)高低橘原,可以從MTTF(平均無故障時間)和MTTR(平均故障維修時間)進行考量樟蠕,公式為:HA=MTTF/(MTTF+MTTR)*100%,具體衡量標準可以參考下表
基本可用性 2個9 99% 年度宕機時間:87.6小時
較高可用性 3個9 99.9% 年度宕機時間:8.8小時
具有故障自動恢復 4個9 99.99% 年度宕機時間:53分鐘
極高可用性 5個9 99.999% 年度宕機時間:5分鐘
1.3 高可用保障
對集群中的服務器進行負載均衡靠柑、健康監(jiān)測寨辩,并在服務器出現(xiàn)故障時能進行故障轉(zhuǎn)移,自動切換到正常服務器是高可用保障的必要手段歼冰。
1.3.1 負載均衡
常見的負載均衡手段如下:

硬件負載均衡靡狞,如F5

軟件負載均衡,如nginx隔嫡、haproxy甸怕、lvs

幾種軟件負載均衡技術比較
技術 優(yōu)點 缺點
nginx 可以針對http應用做一些分流的策略; 對網(wǎng)絡穩(wěn)定性的依賴非常小 安裝和配置簡單腮恩,測試方便 能支撐幾萬的并發(fā)量 可作為靜態(tài)網(wǎng)頁和圖片服務器 僅支持http毅往、https和Email協(xié)議 只支持通過端口進行健康檢測
haproxy 支持通過URL進行健康檢測 單純做負載均衡寥裂,效率高于nginx 支持TCP的負載均衡,可以對mysql集群負載 不支持POP/SMTP協(xié)議 不支持HTTP cache功能 多進程模式支持不夠好 重載配置需要重啟進程
lvs 抗負載能力強,工作在網(wǎng)絡4層吠谢,性能最好 配置性比較低 工作穩(wěn)定 只分發(fā)請求合是,無流量產(chǎn)生火窒,保證IO性能 應用范圍比較廣 不支持正則表達式處理 不能做動靜分離 大型網(wǎng)站實施復雜 沒有專門用于windows的版本
1.3.2 健康監(jiān)測和自動切換
常見的健康監(jiān)測和自動切換軟件有keepAlived和heartBeat甚垦,其二者對比如下:

Keepalived使用更簡單:從安裝、配置释液、使用全释、維護等角度上對比,Keepalived都比Heartbeat要簡單 

Heartbeat功能更強大:Heartbeat雖然復雜误债,但功能更強大浸船,配套工具更全妄迁,適合做大型集群管理,而Keepalived主要用于集群倒換李命,基本沒有管理功能 
1.4 高可用拓撲圖
file

2. 軟件負載均衡技術LVS

2.1 LVS簡介
2.1.1 什么是lvs
LVS是Linux Virtual Server的簡寫登淘,在1998年5月由章文嵩博士成立。

工作在OSI模型的四層项戴,基于IP進行負載均衡。

在linux2.2內(nèi)核時槽惫,IPVS就已經(jīng)以內(nèi)核補丁的形式出現(xiàn)周叮。

從2.4版本以后,IPVS已經(jīng)成為linux官方標準內(nèi)核的一部分界斜。
2.1.2 lvs官方資料鏈接
a.  lvs項目介紹 http://www.linuxvirtualserver.org/zh/lvs1.html

b.  lvs集群的體系結構 http://www.linuxvirtualserver.org/zh/lvs2.html

c.  lvs集群中的IP負載均衡技術 http://www.linuxvirtualserver.org/zh/lvs3.html

d.  lvs集群的負載調(diào)度 http://www.linuxvirtualserver.org/zh/lvs4.html

e.  lvs中文站點 http://zh.linuxvirtualserver.org
2.2 lvs拓撲
2.2.1 lvs術語
LVS服務器(DS)

集群中節(jié)點服務器(RS)

虛擬IP地址(VIP)仿耽,用于向客戶端提供服務的IP地址(配置于負載均衡器上)

真實服務器的IP地址(RIP), 集群中節(jié)點服務器的IP地址 

負載均衡器IP地址(DIP)各薇,負載均衡器的IP地址项贺,物理網(wǎng)卡上的IP

客戶端主機IP地址(CIP),終端請求用戶的主機IP地址
2.2.2 工作原理和拓撲圖
LVS負載均衡調(diào)度技術是在linux內(nèi)核中實現(xiàn)的峭判,使用配置LVS時开缎,不是直接配置內(nèi)核中的IPVS,而是通過IPVS的管理工具IPVSADM來管理配置林螃,LVS集群負載均衡器接受所有入站客戶端的請求奕删,并根據(jù)算法來決定由哪個集群的節(jié)點來處理請求。
2.3 lvs的三種工作模式
2.3.1 NAT模式
NAT(Network Address Translation)模式是基于NAT技術實現(xiàn)的疗认。在此模式中完残,LVS服務器既要處理請求的接入,又要處理請求的響應横漏。因此存在較大的性能瓶頸谨设。
file
2.3.2 DR模式
DR(Direct Routing)模式是LVS的默認工作模式,也叫直接路由模式缎浇。只處理請求的接入扎拣,不處理請求的響應。因此性能高素跺,瓶頸小鹏秋。
file
2.3.3 TUN模式
TUN(Tunneling)模式需要服務器支持IP隧道(IP tunneling,是路由器把一種網(wǎng)絡層協(xié)議封裝到另一個協(xié)議中以跨過網(wǎng)絡傳送到另一個路由器的處理過程)技術亡笑,限制較大侣夷,一般不用。
file
2.4 LVS調(diào)度算法
2.4.1 靜態(tài)調(diào)度算法
調(diào)度算法 說 明
RR roundrobin輪詢調(diào)度
WRR Weighted RR加權輪詢調(diào)度
SH Soure Hashing源地址哈希調(diào)度
DH Destination Hashing目標地址哈希調(diào)度
2.4.2 動態(tài)調(diào)度算法
調(diào)度算法 說 明
LC Least Connections最小連接數(shù)調(diào)度
WLC Weighted LC加權最小連接數(shù)調(diào)度 默認*)
SED Shortest Expection Delay初始連接高權重優(yōu)先
NQ Nerver Queue 第一輪平均分配仑乌,后續(xù)SED
LBLC Locality-Based LC 動態(tài)的DH算法
LBLCR LBLC with Replication 帶復制功能的LBLC
FO Weighted Fail Over百拓,linux內(nèi)核4.15后新增的調(diào)度算法
OVF Overflow-connection琴锭,linux內(nèi)核4.15后新增的調(diào)度算法
2.5 lvs基本命令

對于lvs的操作,主要是通過ipvsadm軟件實現(xiàn)衙传,常用的lvs操作命令如下:

2.5.1 集群服務管理
命令 說 明
ipvsadm -A -t IP -s 調(diào)度算法 此命令用來添加一個lvs策略决帖,IP指VIP,調(diào)度算法是12種調(diào)度算法的一種
ipvsadm -C 此命令用來清除一個lvs策略
ipvsadm -S 此命令用來保存一個lvs策略
ipvsadm -R 此命令用來加載一個lvs策略
ipvsadm -L 此命令用來查看策略
2.5.2 集群RS管理
命令 說 明
ipvsadm -a -t IP1 -r IP2 -m|g|i 添加一臺RS蓖捶,IP1指VIP地回,IP2指RIP,-m|g|i中m是NAT俊鱼,g是DR刻像,
ipvsadm -d -t IP1 -r IP2 此命令用來刪除一臺RS,IP1指VIP并闲,IP2指RIP
2.6 lvs實戰(zhàn)
2.6.1 NAT模式實戰(zhàn)
**NAT實戰(zhàn)拓撲圖**
file
**NAT模式實現(xiàn)**

按照上面的拓撲圖细睡,進行NAT實戰(zhàn),步驟如下:

**A**. 準備4臺linux虛擬機帝火,并確定每臺虛擬機的角色溜徙,為了方便區(qū)分,可以對每臺虛擬機設置新的主機名犀填,比如       LVS服務器可以設置主機名為lvs蠢壹,設置方式如下
#設置主機名
hostnamectl set-hostname lvs
#斷開遠程連接
logout
#重新連接即可看到主機名已經(jīng)更改
然后對四臺虛擬機分別進行配置如下:

        **RS1和RS2配置**

        1)  配置網(wǎng)卡為NAT模式

        2)  下載安裝httpd服務,命令如下
yum install -y httpd
        3)  設置首頁內(nèi)容(RS2把內(nèi)容改為this is RS2)
echo this is RS01 > /var/www/html/index.html
        4)  啟動httpd
systemctl start httpd
        5)  在RS1和RS2上測試訪問九巡,能輸出 this is RS01或this is RS02即為成功
[root@rs01 ~]# curl localhost
this is RS01
        6)  RS1設置靜態(tài)IP為192.168.116.131知残,RS2設置靜態(tài)IP為192.168.116.132。

             RS1和RS2指定網(wǎng)關為192.168.116.130比庄,子網(wǎng)掩碼255.255.255.0

        7)  查看網(wǎng)關是否生效
[root@rs01 html]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.116.130 0.0.0.0         UG    100    0        0 ens33
192.168.116.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33
        **LVS服務器配置**                  

        1)  安裝ipvsadm
yum install -y ipvsadm
        2)  設置雙網(wǎng)卡

            僅主機網(wǎng)卡一塊求妹,IP配置為192.168.5.131,此IP是接受外部請求的VIP

            NAT網(wǎng)卡一塊佳窑,IP配置為192.168.116.130制恍,此IP是與后端RS服務器通信的DIP

        3)  配置ip_forward轉(zhuǎn)發(fā)
vi /etc/sysctl.conf
#添加如下內(nèi)容并保存退出
net.ipv4.ip_forward = 1
#執(zhí)行如下命令使修改生效
sysctl -p
        4)  使用ipvsadm進行負載均衡配置
#指定負載80端口的VIP,并指定調(diào)度策略為輪詢
[root@lvs01 ~]# ipvsadm -A -t 192.168.5.131:80 -s rr
#添加兩臺RS神凑,并指定負載均衡工作模式為NAT
[root@lvs01 ~]# ipvsadm -a -t 192.168.5.131:80 -r 192.168.116.131 -m
[root@lvs01 ~]# ipvsadm -a -t 192.168.5.131:80 -r 192.168.116.132 -m
#查看上述配置是否生效
[root@lvs01 ~]# 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.5.131:80 rr
  -> 192.168.116.131:80           Masq    1      0          0         
  -> 192.168.116.132:80           Masq    1      0          0 
        **client虛擬機配置和測試**

        配置網(wǎng)卡為僅主機模式净神,IP為192.168.5.130,網(wǎng)關無需配置即可溉委。

        在client上測試負載均衡效果鹃唯,如下:
[root@client ~]# curl 192.168.5.131
this is RS02
[root@client ~]# curl 192.168.5.131
this is RS01
[root@client ~]# curl 192.168.5.131
this is RS02
[root@client ~]# curl 192.168.5.131
this is RS01

NAT模式存在的問題-->LVS性能瓶頸

2.6.2 DR模式實戰(zhàn)

小貼士: ARP(Address Resolution Protocol)地址解析協(xié)議,是根據(jù)IP地址獲取物理地址(MAC)的一個 TCP/IP協(xié)議瓣喊。主機發(fā)送信息時將包含目標IP地址的ARP請求廣播到局域網(wǎng)絡上的所有主機坡慌,并接收返 回消息,以此確定目標的物理地址藻三;收到返回消息后將該IP地址和物理地址存入本機ARP緩存中并 保留一定時間洪橘,下次請求時直接查詢ARP緩存以節(jié)約資源跪者。

**DR模式拓撲圖**
file
**DR模式實現(xiàn)**

通過對比NAT模式和DR模式的拓撲圖可以發(fā)現(xiàn),需要讓LVS和RS在同一個網(wǎng)段熄求,并且在兩個RS服務器上也需要綁定VIP渣玲。所以DR模式實驗可以在剛才的基礎上進行,步驟如下:

1) 在RS1和RS2上進行如下ARP抑制操作弟晚,并配置VIP到lo網(wǎng)卡上忘衍,如下:
#arp抑制
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
#配置VIP到lo網(wǎng)卡  這里的子網(wǎng)掩碼需要4個255
[root@rs01 html]# ifconfig lo:9 192.168.116.134 netmask 255.255.255.255
[root@rs01 html]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.131  netmask 255.255.255.0  broadcast 192.168.116.255
        inet6 fe80::cc13:177d:ec0:60d2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::b105:ad45:a07e:f946  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:20:b6:01  txqueuelen 1000  (Ethernet)
        RX packets 1262  bytes 105801 (103.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 582  bytes 70559 (68.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 50  bytes 5310 (5.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 50  bytes 5310 (5.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo:9: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.116.134  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)

注意:RS1和RS2在之前進行NAT模式實驗時設置了網(wǎng)關為LVS的DIP,這里進行DR試驗時需要把網(wǎng)關刪除

2) 在LVS服務器上關閉之前的ens37網(wǎng)卡(注意:你的網(wǎng)卡名稱可能不是這個)
ifdown ens37
ifconfig ens37 down
3) 在lvs的ens33網(wǎng)卡上綁定VIP192.168.116.134
[root@lvs01 ~]# ifconfig ens33:9 192.168.116.134/24
[root@lvs01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.130  netmask 255.255.255.0  broadcast 192.168.116.255
        inet6 fe80::3264:bc00:653f:77b2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::cc13:177d:ec0:60d2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::b105:ad45:a07e:f946  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:38:1d:eb  txqueuelen 1000  (Ethernet)
        RX packets 717  bytes 62082 (60.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 244  bytes 37732 (36.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.134  netmask 255.255.255.0  broadcast 192.168.116.255
        ether 00:50:56:38:1d:eb  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

4) 在lvs服務器上清空LVS策略卿城,并重新設置DR模式策略
#查看策略
[root@lvs01 ~]# 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.5.131:80 rr
  -> 192.168.116.131:80           Masq    1      0          0         
  -> 192.168.116.132:80           Masq    1      0          0         
#清空策略
[root@lvs01 ~]# ipvsadm -C
#再次查看策略
[root@lvs01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

設置DR策略

#設置規(guī)則
[root@lvs01 ~]# ipvsadm -A -t 192.168.116.134:80 -s rr
#添加RS
[root@lvs01 ~]# ipvsadm -a -t 192.168.116.134:80 -r 192.168.116.131 -g
[root@lvs01 ~]# ipvsadm -a -t 192.168.116.134:80 -r 192.168.116.132 -g
#查看策略
[root@lvs01 ~]# 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.116.134:80 rr
  -> 192.168.116.131:80           Route   1      0          0         
  -> 192.168.116.132:80           Route   1      0          0
5) 修改client服務器配置枚钓,更改使用NAT網(wǎng)卡,并設置IP為192.168.116.133

6) 在client測試效果
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
7) 在LVS服務器上查看調(diào)度情況
[root@lvs01 ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:30  FIN_WAIT    192.168.116.133:45810 192.168.116.134:80 192.168.116.131:80
TCP 01:31  FIN_WAIT    192.168.116.133:45812 192.168.116.134:80 192.168.116.132:80
TCP 01:32  FIN_WAIT    192.168.116.133:45814 192.168.116.134:80 192.168.116.131:80
TCP 01:30  FIN_WAIT    192.168.116.133:45808 192.168.116.134:80 192.168.116.132:80
2.6.3 四個問題
a. 如果后端某臺RS服務器掛了會出現(xiàn)什么問題藻雪?

b.如果LVS服務器掛了會出現(xiàn)什么問題?

` c. 如何獲知RS服務器狀態(tài)?

d. 如何進行故障轉(zhuǎn)移秘噪、自動切換? 

3. KeepAlived

3.1 keepAlived簡介
Keepalived的作用是**檢測服務器狀態(tài)**狸吞,如果有一臺web服務器宕機勉耀,或工作出現(xiàn)故障,Keepalived將檢測到蹋偏,并**將有故障的服務器從系統(tǒng)中剔除便斥,同時使用其他服務器代替該服務器的工作**,當服務器工作正常后Keepalived自動將服務器加入到服務器群中威始。
3.2 keepAlived主要特點
3.2.1 健康檢查
檢查方式 說 明
tcp_check 工作在第4層枢纠,keepalived向后端服務器發(fā)起一個tcp連接請求,如果后端服務器沒有響應或超時黎棠,那么這個后端將從服務器池中移除
http_get 工作在第5層晋渺,向指定的URL執(zhí)行http請求,將得到的結果用md5加密并與指定的md5值比較看是否匹配脓斩,不匹配則從服務器池中移除木西;此外還可以指定http返回碼來判斷檢測是否成功。HTTP_GET可以指定多個URL用于檢測随静,這個一臺服務器有多個虛擬主機的情況下比較好用八千。
misc_check 用腳本來檢測,腳本如果帶有參數(shù)燎猛,需將腳本和參數(shù)放入雙引號內(nèi)
ssl_get 和http_get相似恋捆,不同的只是用SSL連接
smtp_check 主要用于郵件系統(tǒng)SMTP協(xié)議的檢測
3.2.2 故障遷移
**VRRP協(xié)議**

在現(xiàn)實的網(wǎng)絡環(huán)境中。主機之間的通信都是通過配置靜態(tài)路由或者(默認網(wǎng)關)來完成的重绷,而主機之間的路由器一旦發(fā)生故障沸停,通信就會失效,因此這種通信模式當中昭卓,路由器就成了一個單點瓶頸星立,為了解決這個問題爽茴,就引入了VRRP協(xié)議。

VRRP協(xié)議是一種容錯的主備模式的協(xié)議绰垂,保證當主機的下一跳路由出現(xiàn)故障時室奏,由另一臺路由器來代替出現(xiàn)故障的路由器進行工作,**通過VRRP可以在網(wǎng)絡發(fā)生故障時透明的進行設備切換而不影響主機之間的數(shù)據(jù)通信**劲装。 

**故障遷移原理**

在 Keepalived 服務正常工作時胧沫,**主 Master 節(jié)點會不斷地向備節(jié)點發(fā)送(多播的方式)心跳消息,用以告訴備 Backup 節(jié)點自己還活著**占业,當主 Master 節(jié)點發(fā)生故障時绒怨,就無法發(fā)送心跳消息,備節(jié)點也就因此無法繼續(xù)檢測到來自主 Master 節(jié)點的心跳了谦疾,于是調(diào)用自身的接管程序南蹂,接管主 Master 節(jié)點的 IP 資源及服務。而當主 Master 節(jié)點恢復時念恍,備 Backup 節(jié)點又會釋放主節(jié)點故障時自身接管的 IP 資源及服務六剥,恢復到原來的備用角色。
3.3 keepAlived原理
Keepalived工作在TCP/IP參考模型的三層峰伙、四層疗疟、五層,其原理如下:
工作層 說 明
網(wǎng)絡層 Keepalived通過ICMP協(xié)議向服務器集群中的每一個節(jié)點發(fā)送一個ICMP數(shù)據(jù)包(有點類似與Ping的功能)瞳氓,如果某個節(jié)點沒有返回響應數(shù)據(jù)包策彤,那么認為該節(jié)點發(fā)生了故障,Keepalived將報告這個節(jié)點失效匣摘,并從服務器集群中剔除故障節(jié)點店诗。
傳輸層 Keepalived在傳輸層里利用了TCP協(xié)議的端口連接和掃描技術來判斷集群節(jié)點的端口是否正常。 比如對于常見的WEB服務器80端口音榜∨尤常或者SSH服務22端口,Keepalived一旦在傳輸層探測到這些端口號沒有數(shù)據(jù)響應和數(shù)據(jù)返回囊咏,就認為這些端口發(fā)生異常恕洲,然后強制將這些端口所對應的節(jié)點從服務器集群中剔除掉。
應用 層 Keepalived的運行方式更加全面化和復雜化梅割,用戶可以通過自定義Keepalived工作方式霜第。 例如:可以通過編寫程序或者腳本來運行Keepalived,而Keepalived將根據(jù)用戶的設定參數(shù)檢測各種程序或者服務是否正常户辞,如果Keepalived的檢測結果和用戶設定的不一致時泌类,Keepalived將把對應的服務器從服務器集群中剔除。
3.4 分布式選主策略
3.4.1 僅設置priority
在一個一主多備的Keepalived集群中,priority值最大的將成為集群中的MASTER節(jié)點刃榨,而其他都是BACKUP節(jié)點弹砚。在MASTER節(jié)點發(fā)生故障后,BACKUP節(jié)點之間將進行“民主選舉”枢希,通過對節(jié)點優(yōu)先級值priority和weight的計算桌吃,選出新的MASTER節(jié)點接管集群服務。
3.4.2 設置priority和weight
**weight值為正數(shù)時**

在vrrp_script中指定的腳本如果檢測成功苞轿,那么MASTER節(jié)點的權值將是weight值與priority值之和茅诱;如果腳本檢測失效,那么MASTER節(jié)點的權值保持為priority值

MASTER 節(jié)點vrrp_script腳本檢測失敗時搬卒,如果MASTER節(jié)點priority值小于BACKUP節(jié)點weight值與priority值之和瑟俭,將發(fā)生主、備切換契邀。

MASTER節(jié)點vrrp_script腳本檢測成功時摆寄,如果MASTER節(jié)點weight值與priority值之和大于BACKUP節(jié)點weight值與priority值之和,主節(jié)點依然為主節(jié)點坯门,不發(fā)生切換微饥。



**weight值為負數(shù)時**

在vrrp_script中指定的腳本如果檢測成功,那么MASTER節(jié)點的權值仍為priority值田盈,當腳本檢測失敗時畜号,MASTER節(jié)點的權值將是priority值與weight值之差

MASTER節(jié)點vrrp_script腳本檢測失敗時缴阎,如果MASTER節(jié)點priority值與weight值之差小于BACKUP節(jié)點priority值允瞧,將發(fā)生主、備切換蛮拔。

MASTER節(jié)點vrrp_scrip腳本檢測成功時述暂,如果MASTER節(jié)點priority值大于BACKUP節(jié)點priority值時,主節(jié)點依然為主節(jié)點建炫,不發(fā)生切換畦韭。

weight設置標準

對于weight值的設置,有一個簡單的標準肛跌,即weight值的絕對值要大于MASTER和BACKUP節(jié)點priority值之差艺配。由此可見,對于weight值的設置要非常謹慎衍慎,如果設置不好转唉,主節(jié)點發(fā)生故障時將導致集群角色選舉失敗,使集群陷于癱瘓狀態(tài)稳捆。    

4. LVS+keepAlived實戰(zhàn)

4.1 實戰(zhàn)拓撲
file

為了測試lvs的高可用赠法,這里需要增加一臺lvs服務器,需在此服務器上安裝ipvsadm乔夯。

4.2 keepAlived安裝和配置
4.2.1 安裝keepAlived
在兩臺lvs服務器上都需要安裝keepAlived砖织,安裝命令如下:
yum install -y keepalived
keepAlived安裝完成后款侵,在/etc/keepalived目錄下有一個keepalived.conf配置文件,內(nèi)容如下:
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
#上面的配置無需關注侧纯,重點關注和修改下面的配置
vrrp_instance VI_1 {
    state MASTER#標識當前l(fā)vs是主新锈,根據(jù)實際lvs服務器規(guī)劃確定,可選值MASTER和BACKUP
    interface eth0#lvs服務器提供服務器的網(wǎng)卡眶熬,根據(jù)實際服務器網(wǎng)卡進行修改
    virtual_router_id 51#lvs提供的服務所屬ID壕鹉,目前無需修改
    priority 100#lvs服務器的優(yōu)先級,主服務器最高聋涨,備份服務器要低于主服務器
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #virtual_ipaddress用于配置VIP和LVS服務器的網(wǎng)卡綁定關系晾浴,一般需要修改
    #示例: 192.168.116.134/24 dev ens33 label ens33:9
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
#配置lvs服務策略,相當于ipvsadm -A -t 192.168.116.134:80 -s rr牍白,一般需要修改
virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr#配置lvs調(diào)度算法脊凰,默認輪詢
    lb_kind NAT#配置lvs工作模式,可以改為DR
    persistence_timeout 50#用于指定同一個client在多久內(nèi)茂腥,只去請求第一次提供服務的RS狸涌,為查看輪詢效                             果,這里需要改為0
    protocol TCP#TCP協(xié)議
    #配置RS信息最岗,相當于ipvsadm -a -t 192.168.116.134:80 -r 192.168.116.131 -g
    real_server 192.168.201.100 443 {
        weight 1#當前RS的權重
        SSL_GET {#SSL_GET健康檢查帕胆,一般改為HTTP_GET
            #兩個url可以刪除一個,url內(nèi)的內(nèi)容改為path /和status_code 200般渡,digest刪除
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
#下面的配置實際是兩組lvs服務的配置懒豹,含義和上面的lvs服務配置一致。如果用不到驯用,下面的配置可以全部刪除
virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
4.2.2 配置keepAlived
基于上述配置文件和實戰(zhàn)拓撲圖及服務器規(guī)劃脸秽,對兩臺lvs服務器分別修改keepalived.conf配置如下:

**lvs主服務器**
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.116.134/24 dev ens33 label ens33:9
    }
}

virtual_server 192.168.116.134 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.116.131 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200 
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.116.132 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200 
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

lvs備份服務器

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.116.134/24 dev ens33 label ens33:9
    }
}

virtual_server 192.168.116.134 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.116.131 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200 
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.116.132 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200 
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

注意:配置文件中的key和大括號之間一定要有空格

4.2.3 啟動keepAlived
在兩臺lvs服務器上分別啟動keepAlived,命令如下:
service keepalived start
4.3 高可用測試
4.3.1 測試環(huán)境檢查
上述步驟執(zhí)行完畢后蝴乔,可以在lvs主服務器和備份服務器分別執(zhí)行ifconfig命令记餐,可以查看到VIP被綁定到了主服務器,如下:
[root@lvs01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.130  netmask 255.255.255.0  broadcast 192.168.116.255
        inet6 fe80::3264:bc00:653f:77b2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::cc13:177d:ec0:60d2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::b105:ad45:a07e:f946  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:38:1d:eb  txqueuelen 1000  (Ethernet)
        RX packets 1574  bytes 135506 (132.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 840  bytes 96383 (94.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.134  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:50:56:38:1d:eb  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
這樣薇正,就可以在客戶端請求VIP192.168.116.134來進行測試片酝。
4.3.2 測試負載均衡
在客戶端發(fā)起請求,測試負載均衡挖腰,如下:
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
4.3.3 測試RS高可用
關閉一臺RS后(這里可以使用**ifconfig 網(wǎng)卡名 down**命令暫時關閉網(wǎng)卡)雕沿,客戶端繼續(xù)發(fā)起請求,查看是否可以正常訪問曙聂,如下:
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
會發(fā)現(xiàn)晦炊,此時客戶端可以正常訪問,但只有RS2在提供服務。這說明断国,keepAlived檢測到了RS1服務器異常贤姆,將其剔除了。

此時再啟動RS1服務器稳衬,客戶端繼續(xù)訪問霞捡,會發(fā)現(xiàn)響應結果如下,keepAlived檢測到RS1服務器恢復正常薄疚,又將其加入服務列表了碧信。
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
4.3.4 測試LVS高可用
這里主要進行兩個測試:

**測試lvs主服務宕機**

使用ifconfig 網(wǎng)卡名 down命令,關閉主服務器網(wǎng)卡街夭,此時主服務器不能提供服務砰碴。觀察備份服務器是否將VIP綁定到自己,以及客戶端是否可以繼續(xù)正常訪問板丽。如下:

關閉主服務器網(wǎng)卡
[root@lvs01 keepalived]# ifconfig ens33 down
觀察備份服務器呈枉,會發(fā)現(xiàn)VIP已經(jīng)綁定過來了。這里實際是keepAlived檢測到了主服務器的異常埃碱,而做出的故障轉(zhuǎn)移和自動切換猖辫。
[root@lvs02 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.135  netmask 255.255.255.0  broadcast 192.168.116.255
        inet6 fe80::3264:bc00:653f:77b2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::cc13:177d:ec0:60d2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::b105:ad45:a07e:f946  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:3a:95:05  txqueuelen 1000  (Ethernet)
        RX packets 1891  bytes 167840 (163.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 830  bytes 77459 (75.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.134  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:50:56:3a:95:05  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 6  bytes 528 (528.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6  bytes 528 (528.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
觀察客戶端是否可以繼續(xù)正常訪問
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
[root@client ~]# curl 192.168.116.134
this is RS01
[root@client ~]# curl 192.168.116.134
this is RS02
**測試lvs主服務器恢復**

上述測試通過后,可以開啟主服務器網(wǎng)卡砚殿,讓其能夠提供服務啃憎,然后觀察VIP是否會回到主服務器。

開啟主服務器網(wǎng)卡
ifconfig ens33 up
查看主服務器和備份服務器

**主服務器**
[root@lvs01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.130  netmask 255.255.255.0  broadcast 192.168.116.255
        inet6 fe80::3264:bc00:653f:77b2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::cc13:177d:ec0:60d2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::b105:ad45:a07e:f946  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:38:1d:eb  txqueuelen 1000  (Ethernet)
        RX packets 2323  bytes 219033 (213.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1953  bytes 189317 (184.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.134  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:50:56:38:1d:eb  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 7  bytes 616 (616.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7  bytes 616 (616.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
**備份服務器**
[root@lvs02 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.135  netmask 255.255.255.0  broadcast 192.168.116.255
        inet6 fe80::3264:bc00:653f:77b2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::cc13:177d:ec0:60d2  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::b105:ad45:a07e:f946  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:3a:95:05  txqueuelen 1000  (Ethernet)
        RX packets 2182  bytes 197998 (193.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1117  bytes 100885 (98.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 6  bytes 528 (528.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6  bytes 528 (528.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

會發(fā)現(xiàn)似炎,VIP重新綁定到了主服務器辛萍。
本文由育博學谷狂野架構師發(fā)布
如果本文對您有幫助,歡迎關注和點贊名党;如果您有任何建議也可留言評論或私信叹阔,您的支持是我堅持創(chuàng)作的動力
轉(zhuǎn)載請注明出處挠轴!

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末传睹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子岸晦,更是在濱河造成了極大的恐慌欧啤,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件启上,死亡現(xiàn)場離奇詭異邢隧,居然都是意外死亡,警方通過查閱死者的電腦和手機冈在,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門倒慧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事纫谅§畔停” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵付秕,是天一觀的道長兰珍。 經(jīng)常有香客問我,道長询吴,這世上最難降的妖魔是什么掠河? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮猛计,結果婚禮上唠摹,老公的妹妹穿的比我還像新娘。我一直安慰自己奉瘤,他們只是感情好跃闹,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著毛好,像睡著了一般望艺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肌访,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天找默,我揣著相機與錄音,去河邊找鬼吼驶。 笑死惩激,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蟹演。 我是一名探鬼主播风钻,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酒请!你這毒婦竟也來了骡技?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤羞反,失蹤者是張志新(化名)和其女友劉穎布朦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昼窗,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡是趴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了澄惊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唆途。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡富雅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肛搬,到底是詐尸還是另有隱情吹榴,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布滚婉,位于F島的核電站图筹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏让腹。R本人自食惡果不足惜远剩,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骇窍。 院中可真熱鬧瓜晤,春花似錦、人聲如沸腹纳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘲恍。三九已至足画,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佃牛,已是汗流浹背淹辞。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俘侠,地道東北人象缀。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像爷速,于是被迫代替她去往敵國和親央星。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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